',drag:'\n
\n \n \n',tree:'\n
\n \n \n \n'},X={icons:U,getIcon:function(t){let e=U[t];return e=String(e).trim(),e}},Y={header:function(t,e,i,o){return t},null:function(t,e,i,o){return e&&e.tg_group?t:null==t?"—":t},blank:function(t,e,i,o){return""},string:function(t,e,i,o){return t},number:function(t,e,i,o){return t},icon:function(t,e,i,o){return`
${t} `},select:function(t,e,i,o){return this.isRowSelectable(e)?this.getSelectFormatterContent(e):""},rowDrag:function(t,e,i,o){return this.getRowDragFormatterContent(e)},rowNumber:function(t,e,i,o){return e.tg_row_number||""},tree:function(t,e,i,o){return this.getTreeFormatterContent(t,e)}},K={setFormatter:function(t,e){this.renderType="all";let i=t;if("string"==typeof t){if(this.formatters)return this.formatters[t]=e,this;i={},i[t]=e}return this.customFormatters=i,this},getFormatter:function(t){if(!t)return;const e=this.formatters[t];return"function"==typeof e?e.bind(this):void 0},getDefaultFormatter:function(t){return(Y[t]||Y.string).bind(this)},getSelectFormatterContent:function(t){let e="radio";this.options.selectMultiple&&(e="checkbox");const i=X.getIcon(e);return`
${i}
`},getRowDragFormatterContent:function(t){if(t.tg_frozen)return"";return`
${X.getIcon("drag")}
`},getTreeIndentWidth:function(t,i,o){if(!t)return 0;let n=5;return i||(n+=e.TREE_INDENT),n+=o*e.TREE_INDENT,n},getTreeFormatterContent:function(t,e){const i=this.rowsInfo.isTree,o=e.tg_group,n=this.isEmptyGroup(e);n&&(e.collapsed=!0);const s=e.collapsed,r=d.toNum(e.tg_level),l=this.getTreeIndentWidth(i,o,r),h=[];if(h.push(`
`),o){const t={"tg-tree-icon":!0,"tg-tree-icon-collapsed":s,"tg-tree-icon-expanded":!s,"tg-tree-icon-empty":n},e=X.getIcon("tree"),i=`
${e}
`;h.push(i)}return h.push(`
${t}
`),h.push("
"),h.join("")}},q={renderHeaderTables:function(){this.clearHeaderCache();const t=this.viewColumns,e=this.frozenInfo.columns;this.hasTreeColumn=!1,this.hasSortColumn=!1;let i=[],o=[];for(let n=0,s=t.length;n
=e?o.push(s):i.push(s)}if(this.frozenInfo.right){const t=i;i=o,o=t}this.renderHeaderTable(i,this.$headerL),this.renderHeaderTable(o,this.$headerR)},renderHeaderTable:function(t,e){const i=document.createElement("div"),o=["tg-header-table"];this.hasSortColumn&&(o.push("tg-header-sortable"),o.push(`tg-header-sort-${this.options.sortIndicator}`)),i.className=d.classMap(o);const n=t.length;if(n){let e=t[n-1];e&&"tg-column-blank"===e.id&&(e=t[n-2]),t.forEach((t=>{this.renderHeaderItem(t,i,e)}))}e.append(i)},renderHeaderItem:function(t,e,i){const o=t.tg_view_index;if(this.getHeaderCache(o))return;const n=this.getHeaderItemClass(t,i),s=d.styleMap(t.headerStyleMap),r={column:o,class:n,data:t.id};s&&(r.style=s);const l=[this.createColumnHeader(t)];if(this.isColumnResizable(t)){const e=this.createColumnResizing(t);l.push(e)}const h=this.createElement("div",r,l);e.appendChild(h),this.setHeaderCache(o,h),this.setNodeDataCache(h,{rowItem:this.headerRowItem,column:o,columnItem:t,headerNode:h}),t.tg_parent&&this.renderHeaderItem(t.tg_parent,e)},createColumnHeader:function(t){const e={class:this.getHeaderClass(t),style:this.getHeaderStyle(t)},i=[this.createColumnName(t)];if(this.hasSortColumn&&!t.tg_group){const e=this.createColumnSort(t);i.push(e)}return this.createElement("div",e,i)},createColumnName:function(t){const e=["tg-column-name"];t.tg_group&&e.push("tg-header-group-name");const i={class:e.join(" ")};let o=t.name;const n=t.tg_headerFormatter;return"function"==typeof n&&(o=n.call(this,o,this.headerRowItem,t)),"tree"===t.formatter?o=this.createHeaderTreeName(o):t===this.selectColumn&&this.isSelectAllVisible()&&(o=this.createHeaderSelectName()),this.createElement("div",i,o)},createHeaderTreeName:function(t){this.hasTreeColumn=!0;const e=[];if(this.options.collapseAllVisible){const t=X.getIcon("tree"),i=this.createElement("div",{class:"tg-tree-icon tg-tree-icon-all"},t);e.push(i)}else{const t=this.createElement("div",{class:"tg-tree-icon"});e.push(t)}const i=this.createElement("div",{class:"tg-tree-name"},t);e.push(i);return this.createElement("div",{class:"tg-tree"},e)},createHeaderSelectName:function(){const t=X.getIcon("checkbox");return this.createElement("div",{class:"tg-select-icon-all tg-checkbox"},t)},createColumnSort:function(t){let e;return this.isColumnSortable(t)&&(e="h"===this.options.sortIndicator?this.createSortIndicatorH(t):this.createSortIndicatorV(t)),this.createElement("div",{class:"tg-column-sort"},e)},createSortIndicatorH:function(t){const e=X.getIcon("sort-h"),i=[this.createElement("div",{class:"tg-sort-indicator-line"}),this.createElement("div",{class:"tg-sort-indicator-icon"},e)];return this.createElement("div",{class:"tg-sort-indicator"},i)},createSortIndicatorV:function(t){const e=X.getIcon("sort-v"),i=[this.createElement("div",{class:"tg-sort-indicator-icon"},e)];return this.createElement("div",{class:"tg-sort-indicator"},i)},createColumnResizing:function(){return this.createElement("div",{class:"tg-column-resizing"})},getHeaderItemClass:function(t,e){const i=["tg-header-item"];return t.tg_group&&i.push("tg-header-group-item"),t===e&&i.push("tg-header-column-last"),i.push(`tg-c-${t.tg_view_index}`),i.push(`tg-h-${t.tg_layer}`),t.tg_combination&&i.push(`tg-h-${t.tg_combination}`),i.push(d.classMap(t.headerClassMap)),d.classMap(i)},getHeaderClass:function(t){const e=["tg-column-header"];return"tree"===t.formatter&&(e.push("tg-tree-header"),this.rowsInfo.isTree&&e.push("tg-tree-header-indent")),this.isColumnSortable(t)&&e.push(`tg-column-sortable tg-column-sort-${this.options.sortIndicator}`),t.align&&e.push(`tg-align-${t.align}`),e.join(" ")},getHeaderStyle:function(t){const e=[d.styleMap(t.headerStyleMap)],i=t.tg_width;return this.isInvisible(t)||i<=0?e.push("display:none;"):e.push(`width:${i}px;`),e.join("")}},J={renderHeader:function(){this.cssRulesInvalid=!0,this.$headerL.empty(),this.$headerR.empty(),this.resetCssDisplay(),this.renderHeaderTables(),this.renderHeaderSort(),this.headerCreated=!0,this.trigger(y.onHeaderUpdated,{node:this.$headerFrame.get(0)})},initHeaderLayerHeight:function(){this.updateScrollPaneHiddenState(),this.resetCssDisplay(),this.viewAllColumns.forEach((t=>{this.updateColumnHeaderHeight(t)})),this.resetCssDisplay("none"),this.updateHeaderLayerHeight()},updateHeaderLayerHeight:function(){const t={},e=this.columnsInfo.maxLevel;for(let i=0;i<=e;i++)t[i]=0;const i=[];this.viewAllColumns.forEach((function(e){if(e.tg_combination)i.push(e);else{const i=e.tg_height,o=e.tg_layer;t[o]=Math.max(t[o],i)}})),i.forEach((function(e){let i=e.tg_height;const o=e.tg_combination.split(""),n=o.pop();o.forEach((function(e){i-=t[e]||0})),t[n]=Math.max(t[n],i)}));const o=JSON.stringify(t);this.previousHeaderLayerHeight!==o&&(this.previousHeaderLayerHeight=o,this.headerLayerHeight=t,this.cssRulesInvalid=!0)}};var Q=i(915);const Z={create:function(t){this.id=d.uid(4,"tg-"),d.isObject(t)||(t={container:t}),this.constructorOptions=t,this.createCache(),this.createView(t.container)},createView:function(t){this.createHolder(t),this.$holder?(this.createGlobalStyle(),this.createContainer()):console.error("ERROR: Grid requires a container")},createHolder:function(t){const e=w(t);if(!e.length)return;this.$holder=e,this.$holder.empty(),this.holder=this.$holder.get(0);const i=this.holder.getRootNode();this.shadowRoot=null,i&&i.host&&(this.shadowRoot=i)},createGlobalStyle:function(){const t=this.shadowRoot||document.head;if(t.querySelector(`style[context="${e.ID}"]`))return;const i=document.createElement("style");i.setAttribute("context",e.ID),i.innerHTML=Q.A.toString(),t.appendChild(i)},createContainer:function(){return this.$container=w('\r\n\r\n \r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n').appendTo(this.$holder),this.$container.attr("id",this.id),this.$container.addClass(`${e.NS} ${this.id}`),this.container=this.$container.get(0),d.setInstance(this.container,this),this.$headerFrame=this.$container.find(".tg-header-frame"),this.$paneHL=this.$headerFrame.find(".tg-pane-header-left"),this.$paneHR=this.$headerFrame.find(".tg-pane-header-right"),this.$headerL=this.$paneHL.find(".tg-header-left"),this.$headerR=this.$paneHR.find(".tg-header-right"),this.$header=w().add(this.$headerL).add(this.$headerR),this.$bodyFrame=this.$container.find(".tg-body-frame"),this.$paneTL=this.$bodyFrame.find(".tg-pane-top-left"),this.$paneTR=this.$bodyFrame.find(".tg-pane-top-right"),this.$paneBL=this.$bodyFrame.find(".tg-pane-bottom-left"),this.$paneBR=this.$bodyFrame.find(".tg-pane-bottom-right"),this.$bodyTL=this.$paneTL.find(".tg-body-top-left"),this.$bodyTR=this.$paneTR.find(".tg-body-top-right"),this.$bodyBL=this.$paneBL.find(".tg-body-bottom-left"),this.$bodyBR=this.$paneBR.find(".tg-body-bottom-right"),this.$body=w().add(this.$bodyTL).add(this.$bodyTR).add(this.$bodyBL).add(this.$bodyBR),this.$columnLineContainer=this.$container.find(".tg-column-line"),this.$columnLineItem=this.$columnLineContainer.find(".tg-column-line-item"),this.$columnLineItemL=this.$columnLineContainer.find(".tg-column-line-l"),this.$columnLineItemR=this.$columnLineContainer.find(".tg-column-line-r"),this}},tt={initColumnsHandler:function(){this.columns=this.data.columns,this.columns.forEach(((t,e)=>{t&&"object"==typeof t||(this.columns[e]={})}));const t=this.getPrivateColumns();this.columnsInfo=this.initTreeInfo(t,this.frozenInfo.column);const e=[],i=[],o=(t,n)=>{if(!d.isList(t))return;let s,r=0;t.forEach((t=>{if(!this.isInvisible(t))if(t.tg_group){if(this.isEmptyGroup(t))return;i.push(t),o(t.subs,t)}else t.tg_list_index=r,r+=1,t.tg_list_last=!1,s=t,e.push(t)})),s&&(s.tg_list_last=!0)};o(t),e.forEach((t=>{this.initColumnItemHandler(t)})),i.forEach((t=>{this.initColumnGroupHandler(t)}));const n=[].concat(e).concat(i);this.initViewList(n,((t,e)=>{})),this.viewColumns=e,this.viewGroupColumns=i,this.viewAllColumns=n,this.initHeaderHandler(t),this.initSortColumn()},getPrivateColumns:function(){const t=this.options;this.selectColumn=t.selectColumn,this.rowDragColumn=t.rowDragColumn,this.rowNumberColumn=t.rowNumberColumn,this.blankColumn=t.blankColumn;let e=[];const i=()=>{t.selectVisible&&e.push(this.selectColumn),t.rowDragVisible&&e.push(this.rowDragColumn),t.rowNumberVisible&&(this.rowNumberColumn.width=t.rowNumberWidth,e.push(this.rowNumberColumn))};if(this.frozenInfo.right){const t=this.frozenInfo.column;this.columns.forEach(((o,n)=>{e.push(o),n===t&&i()}))}else i(),e=e.concat(this.columns);return e.push(this.blankColumn),e},setColumns:function(t){this.data.columns=d.toList(t),this.rerender()},getColumns:function(){return this.columns},getViewColumns:function(t){return t?this.viewAllColumns:this.viewColumns},initColumnItemHandler:function(t){this.initColumnProps(t),this.initColumnFormatter(t),this.initColumnWidth(t)},initColumnGroupHandler:function(t){this.initColumnFormatterByName(t,"headerFormatter","header")},initColumnProps:function(t){const e=this.options.columnTypes;if(!d.hasOwn(t,"type")){const i=e[t.id];"string"==typeof i&&(t.type=i)}let i=this.options.columnProps;const o=e[t.type];o&&"object"==typeof o&&(i=d.merge(i,o));for(const e in i)d.hasOwn(t,e)||(t[e]=i[e])},initColumnFormatter:function(t){this.initColumnFormatterByName(t,"headerFormatter","header");let e=t.type;const i=t.formatter;"string"==typeof i&&(e=i),this.initColumnFormatterByName(t,"formatter",e)},initColumnFormatterByName:function(t,e,i){let o=t[e];"function"!=typeof o?(o=this.getFormatter(i),t[`tg_${e}`]=o||this.getFormatter("string")):t[`tg_${e}`]=o.bind(this)},initColumnWidth:function(t){if(t!==this.blankColumn)return d.isNum(t.width)&&t.width>=0?(t.tg_width=t.width,t.minWidth=Math.min(t.minWidth,t.tg_width),void(t.maxWidth=Math.max(t.maxWidth,t.tg_width))):void this.initColumnWidthByName(t);t.tg_width=0},initColumnWidthByName:function(t){const e=this.getComputedColumnWidth(t);d.isNum(e)&&(t.tg_width=e)},getComputedColumnWidth:function(t){const e=t.name||"",i=d.getCharLen(e);let o=Math.round(10*i);return o>103&&(o=Math.max(103,Math.round(10*i/2)),o>133&&(o=Math.max(133,Math.round(10*i/3)),o>163&&(o=Math.max(163,Math.round(10*i/4))))),d.clamp(o,t.minWidth,t.maxWidth)},initSortColumn:function(){this.sortColumn=null;const t=this.options,e=t.sortField;if(!e)return;const i=this.getColumnItemById(e);return i&&this.isColumnSortable(i)?(d.hasOwn(i,"sortAsc")||(i.sortAsc=t.sortAsc),this.sortColumn=i,this):void 0}},et={initHeaderHandler:function(t){this.initHeaderRowItem(),this.viewGroupColumns.reverse(),this.initGroupColumnsWidth(),this.initGroupColumnsLayer(t)},initHeaderRowItem:function(){this.headerRowItem={tg_index:-1,tg_view_index:-1},this.viewAllColumns.forEach((t=>{d.hasOwn(t,"id")&&(this.headerRowItem[t.id]=t.name)}))},initGroupColumnsWidth:function(){this.viewGroupColumns.forEach((t=>{let e=0;t.subs.forEach((t=>{this.isInvisible(t)||(e+=t.tg_width)})),t.tg_width=e}))},initGroupColumnsLayer:function(t){const e=this.columnsInfo.maxLevel;this.viewColumns.forEach((function(t){t.tg_layer=e,t.tg_parent&&(t.tg_parent.tg_layer=e-1)})),this.viewGroupColumns.forEach((function(t){const e=t.tg_layer,i=t.tg_parent;if(i){let t=e-1;d.isNum(i.tg_layer)&&(t=Math.min(t,i.tg_layer)),i.tg_layer=t}})),this.initColumnRowspanHandler(t,0)},initColumnRowspanHandler:function(t,e){t.forEach((t=>{const i=this.initColumnCombinationHandler(t,e);t.tg_group&&this.initColumnRowspanHandler(t.subs,e+i)}))},initColumnCombinationHandler:function(t,e){const i=[],o=t.tg_layer;for(;e<=o;)i.push(e),e+=1;i.reverse();const n=i.length;let s="";return n>1&&(s=i.join("")),t.tg_combination=s,n}},it={},ot={name:"",minWidth:81,maxWidth:300},nt=function(t){return null==t},st=function(t,e){const i=nt(t),o=nt(e);return i&&o?0:i?1:o?-1:void 0},rt=function(t,e){return t.tg_index>e.tg_index?1:-1},lt=function(t,e){return rt(t,e)},ht=function(t,e){if("string"==typeof t&&"string"==typeof e){const i=t.toUpperCase(),o=e.toUpperCase();if(i!==o)return i>o?-1:1}return t>e?-1:1},at=function(t,e,i,o){return t?-1:e?1:ht(i,o)},ct=function(t,e){const i="number"==typeof t,o="number"==typeof e;return i&&o?t>e?-1:1:at(i,o,t,e)},dt=function(t,e){const i=new Date(t),o=new Date(e),n=d.isDate(i),s=d.isDate(o);if(n&&s){const t=i.getTime(),e=o.getTime();if(t===e)return;return t>e?-1:1}return at(n,s,t,e)},ut=function(t,e){const i="boolean"==typeof t,o="boolean"==typeof e;return i&&o?t>e?-1:1:at(i,o,t,e)},gt=function(t,e,i,o){const n=t[i.sortField],s=e[i.sortField],r=st(n,s);if("number"==typeof r)return 0===r?lt(t,e):i.sortBlankFactor*r;if(n!==s&&"function"==typeof o){const t=o(n,s);if(d.isNum(t))return i.sortFactor*t}return lt(t,e)},ft={blankValue:st,equal:lt,index:rt,value:gt,diffType:at,string:function(t,e,i){return gt(t,e,i,ht)},stringValue:ht,number:function(t,e,i){return gt(t,e,i,ct)},numberValue:ct,date:function(t,e,i){return gt(t,e,i,dt)},dateValue:dt,boolean:function(t,e,i){return gt(t,e,i,ut)},booleanValue:ut};const pt={initOptionsHandler:function(){return this.options=this.generateOptions(),this.initOptionsFormatters(),this.initOptionsSort(),this.initOptionsFrozen(),this.initOptionsScrollbar(),this.initOptionsContainer(),this.initBindWindowResize(),this.initBindContainerResize(),this},generateOptions(){const t={className:e.NS,theme:e.ID,headerVisible:!0,rowHeight:32,rowFilter:null,rowFilteredSort:null,rowNotFound:"",rowMoveCrossLevel:!0,rowCacheLength:0,rowProps:it,columnTypes:{tree:{type:"tree",formatter:"tree",width:230,minWidth:120,maxWidth:810},number:{type:"number",align:"right"},date:{type:"date",align:"right"},name:"tree"},columnCacheLength:0,columnProps:ot,collapseAllOnInit:null,collapseAllVisible:!0,selectAllOnInit:null,selectVisible:!1,selectAllVisible:!0,selectMultiple:!0,selectColumn:{private:!0,id:"tg-column-select",name:"",formatter:"select",headerClassMap:"tg-header-select",classMap:"tg-cell-select",width:36,align:"center",resizable:!1,sortable:!1,exportable:!1},rowDragCrossLevel:!0,rowDragVisible:!1,rowDragColumn:{private:!0,id:"tg-column-row-drag",name:"",formatter:"rowDrag",headerClassMap:"tg-header-row-drag",classMap:"tg-cell-row-drag",align:"center",width:36,resizable:!1,sortable:!1,exportable:!1},rowNumberWidth:36,rowNumberFilter:null,rowNumberVisible:!1,rowNumberColumn:{private:!0,id:"tg-column-row-number",name:"",formatter:"rowNumber",headerClassMap:"tg-header-row-number",classMap:"tg-cell-row-number",align:"center",maxWidth:100,sortable:!1,exportable:!1},blankColumn:{private:!0,id:"tg-column-blank",name:"",formatter:"blank",headerClassMap:"tg-header-blank",classMap:"tg-cell-blank",width:0,minWidth:0,maxWidth:4096,resizable:!1,sortable:!1,exportable:!1},sortField:"",sortAsc:!0,sortBlankValueBottom:!0,sortComparers:ft,sortOnInit:!1,sortIndicator:"h",highlightKeywords:{textKey:"tg_text_",textGenerator:null,highlightKey:"tg_highlight_",highlightPre:"",highlightPost:" "},frozenRow:-1,frozenRowMax:10,frozenRowHoverable:!1,frozenBottom:!1,frozenColumn:-1,frozenColumnMax:10,frozenRight:!1,scrollbarSize:12,scrollbarSizeH:null,scrollbarSizeV:null,scrollbarRound:!1,scrollbarFade:!1,scrollbarFadeTimeout:1e3,scrollbarType:"auto",scrollPaneMinWidth:30,scrollPaneGradient:30,autoHeight:!1,textSelectable:!1,bindWindowResize:!1,bindContainerResize:!1,cellResizeObserver:null},i=this.generateThemeOptions();return d.merge(t,i,this.constructorOptions,this.customOptions,this.dataOptions)},generateThemeOptions(){const t=this.pickOptions("theme").pop();if(t)return this.getThemeOptions(t)},pickOptions(t){return[this.constructorOptions,this.customOptions,this.dataOptions].map((e=>e&&e[t])).filter((t=>t))},initOptionsFormatters(){let t;const e=this.pickOptions("formatters");e.length&&(t=d.merge.apply(null,e)),this.formatters=d.merge(Y,t,this.customFormatters),this.nullFormatter=this.getFormatter("null")},initOptionsSort(){"v"!==this.options.sortIndicator&&(this.options.sortIndicator="h")},initOptionsFrozen:function(){const t=this.options;this.frozenInfo={column:-1,row:-1,columns:0,rows:0,bottom:Boolean(t.frozenBottom),right:Boolean(t.frozenRight)};let e=d.toNum(t.frozenColumn,!0);e=d.clamp(e,-1,t.frozenColumnMax),e>-1&&!this.frozenInfo.right&&(t.selectVisible&&(e+=1),t.rowDragVisible&&(e+=1),t.rowNumberVisible&&(e+=1)),this.frozenInfo.column=e,e>-1?this.frozenInfo.columns=e+1:(this.frozenInfo.columns=0,this.frozenInfo.right=!1);let i=d.toNum(t.frozenRow,!0);i=d.clamp(i,-1,t.frozenRowMax),this.frozenInfo.row=i,i>-1?this.frozenInfo.rows=i+1:(this.frozenInfo.rows=0,this.frozenInfo.bottom=!1)},initOptionsScrollbar:function(){const t=this.options;("auto"===t.scrollbarType&&d.isTouchDevice()||["touch","mobile"].includes(t.scrollbarType))&&(t.scrollbarFade=!0,t.scrollbarSize=6,t.scrollbarRound=!0);const e=d.toNum(t.scrollbarSize);this.scrollbarSizeH=e,d.isNum(t.scrollbarSizeH)&&(this.scrollbarSizeH=t.scrollbarSizeH),this.scrollbarSizeV=e,d.isNum(t.scrollbarSizeV)&&(this.scrollbarSizeV=t.scrollbarSizeV)},initOptionsContainer:function(){this.$container.attr("id",this.id);const t=this.options;this.$container.removeClass();const i=[e.NS,this.id,`tg-${t.theme}`,t.className];t.textSelectable||i.push("tg-text-unselectable"),d.isTouchDevice()&&i.push("tg-touch-device"),this.$container.addClass(d.classMap(i))},setTextSelectable:function(t){this.options.textSelectable&&(t?this.$container.removeClass("tg-text-unselectable"):this.$container.addClass("tg-text-unselectable"))}},mt={initBindWindowResize:function(){this.unbindWindowResize(),this.options.bindWindowResize&&(this.windowResizeEvents={resize:{handler:t=>{this.resize()}}},d.bindEvents(this.windowResizeEvents,window))},unbindWindowResize:function(){d.unbindEvents(this.windowResizeEvents)},createResizeObserver:function(t){if("undefined"==typeof ResizeObserver)return console.error("ERROR: This browser does not support ResizeObserver"),{observe:()=>{},unobserve:()=>{},disconnect:()=>{}};return new ResizeObserver((e=>{t.call(this,e)}))},initBindContainerResize:function(){this.unbindContainerResize(),this.options.bindContainerResize&&this.holder&&(this.resizeObserver=this.createResizeObserver((t=>{Boolean(this.holder.offsetWidth||this.holder.offsetHeight||this.holder.getClientRects().length)&&this.resize()})),this.resizeObserver.observe(this.holder))},unbindContainerResize:function(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null)}},bt={initRowsHandler:function(){this.rows=this.data.rows,this.rowsInfo=this.initTreeInfo(this.rows,this.frozenInfo.row)},getRows:function(){return this.rows},getViewRows:function(){return this.viewRows},createViewRows:function(){this.initRowFilterHandler();const t=[],e=this.getRowNumberFilter();let i=1;const o=(t,o)=>{if(e.call(this,t,o))return t.tg_row_number=i,void(i+=1);t.tg_row_number=""},n=(e,i,s)=>{if(!d.isList(e))return;let r,l=0;e.forEach((e=>{if(this.isInvisible(e))return;e.tg_list_index=l,l+=1,e.tg_list_last=!1,r=e,this.gridRowItemHandler(e),o(e,l),s||t.push(e);const i=s||e.tg_group&&e.collapsed;n(e.subs,e,i)})),r&&(r.tg_list_last=!0)};n(this.rows);let s,r=0;return this.initViewList(t,((t,e)=>{t.tg_top=r,r+=this.getRowHeight(t),t.tg_group_line=!1,t.collapsed&&(t.tg_group_line=!0),s&&(t.tg_group||t.tg_level{if(e.tg_invisible)return;const n=!t.call(this,e,i,o);if(e.tg_filtered=n,!n){let t=e;for(;t.tg_parent;)t.tg_parent.tg_filtered=!1,t=t.tg_parent}})),this.sortColumn)return;let e=this.options.rowFilteredSort;if("function"==typeof e&&(e=e.call(this)),!e)return;"string"==typeof e&&(e={sortField:e,sortAsc:this.options.sortAsc});const i=e.sortField||e.id;i&&this.sortRows(i,e)},highlightKeywordsFilter:function(t,e,i){const{textKey:o,textGenerator:n,highlightKey:s}=this.options.highlightKeywords;if(e.forEach((e=>{t[`${s}${e}`]=null})),!i)return!0;const r=`${i}`.trim().toLowerCase().split(/\s+/g).filter((t=>t));if(!r.length)return!0;let l=!1;const h=(e,i)=>(/<\/?[a-z][\s\S]*>/i.test(e)&&(e=((e,i)=>{const n=`${o}${i}`,s=t[n];if(s)return s;const r=document.createElement("div");r.innerHTML=e;const l=r.innerText;return t[n]=l,l})(e,i)),(t=>{const e=t.toLowerCase();let i=0;for(const t of r){const o=e.indexOf(t,i);if(-1===o)return;i=o+t.length}return!0})(e));let a=function(t,e){return t[e]};return"function"==typeof n&&(a=n),e.forEach((e=>{const i=a(t,e);if(null==i)return;const o=`${i}`.trim();if(!o)return;const n=h(o,e);n&&(t[`${s}${e}`]=n,l=!0,this.highlightKeywords=r)})),l},highlightKeywordsHandler:function(){const{highlightCells:t}=this.renderSettings;if(!t.length)return;const e=this.highlightKeywords;e&&(this.asyncHighlightKeywords||(this.asyncHighlightKeywords=d.debounce(this.highlightKeywordsSync,10)),this.asyncHighlightKeywords.apply(this,[t,e]))},highlightKeywordsSync:function(t,e){t.forEach((t=>{const i=Array.from(t.querySelectorAll("svg")).concat(Array.from(t.querySelectorAll("textarea"))),o=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,(t=>{if(i.length)for(const e of i)if(e.contains(t))return NodeFilter.FILTER_SKIP;return NodeFilter.FILTER_ACCEPT})),n=[];let s=o.nextNode();for(;s;)n.push(s),s=o.nextNode();n.length&&this.highlightTextNodes(n,e)}))},highlightTextNodes:function(t,e){const{highlightPre:i,highlightPost:o}=this.options.highlightKeywords;let n=0;const s=()=>(n>=e.length&&(n=0),e[n++]);let r=s();t.forEach((t=>{const e=t.textContent,n=e.toLowerCase(),l=[];let h=0;const a=e.length;let c=!1;for(;h{if(e.selected){if(t)return void(e.selected=!1);t=e}}))}const t=this.options.selectAllOnInit;!0!==t?!1===t&&this.updateAllRowsSelected(!1):this.updateAllRowsSelected(!0)},updateAllRowsSelected:function(t){this.forEachSelectableRow((e=>{e.selected=t}))},initCollapseAllOnInitHandler:function(){const t=this.options.collapseAllOnInit;!0!==t?!1===t&&this.updateAllRowsCollapsed(!1):this.updateAllRowsCollapsed(!0)},getToBeAddedItemList:function(t){const e=[];return d.toList(t).forEach((t=>{t&&"object"==typeof t?e.push(t):void 0!==t&&e.push({name:t})})),e},getToBeAddedParentSubs:function(t,e){return t?(t.subs||(t.subs=[]),t.subs):e},getToBeAddedPositionIndex:function(t,e){const i=e.length;return d.isNum(t)&&t>=0&&t<=i?Math.round(t):i},generateDataSnapshot:function(t){if(!t||"object"!=typeof t)return t;const e=this.cleanTreeList(t.rows),i=this.cleanTreeList(t.columns);return this.convertNumberType(e,i),t.rows=e,t.columns=i,t},cleanTreeList:function(t){if(!d.isList(t))return[];const e=(t,i)=>{i.forEach((i=>{if(!i||"object"!=typeof i)return void t.push({});const o=this.getItemSnapshot(i),n=i.subs;Array.isArray(n)&&(o.subs=[],e(o.subs,n)),t.push(o)}))},i=[];return e(i,t),i},convertNumberType:function(t,e){const i=[];d.forEachTree(e,(function(t){"number"===t.type&&t.id&&i.push(t.id)})),i.length&&d.forEachTree(t,(function(t){i.forEach((function(e){t[e]=d.convertNum(t[e])}))}))}},vt={setDefaultLoading:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)return;const i=t.style;e.size&&(i.width=e.size,i.height=e.size),e.color&&(i.color=e.color),e.size||e.color||t.removeAttribute("style"),e.fast?t.classList.add("tg-loading-fast"):t.classList.remove("tg-loading-fast")},getDefaultLoading:function(t){return this.setDefaultLoading(this.$defaultLoading,t),this.$defaultLoading},getLoadingHolder:function(){return this.$container?this.$container.find(".tg-loading"):w()},setLoading:function(t){if(!this.$container)return this;this.$defaultLoading||(this.$defaultLoading=this.$container.find(".tg-loading-default").get(0));const e=this.getLoadingHolder().get(0);return"function"==typeof t&&(t=t.call(this,e)),d.isObject(t)&&(t=this.getDefaultLoading(t)),t||(t=this.getDefaultLoading()),this.renderNodeContent(e,t),this},showLoading:function(){return this.getLoadingHolder().show(),this},hideLoading:function(){return this.getLoadingHolder().hide(),this}},Ht={showMask:function(t){if(!this.hasMask||t){const e=this.$container.find(".tg-mask"),i=e.get(0);if(t&&i){const e=d.styleMap(t);e&&(i.style.cssText=e)}e.show(),this.hasMask=!0}return this},hideMask:function(){return this.hasMask&&(this.$container.find(".tg-mask").hide(),this.hasMask=!1),this}},Ct={renderNodeContent:function(t,e){if(t){if(e&&e.nodeType)return this.emptyNode(t),void t.appendChild(e);if(Array.isArray(e))return this.emptyNode(t),void e.forEach((e=>{e&&e.nodeType&&t.appendChild(e)}));void 0===e&&(e=""),t.innerHTML=e}},emptyNode:function(t){if(t)for(;t.firstChild;)t.removeChild(t.firstChild)},removeNode:function(t){t&&t.parentNode&&t.parentNode.removeChild(t)},appendNode:function(t,e){t&&e&&t.appendChild(e)},createElement:function(t,e,i){const o=document.createElement(t);e&&Object.keys(e).forEach((function(t){const i=e[t];void 0!==i&&o.setAttribute(t,i)})),d.isArray(i)||(i=[i]);let n="";return i.forEach((function(t){t&&t.nodeType?o.appendChild(t):void 0!==t&&(n+=t)})),n&&(o.innerHTML=n),o},find:function(t,e){return w(e||this.$container).find(t)},getRowNodes:function(t){const e=this.getRowItem(t);if(e)return this.getRowNodesByIndex(e.tg_view_index)},getCellNode:function(t,e){const i=this.getRowItem(t);if(!i)return;const o=this.getColumnItem(e);return o?this.getCellNodeByIndex(i.tg_view_index,o.tg_view_index):void 0},getHeaderItemNode:function(t){const e=this.getColumnItem(t);if(e)return this.getHeaderCache(e.tg_view_index)},getColumnHeaderNode:function(t){const e=this.getHeaderItemNode(t);if(e)return e.querySelector(".tg-column-header")}},yt={render:function(){this.asyncRender||(this.asyncRender=d.microtask(this.renderSync)),this.asyncRender.apply(this,arguments)},renderSync:function(){this.renderStartedTimestamp=Date.now();const t=this.generateRenderSettings.apply(this,arguments);return this.renderSettings=t,"all"===t.type?(this.flushBody(),this.initHandler(),this.renderHeader(),this.updateViewRowsAndSize(),this.renderBody(),this):"columns"===t.type?(this.flushBody(),this.initColumnsHandler(),this.renderHeader(),this.updateViewRowsAndSize(),this.renderBody(),this):"rows"===t.type?(this.updateViewRowsAndSize(),this.renderBody(),this):"rows_cache"===t.type?(this.cssRulesInvalid=!0,this.updateViewRowsAndSize(),this.updateRowCacheTopAndHeight(),this.renderBody(),this):"resize"===t.type?(this.resizeHandler(),this.renderBody(),this):(this.renderBody(),this)},generateRenderSettings:function(t){const e={type:this.renderType,scrollLeft:null,scrollTop:null,scrollColumn:null,scrollRow:null,highlightCells:[]};return"string"==typeof t?e.type=t:t&&Object.assign(e,t),this.headerCreated||(e.type="all"),e},renderBody:function(){this.scrollOnInit(),this.scrollTopOffset=this.scrollPane.getScrollTopOffset();const t=this.getViewport();return this.viewport=t,this.flushWithViewport(),this.previousScrollTopOffset!==this.scrollTopOffset&&(this.previousScrollTopOffset=this.scrollTopOffset,this.updateRowCacheTopOffset()),this.renderRows(t.rows),this.renderCells(t.rows,t.columns),this.renderUpdatedTimestamp=Date.now(),this.renderDuration=this.renderUpdatedTimestamp-this.renderStartedTimestamp,this.trigger(y.onUpdated,t),this.firstUpdated||(this.firstUpdated=!0,this.trigger(y.onFirstUpdated,t)),this.layoutEventHandler(),this.resizeEventHandler(),this.highlightKeywordsHandler(),this.renderSettings=null,this.renderType=null,this},rerender:function(){return this.render("all"),this}},Rt={resize:function(){return this.asyncResize||(this.asyncResize=d.throttle(this.resizeSync,100)),this.asyncResize.apply(this,arguments),this},resizeSync:function(){return this.headerCreated?(this.resizeHolderHandler.apply(this,arguments),this.firstUpdated&&this.isHolderInvisible()||this.render("resize"),this):this},resizeHolderHandler(t,e){if(0!==arguments.length)return 1===arguments.length?t&&"object"==typeof t?void this.$holder.css(t):void this.$holder.css({width:t}):void this.$holder.css({width:t,height:e})},isHolderInvisible(){const t=this.$holder.width(),e=this.$holder.height();return!t||!e},resizeHandler:function(){this.containerWidth=this.$container.width(),this.containerHeight=this.$container.height(),this.headerWidth=this.containerWidth,this.bodyWidth=this.containerWidth,this.updateTotalColumnsWidth(),this.resizeHeaderHandler(),this.resizeBodyHandler()},layoutEventHandler:function(){const t=this.previousLayout||{},e={headerWidth:this.headerWidth,headerHeight:this.headerHeight,bodyWidth:this.bodyWidth,bodyHeight:this.bodyHeight,scrollbarWidth:this.getScrollbarWidth(),scrollbarHeight:this.getScrollbarHeight()};Object.values(e).join("")!==Object.values(t).join("")&&(this.previousLayout=e,this.trigger(y.onLayout,d.merge({previous:t},e)))},resizeEventHandler:function(){const t=this.previousSize||{},e={width:this.containerWidth,height:this.containerHeight};Object.values(e).join("")!==Object.values(t).join("")&&(this.previousSize=e,this.trigger(y.onResize,d.merge({previous:t},e)))},resizeHeaderHandler:function(){this.initHeaderLayerHeight();const t=this.options;t.autoHeight&&this.viewRows.length>5e3&&(t.autoHeight=!1),this.headerHeight=0,t.headerVisible&&(this.containerHeight>0||t.autoHeight)&&this.updateHeaderTableHeight(),this.$headerFrame.css({width:this.headerWidth,height:this.headerHeight})},updateHeaderTableHeight:function(){let t=0;Object.keys(this.headerLayerHeight).forEach((e=>{t+=this.headerLayerHeight[e]}));const e=this.$headerL.find(".tg-header-table"),i=this.$headerR.find(".tg-header-table");e.css({height:t}),i.css({height:t}),this.headerHeight=t},resizeBodyHandler:function(){this.updateScrollState(),this.bodyHeight=this.containerHeight-this.headerHeight,this.$bodyFrame.css({width:this.bodyWidth,height:this.bodyHeight}),this.updatePaneWidth(),this.updatePaneHeight(),this.updateCanvasWidth(),this.updateCanvasHeight(),this.updateScrollPane(),this.updateCssRules()},updatePaneWidth:function(){let t=this.bodyWidth,e=0;if(this.frozenInfo.columns){const i=this.getScrollbarWidth();this.frozenInfo.right?(e=this.columnsWidthR+i,t=this.bodyWidth-e):(t=this.columnsWidthL,e=this.bodyWidth-t),this.scrollPaneHidden&&(this.frozenInfo.right?(t<=0&&(t=0),e=Math.max(0,this.bodyWidth-t)):(e3&&void 0!==arguments[3])||arguments[3];const n=this.getToBeAddedItemList(t);if(!n.length)return!1;let s;if(null!=e&&(s=this.getRowItem(e),!s))return!1;const r=this.getToBeAddedParentSubs(s,this.rows),l=this.getToBeAddedPositionIndex(i,r),h=[l,0].concat(n);r.splice.apply(r,h),this.initRowsHandler(),s?(s.collapsed=!1,this.flushRowFrom(s.tg_view_index+l)):this.flushRowFrom(l),this.onNextUpdated((function(){this.trigger(y.onRowAdded,n)}));const a={type:"rows"};return o&&(a.scrollRow=n[n.length-1]),this.render(a),!0},deleteRow:function(t){const e=d.toList(t),i=[];if(e.forEach((t=>{const e=this.getRowItem(t);e&&i.push(e)})),!i.length)return!1;const o=this.removeRowsHandler(i);this.initRowsHandler();const n=this.getRemovedMinIndex(o);return this.flushRowFrom(n),this.onNextUpdated((function(){this.trigger(y.onRowRemoved,i)})),this.render("rows"),!0},getRemovedMinIndex:function(t){let e=0;const i=t[t.length-1];if(this.isInvisible(i))return e;e=i.tg_view_index,e>0&&(e-=1);let o=i.tg_parent;for(;o;)o.collapsed&&(e=o.tg_view_index),o=o.tg_parent;return e},removeRowsHandler:function(t){const e=[].concat(t);e.sort((function(t,e){return e.tg_index-t.tg_index}));const i=[];return e.forEach((t=>{this.getRowParentSubs(t).splice(t.tg_sub_index,1),i.push(t)})),i}},Tt={renderCollapseAllState:function(){this.hasTreeColumn&&(this.asyncRenderCollapseAllState||(this.asyncRenderCollapseAllState=d.microtask(this.renderCollapseAllStateSync)),this.asyncRenderCollapseAllState.apply(this,arguments))},renderCollapseAllStateSync:function(){const t=this.$header.find(".tg-tree-header");this.rowsInfo.isTree?t.addClass("tg-tree-header-indent"):t.removeClass("tg-tree-header-indent"),this.renderCollapseAllIcon()},checkCollapseAllState:function(t){if(t!==this.allRowsCollapsed){if(t){let t=0;const e=this.rows.length;for(;t{if(e.tg_group&&e.tg_subs_length&&e.collapsed)return t=!0,!1})),t)return}this.allRowsCollapsed=t,this.renderCollapseAllIcon()}},expandAllRows:function(){return this.renderAllRowsCollapsed(!1)},collapseAllRows:function(){return this.renderAllRowsCollapsed(!0)},toggleAllRows:function(){return this.allRowsCollapsed?this.expandAllRows():this.collapseAllRows()},renderAllRowsCollapsed:function(t){const e=this.updateAllRowsCollapsed(t);return e.length?(this.flushBody(),this.onNextUpdated((()=>{this.renderCollapseAllIcon(),t?this.trigger(y.onRowCollapsed,e):this.trigger(y.onRowExpanded,e)})),this.render("rows"),this):this},updateAllRowsCollapsed:function(t){this.allRowsCollapsed=t;const e=[];return this.forEachRow((i=>{i.subs&&i.tg_subs_length&&this.isCollapsedChanged(i,t)&&(i.collapsed=t,e.push(i))})),e},expandRow:function(t){const e=this.getRowItem(t);return e?this.isEmptyGroup(e)?(this.trigger(y.onRowSubsRequest,e),this):this.isCollapsedChanged(e,!1)?(e.collapsed=!1,this.flushRowFrom(e.tg_view_index),this.renderCollapseIcon(e),this.onNextUpdated((()=>{this.checkCollapseAllState(!1),this.trigger(y.onRowExpanded,e)})),this.render("rows"),this):this:this},collapseRow:function(t){const e=this.getRowItem(t);return e&&e.subs&&e.tg_subs_length&&this.isCollapsedChanged(e,!0)?(e.collapsed=!0,this.flushRowFrom(e.tg_view_index),this.renderCollapseIcon(e),this.onNextUpdated((()=>{this.checkCollapseAllState(!0),this.trigger(y.onRowCollapsed,e)})),this.render("rows"),this):this},toggleRow:function(t){const e=this.getRowItem(t);return e?(e.collapsed?this.expandRow(e):this.collapseRow(e),this):this},expandRowLevel:function(t){t=d.toNum(t,!0);const e=[],i=[];return this.forEachRow((o=>{o.subs&&o.tg_subs_length&&(o.tg_level<=t?this.isCollapsedChanged(o,!1)&&(o.collapsed=!1,i.push(o)):this.isCollapsedChanged(o,!0)&&(o.collapsed=!0,e.push(o)))})),e.length||i.length?(this.flushBody(),this.onNextUpdated((()=>{e.length&&this.trigger(y.onRowCollapsed,e),i.length&&this.trigger(y.onRowExpanded,i)})),this.render("rows"),this):this},renderCollapseAllIcon:function(){if(!this.options.collapseAllVisible||!this.hasTreeColumn)return;const t=this.$header.find(".tg-tree-icon-all");this.renderTreeIcon(t,this.allRowsCollapsed)},renderCollapseIcon:function(t){if(!this.headerCreated)return;const e=this.getRowNodesByIndex(t.tg_view_index);if(!e)return;const i=e.find(".tg-tree-icon");this.renderTreeIcon(i,t.collapsed)},renderTreeIcon:function(t,e){t&&(e?t.removeClass("tg-tree-icon-expanded").addClass("tg-tree-icon-collapsed"):t.removeClass("tg-tree-icon-collapsed").addClass("tg-tree-icon-expanded"))}},Et={rowDragStartHandler:function(t,e){this.removeSortColumn();const i=e.rowItem;if(!i)return;const o=this.getRowNodesByIndex(i.tg_view_index);if(!o)return;e.dragCloneNodes=this.getRowDragCloneNodes(o),e.dropPlaceholder=this.getRowDropPlaceholder(o),e.dragStartTop=this.getRowTop(i),e.dragRowHeight=this.getRowHeight(i),e.dragStartScrollTop=this.scrollTop,e.dragMaxScrollTop=this.scrollPane.getMaxScrollTop();const n={e:t,rowItem:i};this.trigger(y.onRowDragged,n),this.isDefaultPrevented(n)||("touch"===e.type&&d.preventDefault(e.e),this.setRowState(i,"dragging"),this.setTextSelectable(!1),this.rowDropListHandler(e),this.updateDragCloneRowPosition(e))},rowDragMoveHandler:function(t,e){"touch"===e.type&&d.preventDefault(e.e),this.updateDragCloneRowPosition(e),this.updateDragPlaceholderPosition(e),this.rowDragAutoScrollHandler(e)},rowDragEndHandler:function(t,e){"touch"===e.type&&(this.protectedItem=null,d.preventDefault(e.e)),this.autoScrollStop(),this.setRowState(e.rowItem,"dragging",!1),this.setTextSelectable(!0),e.dragCloneNodes&&(e.dragCloneNodes.remove(),e.dragCloneNodes=null),e.dropPlaceholder&&(e.dropPlaceholder.remove(),e.dropPlaceholder=null),e.changed&&this.rowDropHandler(e)},updateDragCloneRowPosition:function(t){const e=this.scrollTop-t.dragStartScrollTop,i=t.dragStartTop+t.offsetY+e,o=i-this.scrollTopOffset;t.dragCloneNodes&&t.dragCloneNodes.css("top",o).show(),t.dragCurrentPosition=i+.5*t.dragRowHeight},getRowDragCloneNodes:function(t){const e=w();return t.each((function(t){const i=w(t),o=i.clone();o.appendTo(i.parent()),e.add(o)})),e.addClass("tg-clone").hide(),e},getRowDropPlaceholder:function(t){const e=w();return t.each((function(t){const i=w(t),o=w("
").addClass("tg-row-placeholder").hide(),n=i.parent();n.find(".tg-row-placeholder").remove(),o.appendTo(n),e.add(o)})),e},updateDragPlaceholderPosition:function(t){this.rowDropItemHandler(t);const e=t.dropItem;if(!e)return;let i=t.dropPosition-1;t.dropBottom?e.tg_view_last&&(i=t.dropPosition-2):e.tg_view_index-this.frozenInfo.rows==0&&(i=t.dropPosition);const o=i-this.scrollTopOffset;t.dropPlaceholder&&t.dropPlaceholder.css("top",o).show()},rowDragAutoScrollHandler:function(t){const e=t.dragCurrentPosition,i=this.scrollTop,o=this.bodyHeight-this.frozenRowsHeight,n=i+o,s=this.options.rowHeight,r=Math.min(3*s,.5*o);if(!(rn-r){const i=e-(n-r),o=this.getAutoScrollOffset(i,r);this.autoScrollStart(o,t)}else this.autoScrollStop()},getAutoScrollOffset:function(t,e){return Math.floor(t/e*20)},autoScrollStop:function(){this.autoScrollMotion&&(this.autoScrollMotion.destroy(),this.autoScrollMotion=null)},autoScrollStart:function(t,e){this.autoScrollStop();const i=e.dragMaxScrollTop;this.autoScrollMotion=new B,this.autoScrollMotion.bind(B.EVENT.MOTION_MOVE,(()=>{const o=d.clamp(this.scrollTop+t,0,i);o!==this.scrollTop?(this.setScrollTop(o),this.updateDragCloneRowPosition(e),this.updateDragPlaceholderPosition(e)):this.autoScrollStop()})),this.autoScrollMotion.once(B.EVENT.MOTION_END,(()=>{this.autoScrollStart(t,e)})),this.autoScrollMotion.start({duration:200})},rowDropListHandler:function(t){const e=this.getRowDropList(t);if(!d.isList(e))return;const i=t.rowItem,o=e.filter((t=>{if(t===i)return!1;if(t.tg_frozen)return!1;let e=t.tg_parent;for(;e;){if(e===i)return!1;e=e.tg_parent}return!0}));if(!d.isList(o))return;const n=[];o.forEach((t=>{const e=this.getRowTop(t),i=this.getRowHeight(t);n.push({rowItem:t,position:e}),n.push({rowItem:t,position:e+i-1,dropBottom:!0})})),t.dropList=n},getRowDropList:function(t){const e=this.options.rowDragCrossLevel;return e?"function"==typeof e?e.call(this,t):this.viewRows:this.getRowParentSubs(t.rowItem)},rowDropItemHandler:function(t){const e=t.dropList;if(!e)return;const i=t.dragCurrentPosition;let o=Number.MAX_VALUE;for(let n=0,s=e.length;no)break;o=r,t.dropItem=s.rowItem,t.dropBottom=s.dropBottom,t.dropPosition=s.position}},rowDragDropPositionHandler:function(t,e,i){const o=this.getRowParentSubs(t),n=t.tg_sub_index;let s,r;return this.isDropIntoGroupFirstChild(e,i)?(s=e.subs,r=0):(s=this.getRowParentSubs(e),r=e.tg_sub_index,o===s&&n{this.trigger(y.onRowDropped,n)})),this.render({type:"rows",scrollRow:i})}},It={getMoveFocusRow:function(t,e){let i=t[0];return e>0&&(i=t[t.length-1]),i},getMoveLengthInList:function(t,e){let i=0;return t.forEach((t=>{this.getRowParentSubs(t)===e&&(i+=1)})),i},getMoveInfo:function(t,e,i){const o=this.getRowParentSubs(i);let n=i.tg_sub_index+e;const s=i.tg_parent;if(s&&this.options.rowMoveCrossLevel){const e=0,i=s.tg_subs_length-1;if(ni){const e=n-i;return this.getMoveInfo(t,e,s)}}if(e>0){n-=this.getMoveLengthInList(t,o)-1}return n=d.clamp(n,0,o.length),{list:o,index:n}},moveRowsHandler:function(t,e){(t=this.removeRowsHandler(t)).reverse();const i=this.getMoveFocusRow(t,e),o=this.getMoveInfo(t,e,i),n=[o.index,0].concat(t);return o.list.splice.apply(o.list,n),this.initRowsHandler(),this.onNextUpdated((function(){this.scrollRowIntoView(i),this.trigger(y.onRowMoved,t)})),this.removeSortColumn(),this.update(),!0},moveRows:function(t,e){t=d.toList(t);const i=[];return t.forEach((t=>{const e=this.getRowItem(t);e&&i.push(e)})),!!i.length&&(!(i.length>=this.getRowsLength())&&(0!==(e=d.toNum(e,!0))&&this.moveRowsHandler(i,e)))},moveRowsUp:function(t){return this.moveRows(t,-1)},moveRowsDown:function(t){return this.moveRows(t,1)},moveRowsToTop:function(t){return this.moveRows(t,-this.getRowsLength(!0))},moveRowsToBottom:function(t){return this.moveRows(t,this.getRowsLength(!0))},moveSelectedRowsUp:function(){return this.moveRows(this.getSelectedRows(),-1)},moveSelectedRowsDown:function(){return this.moveRows(this.getSelectedRows(),1)},moveSelectedRowsToTop:function(){return this.moveRows(this.getSelectedRows(),-this.getRowsLength(!0))},moveSelectedRowsToBottom:function(){return this.moveRows(this.getSelectedRows(),this.getRowsLength(!0))}},Lt={getSelectedRow:function(){let t=null;return this.forEachSelectableRow((function(e){if(e.selected)return t=e,!1})),t},getSelectedRows:function(){const t=[];return this.forEachSelectableRow((function(e){e.selected&&t.push(e)})),t.length>1&&t.sort((function(t,e){const i=t.tg_selected_index,o=e.tg_selected_index;return i>o?1:i0&&void 0!==arguments[0])||arguments[0];if(t=Boolean(t),this.globalSelectedIndex=0,t&&!this.options.selectMultiple)return this;const e=this.getAllSelectedChangedList(t);return e.length?(this.updateRowsSelectedState(e),this):this},setRowSelected:function(){return(this.options.selectMultiple?this.setRowMultipleSelected:this.setRowSingleSelected).apply(this,arguments)},setRowSingleSelected:function(t){const e=this.getRowItem(t);if(!e)return this;if(!this.isRowSelectable(e))return this;if(e.selected)return this;const i=[],o=this.getSelectedRow();return o&&o.selected&&i.push(o),e.selected||i.push(e),i.length?(this.updateRowsSelectedState(i),this):this},setRowMultipleSelected:function(t,e){if(0===arguments.length)return this;if(1===arguments.length&&!1===arguments[0])return this.selectAll(!1);const i=this.toRowItemList(t,(t=>this.isRowSelectable(t)));return i.length?!1===e?(this.setRowListUnselected(i),this):d.hasShiftKey(e)&&1===i.length?(this.setRowBetweenListSelected(i[0]),this):(this.updateRowsSelectedState(i),this):this},setRowListUnselected:function(t){const e=this.getSelectedChangedList(t,!1);e.length&&this.updateRowsSelectedState(e)},setRowBetweenListSelected:function(t){const e=this.previousSelectedRow;if(e&&e!==t){const i=this.getBetweenSelectedChangedList(e,t);if(!i.length)return;this.updateRowsSelectedState(i,!0)}else this.updateRowsSelectedState([t])},getAllSelectedChangedList:function(t){const e=[];return this.forEachSelectableRow((i=>{this.isSelectedChanged(i,t)&&e.push(i)})),e},getSelectedChangedList:function(t,e){const i=[];return t.forEach((t=>{this.isSelectedChanged(t,e)&&i.push(t)})),i},getBetweenSelectedChangedList:function(t,e){const i=t.tg_index,o=e.tg_index,n=[];if(i=o;)n.push(t),t--}return this.toRowItemList(n,(t=>this.isRowSelectable(t)&&!t.selected))},updateRowsSelectedState:function(t,e){let i;t.forEach((t=>{const e=!t.selected;t.selected=e,e&&(t.tg_selected_index=this.globalSelectedIndex++,i=t),this.renderRowSelectedState(t)})),e||(this.previousSelectedRow=i),this.renderSelectAllState(),this.onNextUpdated((()=>{this.trigger(y.onSelectChanged,t)})),this.render()},renderRowSelectedState:function(t){const e=t.tg_view_index;this.viewport.rows.includes(e)&&(this.renderRowState(t,"selected"),this.flushCell(e,this.selectColumn.tg_view_index))},renderSelectAllState:function(){this.isSelectAllVisible()&&(this.asyncRenderSelectAllState||(this.asyncRenderSelectAllState=d.microtask(this.renderSelectAllStateSync)),this.asyncRenderSelectAllState.apply(this,arguments))},renderSelectAllStateSync:function(){const t=this.getSelectAllState();if(t===this.previousSelectAllState)return;this.previousSelectAllState=t;const e=this.selectColumn,i=w(this.getColumnHeaderNode(e)).find(".tg-select-icon-all");i.length&&(i.removeClass("tg-selected tg-mixed"),t&&i.addClass(`tg-${t}`))},getSelectAllState:function(){let t=0;this.forEachSelectableRow((e=>{t+=1}));const e=this.getSelectedRows().length;let i="mixed";return 0===e?(i="",this.previousSelectedRow=null):e===t&&(i="selected"),i},isSelectAllVisible:function(){const t=this.options;return!!(t.selectVisible&&t.selectAllVisible&&t.selectMultiple)}},xt={setRowHover:function(t,e){const i=this.getRowItem(t);return i?(this.renderRowHover(i,e),this):this},renderRowHover:function(t,e){if(this.previousHover&&(this.previousHover.removeClass("tg-hover"),this.previousHover=null),!e)return this;if(!1===this.rowHoverable)return;if(!1===t.hoverable)return this;if(t.tg_frozen&&!this.options.frozenRowHoverable)return this;const i=t.tg_view_index;return this.previousHover=this.$body.find(`.tg-row[row='${i}']`).addClass("tg-hover"),this},setRowState:function(t,e){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const o=this.getRowItem(t);return o?(o.tg_state_names||(o.tg_state_names=new Set),o.tg_state_names.add(e),o[e]=i,this.renderRowState(o,e),this):this},renderRowState:function(t,e){const i=this.getRowNodesByIndex(t.tg_view_index);if(i){const o=`tg-${e}`;t[e]?i.addClass(o):i.removeClass(o)}}},zt={getRowItem:function(t){return d.isNum(t)?(t<0&&(t=this.rowsInfo.length+t),this.rowsInfo.indexCache[t]):t?d.isNum(t.tg_index)?t:this.getRowItemById(t.id||t):void 0},getRowItemById:function(t){return this.getRowItemBy("id",t)},getRowItemBy:function(t,e){if(void 0!==e)return this.rowsInfo.indexCache.find((i=>i[t]===e))},getRowsLength:function(t){return t?this.rowsInfo.length:this.viewRows.length},getViewRowItem:function(t){return this.viewRows[t]},getPreRenderRowInfo:function(t){const e={rows:[],rowNotFound:!1,benchmark:0};if(!t.length)return 0===this.getRowsLength()&&(e.rowNotFound=!0),e;const i=[],o=this.frozenInfo.row;return t.forEach((t=>{this.getRowCache(t)?t>o&&i.push(t):e.rows.push(t)})),i.length&&(e.benchmark=Math.min.apply(Math,i)),e.rows.sort((function(t,i){return t{this.renderRowNodes(t,e.benchmark)}))},createRowNode:function(t,e,i,o,n,s){const r=document.createElement("div");return r.setAttribute("row",t),r.className=i,o&&(r.style.cssText=o),r.style.top=`${n}px`,s!==this.options.rowHeight&&(r.style.height=`${s}px`,r.style.lineHeight=`${s}px`),this.setNodeDataCache(r,{row:t,rowItem:e,rowNode:r}),r},appendRowNode:function(t,e,i,o){ithis.frozenInfo.row))return e;e-=this.frozenRowsHeight}return e-=this.scrollTopOffset,e},getRowTop:function(t){let e=t.tg_top;return t.tg_frozen||(e-=this.frozenRowsHeight),e},getRowVPos:function(t){const e=this.frozenInfo.bottom,i=this.frozenInfo.row;let o="top";return this.frozenInfo.rows&&(t<=i?e&&(o="bottom"):e||(o="bottom")),o},getRowCanvas:function(t,e){return"top"===t?"left"===e?this.$bodyTL:this.$bodyTR:"left"===e?this.$bodyBL:this.$bodyBR}},Mt={CHANGE:"change",START:"start",END:"end"},Pt={h:{type:"h",className:"tg-scrollbar-h",offset:"left",size:"width",page:"pageX",axis:"x",offsetName:"offsetX"},v:{type:"v",className:"tg-scrollbar-v",offset:"top",size:"height",page:"pageY",axis:"y",offsetName:"offsetY"}};class Nt extends k{static EVENT=Mt;static H="h";static V="v";type="h";settings={};size=0;viewSize=0;bodySize=0;trackSize=0;position=0;scale=0;thumbPosition=0;thumbScale=0;constructor(t,e){super(),this.settings=Pt[t]||Pt.h,this.type=this.settings.type,this.id=d.uid(4,`tg-scrollbar-${this.type}-`),this.$holder=w(e),this.$holder.find(`.${this.settings.className}`).remove(),this.options=this.generateOptions()}generateOptions(t){return d.merge({size:15,round:!1,blank:!1,motionDuration:200},t)}updateOptions(t){this.options=this.generateOptions(t);let e=this.options.size;d.isNum(e)||(e=d.toNum(e)),e=Math.round(e),e=Math.max(e,0),e=Math.min(e,30),this.size=e}create(){this.$container=w('').appendTo(this.$holder),this.$container.attr("id",this.id),this.$container.addClass(d.classMap(["tg-scrollbar",this.settings.className,{"tg-scrollbar-round":this.options.round}])),this.$track=this.$container.find(".tg-scrollbar-track"),this.$thumb=this.$container.find(".tg-scrollbar-thumb"),this.thumbDrag=new O,this.thumbDrag.bind(O.EVENT.DRAG_START,((t,e)=>{this.thumbDragStart(e)})).bind(O.EVENT.DRAG_MOVE,((t,e)=>{this.thumbDragMove(e)})).bind(O.EVENT.DRAG_END,((t,e)=>{this.thumbDragEnd(e)}));const t=this.$container.get(0);return this.scrollEvents={mousedown:{handler:e=>{e.target.classList.contains("tg-scrollbar-thumb")?this.thumbMouseDownHandler(e):(this.trackEvents={mouseup:{handler:t=>{this.trackMouseupHandler(t)},options:{once:!0}}},d.bindEvents(this.trackEvents,t),this.trackMousedownHandler(e))},options:!0},selectstart:{handler:t=>{d.preventDefault(t)},options:!0}},d.bindEvents(this.scrollEvents,t),this}getBlank(){return this.options.blank}getSize(){return this.size}getViewSize(){return this.viewSize}getBodySize(){return this.bodySize}getTrackMouseDirection(){let t=1;return this.trackMousePosition0){const i=this.getMaxThumbPosition();t=Math.round(i*this.position/e),t=d.clamp(t,0,i)}return this.setThumbPosition(t),this}trackMousedownHandler(t){return this.motionStop(),this.trackMousePosition=this.getTrackMousePos(t),this.motionStart(),this}trackMouseupHandler(t){return d.unbindEvents(this.trackEvents),this.motionStop(),this.motionStarted||(this.trackMousePosition=this.getTrackMousePos(t),this.trackScrollHandler(),this.triggerEvent()),this}trackScrollHandler(){const t=Math.max(0,this.viewSize-20)*this.getTrackMouseDirection();return this.setOffset(t),this}motionStop(){return this.motion&&(this.motion.destroy(),this.motion=null),this}motionStart(){const t=this.position,e=Math.round(this.trackMousePosition/this.viewSize*this.getMaxPosition());return this.motionStarted=!1,this.motion=new B,this.motion.bind(B.EVENT.MOTION_START,((t,e)=>{this.motionStarted=!0})),this.motion.bind(B.EVENT.MOTION_MOVE,((t,e)=>{this.motionUpdateHandler(t,e)})),this.motion.start({duration:this.options.motionDuration,from:t,till:e}),this}motionUpdateHandler(t,e){e!==this.position&&(this.setPosition(e),this.triggerEvent())}thumbMouseDownHandler(t){this.$thumb.addClass("tg-scrollbar-thumb-hold"),this.thumbDrag.start(t,{target:this.$thumb})}thumbDragStart(t){this.motionStop(),t.thumbPositionStart=this.thumbPosition,this.trigger(Mt.START)}thumbDragMove(t){let e=t.thumbPositionStart+t[this.settings.offsetName];const i=this.getMaxThumbPosition();e=d.clamp(e,0,i),this.setThumbPosition(e);let o=0;i>0&&(o=d.per(e/i)*this.getMaxPosition(),o=Math.round(o)),this.position=o,this.triggerEvent()}thumbDragEnd(t){this.$thumb&&this.$thumb.removeClass("tg-scrollbar-thumb-hold"),this.trigger(Mt.END)}triggerEvent(){this.trigger(Mt.CHANGE,this.position)}getPosition(){return this.position}setPosition(t){t=d.toNum(t,!0);const e=this.getMaxPosition();t=d.clamp(t,0,e),this.position=t,this.updateThumbPosition()}getMaxPosition(){return this.bodySize-this.viewSize}updatePosition(){const t=this.getMaxPosition(),e=d.clamp(this.position,0,t);this.position=e}setOffset(t){t=d.toNum(t);const e=this.position+t;return this.setPosition(e),this}getScale(){return this.scale}setScale(t){return t=d.per(t),this.scale=t,this.scaleChangeHandler(),this}scaleChangeHandler(){let t=Math.round(this.viewSize*this.scale);if(t=Math.max(t,Math.round(1.5*this.options.size)),t=Math.min(t,this.viewSize-1),this.thumbSize=t,this.$thumb){const t={};"h"===this.type?(t.height=this.size,t.width=this.thumbSize):(t.width=this.size,t.height=this.thumbSize),this.$thumb.css(t)}}updateTrackSize(){const t={};return"h"===this.type?(t.width=this.trackSize,t.height=this.size):(t.height=this.trackSize,t.width=this.size),this.$container.css(t),this}updateThumbSize(){let t=0;return this.bodySize&&(t=this.trackSize/this.bodySize),this.setScale(t),this}parseSize(t){return t=d.toNum(t),t=Math.round(t),t=Math.max(t,0)}updateSize(t,e,i){t=this.parseSize(t),this.viewSize=t,e=this.parseSize(e),this.bodySize=e,i=d.isNum(i)?this.parseSize(i):t,this.trackSize=i,this.previousFadeIn=null}fade(t){return!(!this.$container||!this.size)&&(this.previousFadeIn!==t&&(this.previousFadeIn=t,t?this.$container.hasClass("tg-fade-out")&&this.$container.removeClass("tg-fade-out").addClass("tg-fade-in"):this.$container.removeClass("tg-fade-in").addClass("tg-fade-out"),!0))}show(){if(this.updatePosition(),!this.getBlank())return!this.$container&&this.size>0&&this.create(),this.$container?(this.updateTrackSize(),this.updateThumbSize(),this):this;this.remove()}hide(){return this.updatePosition(),this.remove(),this}remove(){if(this.motionStop(),d.unbindEvents(this.scrollEvents),d.unbindEvents(this.trackEvents),this.thumbDrag&&(this.thumbDrag.destroy(),this.thumbDrag=null),!this.$container)return this;this.$thumb=null,this.$track=null,this.$container.remove(),this.$container=null}destroy(){return this.remove(),this}}const _t={CHANGE:"change",START:"start",END:"end"};class kt extends k{static EVENT=_t;visible=!0;constructor(t,e){super(),this.id=d.uid(4,`tg-scroll-pane-${e}-`),this.gradientInfo=[],this.$container=w(t).attr("id",this.id),this.$container.addClass("tg-scroll-pane"),this.$scrollView=this.$container.find(".tg-scroll-view"),this.$scrollBody=this.$scrollView.find(".tg-scroll-body"),this.scrollbarH=new Nt(Nt.H,this.$container),this.scrollbarH.bind(Nt.EVENT.CHANGE,((t,e)=>{this.scrollHChangeHandler()})).bind(Nt.EVENT.START,(t=>{this.scrollStartEndHandler(!0)})).bind(Nt.EVENT.END,(t=>{this.scrollStartEndHandler()})),this.scrollbarV=new Nt(Nt.V,this.$container),this.scrollbarV.bind(Nt.EVENT.CHANGE,((t,e)=>{this.scrollVChangeHandler()})).bind(Nt.EVENT.START,(t=>{this.scrollStartEndHandler(!0)})).bind(Nt.EVENT.END,(t=>{this.scrollStartEndHandler()})),this.options=this.generateOptions()}generateOptions(t){return d.merge({scrollbarH:{},scrollbarV:{},scrollbarFade:!1,scrollSizeOnKeyPress:20,gradient:30},t)}scrollStartEndHandler(t){t?this.trigger(_t.START):this.trigger(_t.END)}show(){return this.$container.show(),this.visible=!0,this}hide(){return this.$container.hide(),this.visible=!1,this}width(){return this.scrollPaneW}height(){return this.scrollPaneH}render(t){return this.visible?(this.options=this.generateOptions(t),this.update(),this):this}update(){this.scrollPaneW=this.options.scrollPaneW,this.scrollPaneH=this.options.scrollPaneH,this.scrollBodyW=this.options.scrollBodyW,this.scrollBodyH=this.options.scrollBodyH,this.updateScrollbar()}setGroupH(t){this.groupH=d.toList(t)}setGroupV(t){this.groupV=d.toList(t)}updateGroupH(){if(!d.isList(this.groupH))return this;const t=this.scrollbarH.getPosition();return this.groupH.forEach((function(e){e&&e.updateScrollHFromGroup(t)})),this}updateGroupV(){if(!d.isList(this.groupV))return this;const t=this.scrollbarV.getPosition();return this.groupV.forEach((function(e){e&&e.updateScrollVFromGroup(t)})),this}updateGroupList(){this.updateGroupH(),this.updateGroupV()}updateScrollHFromGroup(t){this.scrollbarH.getPosition()!==t&&(this.scrollbarH.setPosition(t),this.updateScrollLeft(),this.triggerEvent())}updateScrollVFromGroup(t){this.scrollbarV.getPosition()!==t&&(this.scrollbarV.setPosition(t),this.updateScrollTop(),this.triggerEvent())}setPosition(t,e){return this.scrollbarH.setPosition(t),this.scrollbarV.setPosition(e),this.updateScrollLeft(),this.updateScrollTop(),this.updateGroupList(),this}updateScrollbar(){this.scrollbarH.updateOptions(this.options.scrollbarH),this.scrollbarV.updateOptions(this.options.scrollbarV),this.updateScrollState(),this.updateScrollView(),this.updateScrollTrack(),this.scrollbarH.updateSize(this.scrollViewW,this.scrollBodyW,this.scrollTrackW),this.scrollbarV.updateSize(this.scrollViewH,this.scrollBodyH,this.scrollTrackH),this.hasScrollH?(this.scrollbarH.show(),this.scrollbarH.setPosition(this.scrollbarH.getPosition())):this.scrollbarH.hide(),this.hasScrollV?(this.scrollbarV.show(),this.scrollbarV.setPosition(this.scrollbarV.getPosition())):this.scrollbarV.hide(),this.updateScrollLeft(),this.updateScrollTop(),this.updateGroupList()}updateScrollState(){const t=this.scrollbarH.getSize(),e=this.scrollbarV.getSize(),i=this.scrollbarH.getBlank(),o=this.scrollbarV.getBlank(),n=this.options.scrollbarFade;let s=!1,r=0;(function(){(this.scrollPaneWe&&t.push("left"),ie&&t.push("top"),o{const i=`tg-gradient-${e}`;t.includes(e)?this.$container.addClass(i):this.$container.removeClass(i)})))}getScrollLeft(){return this.scrollbarH.getPosition()}getScrollTop(){return this.scrollbarV.getPosition()}getMaxScrollLeft(){return this.scrollbarH.getMaxPosition()}getMaxScrollTop(){return this.scrollbarV.getMaxPosition()}getScrollTopOffset(){const t=this.getScrollTop();return t-t%1e4}triggerEvent(){this.trigger(_t.CHANGE,{scrollLeft:this.getScrollLeft(),scrollTop:this.getScrollTop()})}scrollHChangeHandler(){this.updateScrollLeft(),this.updateGroupList(),this.triggerEvent()}scrollVChangeHandler(){this.updateScrollTop(),this.updateGroupList(),this.triggerEvent()}setOffsetH(t){const e=this.getScrollLeft();this.scrollbarH.setOffset(t);return this.getScrollLeft()!==e&&(this.updateScrollLeft(),this.updateGroupList(),this.triggerEvent(),!0)}setOffsetV(t){const e=this.getScrollTop();this.scrollbarV.setOffset(t);return this.getScrollTop()!==e&&(this.updateScrollTop(),this.updateGroupList(),this.triggerEvent(),!0)}mouseWheelHandler(t){const e=t.deltaX,i=t.deltaY,o=Math.abs(e);if(o>Math.abs(i)){if(this.hasScrollH)return this.setOffsetH(e)}else{if(this.hasScrollV)return this.setOffsetV(i);if(this.hasScrollH&&!o)return this.setOffsetH(i)}return!1}keyPageUpHandler(t){return this.setOffsetV(-this.scrollViewH)}keyPageDownHandler(t){return this.setOffsetV(this.scrollViewH)}keyEndHandler(t){return this.setOffsetV(this.scrollBodyH)}keyHomeHandler(t){return this.setOffsetV(-this.scrollBodyH)}keyLeftHandler(t){return this.setOffsetH(-this.options.scrollSizeOnKeyPress)}keyUpHandler(t){return this.setOffsetV(-this.options.scrollSizeOnKeyPress)}keyRightHandler(t){return this.setOffsetH(this.options.scrollSizeOnKeyPress)}keyDownHandler(t){return this.setOffsetV(this.options.scrollSizeOnKeyPress)}destroy(){return this.visible=!1,this.groupH=null,this.groupV=null,this.scrollbarV&&(this.scrollbarV.destroy(),this.scrollbarV=null),this.scrollbarH&&(this.scrollbarH.destroy(),this.scrollbarH=null),this.$container=null,this.$scrollView=null,this.$scrollBody=null,this}}const Vt={initScrollPane:function(){this.initFrozenStyle(),this.createScrollPane()},initFrozenStyle:function(){const t={HL:{container:this.$paneHL,cls:[]},HR:{container:this.$paneHR,cls:[]},TL:{container:this.$paneTL,cls:[]},TR:{container:this.$paneTR,cls:[]},BL:{container:this.$paneBL,cls:[]},BR:{container:this.$paneBR,cls:[]}},e="tg-frozen-h";this.frozenInfo.rows&&(this.frozenInfo.bottom?(t.BL.cls.push(e),t.BR.cls.push(e)):(t.TL.cls.push(e),t.TR.cls.push(e)));const i="tg-frozen-v",o="tg-frozen-line-v";this.frozenInfo.columns&&(this.frozenInfo.right?(t.HR.cls.push(i),t.TR.cls.push(i),t.BR.cls.push(i)):(t.HL.cls.push(i),t.TL.cls.push(i),t.BL.cls.push(i)),t.HL.cls.push(o),t.TL.cls.push(o),t.BL.cls.push(o));const n="tg-frozen",s=[n,e,i,o].join(" ");Object.keys(t).forEach((function(e){const i=t[e],o=i.container;o.removeClass(s);const r=i.cls;if(!r.length)return;const l=[n].concat(r).join(" ");o.addClass(l)}))},createScrollPane:function(){this.removeScrollPane(),this.scrollPaneMap={HL:new kt(this.$paneHL,"header-left"),HR:new kt(this.$paneHR,"header-right"),TL:new kt(this.$paneTL,"top-left"),TR:new kt(this.$paneTR,"top-right"),BL:new kt(this.$paneBL,"bottom-left"),BR:new kt(this.$paneBR,"bottom-right")},this.scrollPaneMap.BR.setGroupH([this.scrollPaneMap.HR,this.scrollPaneMap.TR]),this.scrollPaneMap.TR.setGroupH([this.scrollPaneMap.HR,this.scrollPaneMap.BR]),this.scrollPaneMap.BL.setGroupH([this.scrollPaneMap.HL,this.scrollPaneMap.TL]),this.scrollPaneMap.TL.setGroupH([this.scrollPaneMap.HL,this.scrollPaneMap.BL]),this.scrollPaneMap.BR.setGroupV(this.scrollPaneMap.BL),this.scrollPaneMap.BL.setGroupV(this.scrollPaneMap.BR),this.scrollPaneMap.TR.setGroupV(this.scrollPaneMap.TL),this.scrollPaneMap.TL.setGroupV(this.scrollPaneMap.TR),this.initActiveScrollPane(),this.initPaneVisibility()},initActiveScrollPane:function(){const t=this.getScrollPaneVP(),e=this.getScrollPaneHP(),i=`${t}${e}`;this.scrollPane=this.scrollPaneMap[i],this.scrollPane.bind(kt.EVENT.CHANGE,((t,e)=>{this.scrollPaneChangeHandler(t,e)})).bind(kt.EVENT.START,(t=>{this.rowHoverable=!1})).bind(kt.EVENT.END,(t=>{this.rowHoverable=!0}));let o={L:"L",R:"L"};this.frozenInfo.columns&&this.frozenInfo.right&&(o={L:"R",R:"L"});const n=`${t}${o[e]}`;this.scrollPaneFrozen=this.scrollPaneMap[n]},getScrollPaneVP:function(){return this.frozenInfo.rows&&!this.frozenInfo.bottom?"B":"T"},getScrollPaneHP:function(){return this.frozenInfo.columns&&!this.frozenInfo.right?"R":"L"},initPaneVisibility:function(){this.scrollPaneMap.HL.show(),this.scrollPaneMap.TL.show(),this.frozenInfo.columns?(this.scrollPaneMap.HR.show(),this.scrollPaneMap.TR.show(),this.frozenInfo.rows?(this.scrollPaneMap.BL.show(),this.scrollPaneMap.BR.show()):(this.scrollPaneMap.BL.hide(),this.scrollPaneMap.BR.hide())):(this.scrollPaneMap.HR.hide(),this.scrollPaneMap.TR.hide(),this.scrollPaneMap.BR.hide(),this.frozenInfo.rows?this.scrollPaneMap.BL.show():this.scrollPaneMap.BL.hide())},scrollPaneChangeHandler:function(t,e){this.hideColumnLine(),this.scrollLeft=e.scrollLeft,this.scrollTop=e.scrollTop,this.scrollRenderHandler()},scrollbarFadeInOutHandler:function(t,e){this.options.scrollbarFade&&(e?this.updateScrollPaneFade(!0):this.options.scrollbarFadeTimeout||this.updateScrollPaneFade(!1))},updateScrollPaneFade:function(t){if(!this.options.scrollbarFade)return;this.updateScrollPaneFadeSync(t);const e=this.options.scrollbarFadeTimeout;e&&(clearTimeout(this.timeout_fade),this.timeout_fade=setTimeout((()=>{this.updateScrollPaneFadeSync(!1)}),e))},updateScrollPaneFadeSync:function(t){if(this.previousScrollbarFadeIn===t)return;this.previousScrollbarFadeIn=t;const e=[];Object.keys(this.scrollPaneMap).forEach((t=>{const i=this.scrollPaneMap[t];i.hasScrollbar()&&e.push(i)})),e.length&&e.forEach((function(e){e.fade(t)}))},updateScrollPane:function(){const t=this.getScrollbarOptions();this.scrollPaneMap.HL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.headerHeight,scrollBodyW:this.bodyWidthL,scrollBodyH:this.headerHeight,scrollbarV:t.HLV,scrollbarH:t.HLH})),this.scrollPaneMap.HR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.headerHeight,scrollBodyW:this.bodyWidthR,scrollBodyH:this.headerHeight,scrollbarV:t.HRV,scrollbarH:t.HRH})),this.scrollPaneMap.TL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.paneHeightT,scrollBodyW:this.bodyWidthL,scrollBodyH:this.bodyHeightT,scrollbarV:t.TLV,scrollbarH:t.TLH})),this.scrollPaneMap.TR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.paneHeightT,scrollBodyW:this.bodyWidthR,scrollBodyH:this.bodyHeightT,scrollbarV:t.TRV,scrollbarH:t.TRH})),this.scrollPaneMap.BL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.paneHeightB,scrollBodyW:this.bodyWidthL,scrollBodyH:this.bodyHeightB,scrollbarV:t.BLV,scrollbarH:t.BLH})),this.scrollPaneMap.BR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.paneHeightB,scrollBodyW:this.bodyWidthR,scrollBodyH:this.bodyHeightB,scrollbarV:t.BRV,scrollbarH:t.BRH})),this.scrollLeft=this.getScrollLeft(),this.scrollTop=this.getScrollTop(),this.updateScrollPaneFade(Boolean(this.options.scrollbarFadeTimeout))},getScrollPaneOptions:function(t){const e=this.options;return t.scrollbarFade=e.scrollbarFade,t.gradient=d.clamp(d.toNum(e.scrollPaneGradient,!0),0,100),t},getScrollbarOptions:function(){const t=this.options.scrollbarRound,e={};return["HLH","HLV","HRH","HRV","TLH","TLV","TRH","TRV","BLH","BLV","BRH","BRV"].forEach((function(i){e[i]={size:0,round:t,blank:!1}})),this.scrollbarOptionsHandler(e),this.scrollbarFadeHandler(e),e},scrollbarOptionsHandler:function(t){const e=this.scrollbarSizeH,i=this.scrollbarSizeV;this.scrollbarHeaderHandler(t,e,i),this.frozenInfo.columns?this.frozenInfo.rows?this.scrollbarC1R1Handler(t,e,i):this.scrollbarC1R0Handler(t,e,i):this.frozenInfo.rows?this.scrollbarC0R1Handler(t,e,i):this.scrollbarC0R0Handler(t,e,i)},scrollbarFadeHandler:function(t){if(this.options.scrollbarFade)for(const e in t)if(d.hasOwn(t,e)){const i=t[e];i.size>0&&i.blank&&(i.blank=!1,i.size=0)}},scrollbarHeaderHandler:function(t,e,i){this.hasVScroll&&(this.frozenInfo.columns?(t.HRV.size=i,t.HRV.blank=1):(t.HLV.size=i,t.HLV.blank=1))},scrollbarC0R0Handler:function(t,e,i){t.TLH.size=e,t.TLV.size=i},scrollbarC0R1Handler:function(t,e,i){this.frozenInfo.bottom?this.scrollbarC0R1B1Handler(t,e,i):this.scrollbarC0R1B0Handler(t,e,i)},scrollbarC0R1B1Handler:function(t,e,i){t.BLH.size=e,t.TLV.size=i,this.hasVScroll&&(t.BLV.size=i,t.BLV.blank=1)},scrollbarC0R1B0Handler:function(t,e,i){t.BLH.size=e,t.BLV.size=i,this.hasVScroll&&(t.TLV.size=i,t.TLV.blank=1)},scrollbarC1R0Handler:function(t,e,i){this.frozenInfo.right?this.scrollbarC1R0R1Handler(t,e,i):this.scrollbarC1R0R0Handler(t,e,i)},scrollbarC1R0R1Handler:function(t,e,i){this.hasHScroll&&(t.TLH.size=e,this.scrollPaneHidden?(t.TRH.size=e,t.TLH.blank=!0):(t.TRH.size=e,t.TRH.blank=!0)),t.TRV.size=i},scrollbarC1R0R0Handler:function(t,e,i){this.hasHScroll&&(t.TRH.size=e,this.scrollPaneHidden?(t.TLH.size=e,t.TRH.blank=!0):(t.TLH.size=e,t.TLH.blank=!0)),t.TRV.size=i},scrollbarC1R1Handler:function(t,e,i){this.frozenInfo.right?this.frozenInfo.bottom?this.scrollbarC1R1R1B1Handler(t,e,i):this.scrollbarC1R1R1B0Handler(t,e,i):this.frozenInfo.bottom?this.scrollbarC1R1R0B1Handler(t,e,i):this.scrollbarC1R1R0B0Handler(t,e,i)},scrollbarC1R1R1B1Handler:function(t,e,i){this.hasHScroll&&(t.BLH.size=e,this.scrollPaneHidden&&(t.BRH.size=e,t.BLH.blank=!0)),t.TRV.size=i,this.hasVScroll&&(t.BRV.size=i,t.BRV.blank=1)},scrollbarC1R1R1B0Handler:function(t,e,i){this.hasHScroll&&(t.BLH.size=e,this.scrollPaneHidden?(t.BRH.size=e,t.BLH.blank=!0):(t.BRH.size=e,t.BRH.blank=!0)),t.BRV.size=i,this.hasVScroll&&(t.TRV.size=i,t.TRV.blank=1)},scrollbarC1R1R0B1Handler:function(t,e,i){this.hasHScroll&&(t.BRH.size=e,this.scrollPaneHidden&&(t.BLH.size=e,t.BRH.blank=!0)),t.TRV.size=i,this.hasVScroll&&(t.BRV.size=i,t.BRV.blank=1)},scrollbarC1R1R0B0Handler:function(t,e,i){this.hasHScroll&&(t.BRH.size=e,this.scrollPaneHidden?(t.BLH.size=e,t.BRH.blank=!0):(t.BLH.size=e,t.BLH.blank=!0)),t.BRV.size=i,this.hasVScroll&&(t.TRV.size=i,t.TRV.blank=1)},removeScrollPane:function(){clearTimeout(this.timeout_fade),this.previousScrollbarFadeIn=null,this.scrollPaneMap&&(Object.keys(this.scrollPaneMap).forEach((t=>{const e=this.scrollPaneMap[t];e&&e.destroy()})),this.scrollPaneMap=null,this.scrollPane=null,this.scrollPaneFrozen=null)}},Ot={updateScrollState:function(){this.updateGlobalScrollInfo(),this.updateHScrollState(),this.updateVScrollState(),this.updateBlankColumnWidth(),this.scrollStateChanged=!1,this.previousHasHScroll===this.hasHScroll&&this.previousHasVScroll===this.hasVScroll||(this.scrollStateChanged=!0,this.previousHasHScroll=this.hasHScroll,this.previousHasVScroll=this.hasVScroll,this.trigger(y.onScrollStateChanged,{hasHScroll:this.hasHScroll,hasVScroll:this.hasVScroll}))},updateGlobalScrollInfo:function(){this.totalRowsLength=this.getRowsLength(),this.totalRowsHeight=this.getRowsHeight(),this.frozenRowsHeight=this.getFrozenRowsHeight(),this.scrollRowsHeight=this.totalRowsHeight-this.frozenRowsHeight,this.totalRowsHeight=Math.max(this.totalRowsHeight,1),this.scrollRowsHeight=Math.max(this.scrollRowsHeight,1),this.flushRowFrom(this.totalRowsLength)},updateHScrollState:function(){if(this.hasHScroll=!0,this.updateScrollPaneHiddenState(),this.updateHScrollByScrollPaneHidden(),this.scrollPaneHidden)return;this.containerWidth-this.columnsWidth>=0&&(this.hasHScroll=!1)},getScrollPaneCurrentWidth:function(){return this.frozenInfo.right?this.bodyWidth-this.columnsWidthR:this.bodyWidth-this.columnsWidthL},updateHScrollByScrollPaneHidden:function(){if(this.scrollPaneHidden){this.hasHScroll=!1;this.getScrollPaneCurrentWidth()=this.totalRowsHeight&&(this.hasVScroll=!1)}},updateBlankColumnWidth:function(){let t=this.containerWidth-this.columnsWidth;!this.hasVScroll||this.hasHScroll||this.options.scrollbarFade||(t-=this.scrollbarSizeV),this.scrollPaneHidden&&(t=0),this.hasHScroll||(t>=0?(this.frozenInfo.columns?this.columnsWidthR+=t:this.columnsWidthL+=t,this.blankColumn.tg_width=t):this.hasHScroll=!0)}},$t={scrollToRow:function(t){const e=this.getRowItem(t);return this.scrollToItem(e,null),this},scrollToColumn:function(t){const e=this.getColumnItem(t);return this.scrollToItem(null,e),this},scrollToCell:function(t,e){const i=this.getRowItem(t),o=this.getColumnItem(e);return this.scrollToItem(i,o),this},scrollToFirstRow:function(){return this.setScrollTop(0),this},scrollToLastRow:function(){const t=this.getViewRows(),e=t[t.length-1],i=this.getScrollRowPosition(e);if(d.isNum(i))return this.setScrollTop(i),this},scrollToFirstColumn:function(){return this.setScrollLeft(0),this},scrollToLastColumn:function(t){const e=this.getViewColumns();let i=e[e.length-2];t&&(i=e[e.length-1]);const o=this.getScrollColumnPosition(i);if(d.isNum(o))return this.setScrollLeft(o),this},scrollRowIntoView:function(t){const e=this.getRowItem(t);return this.scrollItemIntoView(e,null),this},scrollColumnIntoView:function(t){const e=this.getColumnItem(t);return this.scrollItemIntoView(null,e),this},scrollCellIntoView:function(t,e){const i=this.getRowItem(t),o=this.getColumnItem(e);return this.scrollItemIntoView(i,o),this},setScroll:function(t,e){return t===this.scrollLeft&&e===this.scrollTop||(this.scrollLeft=t,this.scrollTop=e,this.scrollHandler()),this},setScrollLeft:function(t){return t===this.scrollLeft||(this.scrollLeft=t,this.scrollHandler()),this},setScrollTop:function(t){return t===this.scrollTop||(this.scrollTop=t,this.scrollHandler()),this},getScrollRowPosition:function(t){if(!t)return;let e=t.tg_view_index;return e-=this.frozenInfo.rows,e>=0?this.getRowTop(t):void 0},getScrollColumnPosition:function(t){if(!t)return;let e=t.tg_left;return this.frozenInfo.columns&&(e-=this.bodyWidthL),e>=0?e:void 0},scrollToItem:function(t,e){return this.scrollToChanged=!1,this.scrollToRowHandler(t),this.scrollToColumnHandler(e),this.scrollToChanged?(this.scrollHandler(),this):this},scrollToRowHandler:function(t){if(!t)return;const e=this.getScrollRowPosition(t);d.isNum(e)&&e!==this.scrollTop&&(this.scrollTop=e,this.scrollToChanged=!0)},scrollToColumnHandler:function(t){if(!t)return;const e=this.getScrollColumnPosition(t);d.isNum(e)&&e!==this.scrollLeft&&(this.scrollLeft=e,this.scrollToChanged=!0)},scrollItemIntoView:function(t,e){return this.scrollIntoViewChanged=!1,this.scrollRowIntoViewHandler(t),this.scrollColumnIntoViewHandler(e),this.scrollIntoViewChanged?(this.scrollHandler(),this):this},scrollRowIntoViewHandler:function(t){if(!t)return;const e=this.getScrollRowPosition(t);if(!d.isNum(e))return;if(ethis.scrollTop+o){const t=e-(o-i);this.scrollTop=t,this.scrollIntoViewChanged=!0}},scrollColumnIntoViewHandler:function(t){if(!t)return;const e=this.getScrollColumnPosition(t);if(!d.isNum(e))return;if(ethis.scrollLeft+o){const t=e-(o-i);this.scrollLeft=t,this.scrollIntoViewChanged=!0}},scrollOnInit:function(){const{scrollLeft:t,scrollTop:e,scrollColumn:i,scrollRow:o}=this.renderSettings;this.scrollIntoViewChanged=!1,Number.isInteger(t)&&t!==this.scrollLeft&&(this.scrollLeft=t,this.scrollIntoViewChanged=!0),Number.isInteger(e)&&e!==this.scrollTop&&(this.scrollTop=e,this.scrollIntoViewChanged=!0),i&&this.scrollColumnIntoViewHandler(i),o&&this.scrollRowIntoViewHandler(o),this.scrollIntoViewChanged&&this.scrollPane.setPosition(this.scrollLeft,this.scrollTop)},scrollHandler:function(){this.scrollPane.setPosition(this.scrollLeft,this.scrollTop),this.scrollRenderHandler()},scrollRenderHandler:function(){this.previousScrollLeft===this.scrollLeft&&this.previousScrollTop===this.scrollTop||(this.previousScrollLeft=this.scrollLeft,this.previousScrollTop=this.scrollTop,this.onNextUpdated((()=>{this.updateScrollPaneFade(!0),this.trigger(y.onScroll,{scrollLeft:this.scrollLeft,scrollTop:this.scrollTop})})),this.render())},scrollTouchStartHandler:function(t,e){this.hideColumnLine(),this.scrollTouchLeft=this.getScrollLeft(),this.scrollTouchTop=this.getScrollTop(),this.scrollMaxTouchLeft=this.getMaxScrollLeft(),this.scrollMaxTouchTop=this.getMaxScrollTop()},getTouchOrientation:function(t){return t.orientation?t.orientation:[e.LEFT,e.RIGHT].includes(t.direction)?(t.orientation||(t.orientation="Y"),t.orientation):[e.UP,e.DOWN].includes(t.direction)?(t.orientation||(t.orientation="X"),t.orientation):void 0},scrollTouchMoveHandler:function(t,e){if(e.touchLength>1)return;let i=e.offsetX,o=e.offsetY;const n=this.getTouchOrientation(e);"X"===n?i=0:"Y"===n&&(o=0);let s=this.scrollTouchLeft-i,r=this.scrollTouchTop-o;s=d.clamp(s,0,this.scrollMaxTouchLeft),r=d.clamp(r,0,this.scrollMaxTouchTop);let l=!1;this.scrollPaneHidden&&(l=this.scrollPaneFrozen.setOffsetH(-e.moveX),s=0);const h=this.getScrollLeft(),a=this.getScrollTop();(s!==h||r!==a||l)&&(d.preventDefault(e.e),this.setScroll(s,r))},scrollTouchEndHandler:function(){this.protectedItem=null},scrollTouchInertiaHandler:function(t,e){const i=this.getScrollLeft(),o=this.getScrollTop(),n=i-e.touchInertiaX,s=o-e.touchInertiaY;this.setScroll(n,s)},getScrollViewWidth:function(){let t=this.getScrollPaneWidth();return this.frozenInfo.right||(t-=this.getScrollbarWidth()),t},getScrollViewHeight:function(){let t=this.getScrollPaneHeight();return this.frozenInfo.bottom||(t-=this.getScrollbarHeight()),t},getScrollPaneWidth:function(){return this.scrollPane.width()},getScrollPaneHeight:function(){return this.scrollPane.height()},getScrollbarWidth:function(){return this.hasVScroll&&!this.options.scrollbarFade?this.scrollbarSizeV:0},getScrollbarHeight:function(){return this.hasHScroll&&!this.options.scrollbarFade?this.scrollbarSizeH:0},getScrollLeft:function(){return this.scrollPane.getScrollLeft()},getScrollTop:function(){return this.scrollPane.getScrollTop()},getMaxScrollLeft:function(){return this.scrollPane.getMaxScrollLeft()},getMaxScrollTop:function(){return this.scrollPane.getMaxScrollTop()}};class Dt{constructor(t){this.options=this.generateOptions(t)}generateOptions(t){return d.merge({ignore:null,sortField:"",sortFactor:1,sortBlankFactor:1,sortComparer:null},t)}sortList(t){if(!d.isList(t)||1===t.length)return!1;this.ignoreExcludeHandler(t);const e=this.comparerHandler(t);return this.ignoreIncludeHandler(t),e}getDefaultComparer(t){return(ft[t]||ft.string).bind(this)}comparerHandler(t){const e=this.options,i=e.sortField,o=e.sortFactor,n=e.sortBlankFactor,s=e.sortComparer;return"function"==typeof s&&(t.sort(((t,e)=>s.call(this,t,e,{sortField:i,sortFactor:o,sortBlankFactor:n}))),!0)}ignoreExcludeHandler(t){const e=this.options.ignore;this.ignoreListTop=[],this.ignoreListBottom=[];const i=[];for(let o=0,n=t.length;o{t.unshift(e.item)})),this.ignoreListBottom.forEach((e=>{t.push(e.item)}))}}const Bt={removeSortColumn:function(){return this.sortColumn=null,this.$header&&this.$header.find(".tg-column-sorted").removeClass("tg-column-sorted"),this},setSortColumn:function(t){if(!(t=this.getColumnItem(t)))return;if(!this.isColumnSortable(t))return;t===this.sortColumn?t.sortAsc=!t.sortAsc:d.hasOwn(t,"sortAsc")||(t.sortAsc=this.options.sortAsc),this.sortColumn=t;if(this.getRowsLength()-this.frozenInfo.rows<2)return;if(!this.headerCreated)return;this.updateRowsSort()&&(this.renderHeaderSort(),this.flushSort(),this.render("rows"))},renderHeaderSort:function(){const t=this.sortColumn;if(!t)return this;if(!this.isColumnSortable(t))return this;this.$header.find(".tg-column-sorted").removeClass("tg-column-sorted");const e=t.tg_view_index,i=this.$header.find(`.tg-header-item[column='${e}']`).find(".tg-column-header").addClass("tg-column-sorted");return t.sortAsc?i.removeClass("tg-sort-desc").addClass("tg-sort-asc"):i.removeClass("tg-sort-asc").addClass("tg-sort-desc"),this},getSortComparer:function(t){const e=t.comparer;if("function"==typeof e)return e;const i=this.options.sortComparers,o=i[e||t.type];return"function"==typeof o?o:i.string},updateRowsSort:function(){const t=this.sortColumn;if(!t)return!1;const e=t.id;return!!e&&this.sortRows(e,t)},sortRows:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=e.sortAsc?-1:1,o=this.options.sortBlankValueBottom?1:i,n=this.getSortComparer(e);let s=!1;const r=new Dt({ignore:function(t){return t.tg_frozen?{item:t,top:!0}:t.sortFixed?{item:t,top:"top"===t.sortFixed}:void 0},sortField:t,sortFactor:i,sortBlankFactor:o,sortComparer:n}),l=function(t){r.sortList(t)&&(s=!0),t.forEach((function(t,e){t.tg_sub_index=e,t.subs&&l(t.subs)}))};return l(this.rows),s&&this.initRowsHandler(),s}},At={default:{},lightblue:{rowHeight:35,scrollbarSize:10,scrollbarRound:!0},dark:{}},Wt={getAllThemes:function(){return Object.keys(At)},getThemeOptions:function(t){return At[t]}},Ft={update:function(){return this.flushBody(),this.render("rows"),this},updateRow:function(t,e){const i=this.getRowItem(t);if(!i)return this;if(e&&"object"==typeof e){const t=this.getItemSnapshot(e);Object.keys(t).forEach((function(e){i[e]=t[e]}))}return this.flushRow(i.tg_view_index),this.render("rows"),this},updateCell:function(t,e,i){const o=this.getRowItem(t);if(!o)return this;const n=this.getColumnItem(e);return n?(arguments.length>2&&(o[n.id]=i),this.flushCell(o.tg_view_index,n.tg_view_index),this.render("rows"),this):this},onNextUpdated:function(t){return"function"!=typeof t||this.once(y.onUpdated,t),this}},Gt={getViewport:function(){this.scrollLeft=this.getScrollLeft(),this.scrollTop=this.getScrollTop();return{rows:this.getViewportRows(),columns:this.getViewportColumns()}},getViewportRows:function(){const t=[],e=this.viewRows,i=e.length;if(!i)return t;let o=this.options.rowCacheLength;o=d.clamp(d.toNum(o,!0),0,i);const n=this.frozenInfo.rows;if(n){let e=0;for(;e1;){const n=Math.floor(.5*(e+i)),s=t[n],r=this.getRowTop(s),l=this.getRowHeight(s);if(or+l))return n;e=n}}const n=t[i];return o=e)return[];const i=[],o=this.frozenInfo.columns,n=this.viewColumns;for(let s=o,r=n.length;s0;){const n=t[0]-1;n>o&&t.unshift(n);const s=t[t.length-1]+1;si)&&!(n0&&(e.rows.length=o),i=t.options}return this.data=e,this.dataOptions=i,this}setDataSnapshot(t){return this.setData(this.generateDataSnapshot(t)),this}getData(){return this.data}toString(){return"[object Grid]"}}var Ut;Ut=jt.prototype,[v,R,S,T,E,I,L,x,z,F,G,j,K,q,J,Z,tt,et,pt,mt,bt,wt,vt,Ht,{keyTabHandler:function(t){},keyEnterHandler:function(t){},keyEscHandler:function(t){},keyPageUpHandler:function(t){return this.scrollPane.keyPageUpHandler(t)},keyPageDownHandler:function(t){return this.scrollPane.keyPageDownHandler(t)},keyEndHandler:function(t){return this.scrollPane.keyEndHandler(t)},keyHomeHandler:function(t){return this.scrollPane.keyHomeHandler(t)},keyLeftHandler:function(t){return this.scrollPaneHidden?this.scrollPaneFrozen.keyLeftHandler(t):this.scrollPane.keyLeftHandler(t)},keyUpHandler:function(t){return this.scrollPane.keyUpHandler(t)},keyRightHandler:function(t){return this.scrollPaneHidden?this.scrollPaneFrozen.keyRightHandler(t):this.scrollPane.keyRightHandler(t)},keyDownHandler:function(t){return this.scrollPane.keyDownHandler(t)}},Ct,yt,Rt,St,Tt,{showRow:function(t){return this.updateRowsInvisible(this.toRowItemList(t),!1)},hideRow:function(t){return this.updateRowsInvisible(this.toRowItemList(t),!0)},updateRowsInvisible:function(t,e){if(!t.length)return!1;const i=[];return t.forEach((t=>{t.invisible!==e&&(t.invisible=e,t.tg_invisible=e,i.push(t))})),!!i.length&&(this.update(),!0)}},Et,It,Lt,xt,zt,Vt,Ot,$t,Bt,Wt,Ft,Gt].forEach((t=>{for(const e in t){if(d.hasOwn(Ut,e))throw new Error(`ERROR: extends with an existing key: "${e}"`);Ut[e]=t[e]}}));const Xt=jt,Yt=e.VERSION,Kt=e.TIMESTAMP,qt={VERSION:Yt,TIMESTAMP:Kt,Grid:Xt,$:w,CONST:e,EventBase:k,Icon:X,Motion:B,ScrollPane:kt,Util:d}})();var n=o.$,s=o.MP,r=o._d,l=o.xA,h=o.In,a=o.T8,c=o.Gr,d=o.ht,u=o.J0,g=o.xv,f=o.Ay;export{n as $,s as CONST,r as EventBase,l as Grid,h as Icon,a as Motion,c as ScrollPane,d as TIMESTAMP,u as Util,g as VERSION,f as default};
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/js/workflow-metadata.js b/custom_nodes/ComfyUI-Manager/js/workflow-metadata.js
new file mode 100644
index 0000000000000000000000000000000000000000..82dbe0168e1fd7c359243f98bf144811cbd7ce6d
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/js/workflow-metadata.js
@@ -0,0 +1,84 @@
+/**
+ * Attaches metadata to the workflow on save
+ * - custom node pack version to all custom nodes used in the workflow
+ *
+ * Example metadata:
+ * "nodes": {
+ * "1": {
+ * type: "CheckpointLoaderSimple",
+ * ...
+ * properties: {
+ * cnr_id: "comfy-core",
+ * version: "0.3.8",
+ * },
+ * },
+ * }
+ *
+ * @typedef {Object} NodeInfo
+ * @property {string} ver - Version (git hash or semantic version)
+ * @property {string} cnr_id - ComfyRegistry node ID
+ * @property {boolean} enabled - Whether the node is enabled
+ */
+
+import { app } from "../../scripts/app.js";
+import { api } from "../../scripts/api.js";
+
+class WorkflowMetadataExtension {
+ constructor() {
+ this.name = "Comfy.CustomNodesManager.WorkflowMetadata";
+ this.installedNodes = {};
+ this.comfyCoreVersion = null;
+ }
+
+ /**
+ * Get the installed nodes info
+ * @returns {Promise>} The mapping from node name to its info.
+ * ver can either be a git commit hash or a semantic version such as "1.0.0"
+ * cnr_id is the id of the node in the ComfyRegistry
+ * enabled is true if the node is enabled, false if it is disabled
+ */
+ async getInstalledNodes() {
+ const res = await api.fetchApi("/customnode/installed");
+ return await res.json();
+ }
+
+ async init() {
+ this.installedNodes = await this.getInstalledNodes();
+ this.comfyCoreVersion = (await api.getSystemStats()).system.comfyui_version;
+ }
+
+ /**
+ * Called when any node is created
+ * @param {LGraphNode} node The newly created node
+ */
+ nodeCreated(node) {
+ try {
+ // nodeData doesn't exist if node is missing or node is frontend only node
+ if (!node?.constructor?.nodeData?.python_module) return;
+
+ const nodeProperties = (node.properties ??= {});
+ const modules = node.constructor.nodeData.python_module.split(".");
+ const moduleType = modules[0];
+
+ if (moduleType === "custom_nodes") {
+ const nodePackageName = modules[1];
+ const { cnr_id, aux_id, ver } =
+ this.installedNodes[nodePackageName] ??
+ this.installedNodes[nodePackageName.toLowerCase()] ??
+ {};
+
+ if (cnr_id === "comfy-core") return; // don't allow hijacking comfy-core name
+ if (cnr_id) nodeProperties.cnr_id = cnr_id;
+ else nodeProperties.aux_id = aux_id;
+ if (ver) nodeProperties.ver = ver.trim();
+ } else if (["nodes", "comfy_extras", "comfy_api_nodes"].includes(moduleType)) {
+ nodeProperties.cnr_id = "comfy-core";
+ nodeProperties.ver = this.comfyCoreVersion;
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ }
+}
+
+app.registerExtension(new WorkflowMetadataExtension());
diff --git a/custom_nodes/ComfyUI-Manager/json-checker.py b/custom_nodes/ComfyUI-Manager/json-checker.py
new file mode 100644
index 0000000000000000000000000000000000000000..49ae63a34809cb1215f2a8479cf73d3bcb6a9d2b
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/json-checker.py
@@ -0,0 +1,264 @@
+#!/usr/bin/env python3
+"""JSON Entry Validator
+
+Validates JSON entries based on content structure.
+
+Validation rules based on JSON content:
+- {"custom_nodes": [...]}: Validates required fields (author, title, reference, files, install_type, description)
+- {"models": [...]}: Validates JSON syntax only (no required fields)
+- Other JSON structures: Validates JSON syntax only
+
+Git repository URL validation (for custom_nodes):
+1. URLs must NOT end with .git
+2. URLs must follow format: https://github.com/{author}/{reponame}
+3. .py and .js files are exempt from this check
+
+Supported formats:
+- Array format: [{...}, {...}]
+- Object format: {"custom_nodes": [...]} or {"models": [...]}
+"""
+
+import json
+import re
+import sys
+from pathlib import Path
+from typing import Dict, List, Tuple
+
+
+# Required fields for each entry type
+REQUIRED_FIELDS_CUSTOM_NODE = ['author', 'title', 'reference', 'files', 'install_type', 'description']
+REQUIRED_FIELDS_MODEL = [] # model-list.json doesn't require field validation
+
+# Pattern for valid GitHub repository URL (without .git suffix)
+GITHUB_REPO_PATTERN = re.compile(r'^https://github\.com/[^/]+/[^/]+$')
+
+
+def get_entry_context(entry: Dict) -> str:
+ """Get identifying information from entry for error messages
+
+ Args:
+ entry: JSON entry
+
+ Returns:
+ String with author and reference info
+ """
+ parts = []
+ if 'author' in entry:
+ parts.append(f"author={entry['author']}")
+ if 'reference' in entry:
+ parts.append(f"ref={entry['reference']}")
+ if 'title' in entry:
+ parts.append(f"title={entry['title']}")
+
+ if parts:
+ return " | ".join(parts)
+ else:
+ # No identifying info - show actual entry content (truncated)
+ import json
+ entry_str = json.dumps(entry, ensure_ascii=False)
+ if len(entry_str) > 100:
+ entry_str = entry_str[:100] + "..."
+ return f"content={entry_str}"
+
+
+def validate_required_fields(entry: Dict, entry_index: int, required_fields: List[str]) -> List[str]:
+ """Validate that all required fields are present
+
+ Args:
+ entry: JSON entry to validate
+ entry_index: Index of entry in array (for error reporting)
+ required_fields: List of required field names
+
+ Returns:
+ List of error descriptions (without entry prefix/context)
+ """
+ errors = []
+
+ for field in required_fields:
+ if field not in entry:
+ errors.append(f"Missing required field '{field}'")
+ elif entry[field] is None:
+ errors.append(f"Field '{field}' is null")
+ elif isinstance(entry[field], str) and not entry[field].strip():
+ errors.append(f"Field '{field}' is empty")
+ elif field == 'files' and not entry[field]: # Empty array
+ errors.append("Field 'files' is empty array")
+
+ return errors
+
+
+def validate_git_repo_urls(entry: Dict, entry_index: int) -> List[str]:
+ """Validate git repository URLs in 'files' array
+
+ Requirements:
+ - Git repo URLs must NOT end with .git
+ - Must follow format: https://github.com/{author}/{reponame}
+ - .py and .js files are exempt
+
+ Args:
+ entry: JSON entry to validate
+ entry_index: Index of entry in array (for error reporting)
+
+ Returns:
+ List of error descriptions (without entry prefix/context)
+ """
+ errors = []
+
+ if 'files' not in entry or not isinstance(entry['files'], list):
+ return errors
+
+ for file_url in entry['files']:
+ if not isinstance(file_url, str):
+ continue
+
+ # Skip .py and .js files - they're exempt from git repo validation
+ if file_url.endswith('.py') or file_url.endswith('.js'):
+ continue
+
+ # Check if it's a GitHub URL (likely a git repo)
+ if 'github.com' in file_url:
+ # Error if URL ends with .git
+ if file_url.endswith('.git'):
+ errors.append(f"Git repo URL must NOT end with .git: {file_url}")
+ continue
+
+ # Validate format: https://github.com/{author}/{reponame}
+ if not GITHUB_REPO_PATTERN.match(file_url):
+ errors.append(f"Invalid git repo URL format (expected https://github.com/author/reponame): {file_url}")
+
+ return errors
+
+
+def validate_entry(entry: Dict, entry_index: int, required_fields: List[str]) -> List[str]:
+ """Validate a single JSON entry
+
+ Args:
+ entry: JSON entry to validate
+ entry_index: Index of entry in array (for error reporting)
+ required_fields: List of required field names
+
+ Returns:
+ List of error messages (empty if valid)
+ """
+ errors = []
+
+ # Check required fields
+ errors.extend(validate_required_fields(entry, entry_index, required_fields))
+
+ # Check git repository URLs
+ errors.extend(validate_git_repo_urls(entry, entry_index))
+
+ return errors
+
+
+def validate_json_file(file_path: str) -> Tuple[bool, List[str]]:
+ """Validate JSON file containing entries
+
+ Args:
+ file_path: Path to JSON file
+
+ Returns:
+ Tuple of (is_valid, error_messages)
+ """
+ errors = []
+
+ # Check file exists
+ path = Path(file_path)
+ if not path.exists():
+ return False, [f"File not found: {file_path}"]
+
+ # Load JSON
+ try:
+ with open(path, 'r', encoding='utf-8') as f:
+ data = json.load(f)
+ except json.JSONDecodeError as e:
+ return False, [f"Invalid JSON: {e}"]
+ except Exception as e:
+ return False, [f"Error reading file: {e}"]
+
+ # Determine required fields based on JSON content
+ required_fields = []
+
+ # Validate structure - support both array and object formats
+ entries_to_validate = []
+
+ if isinstance(data, list):
+ # Direct array format: [{...}, {...}]
+ entries_to_validate = data
+ elif isinstance(data, dict):
+ # Object format: {"custom_nodes": [...]} or {"models": [...]}
+ # Determine validation based on keys
+ if 'custom_nodes' in data and isinstance(data['custom_nodes'], list):
+ required_fields = REQUIRED_FIELDS_CUSTOM_NODE
+ entries_to_validate = data['custom_nodes']
+ elif 'models' in data and isinstance(data['models'], list):
+ required_fields = REQUIRED_FIELDS_MODEL
+ entries_to_validate = data['models']
+ else:
+ # Other JSON structures (extension-node-map.json, etc.) - just validate JSON syntax
+ return True, []
+ else:
+ return False, ["JSON root must be either an array or an object containing arrays"]
+
+ # Validate each entry
+ for idx, entry in enumerate(entries_to_validate, start=1):
+ if not isinstance(entry, dict):
+ # Show actual value for type errors
+ entry_str = json.dumps(entry, ensure_ascii=False) if not isinstance(entry, str) else repr(entry)
+ if len(entry_str) > 150:
+ entry_str = entry_str[:150] + "..."
+ errors.append(f"\n❌ Entry #{idx}: Must be an object, got {type(entry).__name__}")
+ errors.append(f" Actual value: {entry_str}")
+ continue
+
+ entry_errors = validate_entry(entry, idx, required_fields)
+ if entry_errors:
+ # Group errors by entry with context
+ context = get_entry_context(entry)
+ errors.append(f"\n❌ Entry #{idx} ({context}):")
+ for error in entry_errors:
+ errors.append(f" - {error}")
+
+ is_valid = len(errors) == 0
+ return is_valid, errors
+
+
+def main():
+ """Main entry point"""
+ if len(sys.argv) < 2:
+ print("Usage: python json-checker.py ")
+ print("\nValidates JSON entries based on content:")
+ print(" - {\"custom_nodes\": [...]}: Validates required fields (author, title, reference, files, install_type, description)")
+ print(" - {\"models\": [...]}: Validates JSON syntax only (no required fields)")
+ print(" - Other JSON structures: Validates JSON syntax only")
+ print("\nGit repo URL validation (for custom_nodes):")
+ print(" - URLs must NOT end with .git")
+ print(" - URLs must follow: https://github.com/{author}/{reponame}")
+ sys.exit(1)
+
+ file_path = sys.argv[1]
+
+ is_valid, errors = validate_json_file(file_path)
+
+ if is_valid:
+ print(f"✅ {file_path}: Validation passed")
+ sys.exit(0)
+ else:
+ print(f"Validating: {file_path}")
+ print("=" * 60)
+ print("❌ Validation failed!\n")
+ print("Errors:")
+ # Count actual errors (lines starting with " -")
+ error_count = sum(1 for e in errors if e.strip().startswith('-'))
+ for error in errors:
+ # Don't add ❌ prefix to grouped entries (they already have it)
+ if error.strip().startswith('❌'):
+ print(error)
+ else:
+ print(error)
+ print(f"\nTotal errors: {error_count}")
+ sys.exit(1)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/custom_nodes/ComfyUI-Manager/misc/Impact.pack b/custom_nodes/ComfyUI-Manager/misc/Impact.pack
new file mode 100644
index 0000000000000000000000000000000000000000..93fd32847cc827929cb6a0987466aaf2628c3145
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/misc/Impact.pack
@@ -0,0 +1,444 @@
+{
+ "Impact::MAKE_BASIC_PIPE": {
+ "category": "",
+ "config": {
+ "1": {
+ "input": {
+ "text": {
+ "name": "Positive prompt"
+ }
+ }
+ },
+ "2": {
+ "input": {
+ "text": {
+ "name": "Negative prompt"
+ }
+ }
+ }
+ },
+ "datetime": 1705418802481,
+ "external": [],
+ "links": [
+ [
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ "CLIP"
+ ],
+ [
+ 0,
+ 1,
+ 2,
+ 0,
+ 1,
+ "CLIP"
+ ],
+ [
+ 0,
+ 0,
+ 3,
+ 0,
+ 1,
+ "MODEL"
+ ],
+ [
+ 0,
+ 1,
+ 3,
+ 1,
+ 1,
+ "CLIP"
+ ],
+ [
+ 0,
+ 2,
+ 3,
+ 2,
+ 1,
+ "VAE"
+ ],
+ [
+ 1,
+ 0,
+ 3,
+ 3,
+ 3,
+ "CONDITIONING"
+ ],
+ [
+ 2,
+ 0,
+ 3,
+ 4,
+ 4,
+ "CONDITIONING"
+ ]
+ ],
+ "nodes": [
+ {
+ "flags": {},
+ "index": 0,
+ "mode": 0,
+ "order": 0,
+ "outputs": [
+ {
+ "links": [],
+ "name": "MODEL",
+ "shape": 3,
+ "slot_index": 0,
+ "type": "MODEL"
+ },
+ {
+ "links": [],
+ "name": "CLIP",
+ "shape": 3,
+ "slot_index": 1,
+ "type": "CLIP"
+ },
+ {
+ "links": [],
+ "name": "VAE",
+ "shape": 3,
+ "slot_index": 2,
+ "type": "VAE"
+ }
+ ],
+ "pos": [
+ 550,
+ 360
+ ],
+ "properties": {
+ "Node name for S&R": "CheckpointLoaderSimple"
+ },
+ "size": {
+ "0": 315,
+ "1": 98
+ },
+ "type": "CheckpointLoaderSimple",
+ "widgets_values": [
+ "SDXL/sd_xl_base_1.0_0.9vae.safetensors"
+ ]
+ },
+ {
+ "flags": {},
+ "index": 1,
+ "inputs": [
+ {
+ "link": null,
+ "name": "clip",
+ "type": "CLIP"
+ }
+ ],
+ "mode": 0,
+ "order": 1,
+ "outputs": [
+ {
+ "links": [],
+ "name": "CONDITIONING",
+ "shape": 3,
+ "slot_index": 0,
+ "type": "CONDITIONING"
+ }
+ ],
+ "pos": [
+ 940,
+ 480
+ ],
+ "properties": {
+ "Node name for S&R": "CLIPTextEncode"
+ },
+ "size": {
+ "0": 263,
+ "1": 99
+ },
+ "title": "Positive",
+ "type": "CLIPTextEncode",
+ "widgets_values": [
+ ""
+ ]
+ },
+ {
+ "flags": {},
+ "index": 2,
+ "inputs": [
+ {
+ "link": null,
+ "name": "clip",
+ "type": "CLIP"
+ }
+ ],
+ "mode": 0,
+ "order": 2,
+ "outputs": [
+ {
+ "links": [],
+ "name": "CONDITIONING",
+ "shape": 3,
+ "slot_index": 0,
+ "type": "CONDITIONING"
+ }
+ ],
+ "pos": [
+ 940,
+ 640
+ ],
+ "properties": {
+ "Node name for S&R": "CLIPTextEncode"
+ },
+ "size": {
+ "0": 263,
+ "1": 99
+ },
+ "title": "Negative",
+ "type": "CLIPTextEncode",
+ "widgets_values": [
+ ""
+ ]
+ },
+ {
+ "flags": {},
+ "index": 3,
+ "inputs": [
+ {
+ "link": null,
+ "name": "model",
+ "type": "MODEL"
+ },
+ {
+ "link": null,
+ "name": "clip",
+ "type": "CLIP"
+ },
+ {
+ "link": null,
+ "name": "vae",
+ "type": "VAE"
+ },
+ {
+ "link": null,
+ "name": "positive",
+ "type": "CONDITIONING"
+ },
+ {
+ "link": null,
+ "name": "negative",
+ "type": "CONDITIONING"
+ }
+ ],
+ "mode": 0,
+ "order": 3,
+ "outputs": [
+ {
+ "links": null,
+ "name": "basic_pipe",
+ "shape": 3,
+ "slot_index": 0,
+ "type": "BASIC_PIPE"
+ }
+ ],
+ "pos": [
+ 1320,
+ 360
+ ],
+ "properties": {
+ "Node name for S&R": "ToBasicPipe"
+ },
+ "size": {
+ "0": 241.79998779296875,
+ "1": 106
+ },
+ "type": "ToBasicPipe"
+ }
+ ],
+ "packname": "Impact",
+ "version": "1.0"
+ },
+ "Impact::SIMPLE_DETAILER_PIPE": {
+ "category": "",
+ "config": {
+ "0": {
+ "output": {
+ "0": {
+ "visible": false
+ },
+ "1": {
+ "visible": false
+ }
+ }
+ },
+ "2": {
+ "input": {
+ "Select to add LoRA": {
+ "visible": false
+ },
+ "Select to add Wildcard": {
+ "visible": false
+ },
+ "wildcard": {
+ "visible": false
+ }
+ }
+ }
+ },
+ "datetime": 1705419147116,
+ "external": [],
+ "links": [
+ [
+ null,
+ 0,
+ 2,
+ 0,
+ 6,
+ "BASIC_PIPE"
+ ],
+ [
+ 0,
+ 0,
+ 2,
+ 1,
+ 13,
+ "BBOX_DETECTOR"
+ ],
+ [
+ 1,
+ 0,
+ 2,
+ 2,
+ 15,
+ "SAM_MODEL"
+ ]
+ ],
+ "nodes": [
+ {
+ "flags": {},
+ "index": 0,
+ "mode": 0,
+ "order": 2,
+ "outputs": [
+ {
+ "links": [],
+ "name": "BBOX_DETECTOR",
+ "shape": 3,
+ "type": "BBOX_DETECTOR"
+ },
+ {
+ "links": null,
+ "name": "SEGM_DETECTOR",
+ "shape": 3,
+ "type": "SEGM_DETECTOR"
+ }
+ ],
+ "pos": [
+ 590,
+ 830
+ ],
+ "properties": {
+ "Node name for S&R": "UltralyticsDetectorProvider"
+ },
+ "size": {
+ "0": 315,
+ "1": 78
+ },
+ "type": "UltralyticsDetectorProvider",
+ "widgets_values": [
+ "bbox/Eyeful_v1.pt"
+ ]
+ },
+ {
+ "flags": {},
+ "index": 1,
+ "mode": 0,
+ "order": 3,
+ "outputs": [
+ {
+ "links": [],
+ "name": "SAM_MODEL",
+ "shape": 3,
+ "type": "SAM_MODEL"
+ }
+ ],
+ "pos": [
+ 590,
+ 960
+ ],
+ "properties": {
+ "Node name for S&R": "SAMLoader"
+ },
+ "size": {
+ "0": 315,
+ "1": 82
+ },
+ "type": "SAMLoader",
+ "widgets_values": [
+ "sam_vit_b_01ec64.pth",
+ "AUTO"
+ ]
+ },
+ {
+ "flags": {},
+ "index": 2,
+ "inputs": [
+ {
+ "link": null,
+ "name": "basic_pipe",
+ "type": "BASIC_PIPE"
+ },
+ {
+ "link": null,
+ "name": "bbox_detector",
+ "slot_index": 1,
+ "type": "BBOX_DETECTOR"
+ },
+ {
+ "link": null,
+ "name": "sam_model_opt",
+ "slot_index": 2,
+ "type": "SAM_MODEL"
+ },
+ {
+ "link": null,
+ "name": "segm_detector_opt",
+ "type": "SEGM_DETECTOR"
+ },
+ {
+ "link": null,
+ "name": "detailer_hook",
+ "type": "DETAILER_HOOK"
+ }
+ ],
+ "mode": 0,
+ "order": 5,
+ "outputs": [
+ {
+ "links": null,
+ "name": "detailer_pipe",
+ "shape": 3,
+ "type": "DETAILER_PIPE"
+ }
+ ],
+ "pos": [
+ 1044,
+ 812
+ ],
+ "properties": {
+ "Node name for S&R": "BasicPipeToDetailerPipe"
+ },
+ "size": {
+ "0": 400,
+ "1": 204
+ },
+ "type": "BasicPipeToDetailerPipe",
+ "widgets_values": [
+ "",
+ "Select the LoRA to add to the text",
+ "Select the Wildcard to add to the text"
+ ]
+ }
+ ],
+ "packname": "Impact",
+ "version": "1.0"
+ }
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/model-list.json b/custom_nodes/ComfyUI-Manager/model-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..5fcb5f0637f9fbdedaf8d37da9a390f76ae0ded8
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/model-list.json
@@ -0,0 +1,5869 @@
+{
+ "models": [
+ {
+ "name": "TAEF1 Decoder",
+ "type": "TAESD",
+ "base": "FLUX.1",
+ "save_path": "vae_approx",
+ "description": "(FLUX.1 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
+ "reference": "https://github.com/madebyollin/taesd",
+ "filename": "taef1_decoder.pth",
+ "url": "https://github.com/madebyollin/taesd/raw/main/taef1_decoder.pth",
+ "size": "4.71MB"
+ },
+ {
+ "name": "TAEF1 Encoder",
+ "type": "TAESD",
+ "base": "FLUX.1",
+ "save_path": "vae_approx",
+ "description": "(FLUX.1 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
+ "reference": "https://github.com/madebyollin/taesd",
+ "filename": "taef1_encoder.pth",
+ "url": "https://github.com/madebyollin/taesd/raw/main/taef1_encoder.pth",
+ "size": "4.71MB"
+ },
+ {
+ "name": "TAESD3 Decoder",
+ "type": "TAESD",
+ "base": "SD3",
+ "save_path": "vae_approx",
+ "description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
+ "reference": "https://github.com/madebyollin/taesd",
+ "filename": "taesd3_decoder.pth",
+ "url": "https://github.com/madebyollin/taesd/raw/main/taesd3_decoder.pth",
+ "size": "4.94MB"
+ },
+ {
+ "name": "TAESD3 Encoder",
+ "type": "TAESD",
+ "base": "SD3",
+ "save_path": "vae_approx",
+ "description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
+ "reference": "https://github.com/madebyollin/taesd",
+ "filename": "taesd3_encoder.pth",
+ "url": "https://github.com/madebyollin/taesd/raw/main/taesd3_encoder.pth",
+ "size": "4.94MB"
+ },
+ {
+ "name": "TAESDXL Decoder",
+ "type": "TAESD",
+ "base": "SDXL",
+ "save_path": "vae_approx",
+ "description": "(SDXL Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
+ "reference": "https://github.com/madebyollin/taesd",
+ "filename": "taesdxl_decoder.pth",
+ "url": "https://github.com/madebyollin/taesd/raw/main/taesdxl_decoder.pth",
+ "size": "4.91MB"
+ },
+ {
+ "name": "TAESDXL Encoder",
+ "type": "TAESD",
+ "base": "SDXL",
+ "save_path": "vae_approx",
+ "description": "(SDXL Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
+ "reference": "https://github.com/madebyollin/taesd",
+ "filename": "taesdxl_encoder.pth",
+ "url": "https://github.com/madebyollin/taesd/raw/main/taesdxl_encoder.pth",
+ "size": "4.91MB"
+ },
+ {
+ "name": "TAESD Decoder",
+ "type": "TAESD",
+ "base": "SD1.x",
+ "save_path": "vae_approx",
+ "description": "To view the preview in high quality while running samples in ComfyUI, you will need this model.",
+ "reference": "https://github.com/madebyollin/taesd",
+ "filename": "taesd_decoder.pth",
+ "url": "https://github.com/madebyollin/taesd/raw/main/taesd_decoder.pth",
+ "size": "4.91MB"
+ },
+ {
+ "name": "TAESD Encoder",
+ "type": "TAESD",
+ "base": "SD1.x",
+ "save_path": "vae_approx",
+ "description": "To view the preview in high quality while running samples in ComfyUI, you will need this model.",
+ "reference": "https://github.com/madebyollin/taesd",
+ "filename": "taesd_encoder.pth",
+ "url": "https://github.com/madebyollin/taesd/raw/main/taesd_encoder.pth",
+ "size": "4.91MB"
+ },
+ {
+ "name": "RealESRGAN x2",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "RealESRGAN x2 upscaler model",
+ "reference": "https://huggingface.co/ai-forever/Real-ESRGAN",
+ "filename": "RealESRGAN_x2.pth",
+ "url": "https://huggingface.co/ai-forever/Real-ESRGAN/resolve/main/RealESRGAN_x2.pth",
+ "size": "67.1MB"
+ },
+ {
+ "name": "RealESRGAN x4",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "RealESRGAN x4 upscaler model",
+ "reference": "https://huggingface.co/ai-forever/Real-ESRGAN",
+ "filename": "RealESRGAN_x4.pth",
+ "url": "https://huggingface.co/ai-forever/Real-ESRGAN/resolve/main/RealESRGAN_x4.pth",
+ "size": "67.0MB"
+ },
+ {
+ "name": "ESRGAN x4",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "ESRGAN x4 upscaler model",
+ "reference": "https://huggingface.co/Afizi/ESRGAN_4x.pth",
+ "filename": "ESRGAN_4x.pth",
+ "url": "https://huggingface.co/Afizi/ESRGAN_4x.pth/resolve/main/ESRGAN_4x.pth",
+ "size": "66.9MB"
+ },
+ {
+ "name": "4x_foolhardy_Remacri",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "4x_foolhardy_Remacri upscaler model",
+ "reference": "https://huggingface.co/FacehugmanIII/4x_foolhardy_Remacri",
+ "filename": "4x_foolhardy_Remacri.pth",
+ "url": "https://huggingface.co/FacehugmanIII/4x_foolhardy_Remacri/resolve/main/4x_foolhardy_Remacri.pth",
+ "size": "67.0MB"
+ },
+ {
+ "name": "4x-AnimeSharp",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "4x-AnimeSharp upscaler model",
+ "reference": "https://huggingface.co/Kim2091/AnimeSharp/",
+ "filename": "4x-AnimeSharp.pth",
+ "url": "https://huggingface.co/Kim2091/AnimeSharp/resolve/main/4x-AnimeSharp.pth",
+ "size": "67.0MB"
+ },
+ {
+ "name": "4x-UltraSharp",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "4x-UltraSharp upscaler model",
+ "reference": "https://huggingface.co/Kim2091/UltraSharp/",
+ "filename": "4x-UltraSharp.pth",
+ "url": "https://huggingface.co/Kim2091/UltraSharp/resolve/main/4x-UltraSharp.pth",
+ "size": "67.0MB"
+ },
+ {
+ "name": "4x_NMKD-Siax_200k",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "4x_NMKD-Siax_200k upscaler model",
+ "reference": "https://huggingface.co/gemasai/4x_NMKD-Siax_200k",
+ "filename": "4x_NMKD-Siax_200k.pth",
+ "url": "https://huggingface.co/gemasai/4x_NMKD-Siax_200k/resolve/main/4x_NMKD-Siax_200k.pth",
+ "size": "67.0MB"
+ },
+ {
+ "name": "8x_NMKD-Superscale_150000_G",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "8x_NMKD-Superscale_150000_G upscaler model",
+ "reference": "https://huggingface.co/uwg/upscaler",
+ "filename": "8x_NMKD-Superscale_150000_G.pth",
+ "url": "https://huggingface.co/uwg/upscaler/resolve/main/ESRGAN/8x_NMKD-Superscale_150000_G.pth",
+ "size": "67.1MB"
+ },
+ {
+ "name": "8x_NMKD-Faces_160000_G",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "8x_NMKD-Faces_160000_G upscaler model",
+ "reference": "https://huggingface.co/gemasai/8x_NMKD-Faces_160000_G/tree/main",
+ "filename": "8x_NMKD-Faces_160000_G.pth",
+ "url": "https://huggingface.co/gemasai/8x_NMKD-Faces_160000_G/resolve/main/8x_NMKD-Faces_160000_G.pth",
+ "size": "67.2MB"
+ },
+ {
+ "name": "LDSR(Latent Diffusion Super Resolution)",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "upscale_models/ldsr",
+ "description": "LDSR upscale model. Through the [a/ComfyUI-Flowty-LDSR](https://github.com/flowtyone/ComfyUI-Flowty-LDSR) extension, the upscale model can be utilized.",
+ "reference": "https://github.com/CompVis/latent-diffusion",
+ "filename": "last.ckpt",
+ "url": "https://heibox.uni-heidelberg.de/f/578df07c8fc04ffbadf3/?dl=1",
+ "size": "2.04GB"
+ },
+ {
+ "name": "stabilityai/stable-diffusion-x4-upscaler",
+ "type": "checkpoint",
+ "base": "upscale",
+ "save_path": "checkpoints/upscale",
+ "description": "This upscaling model is a latent text-guided diffusion model and should be used with SD_4XUpscale_Conditioning and KSampler.",
+ "reference": "https://huggingface.co/stabilityai/stable-diffusion-x4-upscaler",
+ "filename": "x4-upscaler-ema.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-diffusion-x4-upscaler/resolve/main/x4-upscaler-ema.safetensors",
+ "size": "3.53GB"
+ },
+ {
+ "name": "Deepbump",
+ "type": "deepbump",
+ "base": "deepbump",
+ "save_path": "deepbump",
+ "description": "Checkpoint of the deepbump model to generate height and normal maps textures from an image (requires comfy_mtb)",
+ "reference": "https://github.com/HugoTini/DeepBump",
+ "filename": "deepbump256.onnx",
+ "url": "https://github.com/HugoTini/DeepBump/raw/master/deepbump256.onnx",
+ "size": "26.7MB"
+ },
+ {
+ "name": "GFPGAN 1.3",
+ "type": "face_restore",
+ "base": "face_restore",
+ "save_path": "face_restore",
+ "description": "Face restoration",
+ "reference": "https://github.com/TencentARC/GFPGAN",
+ "filename": "GFPGANv1.3.pth",
+ "url": "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth",
+ "size": "348.6MB"
+ },
+ {
+ "name": "GFPGAN 1.4",
+ "type": "face_restore",
+ "base": "face_restore",
+ "save_path": "face_restore",
+ "description": "Face restoration",
+ "reference": "https://github.com/TencentARC/GFPGAN",
+ "filename": "GFPGANv1.4.pth",
+ "url": "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth",
+ "size": "348.6MB"
+ },
+ {
+ "name": "RestoreFormer",
+ "type": "face_restore",
+ "base": "face_restore",
+ "save_path": "face_restore",
+ "description": "Face restoration",
+ "reference": "https://github.com/TencentARC/GFPGAN",
+ "filename": "RestoreFormer.pth",
+ "url": "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/RestoreFormer.pth",
+ "size": "290.8MB"
+ },
+ {
+ "name": "Stable Video Diffusion Image-to-Video",
+ "type": "checkpoint",
+ "base": "SVD",
+ "save_path": "checkpoints/SVD",
+ "description": "Stable Video Diffusion (SVD) Image-to-Video is a diffusion model that takes in a still image as a conditioning frame, and generates a video from it.\nNOTE: 14 frames @ 576x1024",
+ "reference": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid",
+ "filename": "svd.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/resolve/main/svd.safetensors",
+ "size": "9.56GB"
+ },
+ {
+ "name": "stabilityai/Stable Zero123",
+ "type": "zero123",
+ "base": "zero123",
+ "save_path": "checkpoints/zero123",
+ "description": "Stable Zero123 is a model for view-conditioned image generation based on [a/Zero123](https://github.com/cvlab-columbia/zero123).",
+ "reference": "https://huggingface.co/stabilityai/stable-zero123",
+ "filename": "stable_zero123.ckpt",
+ "url": "https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt",
+ "size": "8.58GB"
+ },
+ {
+ "name": "Stable Video Diffusion Image-to-Video (XT)",
+ "type": "checkpoint",
+ "base": "SVD",
+ "save_path": "checkpoints/SVD",
+ "description": "Stable Video Diffusion (SVD) Image-to-Video is a diffusion model that takes in a still image as a conditioning frame, and generates a video from it.\nNOTE: 25 frames @ 576x1024 ",
+ "reference": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt",
+ "filename": "svd_xt.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt/resolve/main/svd_xt.safetensors",
+ "size": "9.56GB"
+ },
+ {
+ "name": "negative_hand Negative Embedding",
+ "type": "embedding",
+ "base": "SD1.5",
+ "save_path": "embeddings/SD1.5",
+ "description": "If you use this embedding with negatives, you can solve the issue of damaging your hands.",
+ "reference": "https://civitai.com/models/56519/negativehand-negative-embedding",
+ "filename": "negative_hand-neg.pt",
+ "url": "https://civitai.com/api/download/models/60938",
+ "size": "25KB"
+ },
+ {
+ "name": "bad_prompt Negative Embedding",
+ "type": "embedding",
+ "base": "SD1.5",
+ "save_path": "embeddings/SD1.5",
+ "description": "The idea behind this embedding was to somehow train the negative prompt as an embedding, thus unifying the basis of the negative prompt into one word or embedding.",
+ "reference": "https://civitai.com/models/55700/badprompt-negative-embedding",
+ "filename": "bad_prompt_version2-neg.pt",
+ "url": "https://civitai.com/api/download/models/60095",
+ "size": "25KB"
+ },
+ {
+ "name": "Deep Negative V1.75",
+ "type": "embedding",
+ "base": "SD1.5",
+ "save_path": "embeddings/SD1.5",
+ "description": "These embedding learn what disgusting compositions and color patterns are, including faulty human anatomy, offensive color schemes, upside-down spatial structures, and more. Placing it in the negative can go a long way to avoiding these things.",
+ "reference": "https://civitai.com/models/4629/deep-negative-v1x",
+ "filename": "ng_deepnegative_v1_75t.pt",
+ "url": "https://civitai.com/api/download/models/5637",
+ "size": "226KB"
+ },
+ {
+ "name": "EasyNegative",
+ "type": "embedding",
+ "base": "SD1.5",
+ "save_path": "embeddings/SD1.5",
+ "description": "This embedding should be used in your NEGATIVE prompt. Adjust the strength as desired (seems to scale well without any distortions), the strength required may vary based on positive and negative prompts.",
+ "reference": "https://civitai.com/models/7808/easynegative",
+ "filename": "easynegative.safetensors",
+ "url": "https://civitai.com/api/download/models/9208",
+ "size": "25KB"
+ },
+ {
+ "name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_b.safetensors",
+ "type": "checkpoint",
+ "base": "Stable Cascade",
+ "save_path": "checkpoints/Stable-Cascade",
+ "description": "Stable Cascade stage_b checkpoints",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "stable_cascade_stage_b.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_b.safetensors",
+ "size": "4.55GB"
+ },
+ {
+ "name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_c.safetensors",
+ "type": "checkpoint",
+ "base": "Stable Cascade",
+ "save_path": "checkpoints/Stable-Cascade",
+ "description": "Stable Cascade stage_c checkpoints",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "stable_cascade_stage_c.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_c.safetensors",
+ "size": "9.22GB"
+ },
+ {
+ "name": "stabilityai/Stable Cascade: stage_a.safetensors (VAE)",
+ "type": "VAE",
+ "base": "Stable Cascade",
+ "save_path": "vae/Stable-Cascade",
+ "description": "Stable Cascade: stage_a",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "stage_a.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_a.safetensors",
+ "size": "73.7MB"
+ },
+ {
+ "name": "stabilityai/Stable Cascade: effnet_encoder.safetensors (VAE)",
+ "type": "VAE",
+ "base": "Stable Cascade",
+ "save_path": "vae/Stable-Cascade",
+ "description": "Stable Cascade: effnet_encoder.\nVAE encoder for stage_c latent.",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "effnet_encoder.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/effnet_encoder.safetensors",
+ "size": "81.5MB"
+ },
+ {
+ "name": "stabilityai/Stable Cascade: stage_b.safetensors (UNET)",
+ "type": "diffusion_model",
+ "base": "Stable Cascade",
+ "save_path": "diffusion_models/Stable-Cascade",
+ "description": "Stable Cascade: stage_b",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "stage_b.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b.safetensors",
+ "size": "6.25GB"
+ },
+ {
+ "name": "stabilityai/Stable Cascade: stage_b_bf16.safetensors (UNET)",
+ "type": "diffusion_model",
+ "base": "Stable Cascade",
+ "save_path": "diffusion_models/Stable-Cascade",
+ "description": "Stable Cascade: stage_b/bf16",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "stage_b_bf16.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_bf16.safetensors",
+ "size": "3.13GB"
+ },
+ {
+ "name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
+ "type": "diffusion_model",
+ "base": "Stable Cascade",
+ "save_path": "diffusion_models/Stable-Cascade",
+ "description": "Stable Cascade: stage_b/lite",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "stage_b_lite.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite.safetensors",
+ "size": "2.80GB"
+ },
+ {
+ "name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
+ "type": "diffusion_model",
+ "base": "Stable Cascade",
+ "save_path": "diffusion_models/Stable-Cascade",
+ "description": "Stable Cascade: stage_b/bf16,lite",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "stage_b_lite_bf16.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite_bf16.safetensors",
+ "size": "1.40GB"
+ },
+ {
+ "name": "stabilityai/Stable Cascade: stage_c.safetensors (UNET)",
+ "type": "diffusion_model",
+ "base": "Stable Cascade",
+ "save_path": "diffusion_models/Stable-Cascade",
+ "description": "Stable Cascade: stage_c",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "stage_c.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c.safetensors",
+ "size": "14.4GB"
+ },
+ {
+ "name": "stabilityai/Stable Cascade: stage_c_bf16.safetensors (UNET)",
+ "type": "diffusion_model",
+ "base": "Stable Cascade",
+ "save_path": "diffusion_models/Stable-Cascade",
+ "description": "Stable Cascade: stage_c/bf16",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "stage_c_bf16.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_bf16.safetensors",
+ "size": "7.18GB"
+ },
+ {
+ "name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
+ "type": "diffusion_model",
+ "base": "Stable Cascade",
+ "save_path": "diffusion_models/Stable-Cascade",
+ "description": "Stable Cascade: stage_c/lite",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "stage_c_lite.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite.safetensors",
+ "size": "4.12GB"
+ },
+ {
+ "name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
+ "type": "diffusion_model",
+ "base": "Stable Cascade",
+ "save_path": "diffusion_models/Stable-Cascade",
+ "description": "Stable Cascade: stage_c/bf16,lite",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "stage_c_lite_bf16.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite_bf16.safetensors",
+ "size": "2.06GB"
+ },
+ {
+ "name": "stabilityai/Stable Cascade: text_encoder (CLIP)",
+ "type": "clip",
+ "base": "Stable Cascade",
+ "save_path": "text_encoders/Stable-Cascade",
+ "description": "Stable Cascade: text_encoder",
+ "reference": "https://huggingface.co/stabilityai/stable-cascade",
+ "filename": "model.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/text_encoder/model.safetensors",
+ "size": "1.39GB"
+ },
+ {
+ "name": "SDXL-Turbo 1.0 (fp16)",
+ "type": "checkpoint",
+ "base": "SDXL",
+ "save_path": "checkpoints/SDXL-TURBO",
+ "description": "SDXL-Turbo 1.0 fp16",
+ "reference": "https://huggingface.co/stabilityai/sdxl-turbo",
+ "filename": "sd_xl_turbo_1.0_fp16.safetensors",
+ "url": "https://huggingface.co/stabilityai/sdxl-turbo/resolve/main/sd_xl_turbo_1.0_fp16.safetensors",
+ "size": "6.94GB"
+ },
+ {
+ "name": "SDXL-Turbo 1.0",
+ "type": "checkpoint",
+ "base": "SDXL",
+ "save_path": "checkpoints/SDXL-TURBO",
+ "description": "SDXL-Turbo 1.0",
+ "reference": "https://huggingface.co/stabilityai/sdxl-turbo",
+ "filename": "sd_xl_turbo_1.0.safetensors",
+ "url": "https://huggingface.co/stabilityai/sdxl-turbo/resolve/main/sd_xl_turbo_1.0.safetensors",
+ "size": "13.9GB"
+ },
+ {
+ "name": "sd_xl_base_1.0_0.9vae.safetensors",
+ "type": "checkpoint",
+ "base": "SDXL",
+ "save_path": "checkpoints/SDXL",
+ "description": "Stable Diffusion XL base model (VAE 0.9)",
+ "reference": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0",
+ "filename": "sd_xl_base_1.0_0.9vae.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0_0.9vae.safetensors",
+ "size": "6.94GB"
+ },
+ {
+ "name": "sd_xl_base_1.0.safetensors",
+ "type": "checkpoint",
+ "base": "SDXL",
+ "save_path": "checkpoints/SDXL",
+ "description": "Stable Diffusion XL base model",
+ "reference": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0",
+ "filename": "sd_xl_base_1.0.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors",
+ "size": "6.94GB"
+ },
+ {
+ "name": "sd_xl_refiner_1.0_0.9vae.safetensors",
+ "type": "checkpoint",
+ "base": "SDXL",
+ "save_path": "checkpoints/SDXL",
+ "description": "Stable Diffusion XL refiner model (VAE 0.9)",
+ "reference": "https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0",
+ "filename": "sd_xl_refiner_1.0_0.9vae.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0_0.9vae.safetensors",
+ "size": "6.08GB"
+ },
+ {
+ "name": "stable-diffusion-xl-refiner-1.0",
+ "type": "checkpoint",
+ "base": "SDXL",
+ "save_path": "checkpoints/SDXL",
+ "description": "Stable Diffusion XL refiner model",
+ "reference": "https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0",
+ "filename": "sd_xl_refiner_1.0.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors",
+ "size": "6.08GB"
+ },
+ {
+ "name": "diffusers/stable-diffusion-xl-1.0-inpainting-0.1 (diffusion_models/fp16)",
+ "type": "diffusion_model",
+ "base": "SDXL",
+ "save_path": "diffusion_models/xl-inpaint-0.1",
+ "description": "Stable Diffusion XL inpainting model 0.1. You need UNETLoader instead of CheckpointLoader.",
+ "reference": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1",
+ "filename": "diffusion_pytorch_model.fp16.safetensors",
+ "url": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1/resolve/main/unet/diffusion_pytorch_model.fp16.safetensors",
+ "size": "5.14GB"
+ },
+ {
+ "name": "diffusers/stable-diffusion-xl-1.0-inpainting-0.1 (UNET)",
+ "type": "diffusion_model",
+ "base": "SDXL",
+ "save_path": "diffusion_models/xl-inpaint-0.1",
+ "description": "Stable Diffusion XL inpainting model 0.1. You need UNETLoader instead of CheckpointLoader.",
+ "reference": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1/resolve/main/unet/diffusion_pytorch_model.safetensors",
+ "size": "10.3GB"
+ },
+ {
+ "name": "sd_xl_offset_example-lora_1.0.safetensors",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/SDXL",
+ "description": "Stable Diffusion XL offset LoRA",
+ "reference": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0",
+ "filename": "sd_xl_offset_example-lora_1.0.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors",
+ "size": "49.6MB"
+ },
+
+ {
+ "name": "SDXL Lightning LoRA (2steps)",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/SDXL-Lightning",
+ "description": "SDXL Lightning LoRA (2steps)",
+ "reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
+ "filename": "sdxl_lightning_2step_lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_2step_lora.safetensors",
+ "size": "393.9MB"
+ },
+ {
+ "name": "SDXL Lightning LoRA (4steps)",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/SDXL-Lightning",
+ "description": "SDXL Lightning LoRA (4steps)",
+ "reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
+ "filename": "sdxl_lightning_4step_lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_4step_lora.safetensors",
+ "size": "393.9MB"
+ },
+ {
+ "name": "SDXL Lightning LoRA (8steps)",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/SDXL-Lightning",
+ "description": "SDXL Lightning LoRA (8steps)",
+ "reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
+ "filename": "sdxl_lightning_8step_lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_8step_lora.safetensors",
+ "size": "393.9MB"
+ },
+
+ {
+ "name": "DMD2 LoRA (4steps)",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/DMD2",
+ "description": "DMD2 LoRA (4steps)",
+ "reference": "https://huggingface.co/tianweiy/DMD2",
+ "filename": "dmd2_sdxl_4step_lora.safetensors",
+ "url": "https://huggingface.co/tianweiy/DMD2/resolve/main/dmd2_sdxl_4step_lora.safetensors",
+ "size": "787MB"
+ },
+ {
+ "name": "DMD2 LoRA (4steps/fp16)",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/DMD2",
+ "description": "DMD2 LoRA (4steps/fp16)",
+ "reference": "https://huggingface.co/tianweiy/DMD2",
+ "filename": "dmd2_sdxl_4step_lora_fp16.safetensors",
+ "url": "https://huggingface.co/tianweiy/DMD2/resolve/main/dmd2_sdxl_4step_lora_fp16.safetensors",
+ "size": "394MB"
+ },
+
+ {
+ "name": "Hyper-SD LoRA (8steps) - FLUX.1 [Dev]",
+ "type": "lora",
+ "base": "FLUX.1",
+ "save_path": "loras/HyperSD/FLUX.1",
+ "description": "Hyper-SD LoRA (8steps) - FLUX.1 [Dev]",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-FLUX.1-dev-8steps-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-FLUX.1-dev-8steps-lora.safetensors",
+ "size": "1.39GB"
+ },
+ {
+ "name": "Hyper-SD LoRA (16steps) - FLUX.1 [Dev]",
+ "type": "lora",
+ "base": "FLUX.1",
+ "save_path": "loras/HyperSD/FLUX.1",
+ "description": "Hyper-SD LoRA (16steps) - FLUX.1 [Dev]",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-FLUX.1-dev-16steps-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-FLUX.1-dev-16steps-lora.safetensors",
+ "size": "1.39GB"
+ },
+
+ {
+ "name": "Hyper-SD LoRA (1step) - SD1.5",
+ "type": "lora",
+ "base": "SD1.5",
+ "save_path": "loras/HyperSD/SD15",
+ "description": "Hyper-SD LoRA (1step) - SD1.5",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SD15-1step-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SD15-1step-lora.safetensors",
+ "size": "269MB"
+ },
+ {
+ "name": "Hyper-SD LoRA (2steps) - SD1.5",
+ "type": "lora",
+ "base": "SD1.5",
+ "save_path": "loras/HyperSD/SD15",
+ "description": "Hyper-SD LoRA (2steps) - SD1.5",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SD15-2steps-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SD15-2steps-lora.safetensors",
+ "size": "269MB"
+ },
+ {
+ "name": "Hyper-SD LoRA (4steps) - SD1.5",
+ "type": "lora",
+ "base": "SD1.5",
+ "save_path": "loras/HyperSD/SD15",
+ "description": "Hyper-SD LoRA (4steps)",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SD15-4steps-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SD15-4steps-lora.safetensors",
+ "size": "269MB"
+ },
+ {
+ "name": "Hyper-SD LoRA (8steps) - SD1.5",
+ "type": "lora",
+ "base": "SD1.5",
+ "save_path": "loras/HyperSD/SD15",
+ "description": "Hyper-SD LoRA (8steps)",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SD15-8steps-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SD15-8steps-lora.safetensors",
+ "size": "269MB"
+ },
+ {
+ "name": "Hyper-SD CFG LoRA (8steps) - SD1.5",
+ "type": "lora",
+ "base": "SD1.5",
+ "save_path": "loras/HyperSD/SD15",
+ "description": "Hyper-SD CFG LoRA (8steps)",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SD15-8steps-CFG-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SD15-8steps-CFG-lora.safetensors",
+ "size": "269MB"
+ },
+ {
+ "name": "Hyper-SD CFG LoRA (12steps) - SD1.5",
+ "type": "lora",
+ "base": "SD1.5",
+ "save_path": "loras/HyperSD/SD15",
+ "description": "Hyper-SD CFG LoRA (12steps)",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SD15-12steps-CFG-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SD15-12steps-CFG-lora.safetensors",
+ "size": "269MB"
+ },
+
+ {
+ "name": "Hyper-SD LoRA (1step) - SDXL",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/HyperSD/SDXL",
+ "description": "Hyper-SD LoRA (1step) - SDXL",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SDXL-1step-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SDXL-1step-lora.safetensors",
+ "size": "787MB"
+ },
+ {
+ "name": "Hyper-SD LoRA (2steps) - SDXL",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/HyperSD/SDXL",
+ "description": "Hyper-SD LoRA (2steps) - SDXL",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SDXL-2steps-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SDXL-2steps-lora.safetensors",
+ "size": "787MB"
+ },
+ {
+ "name": "Hyper-SD LoRA (4steps) - SDXL",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/HyperSD/SDXL",
+ "description": "Hyper-SD LoRA (4steps) - SDXL",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SDXL-4steps-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SDXL-4steps-lora.safetensors",
+ "size": "787MB"
+ },
+ {
+ "name": "Hyper-SD LoRA (8steps) - SDXL",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/HyperSD/SDXL",
+ "description": "Hyper-SD LoRA (8steps) - SDXL",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SDXL-8steps-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SDXL-8steps-lora.safetensors",
+ "size": "787MB"
+ },
+ {
+ "name": "Hyper-SD CFG LoRA (8steps) - SDXL",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/HyperSD/SDXL",
+ "description": "Hyper-SD CFG LoRA (8steps) - SDXL",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SDXL-8steps-CFG-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SDXL-8steps-CFG-lora.safetensors",
+ "size": "787MB"
+ },
+ {
+ "name": "Hyper-SD CFG LoRA (12steps) - SDXL",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/HyperSD/SDXL",
+ "description": "Hyper-SD CFG LoRA (12steps) - SDXL",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SDXL-12steps-CFG-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SDXL-12steps-CFG-lora.safetensors",
+ "size": "787MB"
+ },
+
+ {
+ "name": "Hyper-SD CFG LoRA (4steps) - SD3",
+ "type": "lora",
+ "base": "SD3",
+ "save_path": "loras/HyperSD/SD3",
+ "description": "Hyper-SD CFG LoRA (4steps) - SD3",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SD3-4steps-CFG-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SD3-4steps-CFG-lora.safetensors",
+ "size": "472MB"
+ },
+ {
+ "name": "Hyper-SD CFG LoRA (8steps) - SD3",
+ "type": "lora",
+ "base": "SD3",
+ "save_path": "loras/HyperSD/SD3",
+ "description": "Hyper-SD CFG LoRA (8steps) - SD3",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SD3-8steps-CFG-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SD3-8steps-CFG-lora.safetensors",
+ "size": "472MB"
+ },
+ {
+ "name": "Hyper-SD CFG LoRA (16steps) - SD3",
+ "type": "lora",
+ "base": "SD3",
+ "save_path": "loras/HyperSD/SD3",
+ "description": "Hyper-SD CFG LoRA (16steps) - SD3",
+ "reference": "https://huggingface.co/ByteDance/Hyper-SD",
+ "filename": "Hyper-SD3-16steps-CFG-lora.safetensors",
+ "url": "https://huggingface.co/ByteDance/Hyper-SD/resolve/main/Hyper-SD3-16steps-CFG-lora.safetensors",
+ "size": "472MB"
+ },
+
+ {
+ "name": "comfyanonymous/flux_text_encoders - t5xxl (fp16)",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "Text Encoders for FLUX (fp16)",
+ "reference": "https://huggingface.co/comfyanonymous/flux_text_encoders",
+ "filename": "t5xxl_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/flux_text_encoders/resolve/main/t5xxl_fp16.safetensors",
+ "size": "9.79GB"
+ },
+ {
+ "name": "comfyanonymous/flux_text_encoders - t5xxl (fp8_e4m3fn)",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "Text Encoders for FLUX (fp8_e4m3fn)",
+ "reference": "https://huggingface.co/comfyanonymous/flux_text_encoders",
+ "filename": "t5xxl_fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/flux_text_encoders/resolve/main/t5xxl_fp8_e4m3fn.safetensors",
+ "size": "4.89GB"
+ },
+ {
+ "name": "comfyanonymous/flux_text_encoders - t5xxl (fp8_e4m3fn_scaled)",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "Text Encoders for FLUX (fp16)",
+ "reference": "https://huggingface.co/comfyanonymous/flux_text_encoders",
+ "filename": "t5xxl_fp8_e4m3fn_scaled.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/flux_text_encoders/resolve/main/t5xxl_fp8_e4m3fn_scaled.safetensors",
+ "size": "5.16GB"
+ },
+
+ {
+ "name": "comfyanonymous/cosmos_cv8x8x8_1.0.safetensors",
+ "type": "VAE",
+ "base": "Cosmos-1.0",
+ "save_path": "default",
+ "description": "VAE model for Cosmos 1.0",
+ "reference": "https://huggingface.co/comfyanonymous/cosmos_1.0_text_encoder_and_VAE_ComfyUI/tree/main",
+ "filename": "cosmos_cv8x8x8_1.0.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/cosmos_1.0_text_encoder_and_VAE_ComfyUI/resolve/main/vae/cosmos_cv8x8x8_1.0.safetensors",
+ "size": "211MB"
+ },
+ {
+ "name": "mcmonkey/Cosmos-1_0-Diffusion-7B-Text2World.safetensors",
+ "type": "diffusion_model",
+ "base": "Cosmos-1.0",
+ "save_path": "diffusion_models/cosmos-1.0",
+ "description": "Cosmos 1.0 Text2World Diffusion Model (7B)",
+ "reference": "https://huggingface.co/mcmonkey/cosmos-1.0",
+ "filename": "Cosmos-1_0-Diffusion-7B-Text2World.safetensors",
+ "url": "https://huggingface.co/mcmonkey/cosmos-1.0/resolve/main/Cosmos-1_0-Diffusion-7B-Text2World.safetensors",
+ "size": "14.5GB"
+ },
+ {
+ "name": "mcmonkey/Cosmos-1_0-Diffusion-7B-Video2World.safetensors",
+ "type": "diffusion_model",
+ "base": "Cosmos-1.0",
+ "save_path": "diffusion_models/cosmos-1.0",
+ "description": "Cosmos 1.0 Video2World Diffusion Model (7B)",
+ "reference": "https://huggingface.co/mcmonkey/cosmos-1.0",
+ "filename": "Cosmos-1_0-Diffusion-7B-Video2World.safetensors",
+ "url": "https://huggingface.co/mcmonkey/cosmos-1.0/resolve/main/Cosmos-1_0-Diffusion-7B-Video2World.safetensors",
+ "size": "14.5GB"
+ },
+ {
+ "name": "mcmonkey/Cosmos-1_0-Diffusion-14B-Text2World.safetensors",
+ "type": "diffusion_model",
+ "base": "Cosmos-1.0",
+ "save_path": "diffusion_models/cosmos-1.0",
+ "description": "Cosmos 1.0 Text2World Diffusion Model (14B)",
+ "reference": "https://huggingface.co/mcmonkey/cosmos-1.0",
+ "filename": "Cosmos-1_0-Diffusion-14B-Text2World.safetensors",
+ "url": "https://huggingface.co/mcmonkey/cosmos-1.0/resolve/main/Cosmos-1_0-Diffusion-14B-Text2World.safetensors",
+ "size": "28.5GB"
+ },
+ {
+ "name": "mcmonkey/Cosmos-1_0-Diffusion-14B-Video2World.safetensors",
+ "type": "diffusion_model",
+ "base": "Cosmos-1.0",
+ "save_path": "diffusion_models/cosmos-1.0",
+ "description": "Cosmos 1.0 Video2World Diffusion Model (14B)",
+ "reference": "https://huggingface.co/mcmonkey/cosmos-1.0",
+ "filename": "Cosmos-1_0-Diffusion-14B-Video2World.safetensors",
+ "url": "https://huggingface.co/mcmonkey/cosmos-1.0/resolve/main/Cosmos-1_0-Diffusion-14B-Video2World.safetensors",
+ "size": "28.5GB"
+ },
+
+ {
+ "name": "google-t5/t5-base",
+ "type": "clip",
+ "base": "t5-base",
+ "save_path": "text_encoders/t5-base",
+ "description": "T5 Base: Text-To-Text Transfer Transformer. This model can be loaded via CLIPLoader for Stable Audio workflow.",
+ "reference": "https://huggingface.co/google-t5/t5-base",
+ "filename": "model.safetensors",
+ "url": "https://huggingface.co/google-t5/t5-base/resolve/main/model.safetensors",
+ "size": "892MB"
+ },
+ {
+ "name": "google-t5/t5-v1_1-xxl_encoderonly-fp16",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "The encoder part of https://huggingface.co/google/t5-v1_1-xxl, used with SD3 and Flux1",
+ "reference": "https://huggingface.co/mcmonkey/google_t5-v1_1-xxl_encoderonly",
+ "filename": "google_t5-v1_1-xxl_encoderonly-fp16.safetensors",
+ "url": "https://huggingface.co/mcmonkey/google_t5-v1_1-xxl_encoderonly/resolve/main/model.safetensors",
+ "size": "10.1GB"
+ },
+ {
+ "name": "google-t5/t5-v1_1-xxl_encoderonly-fp8_e4m3fn",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "The encoder part of https://huggingface.co/google/t5-v1_1-xxl, used with SD3 and Flux1",
+ "reference": "https://huggingface.co/mcmonkey/google_t5-v1_1-xxl_encoderonly",
+ "filename": "google_t5-v1_1-xxl_encoderonly-fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/mcmonkey/google_t5-v1_1-xxl_encoderonly/resolve/main/t5xxl_fp8_e4m3fn.safetensors",
+ "size": "4.89GB"
+ },
+
+
+ {
+ "name": "city96/t5-v1_1-xxl-encoder-Q3_K_L.gguf",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "t5xxl Text Encoder GGUF model. (Q3_K_L quantized)",
+ "reference": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf",
+ "filename": "t5-v1_1-xxl-encoder-Q3_K_L.gguf",
+ "url": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf/resolve/main/t5-v1_1-xxl-encoder-Q3_K_L.gguf",
+ "size": "2.46GB"
+ },
+ {
+ "name": "city96/t5-v1_1-xxl-encoder-Q3_K_M.gguf",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "t5xxl Text Encoder GGUF model. (Q3_K_M quantized)",
+ "reference": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf",
+ "filename": "t5-v1_1-xxl-encoder-Q3_K_M.gguf",
+ "url": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf/resolve/main/t5-v1_1-xxl-encoder-Q3_K_M.gguf",
+ "size": "2.3GB"
+ },
+ {
+ "name": "city96/t5-v1_1-xxl-encoder-Q3_K_S.gguf",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "t5xxl Text Encoder GGUF model. (Q3_K_S quantized)",
+ "reference": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf",
+ "filename": "t5-v1_1-xxl-encoder-Q3_K_S.gguf",
+ "url": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf/resolve/main/t5-v1_1-xxl-encoder-Q3_K_S.gguf",
+ "size": "2.1GB"
+ },
+ {
+ "name": "city96/t5-v1_1-xxl-encoder-Q4_K_M.gguf",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "t5xxl Text Encoder GGUF model. (Q4_K_M quantized)",
+ "reference": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf",
+ "filename": "t5-v1_1-xxl-encoder-Q4_K_M.gguf",
+ "url": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf/resolve/main/t5-v1_1-xxl-encoder-Q4_K_M.gguf",
+ "size": "2.9GB"
+ },
+ {
+ "name": "city96/t5-v1_1-xxl-encoder-Q4_K_S.gguf",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "t5xxl Text Encoder GGUF model. (Q4_K_S quantized)",
+ "reference": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf",
+ "filename": "t5-v1_1-xxl-encoder-Q4_K_S.gguf",
+ "url": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf/resolve/main/t5-v1_1-xxl-encoder-Q4_K_S.gguf",
+ "size": "2.74GB"
+ },
+ {
+ "name": "city96/t5-v1_1-xxl-encoder-Q5_K_M.gguf",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "t5xxl Text Encoder GGUF model. (Q5_K_M quantized)",
+ "reference": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf",
+ "filename": "t5-v1_1-xxl-encoder-Q5_K_M.gguf",
+ "url": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf/resolve/main/t5-v1_1-xxl-encoder-Q5_K_M.gguf",
+ "size": "3.39GB"
+ },
+ {
+ "name": "city96/t5-v1_1-xxl-encoder-Q5_K_S.gguf",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "t5xxl Text Encoder GGUF model. (Q5_K_S quantized)",
+ "reference": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf",
+ "filename": "t5-v1_1-xxl-encoder-Q5_K_S.gguf",
+ "url": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf/resolve/main/t5-v1_1-xxl-encoder-Q5_K_S.gguf",
+ "size": "3.29GB"
+ },
+ {
+ "name": "city96/t5-v1_1-xxl-encoder-Q6_K.gguf",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "t5xxl Text Encoder GGUF model. (Q6_K quantized)",
+ "reference": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf",
+ "filename": "t5-v1_1-xxl-encoder-Q6_K.gguf",
+ "url": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf/resolve/main/t5-v1_1-xxl-encoder-Q6_K.gguf",
+ "size": "3.91GB"
+ },
+ {
+ "name": "city96/t5-v1_1-xxl-encoder-Q8_0.gguf",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "t5xxl Text Encoder GGUF model. (Q8_0 quantized)",
+ "reference": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf",
+ "filename": "t5-v1_1-xxl-encoder-Q8_0.gguf",
+ "url": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf/resolve/main/t5-v1_1-xxl-encoder-Q8_0.gguf",
+ "size": "5.06GB"
+ },
+ {
+ "name": "city96/t5-v1_1-xxl-encoder-f16.gguf",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "t5xxl Text Encoder GGUF model. (float 16)",
+ "reference": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf",
+ "filename": "t5-v1_1-xxl-encoder-f16.gguf",
+ "url": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf/resolve/main/t5-v1_1-xxl-encoder-f16.gguf",
+ "size": "9.53GB"
+ },
+ {
+ "name": "city96/t5-v1_1-xxl-encoder-f32.gguf",
+ "type": "clip",
+ "base": "t5",
+ "save_path": "text_encoders/t5",
+ "description": "t5xxl Text Encoder GGUF model. (float 32)",
+ "reference": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf",
+ "filename": "t5-v1_1-xxl-encoder-f32.gguf",
+ "url": "https://huggingface.co/city96/t5-v1_1-xxl-encoder-gguf/resolve/main/t5-v1_1-xxl-encoder-f32.gguf",
+ "size": "19.1GB"
+ },
+
+ {
+ "name": "Comfy-Org/clip_l",
+ "type": "clip",
+ "base": "clip",
+ "save_path": "default",
+ "description": "clip_l model (for SD1.x, SD2.x, SDXL, SD3.5, FLUX.1, HunyuanVideo, ...) ",
+ "reference": "https://huggingface.co/Comfy-Org/stable-diffusion-3.5-fp8",
+ "filename": "clip_l.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/stable-diffusion-3.5-fp8/resolve/main/text_encoders/clip_l.safetensors",
+ "size": "246MB"
+ },
+ {
+ "name": "Comfy-Org/clip_g",
+ "type": "clip",
+ "base": "clip",
+ "save_path": "default",
+ "description": "clip_g model (for SDXL, SD3.5)",
+ "reference": "https://huggingface.co/Comfy-Org/stable-diffusion-3.5-fp8",
+ "filename": "clip_g.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/stable-diffusion-3.5-fp8/resolve/main/text_encoders/clip_g.safetensors",
+ "size": "1.39GB"
+ },
+
+ {
+ "name": "v1-5-pruned-emaonly.ckpt",
+ "type": "checkpoint",
+ "base": "SD1.5",
+ "save_path": "checkpoints/SD1.5",
+ "description": "Stable Diffusion 1.5 base model",
+ "reference": "https://huggingface.co/runwayml/stable-diffusion-v1-5",
+ "filename": "v1-5-pruned-emaonly.ckpt",
+ "url": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt",
+ "size": "4.27GB"
+ },
+ {
+ "name": "v2-1_512-ema-pruned.safetensors",
+ "type": "checkpoint",
+ "base": "SD2",
+ "save_path": "checkpoints/SD2.1",
+ "description": "Stable Diffusion 2 base model (512)",
+ "reference": "https://huggingface.co/stabilityai/stable-diffusion-2-1-base",
+ "filename": "v2-1_512-ema-pruned.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-diffusion-2-1-base/resolve/main/v2-1_512-ema-pruned.safetensors",
+ "size": "5.21GB"
+ },
+ {
+ "name": "v2-1_768-ema-pruned.safetensors",
+ "type": "checkpoint",
+ "base": "SD2",
+ "save_path": "checkpoints/SD2.1",
+ "description": "Stable Diffusion 2 base model (768)",
+ "reference": "https://huggingface.co/stabilityai/stable-diffusion-2-1",
+ "filename": "v2-1_768-ema-pruned.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-ema-pruned.safetensors",
+ "size": "5.21GB"
+ },
+ {
+ "name": "AbyssOrangeMix2 (hard)",
+ "type": "checkpoint",
+ "base": "SD1.5",
+ "save_path": "checkpoints/SD1.5",
+ "description": "AbyssOrangeMix2 - hard version (anime style)",
+ "reference": "https://huggingface.co/WarriorMama777/OrangeMixs",
+ "filename": "AbyssOrangeMix2_hard.safetensors",
+ "url": "https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix2/AbyssOrangeMix2_hard.safetensors",
+ "size": "5.57GB"
+ },
+ {
+ "name": "AbyssOrangeMix3 A1",
+ "type": "checkpoint",
+ "base": "SD1.5",
+ "save_path": "checkpoints/SD1.5",
+ "description": "AbyssOrangeMix3 - A1 (anime style)",
+ "reference": "https://huggingface.co/WarriorMama777/OrangeMixs",
+ "filename": "AOM3A1_orangemixs.safetensors",
+ "url": "https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A1_orangemixs.safetensors",
+ "size": "2.13GB"
+ },
+ {
+ "name": "AbyssOrangeMix3 A3",
+ "type": "checkpoint",
+ "base": "SD1.5",
+ "save_path": "checkpoints/SD1.5",
+ "description": "AbyssOrangeMix - A3 (anime style)",
+ "reference": "https://huggingface.co/WarriorMama777/OrangeMixs",
+ "filename": "AOM3A3_orangemixs.safetensors",
+ "url": "https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A3_orangemixs.safetensors",
+ "size": "2.13GB"
+ },
+ {
+ "name": "Waifu Diffusion 1.5 Beta3 (fp16)",
+ "type": "checkpoint",
+ "base": "SD2.1",
+ "save_path": "checkpoints/SD2.1",
+ "description": "Waifu Diffusion 1.5 Beta3",
+ "reference": "https://huggingface.co/waifu-diffusion/wd-1-5-beta3",
+ "filename": "wd-illusion-fp16.safetensors",
+ "url": "https://huggingface.co/waifu-diffusion/wd-1-5-beta3/resolve/main/wd-illusion-fp16.safetensors",
+ "size": "2.58GB"
+ },
+ {
+ "name": "illuminatiDiffusionV1_v11 unCLIP model",
+ "type": "unclip",
+ "base": "SD2.1",
+ "save_path": "checkpoints/SD2.1",
+ "description": "Mix model (SD2.1 unCLIP + illuminatiDiffusionV1_v11)",
+ "reference": "https://huggingface.co/comfyanonymous/illuminatiDiffusionV1_v11_unCLIP",
+ "filename": "illuminatiDiffusionV1_v11-unclip-h-fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/illuminatiDiffusionV1_v11_unCLIP/resolve/main/illuminatiDiffusionV1_v11-unclip-h-fp16.safetensors",
+ "size": "3.98GB"
+ },
+ {
+ "name": "Waifu Diffusion 1.5 unCLIP model",
+ "type": "unclip",
+ "base": "SD2.1",
+ "save_path": "checkpoints/SD2.1",
+ "description": "Mix model (SD2.1 unCLIP + Waifu Diffusion 1.5)",
+ "reference": "https://huggingface.co/comfyanonymous/wd-1.5-beta2_unCLIP",
+ "filename": "wd-1-5-beta2-aesthetic-unclip-h-fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/wd-1.5-beta2_unCLIP/resolve/main/wd-1-5-beta2-aesthetic-unclip-h-fp16.safetensors",
+ "size": "3.98GB"
+ },
+ {
+ "name": "sdxl_vae.safetensors",
+ "type": "VAE",
+ "base": "SDXL",
+ "save_path": "vae/SDXL",
+ "description": "SDXL-VAE",
+ "reference": "https://huggingface.co/stabilityai/sdxl-vae",
+ "filename": "sdxl_vae.safetensors",
+ "url": "https://huggingface.co/stabilityai/sdxl-vae/resolve/main/sdxl_vae.safetensors",
+ "size": "334.6MB"
+ },
+ {
+ "name": "vae-ft-mse-840000-ema-pruned",
+ "type": "VAE",
+ "base": "SD1.5",
+ "save_path": "vae/SD1.5",
+ "description": "vae-ft-mse-840000-ema-pruned",
+ "reference": "https://huggingface.co/stabilityai/sd-vae-ft-mse-original",
+ "filename": "vae-ft-mse-840000-ema-pruned.safetensors",
+ "url": "https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.safetensors",
+ "size": "334.6MB"
+ },
+ {
+ "name": "orangemix.vae",
+ "type": "VAE",
+ "base": "SD1.5",
+ "save_path": "vae/SD1.5",
+ "description": "orangemix vae model",
+ "reference": "https://huggingface.co/WarriorMama777/OrangeMixs",
+ "filename": "orangemix.vae.pt",
+ "url": "https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/VAEs/orangemix.vae.pt",
+ "size": "822.8MB"
+ },
+ {
+ "name": "kl-f8-anime2",
+ "type": "VAE",
+ "base": "SD2.1",
+ "save_path": "vae/SD2.1",
+ "description": "kl-f8-anime2 vae model",
+ "reference": "https://huggingface.co/hakurei/waifu-diffusion-v1-4",
+ "filename": "kl-f8-anime2.ckpt",
+ "url": "https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/vae/kl-f8-anime2.ckpt",
+ "size": "404.7MB"
+ },
+ {
+ "name": "OpenAI Consistency Decoder",
+ "type": "VAE",
+ "base": "SD1.5",
+ "save_path": "vae/SD1.5/openai_consistency_decoder",
+ "description": "OpenAI Consistency Decoder. Improved decoding for stable diffusion vaes.",
+ "reference": "https://github.com/openai/consistencydecoder",
+ "filename": "decoder.pt",
+ "url": "https://openaipublic.azureedge.net/diff-vae/c9cebd3132dd9c42936d803e33424145a748843c8f716c0814838bdc8a2fe7cb/decoder.pt",
+ "size": "2.49GB"
+ },
+ {
+ "name": "LCM LoRA SD1.5",
+ "type": "lora",
+ "base": "SD1.5",
+ "save_path": "loras/SD1.5/lcm",
+ "description": "Latent Consistency LoRA for SD1.5",
+ "reference": "https://huggingface.co/latent-consistency/lcm-lora-sdv1-5",
+ "filename": "pytorch_lora_weights.safetensors",
+ "url": "https://huggingface.co/latent-consistency/lcm-lora-sdv1-5/resolve/main/pytorch_lora_weights.safetensors",
+ "size": "134.6MB"
+ },
+ {
+ "name": "LCM LoRA SSD-1B",
+ "type": "lora",
+ "base": "SSD-1B",
+ "save_path": "loras/SSD-1B/lcm",
+ "description": "Latent Consistency LoRA for SSD-1B",
+ "reference": "https://huggingface.co/latent-consistency/lcm-lora-ssd-1b",
+ "filename": "pytorch_lora_weights.safetensors",
+ "url": "https://huggingface.co/latent-consistency/lcm-lora-ssd-1b/resolve/main/pytorch_lora_weights.safetensors",
+ "size": "210.0MB"
+ },
+ {
+ "name": "LCM LoRA SDXL",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/SDXL/lcm",
+ "description": "Latent Consistency LoRA for SDXL",
+ "reference": "https://huggingface.co/latent-consistency/lcm-lora-sdxl",
+ "filename": "pytorch_lora_weights.safetensors",
+ "url": "https://huggingface.co/latent-consistency/lcm-lora-sdxl/resolve/main/pytorch_lora_weights.safetensors",
+ "size": "393.9MB"
+ },
+ {
+ "name": "Segmind-Vega",
+ "type": "checkpoint",
+ "base": "segmind-vega",
+ "save_path": "checkpoints/segmind-vega",
+ "description": "The Segmind-Vega Model is a distilled version of the Stable Diffusion XL (SDXL), offering a remarkable 70% reduction in size and an impressive 100% speedup while retaining high-quality text-to-image generation capabilities.",
+ "reference": "https://huggingface.co/segmind/Segmind-Vega",
+ "filename": "segmind-vega.safetensors",
+ "url": "https://huggingface.co/segmind/Segmind-Vega/resolve/main/segmind-vega.safetensors",
+ "size": "3.29GB"
+ },
+ {
+ "name": "Segmind-VegaRT - Latent Consistency Model (LCM) LoRA of Segmind-Vega",
+ "type": "lora",
+ "base": "segmind-vega",
+ "save_path": "loras/segmind-vega",
+ "description": "Segmind-VegaRT a distilled consistency adapter for Segmind-Vega that allows to reduce the number of inference steps to only between 2 - 8 steps.",
+ "reference": "https://huggingface.co/segmind/Segmind-VegaRT",
+ "filename": "pytorch_lora_weights.safetensors",
+ "url": "https://huggingface.co/segmind/Segmind-VegaRT/resolve/main/pytorch_lora_weights.safetensors",
+ "size": "239.2MB"
+ },
+ {
+ "name": "Theovercomer8's Contrast Fix (SD2.1)",
+ "type": "lora",
+ "base": "SD2.1",
+ "save_path": "loras/SD2.1",
+ "description": "LORA: Theovercomer8's Contrast Fix (SD2.1)",
+ "reference": "https://civitai.com/models/8765/theovercomer8s-contrast-fix-sd15sd21-768",
+ "filename": "theovercomer8sContrastFix_sd21768.safetensors",
+ "url": "https://civitai.com/api/download/models/10350",
+ "size": "163MB"
+ },
+ {
+ "name": "Theovercomer8's Contrast Fix (SD1.5)",
+ "type": "lora",
+ "base": "SD1.5",
+ "save_path": "loras/SD1.5",
+ "description": "LORA: Theovercomer8's Contrast Fix (SD1.5)",
+ "reference": "https://civitai.com/models/8765/theovercomer8s-contrast-fix-sd15sd21-768",
+ "filename": "theovercomer8sContrastFix_sd15.safetensors",
+ "url": "https://civitai.com/api/download/models/10638",
+ "size": "113MB"
+ },
+ {
+ "name": "T2I-Adapter (depth)",
+ "type": "T2I-Adapter",
+ "base": "SD1.5",
+ "save_path": "controlnet/SD1.5",
+ "description": "ControlNet T2I-Adapter for depth",
+ "reference": "https://huggingface.co/TencentARC/T2I-Adapter",
+ "filename": "t2iadapter_depth_sd14v1.pth",
+ "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_depth_sd14v1.pth",
+ "size": "309.5MB"
+ },
+ {
+ "name": "T2I-Adapter (seg)",
+ "type": "T2I-Adapter",
+ "base": "SD1.5",
+ "save_path": "controlnet/SD1.5",
+ "description": "ControlNet T2I-Adapter for seg",
+ "reference": "https://huggingface.co/TencentARC/T2I-Adapter",
+ "filename": "t2iadapter_seg_sd14v1.pth",
+ "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_seg_sd14v1.pth",
+ "size": "309.5MB"
+ },
+ {
+ "name": "T2I-Adapter (sketch)",
+ "type": "T2I-Adapter",
+ "base": "SD1.5",
+ "save_path": "controlnet/SD1.5",
+ "description": "ControlNet T2I-Adapter for sketch",
+ "reference": "https://huggingface.co/TencentARC/T2I-Adapter",
+ "filename": "t2iadapter_sketch_sd14v1.pth",
+ "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_sketch_sd14v1.pth",
+ "size": "308.0MB"
+ },
+ {
+ "name": "T2I-Adapter (keypose)",
+ "type": "T2I-Adapter",
+ "base": "SD1.5",
+ "save_path": "controlnet/SD1.5",
+ "description": "ControlNet T2I-Adapter for keypose",
+ "reference": "https://huggingface.co/TencentARC/T2I-Adapter",
+ "filename": "t2iadapter_keypose_sd14v1.pth",
+ "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_keypose_sd14v1.pth",
+ "size": "309.5MB"
+ },
+ {
+ "name": "T2I-Adapter (openpose)",
+ "type": "T2I-Adapter",
+ "base": "SD1.5",
+ "save_path": "controlnet/SD1.5",
+ "description": "ControlNet T2I-Adapter for openpose",
+ "reference": "https://huggingface.co/TencentARC/T2I-Adapter",
+ "filename": "t2iadapter_openpose_sd14v1.pth",
+ "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_openpose_sd14v1.pth",
+ "size": "309.5MB"
+ },
+ {
+ "name": "T2I-Adapter (color)",
+ "type": "T2I-Adapter",
+ "base": "SD1.5",
+ "save_path": "controlnet/SD1.5",
+ "description": "ControlNet T2I-Adapter for color",
+ "reference": "https://huggingface.co/TencentARC/T2I-Adapter",
+ "filename": "t2iadapter_color_sd14v1.pth",
+ "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_color_sd14v1.pth",
+ "size": "74.8MB"
+ },
+ {
+ "name": "T2I-Adapter (canny)",
+ "type": "T2I-Adapter",
+ "base": "SD1.5",
+ "save_path": "controlnet/SD1.5",
+ "description": "ControlNet T2I-Adapter for canny",
+ "reference": "https://huggingface.co/TencentARC/T2I-Adapter",
+ "filename": "t2iadapter_canny_sd14v1.pth",
+ "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_canny_sd14v1.pth",
+ "size": "308.0MB"
+ },
+ {
+ "name": "T2I-Style model",
+ "type": "T2I-Style",
+ "base": "SD1.5",
+ "save_path": "controlnet/SD1.5",
+ "description": "ControlNet T2I-Adapter style model. Need to download CLIPVision model.",
+ "reference": "https://huggingface.co/TencentARC/T2I-Adapter",
+ "filename": "t2iadapter_style_sd14v1.pth",
+ "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_style_sd14v1.pth",
+ "size": "154.4MB"
+ },
+ {
+ "name": "T2I-Adapter XL (lineart) FP16",
+ "type": "T2I-Adapter",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet T2I-Adapter XL for lineart",
+ "reference": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0",
+ "filename": "t2i-adapter-lineart-sdxl-1.0.fp16.safetensors",
+ "url": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors",
+ "size": "158.1MB"
+ },
+ {
+ "name": "T2I-Adapter XL (canny) FP16",
+ "type": "T2I-Adapter",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet T2I-Adapter XL for canny",
+ "reference": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0",
+ "filename": "t2i-adapter-canny-sdxl-1.0.fp16.safetensors",
+ "url": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors",
+ "size": "158.1MB"
+ },
+ {
+ "name": "T2I-Adapter XL (depth-zoe) FP16",
+ "type": "T2I-Adapter",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet T2I-Adapter XL for depth-zoe",
+ "reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0",
+ "filename": "t2i-adapter-depth-zoe-sdxl-1.0.fp16.safetensors",
+ "url": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors",
+ "size": "158.1MB"
+ },
+ {
+ "name": "T2I-Adapter XL (depth-midas) FP16",
+ "type": "T2I-Adapter",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet T2I-Adapter XL for depth-midas",
+ "reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0",
+ "filename": "t2i-adapter-depth-midas-sdxl-1.0.fp16.safetensors",
+ "url": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors",
+ "size": "158.1MB"
+ },
+ {
+ "name": "T2I-Adapter XL (sketch) FP16",
+ "type": "T2I-Adapter",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet T2I-Adapter XL for sketch",
+ "reference": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0",
+ "filename": "t2i-adapter-sketch-sdxl-1.0.fp16.safetensors",
+ "url": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors",
+ "size": "158.1MB"
+ },
+ {
+ "name": "T2I-Adapter XL (lineart)",
+ "type": "T2I-Adapter",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet T2I-Adapter XL for lineart",
+ "reference": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0",
+ "filename": "t2i-adapter-lineart-sdxl-1.0.safetensors",
+ "url": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "316.1MB"
+ },
+ {
+ "name": "T2I-Adapter XL (canny)",
+ "type": "T2I-Adapter",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet T2I-Adapter XL for canny",
+ "reference": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0",
+ "filename": "t2i-adapter-canny-sdxl-1.0.safetensors",
+ "url": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "316.1MB"
+ },
+ {
+ "name": "T2I-Adapter XL (depth-zoe)",
+ "type": "T2I-Adapter",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet T2I-Adapter XL for depth-zoe",
+ "reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0",
+ "filename": "t2i-adapter-depth-zoe-sdxl-1.0.safetensors",
+ "url": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "316.1MB"
+ },
+ {
+ "name": "T2I-Adapter XL (depth-midas)",
+ "type": "T2I-Adapter",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet T2I-Adapter XL for depth-midas",
+ "reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0",
+ "filename": "t2i-adapter-depth-midas-sdxl-1.0.safetensors",
+ "url": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "316.1MB"
+ },
+ {
+ "name": "T2I-Adapter XL (sketch)",
+ "type": "T2I-Adapter",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet T2I-Adapter XL for sketch",
+ "reference": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0",
+ "filename": "t2i-adapter-sketch-sdxl-1.0.safetensors",
+ "url": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "316.1MB"
+ },
+ {
+ "name": "T2I-Adapter XL (openpose)",
+ "type": "T2I-Adapter",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet T2I-Adapter XL for openpose",
+ "reference": "https://huggingface.co/TencentARC/t2i-adapter-openpose-sdxl-1.0",
+ "filename": "t2i-adapter-openpose-sdxl-1.0.safetensors",
+ "url": "https://huggingface.co/TencentARC/t2i-adapter-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "316.1MB"
+ },
+ {
+ "name": "CiaraRowles/TemporalNet2",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/SD1.5",
+ "description": "TemporalNet was a ControlNet model designed to enhance the temporal consistency of generated outputs",
+ "reference": "https://huggingface.co/CiaraRowles/TemporalNet2",
+ "filename": "temporalnetversion2.safetensors",
+ "url": "https://huggingface.co/CiaraRowles/TemporalNet2/resolve/main/temporalnetversion2.safetensors",
+ "size": "5.71GB"
+ },
+ {
+ "name": "CiaraRowles/TemporalNet1XL (1.0)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL/TemporalNet1XL",
+ "description": "This is TemporalNet1XL, it is a re-train of the controlnet TemporalNet1 with Stable Diffusion XL.",
+ "reference": "https://huggingface.co/CiaraRowles/controlnet-temporalnet-sdxl-1.0",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/CiaraRowles/controlnet-temporalnet-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "5.00GB"
+ },
+
+ {
+ "name": "Comfy-Org/sigclip_vision_384 (patch14_384)",
+ "type": "clip_vision",
+ "base": "sigclip",
+ "save_path": "clip_vision",
+ "description": "This clip vision model is required for FLUX.1 Redux.",
+ "reference": "https://huggingface.co/Comfy-Org/sigclip_vision_384/tree/main",
+ "filename": "sigclip_vision_patch14_384.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/sigclip_vision_384/resolve/main/sigclip_vision_patch14_384.safetensors",
+ "size": "857MB"
+ },
+
+ {
+ "name": "CLIPVision model (stabilityai/clip_vision_g)",
+ "type": "clip_vision",
+ "base": "ViT-G",
+ "save_path": "clip_vision",
+ "description": "clip_g vision model",
+ "reference": "https://huggingface.co/stabilityai/control-lora",
+ "filename": "clip_vision_g.safetensors",
+ "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/revision/clip_vision_g.safetensors",
+ "size": "3.69GB"
+ },
+ {
+ "name": "CLIPVision model (openai/clip-vit-large)",
+ "type": "clip_vision",
+ "base": "ViT-L",
+ "save_path": "clip_vision",
+ "description": "CLIPVision model (needed for styles model)",
+ "reference": "https://huggingface.co/openai/clip-vit-large-patch14",
+ "filename": "clip-vit-large-patch14.safetensors",
+ "url": "https://huggingface.co/openai/clip-vit-large-patch14/resolve/main/model.safetensors",
+ "size": "1.71GB"
+ },
+ {
+ "name": "CLIPVision model (Kwai-Kolors/Kolors-IP-Adapter-Plus/clip-vit-large)",
+ "type": "clip_vision",
+ "base": "ViT-L",
+ "save_path": "clip_vision",
+ "description": "CLIPVision model (needed for IP-Adapter)",
+ "reference": "https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus",
+ "filename": "clip-vit-large-patch14-336.bin",
+ "url": "https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus/resolve/main/image_encoder/pytorch_model.bin",
+ "size": "1.71GB"
+ },
+ {
+ "name": "CLIPVision model (IP-Adapter) CLIP-ViT-H-14-laion2B-s32B-b79K",
+ "type": "clip_vision",
+ "base": "ViT-H",
+ "save_path": "clip_vision",
+ "description": "CLIPVision model (needed for IP-Adapter)",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/image_encoder/model.safetensors",
+ "size": "2.53GB"
+ },
+ {
+ "name": "CLIPVision model (IP-Adapter) CLIP-ViT-bigG-14-laion2B-39B-b160k",
+ "type": "clip_vision",
+ "base": "ViT-G",
+ "save_path": "clip_vision",
+ "description": "CLIPVision model (needed for IP-Adapter)",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "CLIP-ViT-bigG-14-laion2B-39B-b160k.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/image_encoder/model.safetensors",
+ "size": "3.69GB"
+ },
+ {
+ "name": "stabilityai/control-lora-canny-rank128.safetensors",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "Control-LoRA: canny rank128",
+ "reference": "https://huggingface.co/stabilityai/control-lora",
+ "filename": "control-lora-canny-rank128.safetensors",
+ "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-canny-rank128.safetensors",
+ "size": "395.7MB"
+ },
+ {
+ "name": "stabilityai/control-lora-depth-rank128.safetensors",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "Control-LoRA: depth rank128",
+ "reference": "https://huggingface.co/stabilityai/control-lora",
+ "filename": "control-lora-depth-rank128.safetensors",
+ "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-depth-rank128.safetensors",
+ "size": "395.7MB"
+ },
+ {
+ "name": "stabilityai/control-lora-recolor-rank128.safetensors",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "Control-LoRA: recolor rank128",
+ "reference": "https://huggingface.co/stabilityai/control-lora",
+ "filename": "control-lora-recolor-rank128.safetensors",
+ "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-recolor-rank128.safetensors",
+ "size": "395.7MB"
+ },
+ {
+ "name": "stabilityai/control-lora-sketch-rank128-metadata.safetensors",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "Control-LoRA: sketch rank128 metadata",
+ "reference": "https://huggingface.co/stabilityai/control-lora",
+ "filename": "control-lora-sketch-rank128-metadata.safetensors",
+ "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-sketch-rank128-metadata.safetensors",
+ "size": "395.7MB"
+ },
+ {
+ "name": "stabilityai/control-lora-canny-rank256.safetensors",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "Control-LoRA: canny rank256",
+ "reference": "https://huggingface.co/stabilityai/control-lora",
+ "filename": "control-lora-canny-rank256.safetensors",
+ "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-canny-rank256.safetensors",
+ "size": "774.5MB"
+ },
+ {
+ "name": "stabilityai/control-lora-depth-rank256.safetensors",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "Control-LoRA: depth rank256",
+ "reference": "https://huggingface.co/stabilityai/control-lora",
+ "filename": "control-lora-depth-rank256.safetensors",
+ "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-depth-rank256.safetensors",
+ "size": "774.4MB"
+ },
+ {
+ "name": "stabilityai/control-lora-recolor-rank256.safetensors",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "Control-LoRA: recolor rank256",
+ "reference": "https://huggingface.co/stabilityai/control-lora",
+ "filename": "control-lora-recolor-rank256.safetensors",
+ "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-recolor-rank256.safetensors",
+ "size": "774.4MB"
+ },
+ {
+ "name": "stabilityai/control-lora-sketch-rank256.safetensors",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "Control-LoRA: sketch rank256",
+ "reference": "https://huggingface.co/stabilityai/control-lora",
+ "filename": "control-lora-sketch-rank256.safetensors",
+ "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-sketch-rank256.safetensors",
+ "size": "774.5MB"
+ },
+ {
+ "name": "SDXL-controlnet: OpenPose (v2)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet openpose model for SDXL",
+ "reference": "https://huggingface.co/thibaud/controlnet-openpose-sdxl-1.0",
+ "filename": "OpenPoseXL2.safetensors",
+ "url": "https://huggingface.co/thibaud/controlnet-openpose-sdxl-1.0/resolve/main/OpenPoseXL2.safetensors",
+ "size": "5.00GB"
+ },
+ {
+ "name": "controlnet-SargeZT/controlnet-sd-xl-1.0-softedge-dexined",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet softedge model for SDXL",
+ "reference": "https://huggingface.co/SargeZT/controlnet-sd-xl-1.0-softedge-dexined",
+ "filename": "controlnet-sd-xl-1.0-softedge-dexined.safetensors",
+ "url": "https://huggingface.co/SargeZT/controlnet-sd-xl-1.0-softedge-dexined/resolve/main/controlnet-sd-xl-1.0-softedge-dexined.safetensors",
+ "size": "5.00GB"
+ },
+ {
+ "name": "controlnet-SargeZT/controlnet-sd-xl-1.0-depth-16bit-zoe",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "ControlNet depth-zoe model for SDXL",
+ "reference": "https://huggingface.co/SargeZT/controlnet-sd-xl-1.0-depth-16bit-zoe",
+ "filename": "depth-zoe-xl-v1.0-controlnet.safetensors",
+ "url": "https://huggingface.co/SargeZT/controlnet-sd-xl-1.0-depth-16bit-zoe/resolve/main/depth-zoe-xl-v1.0-controlnet.safetensors",
+ "size": "5.00GB"
+ },
+ {
+ "name": "ControlNet-v1-1 (ip2p; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (ip2p)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11e_sd15_ip2p_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11e_sd15_ip2p_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (shuffle; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (shuffle)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11e_sd15_shuffle_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11e_sd15_shuffle_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (canny; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (canny)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11p_sd15_canny_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_canny_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (depth; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (depth)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11f1p_sd15_depth_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11f1p_sd15_depth_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (inpaint; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (inpaint)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11p_sd15_inpaint_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_inpaint_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (lineart; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (lineart)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11p_sd15_lineart_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_lineart_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (mlsd; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (mlsd)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11p_sd15_mlsd_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_mlsd_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (normalbae; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (normalbae)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11p_sd15_normalbae_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_normalbae_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (openpose; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (openpose)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11p_sd15_openpose_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_openpose_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (scribble; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (scribble)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11p_sd15_scribble_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_scribble_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (seg; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (seg)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11p_sd15_seg_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_seg_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (softedge; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (softedge)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11p_sd15_softedge_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_softedge_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (anime; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (anime)",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11p_sd15s2_lineart_anime_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15s2_lineart_anime_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (tile; fp16; v11u)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (tile) / v11u",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11u_sd15_tile_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11u_sd15_tile_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-v1-1 (tile; fp16; v11f1e)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (tile) / v11f1e\nYou need to this model for Tiled Resample ",
+ "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors",
+ "filename": "control_v11f1e_sd15_tile_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11f1e_sd15_tile_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "ControlNet-HandRefiner-pruned (inpaint-depth-hand; fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "This inpaint-depth controlnet model is specialized for the hand refiner.",
+ "reference": "https://huggingface.co/hr16/ControlNet-HandRefiner-pruned",
+ "filename": "control_sd15_inpaint_depth_hand_fp16.safetensors",
+ "url": "https://huggingface.co/hr16/ControlNet-HandRefiner-pruned/resolve/main/control_sd15_inpaint_depth_hand_fp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "control_boxdepth_LooseControlfp16 (fp16)",
+ "type": "controlnet",
+ "base": "SD1.5",
+ "save_path": "controlnet/1.5",
+ "description": "Loose ControlNet model",
+ "reference": "https://huggingface.co/ioclab/LooseControl_WebUICombine",
+ "filename": "control_boxdepth_LooseControlfp16.safetensors",
+ "url": "https://huggingface.co/ioclab/LooseControl_WebUICombine/resolve/main/control_boxdepth_LooseControlfp16.safetensors",
+ "size": "722.6MB"
+ },
+ {
+ "name": "GLIGEN textbox (fp16; pruned)",
+ "type": "gligen",
+ "base": "SD1.5",
+ "save_path": "gligen/SD1.5",
+ "description": "GLIGEN textbox model",
+ "reference": "https://huggingface.co/comfyanonymous/GLIGEN_pruned_safetensors",
+ "filename": "gligen_sd14_textbox_pruned_fp16.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/GLIGEN_pruned_safetensors/resolve/main/gligen_sd14_textbox_pruned_fp16.safetensors",
+ "size": "418.2MB"
+ },
+ {
+ "name": "ViT-H SAM model",
+ "type": "sam",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM model (ViT-H)",
+ "reference": "https://github.com/facebookresearch/segment-anything#model-checkpoints",
+ "filename": "sam_vit_h_4b8939.pth",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth",
+ "size": "2.56GB"
+ },
+ {
+ "name": "ViT-L SAM model",
+ "type": "sam",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM model (ViT-L)",
+ "reference": "https://github.com/facebookresearch/segment-anything#model-checkpoints",
+ "filename": "sam_vit_l_0b3195.pth",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth",
+ "size": "1.25GB"
+ },
+ {
+ "name": "ViT-B SAM model",
+ "type": "sam",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM model (ViT-B)",
+ "reference": "https://github.com/facebookresearch/segment-anything#model-checkpoints",
+ "filename": "sam_vit_b_01ec64.pth",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth",
+ "size": "375.0MB"
+ },
+
+ {
+ "name": "sam2.1_hiera_tiny.pt",
+ "type": "sam2.1",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2.1 hiera model (tiny)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2.1_hiera_tiny.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_tiny.pt",
+ "size": "149.0MB"
+ },
+ {
+ "name": "sam2.1_hiera_small.pt",
+ "type": "sam2.1",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2.1 hiera model (small)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2.1_hiera_small.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_small.pt",
+ "size": "176.0MB"
+ },
+ {
+ "name": "sam2.1_hiera_base_plus.pt",
+ "type": "sam2.1",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2.1 hiera model (base+)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2.1_hiera_base_plus.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_base_plus.pt",
+ "size": "309.0MB"
+ },
+ {
+ "name": "sam2.1_hiera_large.pt",
+ "type": "sam2.1",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2.1 hiera model (large)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2.1_hiera_large.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_large.pt",
+ "size": "857.0MB"
+ },
+
+ {
+ "name": "sam2_hiera_tiny.pt",
+ "type": "sam2",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2 hiera model (tiny)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2_hiera_tiny.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_tiny.pt",
+ "size": "149.0MB"
+ },
+ {
+ "name": "sam2_hiera_small.pt",
+ "type": "sam2",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2 hiera model (small)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2_hiera_small.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_small.pt",
+ "size": "176.0MB"
+ },
+ {
+ "name": "sam2_hiera_base_plus.pt",
+ "type": "sam2",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2 hiera model (base+)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2_hiera_base_plus.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_base_plus.pt",
+ "size": "309.0MB"
+ },
+ {
+ "name": "sam2_hiera_large.pt",
+ "type": "sam2",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2 hiera model (large)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2_hiera_large.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_large.pt",
+ "size": "857.0MB"
+ },
+
+ {
+ "name": "seecoder v1.0",
+ "type": "seecoder",
+ "base": "SEECODER",
+ "save_path": "seecoders",
+ "description": "SeeCoder model",
+ "reference": "https://huggingface.co/shi-labs/prompt-free-diffusion/tree/main/pretrained/pfd/seecoder",
+ "filename": "seecoder-v1-0.safetensors",
+ "url": "https://huggingface.co/shi-labs/prompt-free-diffusion/resolve/main/pretrained/pfd/seecoder/seecoder-v1-0.safetensors",
+ "size": "1.18GB"
+ },
+ {
+ "name": "seecoder pa v1.0",
+ "type": "seecoder",
+ "base": "SEECODER",
+ "save_path": "seecoders",
+ "description": "SeeCoder model",
+ "reference": "https://huggingface.co/shi-labs/prompt-free-diffusion/tree/main/pretrained/pfd/seecoder",
+ "filename": "seecoder-pa-v1-0.safetensors",
+ "url": "https://huggingface.co/shi-labs/prompt-free-diffusion/resolve/main/pretrained/pfd/seecoder/seecoder-pa-v1-0.safetensors",
+ "size": "1.19GB"
+ },
+ {
+ "name": "seecoder anime v1.0",
+ "type": "seecoder",
+ "base": "SEECODER",
+ "save_path": "seecoders",
+ "description": "SeeCoder model",
+ "reference": "https://huggingface.co/shi-labs/prompt-free-diffusion/tree/main/pretrained/pfd/seecoder",
+ "filename": "seecoder-anime-v1-0.safetensors",
+ "url": "https://huggingface.co/shi-labs/prompt-free-diffusion/resolve/main/pretrained/pfd/seecoder/seecoder-anime-v1-0.safetensors",
+ "size": "1.18GB"
+ },
+ {
+ "name": "face_yolov8m (bbox)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/bbox",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://huggingface.co/Bingsu/adetailer/tree/main",
+ "filename": "face_yolov8m.pt",
+ "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/face_yolov8m.pt",
+ "size": "52.0MB"
+ },
+ {
+ "name": "face_yolov8n (bbox)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/bbox",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://huggingface.co/Bingsu/adetailer/tree/main",
+ "filename": "face_yolov8n.pt",
+ "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/face_yolov8n.pt",
+ "size": "6.23MB"
+ },
+ {
+ "name": "face_yolov8n_v2 (bbox)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/bbox",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://huggingface.co/Bingsu/adetailer/tree/main",
+ "filename": "face_yolov8n_v2.pt",
+ "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/face_yolov8n_v2.pt",
+ "size": "6.24MB"
+ },
+ {
+ "name": "face_yolov8s (bbox)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/bbox",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://huggingface.co/Bingsu/adetailer/tree/main",
+ "filename": "face_yolov8s.pt",
+ "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/face_yolov8s.pt",
+ "size": "22.5MB"
+ },
+ {
+ "name": "hand_yolov8n (bbox)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/bbox",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://huggingface.co/Bingsu/adetailer/tree/main",
+ "filename": "hand_yolov8n.pt",
+ "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/hand_yolov8n.pt",
+ "size": "6.24MB"
+ },
+ {
+ "name": "hand_yolov8s (bbox)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/bbox",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://huggingface.co/Bingsu/adetailer/tree/main",
+ "filename": "hand_yolov8s.pt",
+ "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/hand_yolov8s.pt",
+ "size": "22.5MB"
+ },
+ {
+ "name": "person_yolov8m (segm)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/segm",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://huggingface.co/Bingsu/adetailer/tree/main",
+ "filename": "person_yolov8m-seg.pt",
+ "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/person_yolov8m-seg.pt",
+ "size": "54.8MB"
+ },
+ {
+ "name": "person_yolov8n (segm)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/segm",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://huggingface.co/Bingsu/adetailer/tree/main",
+ "filename": "person_yolov8n-seg.pt",
+ "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/person_yolov8n-seg.pt",
+ "size": "6.78MB"
+ },
+ {
+ "name": "person_yolov8s (segm)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/segm",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://huggingface.co/Bingsu/adetailer/tree/main",
+ "filename": "person_yolov8s-seg.pt",
+ "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/person_yolov8s-seg.pt",
+ "size": "23.9MB"
+ },
+ {
+ "name": "deepfashion2_yolov8s (segm)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/segm",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://huggingface.co/Bingsu/adetailer/tree/main",
+ "filename": "deepfashion2_yolov8s-seg.pt",
+ "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/deepfashion2_yolov8s-seg.pt",
+ "size": "23.9MB"
+ },
+ {
+ "name": "face_yolov8m-seg_60.pt (segm)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/segm",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
+ "filename": "face_yolov8m-seg_60.pt",
+ "url": "https://github.com/hben35096/assets/releases/download/yolo8/face_yolov8m-seg_60.pt",
+ "size": "54.8MB"
+ },
+ {
+ "name": "face_yolov8n-seg2_60.pt (segm)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/segm",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
+ "filename": "face_yolov8n-seg2_60.pt",
+ "url": "https://github.com/hben35096/assets/releases/download/yolo8/face_yolov8n-seg2_60.pt",
+ "size": "6.77MB"
+ },
+ {
+ "name": "hair_yolov8n-seg_60.pt (segm)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/segm",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
+ "filename": "hair_yolov8n-seg_60.pt",
+ "url": "https://github.com/hben35096/assets/releases/download/yolo8/hair_yolov8n-seg_60.pt",
+ "size": "6.77MB"
+ },
+ {
+ "name": "skin_yolov8m-seg_400.pt (segm)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/segm",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
+ "filename": "skin_yolov8m-seg_400.pt",
+ "url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8m-seg_400.pt",
+ "size": "54.9MB"
+ },
+ {
+ "name": "skin_yolov8n-seg_400.pt (segm)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/segm",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
+ "filename": "skin_yolov8n-seg_400.pt",
+ "url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8n-seg_400.pt",
+ "size": "6.83MB"
+ },
+ {
+ "name": "skin_yolov8n-seg_800.pt (segm)",
+ "type": "Ultralytics",
+ "base": "Ultralytics",
+ "save_path": "ultralytics/segm",
+ "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
+ "reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
+ "filename": "skin_yolov8n-seg_800.pt",
+ "url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8n-seg_800.pt",
+ "size": "6.84MB"
+ },
+ {
+ "name": "animatediff/mmd_sd_v14.ckpt (comfyui-animatediff) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "AnimateDiff",
+ "description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "mm_sd_v14.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v14.ckpt",
+ "size": "1.67GB"
+ },
+ {
+ "name": "animatediff/mm_sd_v15.ckpt (comfyui-animatediff) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "AnimateDiff",
+ "description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "mm_sd_v15.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15.ckpt",
+ "size": "1.67GB"
+ },
+ {
+ "name": "animatediff/mmd_sd_v14.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "mm_sd_v14.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v14.ckpt",
+ "size": "1.67GB"
+ },
+ {
+ "name": "animatediff/mm_sd_v15.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "mm_sd_v15.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15.ckpt",
+ "size": "1.67GB"
+ },
+ {
+ "name": "animatediff/mm_sd_v15_v2.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "mm_sd_v15_v2.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt",
+ "size": "1.82GB"
+ },
+ {
+ "name": "animatediff/v3_sd15_mm.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v3_sd15_mm.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_mm.ckpt",
+ "size": "1.67GB"
+ },
+ {
+ "name": "animatediff/mm_sdxl_v10_beta.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "animatediff",
+ "base": "SDXL",
+ "save_path": "animatediff_models",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "mm_sdxl_v10_beta.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sdxl_v10_beta.ckpt",
+ "size": "950.1MB"
+ },
+ {
+ "name": "AD_Stabilized_Motion/mm-Stabilized_high.pth (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
+ "filename": "mm-Stabilized_high.pth",
+ "url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_high.pth",
+ "size": "1.67GB"
+ },
+ {
+ "name": "AD_Stabilized_Motion/mm-Stabilized_mid.pth (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
+ "filename": "mm-Stabilized_mid.pth",
+ "url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_mid.pth",
+ "size": "1.67GB"
+ },
+ {
+ "name": "CiaraRowles/temporaldiff-v1-animatediff.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/CiaraRowles/TemporalDiff",
+ "filename": "temporaldiff-v1-animatediff.ckpt",
+ "url": "https://huggingface.co/CiaraRowles/TemporalDiff/resolve/main/temporaldiff-v1-animatediff.ckpt",
+ "size": "1.67GB"
+ },
+ {
+ "name": "Leoxing/pia.ckpt",
+ "type": "animatediff-pia",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "AnimateDiff-PIA Model",
+ "reference": "https://huggingface.co/Leoxing/PIA/tree/main",
+ "filename": "pia.ckpt",
+ "url": "https://huggingface.co/Leoxing/PIA/resolve/main/pia.ckpt",
+ "size": "1.67GB"
+ },
+
+ {
+ "name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "motion lora",
+ "base": "SD1.x",
+ "save_path": "animatediff_motion_lora",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v2_lora_PanLeft.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanLeft.ckpt",
+ "size": "77.5MB"
+ },
+ {
+ "name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "motion lora",
+ "base": "SD1.x",
+ "save_path": "animatediff_motion_lora",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v2_lora_PanRight.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanRight.ckpt",
+ "size": "77.5MB"
+ },
+ {
+ "name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "motion lora",
+ "base": "SD1.x",
+ "save_path": "animatediff_motion_lora",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v2_lora_RollingAnticlockwise.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingAnticlockwise.ckpt",
+ "size": "77.5MB"
+ },
+ {
+ "name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "motion lora",
+ "base": "SD1.x",
+ "save_path": "animatediff_motion_lora",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v2_lora_RollingClockwise.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingClockwise.ckpt",
+ "size": "77.5MB"
+ },
+ {
+ "name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "motion lora",
+ "base": "SD1.x",
+ "save_path": "animatediff_motion_lora",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v2_lora_TiltDown.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltDown.ckpt",
+ "size": "77.5MB"
+ },
+ {
+ "name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "motion lora",
+ "base": "SD1.x",
+ "save_path": "animatediff_motion_lora",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v2_lora_TiltUp.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltUp.ckpt",
+ "size": "77.5MB"
+ },
+ {
+ "name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "motion lora",
+ "base": "SD1.x",
+ "save_path": "animatediff_motion_lora",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v2_lora_ZoomIn.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomIn.ckpt",
+ "size": "77.5MB"
+ },
+ {
+ "name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "motion lora",
+ "base": "SD1.x",
+ "save_path": "animatediff_motion_lora",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v2_lora_ZoomOut.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomOut.ckpt",
+ "size": "77.5MB"
+ },
+ {
+ "name": "LongAnimatediff/lt_long_mm_32_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
+ "filename": "lt_long_mm_32_frames.ckpt",
+ "url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_32_frames.ckpt",
+ "size": "1.82GB"
+ },
+ {
+ "name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
+ "filename": "lt_long_mm_16_64_frames.ckpt",
+ "url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames.ckpt",
+ "size": "1.83GB"
+ },
+ {
+ "name": "LongAnimatediff/lt_long_mm_16_64_frames_v1.1.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
+ "type": "animatediff",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
+ "reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
+ "filename": "lt_long_mm_16_64_frames_v1.1.ckpt",
+ "url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames_v1.1.ckpt",
+ "size": "1.83GB"
+ },
+ {
+ "name": "animatediff/v3_sd15_sparsectrl_rgb.ckpt (ComfyUI-AnimateDiff-Evolved)",
+ "type": "controlnet",
+ "base": "SD1.x",
+ "save_path": "controlnet/SD1.5/animatediff",
+ "description": "AnimateDiff SparseCtrl RGB ControlNet model",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v3_sd15_sparsectrl_rgb.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_sparsectrl_rgb.ckpt",
+ "size": "1.99GB"
+ },
+ {
+ "name": "animatediff/v3_sd15_sparsectrl_scribble.ckpt",
+ "type": "controlnet",
+ "base": "SD1.x",
+ "save_path": "controlnet/SD1.5/animatediff",
+ "description": "AnimateDiff SparseCtrl Scribble ControlNet model",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v3_sd15_sparsectrl_scribble.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_sparsectrl_scribble.ckpt",
+ "size": "1.99GB"
+ },
+ {
+ "name": "animatediff/v3_sd15_adapter.ckpt",
+ "type": "lora",
+ "base": "SD1.x",
+ "save_path": "loras/SD1.5/animatediff",
+ "description": "AnimateDiff Adapter LoRA (SD1.5)",
+ "reference": "https://huggingface.co/guoyww/animatediff",
+ "filename": "v3_sd15_adapter.ckpt",
+ "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_adapter.ckpt",
+ "size": "102.1MB"
+ },
+ {
+ "name": "TencentARC/motionctrl.pth",
+ "type": "checkpoint",
+ "base": "MotionCtrl",
+ "save_path": "checkpoints/motionctrl",
+ "description": "To use the ComfyUI-MotionCtrl extension, downloading this model is required.",
+ "reference": "https://huggingface.co/TencentARC/MotionCtrl",
+ "filename": "motionctrl.pth",
+ "url": "https://huggingface.co/TencentARC/MotionCtrl/resolve/main/motionctrl.pth",
+ "size": "4.02GB"
+ },
+ {
+ "name": "ip-adapter_sd15.safetensors",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "ip-adapter_sd15.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15.safetensors",
+ "size": "44.6MB"
+ },
+ {
+ "name": "ip-adapter_sd15_light_v11.bin",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "ip-adapter_sd15_light_v11.bin",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_light_v11.bin",
+ "size": "44.6MB"
+ },
+ {
+ "name": "ip-adapter_sd15_light.safetensors [DEPRECATED]",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "ip-adapter_sd15_light.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_light.safetensors",
+ "size": "44.6MB"
+ },
+ {
+ "name": "ip-adapter-plus_sd15.safetensors",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "ip-adapter-plus_sd15.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter-plus_sd15.safetensors",
+ "size": "98.2MB"
+ },
+ {
+ "name": "ip-adapter-plus-face_sd15.safetensors",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "ip-adapter-plus-face_sd15.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter-plus-face_sd15.safetensors",
+ "size": "98.2MB"
+ },
+ {
+ "name": "ip-adapter-full-face_sd15.safetensors",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "ip-adapter-full-face_sd15.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter-full-face_sd15.safetensors",
+ "size": "43.6MB"
+ },
+ {
+ "name": "ip-adapter_sd15_vit-G.safetensors",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "ip-adapter_sd15_vit-G.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_vit-G.safetensors",
+ "size": "46.2MB"
+ },
+ {
+ "name": "ip-adapter-faceid_sd15.bin",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "IP-Adapter-FaceID Model (SD1.5) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid_sd15.bin",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sd15.bin",
+ "size": "96.7MB"
+ },
+ {
+ "name": "ip-adapter-faceid-plusv2_sd15.bin",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "IP-Adapter-FaceID Plus V2 Model (SD1.5) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid-plusv2_sd15.bin",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15.bin",
+ "size": "156.6MB"
+ },
+ {
+ "name": "ip-adapter-faceid-plus_sd15.bin [DEPRECATED]",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "IP-Adapter-FaceID Plus Model (SD1.5) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid-plus_sd15.bin",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plus_sd15.bin",
+ "size": "156.6MB"
+ },
+ {
+ "name": "ip-adapter-faceid-portrait-v11_sd15.bin",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "IP-Adapter-FaceID Portrait V11 Model (SD1.5) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid-portrait-v11_sd15.bin",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait-v11_sd15.bin",
+ "size": "64.6MB"
+ },
+ {
+ "name": "ip-adapter-faceid-portrait_sd15.bin [DEPRECATED]",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "IP-Adapter-FaceID Portrait Model (SD1.5) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid-portrait_sd15.bin",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sd15.bin",
+ "size": "64.6MB"
+ },
+ {
+ "name": "ip-adapter-faceid_sdxl.bin",
+ "type": "IP-Adapter",
+ "base": "SDXL",
+ "save_path": "ipadapter",
+ "description": "IP-Adapter-FaceID Model (SDXL) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid_sdxl.bin",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sdxl.bin",
+ "size": "1.07GB"
+ },
+ {
+ "name": "ip-adapter-faceid-plusv2_sdxl.bin",
+ "type": "IP-Adapter",
+ "base": "SDXL",
+ "save_path": "ipadapter",
+ "description": "IP-Adapter-FaceID Plus Model (SDXL) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid-plusv2_sdxl.bin",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sdxl.bin",
+ "size": "1.49GB"
+ },
+ {
+ "name": "ip-adapter-faceid-portrait_sdxl.bin",
+ "type": "IP-Adapter",
+ "base": "SDXL",
+ "save_path": "ipadapter",
+ "description": "IP-Adapter-FaceID Portrait Model (SDXL) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid-portrait_sdxl.bin",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sdxl.bin",
+ "size": "749.8MB"
+ },
+ {
+ "name": "ip-adapter-faceid-portrait_sdxl_unnorm.bin",
+ "type": "IP-Adapter",
+ "base": "SDXL",
+ "save_path": "ipadapter",
+ "description": "IP-Adapter-FaceID Portrait Model (SDXL/unnorm) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid-portrait_sdxl_unnorm.bin",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sdxl_unnorm.bin",
+ "size": "1.01GB"
+ },
+ {
+ "name": "ip-adapter-faceid_sd15_lora.safetensors",
+ "type": "lora",
+ "base": "SD1.5",
+ "save_path": "loras/ipadapter",
+ "description": "IP-Adapter-FaceID LoRA Model (SD1.5) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid_sd15_lora.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sd15_lora.safetensors",
+ "size": "51.1MB"
+ },
+ {
+ "name": "ip-adapter-faceid-plus_sd15_lora.safetensors [DEPRECATED]",
+ "type": "lora",
+ "base": "SD1.5",
+ "save_path": "loras/ipadapter",
+ "description": "IP-Adapter-FaceID Plus LoRA Model (SD1.5) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid-plus_sd15_lora.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plus_sd15_lora.safetensors",
+ "size": "51.1MB"
+ },
+ {
+ "name": "ip-adapter-faceid-plusv2_sd15_lora.safetensors",
+ "type": "lora",
+ "base": "SD1.5",
+ "save_path": "loras/ipadapter",
+ "description": "IP-Adapter-FaceID-Plus V2 LoRA Model (SD1.5) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid-plusv2_sd15_lora.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15_lora.safetensors",
+ "size": "51.1MB"
+ },
+ {
+ "name": "ip-adapter-faceid_sdxl_lora.safetensors",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/ipadapter",
+ "description": "IP-Adapter-FaceID LoRA Model (SDXL) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid_sdxl_lora.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sdxl_lora.safetensors",
+ "size": "371.8MB"
+ },
+ {
+ "name": "ip-adapter-faceid-plusv2_sdxl_lora.safetensors",
+ "type": "lora",
+ "base": "SDXL",
+ "save_path": "loras/ipadapter",
+ "description": "IP-Adapter-FaceID-Plus V2 LoRA Model (SDXL) [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
+ "filename": "ip-adapter-faceid-plusv2_sdxl_lora.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sdxl_lora.safetensors",
+ "size": "371.8MB"
+ },
+ {
+ "name": "ip-adapter_sdxl.safetensors",
+ "type": "IP-Adapter",
+ "base": "SDXL",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "ip-adapter_sdxl.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter_sdxl.safetensors",
+ "size": "702.6MB"
+ },
+ {
+ "name": "ip-adapter_sdxl_vit-h.safetensors",
+ "type": "IP-Adapter",
+ "base": "SDXL",
+ "save_path": "ipadapter",
+ "description": "This model requires the use of the SD1.5 encoder despite being for SDXL checkpoints [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "ip-adapter_sdxl_vit-h.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter_sdxl_vit-h.safetensors",
+ "size": "698.4MB"
+ },
+ {
+ "name": "ip-adapter-plus_sdxl_vit-h.safetensors",
+ "type": "IP-Adapter",
+ "base": "SDXL",
+ "save_path": "ipadapter",
+ "description": "This model requires the use of the SD1.5 encoder despite being for SDXL checkpoints [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "ip-adapter-plus_sdxl_vit-h.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter-plus_sdxl_vit-h.safetensors",
+ "size": "847.5MB"
+ },
+ {
+ "name": "ip-adapter-plus-face_sdxl_vit-h.safetensors",
+ "type": "IP-Adapter",
+ "base": "SDXL",
+ "save_path": "ipadapter",
+ "description": "This model requires the use of the SD1.5 encoder despite being for SDXL checkpoints [ipadapter]",
+ "reference": "https://huggingface.co/h94/IP-Adapter",
+ "filename": "ip-adapter-plus-face_sdxl_vit-h.safetensors",
+ "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter-plus-face_sdxl_vit-h.safetensors",
+ "size": "847.5MB"
+ },
+ {
+ "name": "ip_plus_composition_sd15.safetensors",
+ "type": "IP-Adapter",
+ "base": "SD1.5",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/ostris/ip-composition-adapter",
+ "filename": "ip_plus_composition_sd15.safetensors",
+ "url": "https://huggingface.co/ostris/ip-composition-adapter/resolve/main/ip_plus_composition_sd15.safetensors",
+ "size": "98.2MB"
+ },
+ {
+ "name": "ip_plus_composition_sdxl.safetensors",
+ "type": "IP-Adapter",
+ "base": "SDXL",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/ostris/ip-composition-adapter",
+ "filename": "ip_plus_composition_sdxl.safetensors",
+ "url": "https://huggingface.co/ostris/ip-composition-adapter/resolve/main/ip_plus_composition_sdxl.safetensors",
+ "size": "847.5MB"
+ },
+ {
+ "name": "Kolors-IP-Adapter-Plus.bin (Kwai-Kolors/Kolors-IP-Adapter-Plus)",
+ "type": "IP-Adapter",
+ "base": "Kolors",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus",
+ "filename": "Kolors-IP-Adapter-Plus.bin",
+ "url": "https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus/resolve/main/ip_adapter_plus_general.bin",
+ "size": "1.01GB"
+ },
+ {
+ "name": "Kolors-IP-Adapter-FaceID-Plus.bin (Kwai-Kolors/Kolors-IP-Adapter-Plus)",
+ "type": "IP-Adapter",
+ "base": "Kolors",
+ "save_path": "ipadapter",
+ "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
+ "reference": "https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-FaceID-Plus",
+ "filename": "Kolors-IP-Adapter-FaceID-Plus.bin",
+ "url": "https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-FaceID-Plus/resolve/main/ipa-faceid-plus.bin",
+ "size": "2.39GB"
+ },
+
+
+
+ {
+ "name": "GFPGANv1.4.pth",
+ "type": "GFPGAN",
+ "base": "GFPGAN",
+ "save_path": "facerestore_models",
+ "description": "Face Restoration Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
+ "reference": "https://github.com/TencentARC/GFPGAN/releases",
+ "filename": "GFPGANv1.4.pth",
+ "url": "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/GFPGANv1.4.pth",
+ "size": "348.6MB"
+ },
+ {
+ "name": "codeformer.pth",
+ "type": "CodeFormer",
+ "base": "CodeFormer",
+ "save_path": "facerestore_models",
+ "description": "Face Restoration Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
+ "reference": "https://github.com/sczhou/CodeFormer/releases",
+ "filename": "codeformer.pth",
+ "url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth",
+ "size": "376.6MB"
+ },
+ {
+ "name": "detection_Resnet50_Final.pth",
+ "type": "facexlib",
+ "base": "facexlib",
+ "save_path": "facerestore_models",
+ "description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
+ "reference": "https://github.com/xinntao/facexlib",
+ "filename": "detection_Resnet50_Final.pth",
+ "url": "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth",
+ "size": "109.5MB"
+ },
+ {
+ "name": "detection_mobilenet0.25_Final.pth",
+ "type": "facexlib",
+ "base": "facexlib",
+ "save_path": "facerestore_models",
+ "description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
+ "reference": "https://github.com/xinntao/facexlib",
+ "filename": "detection_mobilenet0.25_Final.pth",
+ "url": "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_mobilenet0.25_Final.pth",
+ "size": "1.79MB"
+ },
+ {
+ "name": "yolov5l-face.pth",
+ "type": "facexlib",
+ "base": "facexlib",
+ "save_path": "facedetection",
+ "description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
+ "reference": "https://github.com/xinntao/facexlib",
+ "filename": "yolov5l-face.pth",
+ "url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/yolov5l-face.pth",
+ "size": "187.0MB"
+ },
+ {
+ "name": "yolov5n-face.pth",
+ "type": "facexlib",
+ "base": "facexlib",
+ "save_path": "facedetection",
+ "description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
+ "reference": "https://github.com/xinntao/facexlib",
+ "filename": "yolov5n-face.pth",
+ "url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/yolov5n-face.pth",
+ "size": "7.15MB"
+ },
+ {
+ "name": "photomaker-v1.bin",
+ "type": "photomaker",
+ "base": "SDXL",
+ "save_path": "photomaker",
+ "description": "PhotoMaker model. This model is compatible with SDXL.",
+ "reference": "https://huggingface.co/TencentARC/PhotoMaker",
+ "filename": "photomaker-v1.bin",
+ "url": "https://huggingface.co/TencentARC/PhotoMaker/resolve/main/photomaker-v1.bin",
+ "size": "934.1MB"
+ },
+ {
+ "name": "photomaker-v2.bin",
+ "type": "photomaker",
+ "base": "SDXL",
+ "save_path": "photomaker",
+ "description": "PhotoMaker model. This model is compatible with SDXL.",
+ "reference": "https://huggingface.co/TencentARC/PhotoMaker-V2",
+ "filename": "photomaker-v2.bin",
+ "url": "https://huggingface.co/TencentARC/PhotoMaker-V2/resolve/main/photomaker-v2.bin",
+ "size": "1.8GB"
+ },
+ {
+ "name": "1k3d68.onnx",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface/models/antelopev2",
+ "description": "Antelopev2 1k3d68.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
+ "reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
+ "filename": "1k3d68.onnx",
+ "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/1k3d68.onnx",
+ "size": "143.6MB"
+ },
+ {
+ "name": "2d106det.onnx",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface/models/antelopev2",
+ "description": "Antelopev2 2d106det.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
+ "reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
+ "filename": "2d106det.onnx",
+ "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/2d106det.onnx",
+ "size": "5.03MB"
+ },
+ {
+ "name": "genderage.onnx",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface/models/antelopev2",
+ "description": "Antelopev2 genderage.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
+ "reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
+ "filename": "genderage.onnx",
+ "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/genderage.onnx",
+ "size": "1.32MB"
+ },
+ {
+ "name": "glintr100.onnx",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface/models/antelopev2",
+ "description": "Antelopev2 glintr100.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
+ "reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
+ "filename": "glintr100.onnx",
+ "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/glintr100.onnx",
+ "size": "260.7MB"
+ },
+ {
+ "name": "scrfd_10g_bnkps.onnx",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface/models/antelopev2",
+ "description": "Antelopev2 scrfd_10g_bnkps.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
+ "reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
+ "filename": "scrfd_10g_bnkps.onnx",
+ "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/scrfd_10g_bnkps.onnx",
+ "size": "16.9MB"
+ },
+ {
+ "name": "ip-adapter.bin",
+ "type": "instantid",
+ "base": "SDXL",
+ "save_path": "instantid",
+ "description": "InstantId main model based on IpAdapter",
+ "reference": "https://huggingface.co/InstantX/InstantID",
+ "filename": "ip-adapter.bin",
+ "url": "https://huggingface.co/InstantX/InstantID/resolve/main/ip-adapter.bin",
+ "size": "1.69GB"
+ },
+ {
+ "name": "diffusion_pytorch_model.safetensors",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/instantid",
+ "description": "InstantId controlnet model",
+ "reference": "https://huggingface.co/InstantX/InstantID",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "InstanceDiffusion/fusers",
+ "type": "InstanceDiffusion",
+ "base": "SD1.5",
+ "save_path": "instance_models/fuser_models",
+ "description": "Fusers checkpoints for multi-object prompting with InstanceDiffusion.",
+ "reference": "https://huggingface.co/logtd/instance_diffusion",
+ "filename": "fusers.ckpt",
+ "url": "https://huggingface.co/logtd/instance_diffusion/resolve/main/fusers.ckpt",
+ "size": "832.1MB"
+ },
+ {
+ "name": "InstanceDiffusion/position_net",
+ "type": "InstanceDiffusion",
+ "base": "SD1.5",
+ "save_path": "instance_models/positionnet_models",
+ "description": "PositionNet checkpoints for multi-object prompting with InstanceDiffusion.",
+ "reference": "https://huggingface.co/logtd/instance_diffusion",
+ "filename": "position_net.ckpt",
+ "url": "https://huggingface.co/logtd/instance_diffusion/resolve/main/position_net.ckpt",
+ "size": "643.2MB"
+ },
+ {
+ "name": "InstanceDiffusion/scaleu",
+ "type": "InstanceDiffusion",
+ "base": "SD1.5",
+ "save_path": "instance_models/scaleu_models",
+ "description": "ScaleU checkpoints for multi-object prompting with InstanceDiffusion.",
+ "reference": "https://huggingface.co/logtd/instance_diffusion",
+ "filename": "scaleu.ckpt",
+ "url": "https://huggingface.co/logtd/instance_diffusion/resolve/main/scaleu.ckpt",
+ "size": "53.1KB"
+ },
+ {
+ "name": "1k3d68.onnx",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface/models/buffalo_l",
+ "description": "Buffalo_l 1k3d68.onnx model for IpAdapterPlus",
+ "reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid",
+ "filename": "1k3d68.onnx",
+ "url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/1k3d68.onnx",
+ "size": "143.6MB"
+ },
+ {
+ "name": "2d106det.onnx",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface/models/buffalo_l",
+ "description": "Buffalo_l 2d106det.onnx model for IpAdapterPlus",
+ "reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid",
+ "filename": "2d106det.onnx",
+ "url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/2d106det.onnx",
+ "size": "5.03MB"
+ },
+ {
+ "name": "det_10g.onnx",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface/models/buffalo_l",
+ "description": "Buffalo_l det_10g.onnx model for IpAdapterPlus",
+ "reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid",
+ "filename": "det_10g.onnx",
+ "url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/det_10g.onnx",
+ "size": "16.9MB"
+ },
+ {
+ "name": "genderage.onnx",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface/models/buffalo_l",
+ "description": "Buffalo_l genderage.onnx model for IpAdapterPlus",
+ "reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid",
+ "filename": "genderage.onnx",
+ "url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/genderage.onnx",
+ "size": "1.32MB"
+ },
+ {
+ "name": "w600k_r50.onnx",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface/models/buffalo_l",
+ "description": "Buffalo_l w600k_r50.onnx model for IpAdapterPlus",
+ "reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid",
+ "filename": "w600k_r50.onnx",
+ "url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/w600k_r50.onnx",
+ "size": "174.4MB"
+ },
+ {
+ "name": "BLIP ImageCaption (COCO) w/ ViT-B and CapFilt-L",
+ "type": "BLIP_MODEL",
+ "base": "blip_model",
+ "save_path": "blip",
+ "description": "BLIP ImageCaption (COCO) w/ ViT-B and CapFilt-L",
+ "reference": "https://github.com/salesforce/BLIP",
+ "filename": "model_base_capfilt_large.pth",
+ "url": "https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base_capfilt_large.pth",
+ "size": "2.12GB"
+ },
+ {
+ "name": "GroundingDINO SwinT OGC - Model",
+ "type": "GroundingDINO",
+ "base": "DINO",
+ "save_path": "groundingdino",
+ "description": "GroundingDINO SwinT OGC Model",
+ "reference": "https://huggingface.co/ShilongLiu/GroundingDINO",
+ "filename": "groundingdino_swint_ogc.pth",
+ "url": "https://huggingface.co/ShilongLiu/GroundingDINO/resolve/main/groundingdino_swint_ogc.pth",
+ "size": "694.0MB"
+ },
+ {
+ "name": "GroundingDINO SwinT OGC - CFG File",
+ "type": "GroundingDINO",
+ "base": "DINO",
+ "save_path": "groundingdino",
+ "description": "GroundingDINO SwinT OGC CFG File",
+ "reference": "https://huggingface.co/ShilongLiu/GroundingDINO/resolve/main/GroundingDINO_SwinT_OGC.cfg.py",
+ "filename": "GroundingDINO_SwinT_OGC.cfg.py",
+ "url": "https://huggingface.co/ShilongLiu/GroundingDINO/raw/main/GroundingDINO_SwinT_OGC.cfg.py",
+ "size": "1.01KB"
+ },
+ {
+ "name": "MobileSAM",
+ "type": "sam",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "MobileSAM",
+ "reference": "https://github.com/ChaoningZhang/MobileSAM/",
+ "filename": "mobile_sam.pt",
+ "url": "https://github.com/ChaoningZhang/MobileSAM/blob/master/weights/mobile_sam.pt",
+ "size": "38.8MB"
+ },
+ {
+ "name": "DynamiCrafter 1024 bf16 safetensors",
+ "type": "checkpoint",
+ "base": "DynamiCrafter",
+ "save_path": "checkpoints/dynamicrafter",
+ "description": "DynamiCrafter image2video model 1024x575",
+ "reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned/",
+ "filename": "dynamicrafter_1024_v1_bf16.safetensors",
+ "url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/dynamicrafter_1024_v1_bf16.safetensors",
+ "size": "5.22GB"
+ },
+ {
+ "name": "DynamiCrafter 512 interpolation bf16 safetensors",
+ "type": "checkpoint",
+ "base": "DynamiCrafter",
+ "save_path": "checkpoints/dynamicrafter",
+ "description": "DynamiCrafter image2video interpolation model 512",
+ "reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned/",
+ "filename": "dynamicrafter_512_interp_v1_bf16.safetensors",
+ "url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/dynamicrafter_512_interp_v1_bf16.safetensors",
+ "size": "5.22GB"
+ },
+ {
+ "name": "monster-labs - Controlnet QR Code Monster v1 For SDXL",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "monster-labs - Controlnet QR Code Monster v1 For SDXL",
+ "reference": "https://huggingface.co/monster-labs/control_v1p_sdxl_qrcode_monster",
+ "filename": "control_v1p_sdxl_qrcode_monster.safetensors",
+ "url": "https://huggingface.co/monster-labs/control_v1p_sdxl_qrcode_monster/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "5.00GB"
+ },
+ {
+ "name": "Depth-FM-v1 fp16 safetensors",
+ "type": "checkpoint",
+ "base": "Depth-FM",
+ "save_path": "checkpoints/depthfm",
+ "description": "Depth-FM monocular depth estimation model",
+ "reference": "https://huggingface.co/Kijai/depth-fm-pruned",
+ "filename": "depthfm-v1_fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/depth-fm-pruned/resolve/main/depthfm-v1_fp16.safetensors",
+ "size": "1.73GB"
+ },
+ {
+ "name": "Depth-FM-v1 fp32 safetensors",
+ "type": "checkpoint",
+ "base": "Depth-FM",
+ "save_path": "checkpoints/depthfm",
+ "description": "Depth-FM monocular depth estimation model",
+ "reference": "https://huggingface.co/Kijai/depth-fm-pruned",
+ "filename": "depthfm-v1_fp32.safetensors",
+ "url": "https://huggingface.co/Kijai/depth-fm-pruned/resolve/main/depthfm-v1_fp32.safetensors",
+ "size": "3.46GB"
+ },
+ {
+ "name": "SUPIR-v0F.ckpt",
+ "type": "checkpoint",
+ "base": "SUPIR",
+ "save_path": "checkpoints/SUPIR",
+ "description": "SUPIR checkpoint model",
+ "reference": "https://huggingface.co/camenduru/SUPIR/tree/main",
+ "filename": "SUPIR-v0F.ckpt",
+ "url": "https://huggingface.co/camenduru/SUPIR/resolve/main/SUPIR-v0F.ckpt",
+ "size": "5.33GB"
+ },
+ {
+ "name": "SUPIR-v0Q.ckpt",
+ "type": "checkpoint",
+ "base": "SUPIR",
+ "save_path": "checkpoints/SUPIR",
+ "description": "SUPIR checkpoint model",
+ "reference": "https://huggingface.co/camenduru/SUPIR/tree/main",
+ "filename": "SUPIR-v0Q.ckpt",
+ "url": "https://huggingface.co/camenduru/SUPIR/resolve/main/SUPIR-v0Q.ckpt",
+ "size": "5.33GB"
+ },
+ {
+ "name": "Kijai/SUPIR-v0F_fp16.safetensors (pruned)",
+ "type": "checkpoint",
+ "base": "SUPIR",
+ "save_path": "checkpoints/SUPIR",
+ "description": "SUPIR checkpoint model",
+ "reference": "https://huggingface.co/Kijai/SUPIR_pruned/tree/main",
+ "filename": "SUPIR-v0F_fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/SUPIR_pruned/resolve/main/SUPIR-v0F_fp16.safetensors",
+ "size": "2.66GB"
+ },
+ {
+ "name": "Kijai/SUPIR-v0Q_fp16.safetensors (pruned)",
+ "type": "checkpoint",
+ "base": "SUPIR",
+ "save_path": "checkpoints/SUPIR",
+ "description": "SUPIR checkpoint model",
+ "reference": "https://huggingface.co/Kijai/SUPIR_pruned/tree/main",
+ "filename": "SUPIR-v0Q_fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/SUPIR_pruned/resolve/main/SUPIR-v0Q_fp16.safetensors",
+ "size": "2.66GB"
+ },
+ {
+ "name": "RAM",
+ "type": "RAM",
+ "base": "RAM",
+ "save_path": "rams",
+ "description": "RAM Recognize Anything Model",
+ "reference": "https://huggingface.co/xinyu1205/recognize_anything_model",
+ "filename": "ram_swin_large_14m.pth",
+ "url": "https://huggingface.co/xinyu1205/recognize_anything_model/resolve/main/ram_swin_large_14m.pth",
+ "size": "5.63GB"
+ },
+ {
+ "name": "RAM++",
+ "type": "RAM",
+ "base": "RAM",
+ "save_path": "rams",
+ "description": "RAM++ Recognize Anything Model",
+ "reference": "https://huggingface.co/xinyu1205/recognize-anything-plus-model",
+ "filename": "ram_plus_swin_large_14m.pth",
+ "url": "https://huggingface.co/xinyu1205/recognize-anything-plus-model/resolve/main/ram_plus_swin_large_14m.pth",
+ "size": "3.01GB"
+ },
+ {
+ "name": "tag2text",
+ "type": "RAM",
+ "base": "RAM",
+ "save_path": "rams",
+ "description": "tag2text Recognize Anything Model",
+ "reference": "https://huggingface.co/xinyu1205/recognize_anything_model",
+ "filename": "tag2text_swin_14m.pth",
+ "url": "https://huggingface.co/xinyu1205/recognize_anything_model/resolve/main/tag2text_swin_14m.pth",
+ "size": "4.48GB"
+ },
+ {
+ "name": "Zero123 3D object Model",
+ "type": "zero123",
+ "base": "zero123",
+ "save_path": "checkpoints/zero123",
+ "description": "model that been trained on 10M+ 3D objects from Objaverse-XL, used for generated rotated CamView",
+ "reference": "https://objaverse.allenai.org/docs/zero123-xl/",
+ "filename": "zero123-xl.ckpt",
+ "url": "https://huggingface.co/kealiu/zero123-xl/resolve/main/zero123-xl.ckpt",
+ "size": "15.5GB"
+ },
+ {
+ "name": "Zero123 3D object Model",
+ "type": "zero123",
+ "base": "zero123",
+ "save_path": "checkpoints/zero123",
+ "description": "Stable Zero123 is a model for view-conditioned image generation based on [a/Zero123](https://github.com/cvlab-columbia/zero123).",
+ "reference": "https://huggingface.co/stabilityai/stable-zero123",
+ "filename": "stable_zero123.ckpt",
+ "url": "https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt",
+ "size": "8.58GB"
+ },
+ {
+ "name": "Zero123 3D object Model",
+ "type": "zero123",
+ "base": "zero123",
+ "save_path": "checkpoints/zero123",
+ "description": "Zero123 original checkpoints in 105000 steps.",
+ "reference": "https://huggingface.co/cvlab/zero123-weights",
+ "filename": "zero123-105000.ckpt",
+ "url": "https://huggingface.co/cvlab/zero123-weights/resolve/main/105000.ckpt",
+ "size": "15.5GB"
+ },
+ {
+ "name": "Zero123 3D object Model",
+ "type": "zero123",
+ "base": "zero123",
+ "save_path": "checkpoints/zero123",
+ "description": "Zero123 original checkpoints in 165000 steps.",
+ "reference": "https://huggingface.co/cvlab/zero123-weights",
+ "filename": "zero123-165000.ckpt",
+ "url": "https://huggingface.co/cvlab/zero123-weights/resolve/main/165000.ckpt",
+ "size": "15.5GB"
+ },
+ {
+ "name": "InstantID/ip-adapter",
+ "type": "instantid",
+ "base": "SDXL",
+ "save_path": "instantid/SDXL",
+ "description": "ip-adapter model for cubiq/InstantID",
+ "reference": "https://huggingface.co/InstantX/InstantID",
+ "filename": "ip-adapter.bin",
+ "url": "https://huggingface.co/InstantX/InstantID/resolve/main/ip-adapter.bin",
+ "size": "1.69GB"
+ },
+ {
+ "name": "InstantID/ControlNet",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL/instantid",
+ "description": "instantid controlnet model for cubiq/InstantID",
+ "reference": "https://huggingface.co/InstantX/InstantID",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "MonsterMMORPG/insightface (for InstantID)",
+ "type": "insightface",
+ "base": "SDXL",
+ "save_path": "insightface/models",
+ "description": "MonsterMMORPG insightface model for cubiq/InstantID",
+ "reference": "https://huggingface.co/MonsterMMORPG/tools/tree/main",
+ "filename": "antelopev2.zip",
+ "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/antelopev2.zip",
+ "size": "360.7MB"
+ },
+ {
+ "name": "IC-Light/fc",
+ "type": "IC-Light",
+ "base": "SD1.5",
+ "save_path": "diffusion_models/IC-Light",
+ "description": "The default relighting model, conditioned on text and foreground",
+ "reference": "https://huggingface.co/lllyasviel/ic-light",
+ "filename": "iclight_sd15_fc.safetensors",
+ "url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fc.safetensors",
+ "size": "1.72GB"
+ },
+ {
+ "name": "IC-Light/fbc",
+ "type": "IC-Light",
+ "base": "SD1.5",
+ "save_path": "diffusion_models/IC-Light",
+ "description": "Relighting model conditioned with text, foreground, and background",
+ "reference": "https://huggingface.co/lllyasviel/ic-light",
+ "filename": "iclight_sd15_fbc.safetensors",
+ "url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fbc.safetensors",
+ "size": "1.72GB"
+ },
+ {
+ "name": "IC-Light/fcon",
+ "type": "IC-Light",
+ "base": "SD1.5",
+ "save_path": "diffusion_models/IC-Light",
+ "description": "Same as iclight_sd15_fc.safetensors, but trained with offset noise",
+ "reference": "https://huggingface.co/lllyasviel/ic-light",
+ "filename": "iclight_sd15_fcon.safetensors",
+ "url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fcon.safetensors",
+ "size": "1.72GB"
+ },
+ {
+ "name": "TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic v2 (fp16)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "Controlnet SDXL Tile model realistic version.",
+ "reference": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic",
+ "filename": "TTPLANET_Controlnet_Tile_realistic_v2_fp16.safetensors",
+ "url": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic/resolve/main/TTPLANET_Controlnet_Tile_realistic_v2_fp16.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic v2 (rank256)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "Controlnet SDXL Tile model realistic version.",
+ "reference": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic",
+ "filename": "TTPLANET_Controlnet_Tile_realistic_v2_rank256.safetensors",
+ "url": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic/resolve/main/TTPLANET_Controlnet_Tile_realistic_v2_rank256.safetensors",
+ "size": "774.4MB"
+ },
+ {
+ "name": "ViperYX/RGT_x2.pth",
+ "type": "RGT",
+ "base": "RGT",
+ "save_path": "RGT/RGT",
+ "description": "RGT x2 upscale model for ComfyUI-RGT",
+ "reference": "https://huggingface.co/ViperYX/RGT/tree/main",
+ "filename": "RGT_x2.pth",
+ "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x2.pth",
+ "size": "179.8MB"
+ },
+ {
+ "name": "ViperYX/RGT_x3.pth",
+ "type": "RGT",
+ "base": "RGT",
+ "save_path": "RGT/RGT",
+ "description": "RGT x3 upscale model for ComfyUI-RGT",
+ "reference": "https://huggingface.co/ViperYX/RGT/tree/main",
+ "filename": "RGT_x3.pth",
+ "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x3.pth",
+ "size": "180.5MB"
+ },
+ {
+ "name": "ViperYX/RGT_x4.pth",
+ "type": "RGT",
+ "base": "RGT",
+ "save_path": "RGT/RGT",
+ "description": "RGT_S x4 upscale model for ComfyUI-RGT",
+ "reference": "https://huggingface.co/ViperYX/RGT/tree/main",
+ "filename": "RGT_x4.pth",
+ "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x4.pth",
+ "size": "180.4MB"
+ },
+ {
+ "name": "ViperYX/RGT_S_x2.pth",
+ "type": "RGT",
+ "base": "RGT",
+ "save_path": "RGT/RGT_S",
+ "description": "RGT_S x2 upscale model for ComfyUI-RGT",
+ "reference": "https://huggingface.co/ViperYX/RGT/tree/main",
+ "filename": "RGT_S_x2.pth",
+ "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x2.pth",
+ "size": "135.4MB"
+ },
+ {
+ "name": "ViperYX/RGT_S_x3.pth",
+ "type": "RGT",
+ "base": "RGT",
+ "save_path": "RGT/RGT_S",
+ "description": "RGT_S x3 upscale model for ComfyUI-RGT",
+ "reference": "https://huggingface.co/ViperYX/RGT/tree/main",
+ "filename": "RGT_S_x3.pth",
+ "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x3.pth",
+ "size": "136.1MB"
+ },
+ {
+ "name": "ViperYX/RGT_S_x4.pth",
+ "type": "RGT",
+ "base": "RGT",
+ "save_path": "RGT/RGT_S",
+ "description": "RGT_S x4 upscale model for ComfyUI-RGT",
+ "reference": "https://huggingface.co/ViperYX/RGT/tree/main",
+ "filename": "RGT_S_x4.pth",
+ "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x4.pth",
+ "size": "136.0MB"
+ },
+
+ {
+ "name": "InstantX/FLUX.1-dev Controlnet (Union)",
+ "type": "controlnet",
+ "base": "FLUX.1",
+ "save_path": "controlnet/FLUX.1/InstantX-FLUX1-Dev-Union",
+ "description": "FLUX.1 [Dev] Union Controlnet. Supports Canny, Depth, Pose, Tile, Blur, Gray Low Quality.",
+ "reference": "https://huggingface.co/InstantX/FLUX.1-dev-Controlnet-Union",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/InstantX/FLUX.1-dev-Controlnet-Union/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "6.6GB"
+ },
+
+
+ {
+ "name": "InstantX/FLUX.1-dev-IP-Adapter",
+ "type": "IP-Adapter",
+ "base": "FLUX.1",
+ "save_path": "ipadapter-flux",
+ "description": "FLUX.1-dev-IP-Adapter",
+ "reference": "https://huggingface.co/InstantX/FLUX.1-dev-IP-Adapter",
+ "filename": "ip-adapter.bin",
+ "url": "https://huggingface.co/InstantX/FLUX.1-dev-IP-Adapter/resolve/main/ip-adapter.bin",
+ "size": "5.29GB"
+ },
+ {
+ "name": "Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro",
+ "type": "controlnet",
+ "base": "FLUX.1",
+ "save_path": "controlnet/FLUX.1/Shakker-Labs-ControlNet-Union-Pro",
+ "description": "FLUX.1 [Dev] Union Controlnet. Supports Canny, Tile, Depth, Blur, Pose, Gray, Low Quality",
+ "reference": "https://huggingface.co/Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "6.6GB"
+ },
+ {
+ "name": "Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro (fp8_e4m3fn) by Kijai",
+ "type": "controlnet",
+ "base": "FLUX.1",
+ "save_path": "controlnet/FLUX.1",
+ "description": "FLUX.1 [Dev] Union Controlnet. Supports Canny, Tile, Depth, Blur, Pose, Gray, Low Quality\nVersion quantized to fp8_e4m3fn by Kijai",
+ "reference": "https://huggingface.co/Kijai/flux-fp8",
+ "filename": "flux_shakker_labs_union_pro-fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/Kijai/flux-fp8/resolve/main/flux_shakker_labs_union_pro-fp8_e4m3fn.safetensors",
+ "size": "3.3GB"
+ },
+
+ {
+ "name": "jasperai/FLUX.1-dev-Controlnet-Upscaler",
+ "type": "controlnet",
+ "base": "FLUX.1",
+ "save_path": "controlnet/FLUX.1/jasperai-dev-Upscaler",
+ "description": "This is Flux.1-dev ControlNet for low resolution images developed by Jasper research team.",
+ "reference": "https://huggingface.co/jasperai/Flux.1-dev-Controlnet-Upscaler",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/jasperai/Flux.1-dev-Controlnet-Upscaler/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "3.58GB"
+ },
+ {
+ "name": "jasperai/FLUX.1-dev-Controlnet-Depth",
+ "type": "controlnet",
+ "base": "FLUX.1",
+ "save_path": "controlnet/FLUX.1/jasperai-dev-Depth",
+ "description": "This is Flux.1-dev ControlNet for Depth map developed by Jasper research team.",
+ "reference": "https://huggingface.co/jasperai/Flux.1-dev-Controlnet-Depth",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/jasperai/Flux.1-dev-Controlnet-Depth/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "3.58GB"
+ },
+ {
+ "name": "jasperai/Flux.1-dev-Controlnet-Surface-Normals",
+ "type": "controlnet",
+ "base": "FLUX.1",
+ "save_path": "controlnet/FLUX.1/jasperai-dev-Surface-Normals",
+ "description": "This is Flux.1-dev ControlNet for Surface Normals map developed by Jasper research team.",
+ "reference": "https://huggingface.co/jasperai/Flux.1-dev-Controlnet-Surface-Normals",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/jasperai/Flux.1-dev-Controlnet-Surface-Normals/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "3.58GB"
+ },
+
+ {
+ "name": "xinsir/ControlNet++: All-in-one ControlNet",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL/controlnet-union-sdxl-1.0",
+ "description": "All-in-one ControlNet for image generations and editing!",
+ "reference": "https://huggingface.co/xinsir/controlnet-union-sdxl-1.0",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/xinsir/controlnet-union-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "xinsir/ControlNet++: All-in-one ControlNet (ProMax model)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL/controlnet-union-sdxl-1.0",
+ "description": "All-in-one ControlNet for image generations and editing! (ProMax model)",
+ "reference": "https://huggingface.co/xinsir/controlnet-union-sdxl-1.0",
+ "filename": "diffusion_pytorch_model_promax.safetensors",
+ "url": "https://huggingface.co/xinsir/controlnet-union-sdxl-1.0/resolve/main/diffusion_pytorch_model_promax.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "xinsir/Controlnet-Scribble-Sdxl-1.0",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0",
+ "description": "Controlnet SDXL Scribble model.",
+ "reference": "https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "xinsir/Controlnet-Canny-Sdxl-1.0 (V2)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL/controlnet-canny-sdxl-1.0",
+ "description": "Controlnet SDXL Canny model.",
+ "reference": "https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0",
+ "filename": "diffusion_pytorch_model_V2.safetensors",
+ "url": "https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0/resolve/main/diffusion_pytorch_model_V2.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "xinsir/Controlnet-Openpose-Sdxl-1.0",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL/controlnet-openpose-sdxl-1.0",
+ "description": "Controlnet SDXL Openpose model.",
+ "reference": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "xinsir/Controlnet-Openpose-Sdxl-1.0 (Ver. twins)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL/controlnet-openpose-sdxl-1.0",
+ "description": "Controlnet SDXL Openpose model. (Ver. twins)",
+ "reference": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0",
+ "filename": "diffusion_pytorch_model_twins.safetensors",
+ "url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model_twins.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "xinsir/Controlnet-Scribble-Sdxl-1.0-Anime",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0-anime",
+ "description": "Controlnet SDXL Scribble model. (Ver. anime)",
+ "reference": "https://huggingface.co/xinsir/anime-painter",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/xinsir/anime-painter/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "xinsir/ControlNet Depth SDXL, support zoe, midias",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL/controlnet-depth-sdxl-1.0",
+ "description": "Controlnet SDXL Depth model.",
+ "reference": "https://huggingface.co/xinsir/controlnet-depth-sdxl-1.0",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/xinsir/controlnet-depth-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "xinsir/ControlNet Tile SDXL",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL/controlnet-tile-sdxl-1.0",
+ "description": "Controlnet SDXL Tile model.",
+ "reference": "https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "2.50GB"
+ },
+
+ {
+ "name": "InstantX/SD3-Controlnet-Canny",
+ "type": "controlnet",
+ "base": "SD3",
+ "save_path": "controlnet/SD3/InstantX-Controlnet-Canny",
+ "description": "Controlnet SD3 Canny model.",
+ "reference": "https://huggingface.co/InstantX/SD3-Controlnet-Canny",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/InstantX/SD3-Controlnet-Canny/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "1.19GB"
+ },
+ {
+ "name": "InstantX/SD3-Controlnet-Pose",
+ "type": "controlnet",
+ "base": "SD3",
+ "save_path": "controlnet/SD3/InstantX-Controlnet-Pose",
+ "description": "Controlnet SD3 Pose model.",
+ "reference": "https://huggingface.co/InstantX/SD3-Controlnet-Pose",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/InstantX/SD3-Controlnet-Pose/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "1.19GB"
+ },
+ {
+ "name": "InstantX/SD3-Controlnet-Tile",
+ "type": "controlnet",
+ "base": "SD3",
+ "save_path": "controlnet/SD3/InstantX-Controlnet-Tile",
+ "description": "Controlnet SD3 Tile model.",
+ "reference": "https://huggingface.co/InstantX/SD3-Controlnet-Tile",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/InstantX/SD3-Controlnet-Tile/resolve/main/diffusion_pytorch_model.safetensors",
+ "size": "1.19GB"
+ },
+
+
+ {
+ "name": "stabilityai/SD3.5-Large-Controlnet-Blur",
+ "type": "controlnet",
+ "base": "SD3.5",
+ "save_path": "controlnet/SD3.5",
+ "description": "Blur Controlnet model for SD3.5 Large",
+ "reference": "https://huggingface.co/stabilityai/stable-diffusion-3.5-controlnets",
+ "filename": "sd3.5_large_controlnet_blur.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-diffusion-3.5-controlnets/resolve/main/sd3.5_large_controlnet_blur.safetensors",
+ "size": "8.65GB"
+ },
+ {
+ "name": "stabilityai/SD3.5-Large-Controlnet-Canny",
+ "type": "controlnet",
+ "base": "SD3.5",
+ "save_path": "controlnet/SD3.5",
+ "description": "Canny Controlnet model for SD3.5 Large",
+ "reference": "https://huggingface.co/stabilityai/stable-diffusion-3.5-controlnets",
+ "filename": "sd3.5_large_controlnet_canny.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-diffusion-3.5-controlnets/resolve/main/sd3.5_large_controlnet_canny.safetensors",
+ "size": "8.65GB"
+ },
+ {
+ "name": "stabilityai/SD3.5-Large-Controlnet-Depth",
+ "type": "controlnet",
+ "base": "SD3.5",
+ "save_path": "controlnet/SD3.5",
+ "description": "Depth Controlnet model for SD3.5 Large",
+ "reference": "https://huggingface.co/stabilityai/stable-diffusion-3.5-controlnets",
+ "filename": "sd3.5_large_controlnet_depth.safetensors",
+ "url": "https://huggingface.co/stabilityai/stable-diffusion-3.5-controlnets/resolve/main/sd3.5_large_controlnet_depth.safetensors",
+ "size": "8.65GB"
+ },
+
+ {
+ "name": "Kijai/ToonCrafter model checkpoint (interpolation fp16)",
+ "type": "checkpoint",
+ "base": "ToonCrafter",
+ "save_path": "checkpoints/ToonCrafter",
+ "description": "ToonCrafter checkpoint model for ComfyUI-DynamiCrafterWrapper",
+ "reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned",
+ "filename": "tooncrafter_512_interp-fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/tooncrafter_512_interp-fp16.safetensors",
+ "size": "5.25GB"
+ },
+ {
+ "name": "CN-anytest_v4-marged.safetensors",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "AnyTest Controlnet. A model for style transfer.",
+ "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
+ "filename": "CN-anytest_v4-marged.safetensors",
+ "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "CN-anytest_v4-marged_am_dim256.safetensors (dim256/Animagine)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "AnyTest Controlnet Lora (dim256) for Animagine. A model for style transfer.",
+ "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
+ "filename": "CN-anytest_v4-marged_am_dim256.safetensors",
+ "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim256.safetensors",
+ "size": "774.4MB"
+ },
+ {
+ "name": "CN-anytest_v4-marged_am_dim128.safetensors (dim128/Animagine)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "AnyTest Controlnet Lora (dim128) for Animagine. A model for style transfer.",
+ "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
+ "filename": "CN-anytest_v4-marged_am_dim128.safetensors",
+ "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim128.safetensors",
+ "size": "395.7MB"
+ },
+ {
+ "name": "CN-anytest_v4-marged_pn_dim256.safetensors (dim256/Pony)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "AnyTest Controlnet Lora (dim256) for Pony. A model for style transfer.",
+ "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
+ "filename": "CN-anytest_v4-marged_pn_dim256.safetensors",
+ "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim256.safetensors",
+ "size": "774.4MB"
+ },
+ {
+ "name": "CN-anytest_v4-marged_pn_dim128.safetensors (dim128/Pony)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "AnyTest Controlnet Lora (dim128) for Pony. A model for style transfer.",
+ "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
+ "filename": "CN-anytest_v4-marged_pn_dim128.safetensors",
+ "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim128.safetensors",
+ "size": "395.7MB"
+ },
+ {
+ "name": "CN-anytest_v3-50000_fp16.safetensors (fp16)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "AnyTest Controlnet. A strict control model.",
+ "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
+ "filename": "CN-anytest_v3-50000_fp16.safetensors",
+ "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_fp16.safetensors",
+ "size": "2.50GB"
+ },
+ {
+ "name": "CN-anytest_v3-50000_am_dim256.safetensors (dim256/Animagine)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "AnyTest Controlnet Lora (dim256) for Animagine. A strict control model.",
+ "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
+ "filename": "CN-anytest_v3-50000_am_dim256.safetensors",
+ "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim256.safetensors",
+ "size": "774.4MB"
+ },
+ {
+ "name": "CN-anytest_v3-50000_am_dim128.safetensors (dim128/Animagine)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "AnyTest Controlnet Lora (dim128) for Animagine. A strict control model.",
+ "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
+ "filename": "CN-anytest_v3-50000_am_dim128.safetensors",
+ "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim128.safetensors",
+ "size": "395.7MB"
+ },
+ {
+ "name": "CN-anytest_v3-50000_pn_dim256.safetensors (dim256/Pony)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "AnyTest Controlnet Lora (dim256) for Pony. A strict control model.",
+ "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
+ "filename": "CN-anytest_v3-50000_pn_dim256.safetensors",
+ "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim256.safetensors",
+ "size": "774.4MB"
+ },
+ {
+ "name": "CN-anytest_v3-50000_pn_dim128.safetensors (dim128/Pony)",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "controlnet/SDXL",
+ "description": "AnyTest Controlnet Lora (dim128) for Pony. A strict control model.",
+ "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
+ "filename": "CN-anytest_v3-50000_pn_dim128.safetensors",
+ "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim128.safetensors",
+ "size": "395.7MB"
+ },
+ {
+ "name": "kijai/DepthAnythingV2 (vitb/fp16)",
+ "type": "depthanything",
+ "base": "depthanything",
+ "save_path": "depthanything",
+ "description": "DepthAnythingV2 model",
+ "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
+ "filename": "depth_anything_v2_vitb_fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitb_fp16.safetensors",
+ "size": "195.0MB"
+ },
+ {
+ "name": "kijai/DepthAnythingV2 (vitb/fp32)",
+ "type": "depthanything",
+ "base": "depthanything",
+ "save_path": "depthanything",
+ "description": "DepthAnythingV2 model",
+ "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
+ "filename": "depth_anything_v2_vitb_fp32.safetensors",
+ "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitb_fp32.safetensors",
+ "size": "389.9MB"
+ },
+ {
+ "name": "kijai/DepthAnythingV2 (vitl/fp16)",
+ "type": "depthanything",
+ "base": "depthanything",
+ "save_path": "depthanything",
+ "description": "DepthAnythingV2 model",
+ "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
+ "filename": "depth_anything_v2_vitl_fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitl_fp16.safetensors",
+ "size": "670.7MB"
+ },
+ {
+ "name": "kijai/DepthAnythingV2 (vitl/fp32)",
+ "type": "depthanything",
+ "base": "depthanything",
+ "save_path": "depthanything",
+ "description": "DepthAnythingV2 model",
+ "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
+ "filename": "depth_anything_v2_vitl_fp32.safetensors",
+ "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitl_fp32.safetensors",
+ "size": "1.34GB"
+ },
+ {
+ "name": "kijai/DepthAnythingV2 (vits/fp16)",
+ "type": "depthanything",
+ "base": "depthanything",
+ "save_path": "depthanything",
+ "description": "DepthAnythingV2 model",
+ "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
+ "filename": "depth_anything_v2_vits_fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vits_fp16.safetensors",
+ "size": "49.6MB"
+ },
+ {
+ "name": "kijai/DepthAnythingV2 (vitb/fp32)",
+ "type": "depthanything",
+ "base": "depthanything",
+ "save_path": "depthanything",
+ "description": "DepthAnythingV2 model",
+ "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
+ "filename": "depth_anything_v2_vits_fp32.safetensors",
+ "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vits_fp32.safetensors",
+ "size": "99.2MB"
+ },
+
+ {
+ "name": "PixArt-Sigma-XL-2-1024-MS.pth (checkpoint)",
+ "type": "checkpoint",
+ "base": "pixart-sigma",
+ "save_path": "checkpoints/PixArt-Sigma",
+ "description": "PixArt-Sigma Checkpoint model",
+ "reference": "https://huggingface.co/PixArt-alpha/PixArt-Sigma/tree/main",
+ "filename": "PixArt-Sigma-XL-2-1024-MS.pth",
+ "url": "https://huggingface.co/PixArt-alpha/PixArt-Sigma/resolve/main/PixArt-Sigma-XL-2-1024-MS.pth",
+ "size": "2.47GB"
+ },
+
+ {
+ "name": "PixArt-Sigma-XL-2-512-MS.safetensors (diffusion)",
+ "type": "diffusion_model",
+ "base": "pixart-sigma",
+ "save_path": "diffusion_models/PixArt-Sigma",
+ "description": "PixArt-Sigma Diffusion model",
+ "reference": "https://huggingface.co/PixArt-alpha/PixArt-Sigma-XL-2-512-MS",
+ "filename": "PixArt-Sigma-XL-2-512-MS.safetensors",
+ "url": "https://huggingface.co/PixArt-alpha/PixArt-Sigma-XL-2-512-MS/resolve/main/transformer/diffusion_pytorch_model.safetensors",
+ "size": "2.44GB"
+ },
+ {
+ "name": "PixArt-Sigma-XL-2-1024-MS.safetensors (diffusion)",
+ "type": "diffusion_model",
+ "base": "pixart-sigma",
+ "save_path": "diffusion_models/PixArt-Sigma",
+ "description": "PixArt-Sigma Diffusion model",
+ "reference": "https://huggingface.co/PixArt-alpha/PixArt-Sigma-XL-2-1024-MS",
+ "filename": "PixArt-Sigma-XL-2-1024-MS.safetensors",
+ "url": "https://huggingface.co/PixArt-alpha/PixArt-Sigma-XL-2-1024-MS/resolve/main/transformer/diffusion_pytorch_model.safetensors",
+ "size": "2.44GB"
+ },
+ {
+ "name": "PixArt-XL-2-1024-MS.safetensors (diffusion)",
+ "type": "diffusion_model",
+ "base": "pixart-alpha",
+ "save_path": "diffusion_models/PixArt-Alpha",
+ "description": "PixArt-Alpha Diffusion model",
+ "reference": "https://huggingface.co/PixArt-alpha/PixArt-XL-2-1024-MS",
+ "filename": "PixArt-XL-2-1024-MS.safetensors",
+ "url": "https://huggingface.co/PixArt-alpha/PixArt-XL-2-1024-MS/resolve/main/transformer/diffusion_pytorch_model.safetensors",
+ "size": "2.45GB"
+ },
+
+
+ {
+ "name": "hunyuan_dit_1.2.safetensors",
+ "type": "checkpoint",
+ "base": "Hunyuan-DiT",
+ "save_path": "checkpoints/hunyuan_dit_comfyui",
+ "description": "Different versions of HunyuanDIT packaged for ComfyUI use.",
+ "reference": "https://huggingface.co/comfyanonymous/hunyuan_dit_comfyui",
+ "filename": "hunyuan_dit_1.2.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/hunyuan_dit_comfyui/resolve/main/hunyuan_dit_1.2.safetensors",
+ "size": "8.24GB"
+ },
+ {
+ "name": "hunyuan_dit_1.1.safetensors",
+ "type": "checkpoint",
+ "base": "Hunyuan-DiT",
+ "save_path": "checkpoints/hunyuan_dit_comfyui",
+ "description": "Different versions of HunyuanDIT packaged for ComfyUI use.",
+ "reference": "https://huggingface.co/comfyanonymous/hunyuan_dit_comfyui",
+ "filename": "hunyuan_dit_1.1.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/hunyuan_dit_comfyui/resolve/main/hunyuan_dit_1.1.safetensors",
+ "size": "8.24GB"
+ },
+ {
+ "name": "hunyuan_dit_1.0.safetensors",
+ "type": "checkpoint",
+ "base": "Hunyuan-DiT",
+ "save_path": "checkpoints/hunyuan_dit_comfyui",
+ "description": "Different versions of HunyuanDIT packaged for ComfyUI use.",
+ "reference": "https://huggingface.co/comfyanonymous/hunyuan_dit_comfyui",
+ "filename": "hunyuan_dit_1.0.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/hunyuan_dit_comfyui/resolve/main/hunyuan_dit_1.0.safetensors",
+ "size": "8.24GB"
+ },
+
+ {
+ "name": "Comfy-Org/hunyuan_video_t2v_720p_bf16.safetensors",
+ "type": "diffusion_model",
+ "base": "Hunyuan Video",
+ "save_path": "diffusion_models/hunyuan_video",
+ "description": "Huyuan Video diffusion model. repackaged version.",
+ "reference": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged",
+ "filename": "hunyuan_video_t2v_720p_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged/resolve/main/split_files/diffusion_models/hunyuan_video_t2v_720p_bf16.safetensors",
+ "size": "25.6GB"
+ },
+ {
+ "name": "Comfy-Org/hunyuan_video_vae_bf16.safetensors",
+ "type": "VAE",
+ "base": "Hunyuan Video",
+ "save_path": "default",
+ "description": "Huyuan Video VAE model. repackaged version.",
+ "reference": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged",
+ "filename": "hunyuan_video_vae_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged/resolve/main/split_files/vae/hunyuan_video_vae_bf16.safetensors",
+ "size": "493MB"
+ },
+ {
+ "name": "Comfy-Org/hunyuan_video_image_to_video_720p_bf16.safetensors",
+ "type": "diffusion_model",
+ "base": "Hunyuan Video",
+ "save_path": "diffusion_models/hunyuan_video",
+ "description": "Huyuan Video Image2Video diffusion model. repackaged version.",
+ "reference": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged",
+ "filename": "hunyuan_video_image_to_video_720p_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged/resolve/main/split_files/diffusion_models/hunyuan_video_image_to_video_720p_bf16.safetensors",
+ "size": "25.6GB"
+ },
+
+ {
+ "name": "Comfy-Org/llava_llama3_fp8_scaled.safetensors",
+ "type": "clip",
+ "base": "LLaVA-Llama-3",
+ "save_path": "text_encoders",
+ "description": "llava_llama3_fp8_scaled text encoder model. This is required for using Hunyuan Video.",
+ "reference": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged",
+ "filename": "llava_llama3_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged/resolve/main/split_files/text_encoders/llava_llama3_fp8_scaled.safetensors",
+ "size": "9.09GB"
+ },
+ {
+ "name": "Comfy-Org/llava_llama3_fp16.safetensors",
+ "type": "clip",
+ "base": "LLaVA-Llama-3",
+ "save_path": "text_encoders",
+ "description": "llava_llama3_fp16 text encoder model. This is required for using Hunyuan Video.",
+ "reference": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged",
+ "filename": "llava_llama3_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged/resolve/main/split_files/text_encoders/llava_llama3_fp16.safetensors",
+ "size": "16.1GB"
+ },
+ {
+ "name": "Comfy-Org/llava_llama3_vision.safetensors",
+ "type": "clip_vision",
+ "base": "LLaVA-Llama-3",
+ "save_path": "text_encoders",
+ "description": "llava_llama3_vision clip vison model. This is required for using Hunyuan Video Image2Video.",
+ "reference": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged",
+ "filename": "llava_llama3_vision.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged/resolve/main/split_files/clip_vision/llava_llama3_vision.safetensors",
+ "size": "649MB"
+ },
+
+ {
+ "name": "Comfy-Org/omnigen2_fp16.safetensors",
+ "type": "diffusion_model",
+ "base": "OmniGen2",
+ "save_path": "default",
+ "description": "OmniGen2 diffusion model. This is required for using OmniGen2.",
+ "reference": "https://huggingface.co/Comfy-Org/Omnigen2_ComfyUI_repackaged",
+ "filename": "omnigen2_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Omnigen2_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/omnigen2_fp16.safetensors",
+ "size": "7.93GB"
+ },
+ {
+ "name": "Comfy-Org/qwen_2.5_vl_fp16.safetensors",
+ "type": "clip",
+ "base": "qwen-2.5",
+ "save_path": "default",
+ "description": "text encoder for OmniGen2",
+ "reference": "https://huggingface.co/Comfy-Org/Omnigen2_ComfyUI_repackaged",
+ "filename": "qwen_2.5_vl_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Omnigen2_ComfyUI_repackaged/resolve/main/split_files/text_encoders/qwen_2.5_vl_fp16.safetensors",
+ "size": "7.51GB"
+ },
+
+ {
+ "name": "FLUX.1 [Schnell] Diffusion model",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Schnell] Diffusion model (a.k.a. FLUX.1 turbo model)[w/Due to the large size of the model, it is recommended to download it through a browser if possible.]",
+ "reference": "https://huggingface.co/black-forest-labs/FLUX.1-schnell",
+ "filename": "flux1-schnell.safetensors",
+ "url": "https://huggingface.co/black-forest-labs/FLUX.1-schnell/resolve/main/flux1-schnell.safetensors",
+ "size": "23.8GB"
+ },
+
+ {
+ "name": "FLUX.1 VAE model",
+ "type": "VAE",
+ "base": "FLUX.1",
+ "save_path": "vae/FLUX1",
+ "description": "FLUX.1 VAE model\nNOTE: This VAE model can also be used for image generation with OmniGen2.",
+ "reference": "https://huggingface.co/black-forest-labs/FLUX.1-schnell",
+ "filename": "ae.safetensors",
+ "url": "https://huggingface.co/black-forest-labs/FLUX.1-schnell/resolve/main/ae.safetensors",
+ "size": "335MB"
+ },
+
+ {
+ "name": "kijai/FLUX.1 [schnell] Diffusion model (float8_e4m3fn)",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Schnell] Diffusion model (float8_e4m3fn)",
+ "reference": "https://huggingface.co/Kijai/flux-fp8",
+ "filename": "flux1-schnell-fp8.safetensors",
+ "url": "https://huggingface.co/Kijai/flux-fp8/resolve/main/flux1-schnell-fp8.safetensors",
+ "size": "11.9GB"
+ },
+
+ {
+ "name": "FLUX.1 [Dev] Diffusion model (scaled fp8)",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (scaled fp8)[w/Due to the large size of the model, it is recommended to download it through a browser if possible.]",
+ "reference": "https://huggingface.co/comfyanonymous/flux_dev_scaled_fp8_test",
+ "filename": "flux_dev_fp8_scaled_diffusion_model.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/flux_dev_scaled_fp8_test/resolve/main/flux_dev_fp8_scaled_diffusion_model.safetensors",
+ "size": "11.9GB"
+ },
+ {
+ "name": "kijai/FLUX.1 [dev] Diffusion model (float8_e4m3fn)",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [dev] Diffusion model (float8_e4m3fn)",
+ "reference": "https://huggingface.co/Kijai/flux-fp8",
+ "filename": "flux1-dev-fp8.safetensors",
+ "url": "https://huggingface.co/Kijai/flux-fp8/resolve/main/flux1-dev-fp8.safetensors",
+ "size": "11.9GB"
+ },
+
+ {
+ "name": "Comfy Org/FLUX.1 [dev] Checkpoint model (fp8)",
+ "type": "checkpoint",
+ "base": "FLUX.1",
+ "save_path": "checkpoints/FLUX1",
+ "description": "FLUX.1 [dev] Checkpoint model (fp8)",
+ "reference": "https://huggingface.co/Comfy-Org/flux1-dev/tree/main",
+ "filename": "flux1-dev-fp8.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/flux1-dev/resolve/main/flux1-dev-fp8.safetensors",
+ "size": "17.2GB"
+ },
+ {
+ "name": "Comfy Org/FLUX.1 [schnell] Checkpoint model (fp8)",
+ "type": "checkpoint",
+ "base": "FLUX.1",
+ "save_path": "checkpoints/FLUX1",
+ "description": "FLUX.1 [schnell] Checkpoint model (fp8)",
+ "reference": "https://huggingface.co/Comfy-Org/flux1-dev/tree/main",
+ "filename": "flux1-schnell-fp8.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/flux1-schnell/resolve/main/flux1-schnell-fp8.safetensors",
+ "size": "17.2GB"
+ },
+
+ {
+ "name": "city96/flux1-dev-F16.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (f16/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-dev-gguf",
+ "filename": "flux1-dev-F16.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-F16.gguf",
+ "size": "23.8GB"
+ },
+ {
+ "name": "city96/flux1-dev-Q2_K.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q2_K/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-dev-gguf",
+ "filename": "flux1-dev-Q2_K.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-Q2_K.gguf",
+ "size": "4.03GB"
+ },
+ {
+ "name": "city96/flux1-dev-Q3_K_S.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q3_K_S/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-dev-gguf",
+ "filename": "flux1-dev-Q3_K_S.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-Q3_K_S.gguf",
+ "size": "5.23GB"
+ },
+ {
+ "name": "city96/flux1-dev-Q4_0.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q4_0/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-dev-gguf",
+ "filename": "flux1-dev-Q4_0.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-Q4_0.gguf",
+ "size": "6.79GB"
+ },
+ {
+ "name": "city96/flux1-dev-Q4_1.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q4_1/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-dev-gguf",
+ "filename": "flux1-dev-Q4_1.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-Q4_1.gguf",
+ "size": "7.53GB"
+ },
+ {
+ "name": "city96/flux1-dev-Q4_K_S.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q4_K_S/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-dev-gguf",
+ "filename": "flux1-dev-Q4_K_S.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-Q4_K_S.gguf",
+ "size": "6.81GB"
+ },
+ {
+ "name": "city96/flux1-dev-Q5_0.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q5_0/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-dev-gguf",
+ "filename": "flux1-dev-Q5_0.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-Q5_0.gguf",
+ "size": "8.27GB"
+ },
+ {
+ "name": "city96/flux1-dev-Q5_1.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q5_1/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-dev-gguf",
+ "filename": "flux1-dev-Q5_1.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-Q5_1.gguf",
+ "size": "9.01GB"
+ },
+ {
+ "name": "city96/flux1-dev-Q5_K_S.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q5_K_S/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-dev-gguf",
+ "filename": "flux1-dev-Q5_K_S.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-Q5_K_S.gguf",
+ "size": "8.29GB"
+ },
+ {
+ "name": "city96/flux1-dev-Q6_K.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q6_K/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-dev-gguf",
+ "filename": "flux1-dev-Q6_K.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-Q6_K.gguf",
+ "size": "9.86GB"
+ },
+ {
+ "name": "city96/flux1-dev-Q8_0.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q8_0/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-dev-gguf",
+ "filename": "flux1-dev-Q8_0.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-Q8_0.gguf",
+ "size": "12.7GB"
+ },
+
+ {
+ "name": "city96/flux1-schnell-F16.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (f16/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-schnell-gguf",
+ "filename": "flux1-schnell-F16.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-schnell-gguf/resolve/main/flux1-schnell-F16.gguf",
+ "size": "23.8GB"
+ },
+ {
+ "name": "city96/flux1-schnell-Q2_K.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q2_K/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-schnell-gguf",
+ "filename": "flux1-schnell-Q2_K.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-schnell-gguf/resolve/main/flux1-schnell-Q2_K.gguf",
+ "size": "4.01GB"
+ },
+ {
+ "name": "city96/flux1-schnell-Q3_K_S.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q3_K_S/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-schnell-gguf",
+ "filename": "flux1-schnell-Q3_K_S.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-schnell-gguf/resolve/main/flux1-schnell-Q3_K_S.gguf",
+ "size": "5.21GB"
+ },
+ {
+ "name": "city96/flux1-schnell-Q4_0.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q4_0/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-schnell-gguf",
+ "filename": "flux1-schnell-Q4_0.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-schnell-gguf/resolve/main/flux1-schnell-Q4_0.gguf",
+ "size": "6.77GB"
+ },
+ {
+ "name": "city96/flux1-schnell-Q4_1.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q4_1/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-schnell-gguf",
+ "filename": "flux1-schnell-Q4_1.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-schnell-gguf/resolve/main/flux1-schnell-Q4_1.gguf",
+ "size": "7.51GB"
+ },
+ {
+ "name": "city96/flux1-schnell-Q4_K_S.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q4_K_S/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-schnell-gguf",
+ "filename": "flux1-schnell-Q4_K_S.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-schnell-gguf/resolve/main/flux1-schnell-Q4_K_S.gguf",
+ "size": "6.78GB"
+ },
+ {
+ "name": "city96/flux1-schnell-Q5_0.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q5_0/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-schnell-gguf",
+ "filename": "flux1-schnell-Q5_0.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-schnell-gguf/resolve/main/flux1-schnell-Q5_0.gguf",
+ "size": "8.25GB"
+ },
+ {
+ "name": "city96/flux1-schnell-Q5_1.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q5_1/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-schnell-gguf",
+ "filename": "flux1-schnell-Q5_1.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-schnell-gguf/resolve/main/flux1-schnell-Q5_1.gguf",
+ "size": "8.99GB"
+ },
+ {
+ "name": "city96/flux1-schnell-Q5_K_S.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q5_K_S/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-schnell-gguf",
+ "filename": "flux1-schnell-Q5_K_S.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-schnell-gguf/resolve/main/flux1-schnell-Q5_K_S.gguf",
+ "size": "8.26GB"
+ },
+ {
+ "name": "city96/flux1-schnell-Q6_K.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q6_K/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-schnell-gguf",
+ "filename": "flux1-schnell-Q6_K.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-schnell-gguf/resolve/main/flux1-schnell-Q6_K.gguf",
+ "size": "9.83GB"
+ },
+ {
+ "name": "city96/flux1-schnell-Q8_0.gguf",
+ "type": "diffusion_model",
+ "base": "FLUX.1",
+ "save_path": "diffusion_models/FLUX1",
+ "description": "FLUX.1 [Dev] Diffusion model (Q8_0/.gguf)",
+ "reference": "https://huggingface.co/city96/FLUX.1-schnell-gguf",
+ "filename": "flux1-schnell-Q8_0.gguf",
+ "url": "https://huggingface.co/city96/FLUX.1-schnell-gguf/resolve/main/flux1-schnell-Q8_0.gguf",
+ "size": "12.7GB"
+ },
+
+ {
+ "name": "ViT-L-14-TEXT-detail-improved-hiT-GmP-HF.safetensors [Long CLIP L]",
+ "type": "clip",
+ "base": "clip",
+ "save_path": "text_encoders/long_clip",
+ "description": "Greatly improved TEXT + Detail (as CLIP-L for Flux.1)",
+ "reference": "https://huggingface.co/zer0int",
+ "filename": "ViT-L-14-TEXT-detail-improved-hiT-GmP-HF.safetensors",
+ "url": "https://huggingface.co/zer0int/CLIP-GmP-ViT-L-14/resolve/main/ViT-L-14-TEXT-detail-improved-hiT-GmP-HF.safetensors",
+ "size": "931MB"
+ },
+ {
+ "name": "ViT-L-14-TEXT-detail-improved-hiT-GmP-HF.safetensors [Long CLIP L]",
+ "type": "clip",
+ "base": "clip",
+ "save_path": "text_encoders/long_clip",
+ "description": "Greatly improved TEXT + Detail (as CLIP-L for Flux.1)",
+ "reference": "https://huggingface.co/zer0int",
+ "filename": "ViT-L-14-TEXT-detail-improved-hiT-GmP-TE-only-HF.safetensors",
+ "url": "https://huggingface.co/zer0int/CLIP-GmP-ViT-L-14/resolve/main/ViT-L-14-TEXT-detail-improved-hiT-GmP-TE-only-HF.safetensors",
+ "size": "323MB"
+ },
+
+ {
+ "name": "Depth Pro model",
+ "type": "depth-pro",
+ "base": "depth-pro",
+ "save_path": "depth/ml-depth-pro",
+ "description": "Depth pro model for [a/ComfyUI-Depth-Pro](https://github.com/spacepxl/ComfyUI-Depth-Pro)",
+ "reference": "https://huggingface.co/spacepxl/ml-depth-pro",
+ "filename": "depth_pro.fp16.safetensors",
+ "url": "https://huggingface.co/spacepxl/ml-depth-pro/resolve/main/depth_pro.fp16.safetensors",
+ "size": "1.9GB"
+ },
+
+ {
+ "name": "kijai/lotus depth d model v1.1 (fp16)",
+ "type": "diffusion_model",
+ "base": "lotus",
+ "save_path": "diffusion_models",
+ "description": "lotus depth d model v1.1 (fp16). This model can be used in ComfyUI-Lotus custom nodes.",
+ "reference": "https://huggingface.co/Kijai/lotus-comfyui",
+ "filename": "lotus-depth-d-v-1-1-fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/lotus-comfyui/resolve/main/lotus-depth-d-v-1-1-fp16.safetensors",
+ "size": "1.74GB"
+ },
+ {
+ "name": "kijai/lotus depth g model v1.0 (fp16)",
+ "type": "diffusion_model",
+ "base": "lotus",
+ "save_path": "diffusion_models",
+ "description": "lotus depth g model v1.0 (fp16). This model can be used in ComfyUI-Lotus custom nodes.",
+ "reference": "https://huggingface.co/Kijai/lotus-comfyui",
+ "filename": "lotus-depth-g-v1-0-fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/lotus-comfyui/resolve/main/lotus-depth-g-v1-0-fp16.safetensors",
+ "size": "1.74GB"
+ },
+ {
+ "name": "kijai/lotus depth g model v1.0",
+ "type": "diffusion_model",
+ "base": "lotus",
+ "save_path": "diffusion_models",
+ "description": "lotus depth g model v1.0. This model can be used in ComfyUI-Lotus custom nodes.",
+ "reference": "https://huggingface.co/Kijai/lotus-comfyui",
+ "filename": "lotus-depth-g-v1-0.safetensors",
+ "url": "https://huggingface.co/Kijai/lotus-comfyui/resolve/main/lotus-depth-g-v1-0.safetensors",
+ "size": "3.47GB"
+ },
+ {
+ "name": "kijai/lotus normal d model v1.0 (fp16)",
+ "type": "diffusion_model",
+ "base": "lotus",
+ "save_path": "diffusion_models",
+ "description": "lotus normal d model v1.0 (fp16). This model can be used in ComfyUI-Lotus custom nodes.",
+ "reference": "https://huggingface.co/Kijai/lotus-comfyui",
+ "filename": "lotus-normal-d-v1-0-fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/lotus-comfyui/resolve/main/lotus-normal-d-v1-0-fp16.safetensors",
+ "size": "1.74GB"
+ },
+ {
+ "name": "kijai/lotus normal d model v1.0",
+ "type": "diffusion_model",
+ "base": "lotus",
+ "save_path": "diffusion_models",
+ "description": "lotus normal d model v1.0. This model can be used in ComfyUI-Lotus custom nodes.",
+ "reference": "https://huggingface.co/Kijai/lotus-comfyui",
+ "filename": "lotus-normal-d-v1-0.safetensors",
+ "url": "https://huggingface.co/Kijai/lotus-comfyui/resolve/main/lotus-normal-d-v1-0.safetensors",
+ "size": "3.47GB"
+ },
+ {
+ "name": "kijai/lotus normal g model v1.0 (fp16)",
+ "type": "diffusion_model",
+ "base": "lotus",
+ "save_path": "diffusion_models",
+ "description": "lotus normal g model v1.0 (fp16). This model can be used in ComfyUI-Lotus custom nodes.",
+ "reference": "https://huggingface.co/Kijai/lotus-comfyui",
+ "filename": "lotus-normal-g-v1-0-fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/lotus-comfyui/resolve/main/lotus-normal-g-v1-0-fp16.safetensors",
+ "size": "1.74GB"
+ },
+ {
+ "name": "kijai/lotus normal g model v1.0",
+ "type": "diffusion_model",
+ "base": "lotus",
+ "save_path": "diffusion_models",
+ "description": "lotus normal g model v1.0. This model can be used in ComfyUI-Lotus custom nodes.",
+ "reference": "https://huggingface.co/Kijai/lotus-comfyui",
+ "filename": "lotus-normal-g-v1-0.safetensors",
+ "url": "https://huggingface.co/Kijai/lotus-comfyui/resolve/main/lotus-normal-g-v1-0.safetensors",
+ "size": "3.47GB"
+ },
+
+ {
+ "name": "Kolors UNet model",
+ "type": "diffusion_model",
+ "base": "Kolors",
+ "save_path": "diffusion_models/kolors",
+ "description": "Kolors UNet model",
+ "reference": "https://huggingface.co/Kwai-Kolors/Kolors",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/Kwai-Kolors/Kolors/resolve/main/unet/diffusion_pytorch_model.safetensors",
+ "size": "10.3GB"
+ },
+ {
+ "name": "Kolors UNet model (fp16)",
+ "type": "diffusion_model",
+ "base": "Kolors",
+ "save_path": "diffusion_models/kolors",
+ "description": "Kolors UNet model",
+ "reference": "https://huggingface.co/Kwai-Kolors/Kolors",
+ "filename": "diffusion_pytorch_model.fp16.safetensors",
+ "url": "https://huggingface.co/Kwai-Kolors/Kolors/resolve/main/unet/diffusion_pytorch_model.fp16.safetensors",
+ "size": "5.16GB"
+ },
+ {
+ "name": "Kijai/ChatGLM3 (4bit)",
+ "type": "LLM",
+ "base": "ChatGLM3",
+ "save_path": "LLM",
+ "description": "This is required for Kolors",
+ "reference": "https://huggingface.co/Kijai/ChatGLM3-safetensors/tree/main",
+ "filename": "chatglm3-4bit.safetensors",
+ "url": "https://huggingface.co/Kijai/ChatGLM3-safetensors/resolve/main/chatglm3-4bit.safetensors",
+ "size": "3.92GB"
+ },
+ {
+ "name": "Kijai/ChatGLM3 (8bit)",
+ "type": "LLM",
+ "base": "ChatGLM3",
+ "save_path": "LLM",
+ "description": "This is required for Kolors",
+ "reference": "https://huggingface.co/Kijai/ChatGLM3-safetensors/tree/main",
+ "filename": "chatglm3-8bit.safetensors",
+ "url": "https://huggingface.co/Kijai/ChatGLM3-safetensors/resolve/main/chatglm3-8bit.safetensors",
+ "size": "3.92GB"
+ },
+ {
+ "name": "Kijai/ChatGLM3 (16bit)",
+ "type": "LLM",
+ "base": "ChatGLM3",
+ "save_path": "LLM",
+ "description": "This is required for Kolors",
+ "reference": "https://huggingface.co/Kijai/ChatGLM3-safetensors/tree/main",
+ "filename": "chatglm3-fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/ChatGLM3-safetensors/resolve/main/chatglm3-fp16.safetensors",
+ "size": "12.52GB"
+ },
+
+ {
+ "name": "pulid_flux_v0.9.1.safetensors",
+ "type": "PuLID",
+ "base": "FLUX.1",
+ "save_path": "pulid",
+ "description": "This is required for PuLID (FLUX)",
+ "reference": "https://huggingface.co/guozinan/PuLID",
+ "filename": "pulid_flux_v0.9.1.safetensors",
+ "url": "https://huggingface.co/guozinan/PuLID/resolve/main/pulid_flux_v0.9.1.safetensors",
+ "size": "1.14GB"
+ },
+ {
+ "name": "pulid_v1.1.safetensors",
+ "type": "PuLID",
+ "base": "SDXL",
+ "save_path": "pulid",
+ "description": "This is required for PuLID (SDXL)",
+ "reference": "https://huggingface.co/guozinan/PuLID",
+ "filename": "pulid_v1.1.safetensors",
+ "url": "https://huggingface.co/guozinan/PuLID/resolve/main/pulid_v1.1.safetensors",
+ "size": "984MB"
+ },
+
+ {
+ "name": "kijai/MoGe_ViT_L_fp16.safetensors",
+ "type": "MoGe",
+ "base": "MoGe",
+ "save_path": "MoGe",
+ "description": "Safetensors versions of [a/https://github.com/microsoft/MoGe](https://github.com/microsoft/MoGe)",
+ "reference": "https://huggingface.co/Kijai/MoGe_safetensors",
+ "filename": "MoGe_ViT_L_fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/MoGe_safetensors/resolve/main/MoGe_ViT_L_fp16.safetensors",
+ "size": "628MB"
+ },
+ {
+ "name": "kijai/MoGe_ViT_L_fp16.safetensors",
+ "type": "MoGe",
+ "base": "MoGe",
+ "save_path": "MoGe",
+ "description": "Safetensors versions of [a/https://github.com/microsoft/MoGe](https://github.com/microsoft/MoGe)",
+ "reference": "https://huggingface.co/Kijai/MoGe_safetensors",
+ "filename": "MoGe_ViT_L_fp16.safetensors",
+ "url": "https://huggingface.co/Kijai/MoGe_safetensors/resolve/main/MoGe_ViT_L_fp16.safetensors",
+ "size": "1.26GB"
+ },
+
+ {
+ "name": "LTX-Video 2B v0.9 Checkpoint",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "LTX-Video is the first DiT-based video generation model capable of generating high-quality videos in real-time. It produces 24 FPS videos at a 768x512 resolution faster than they can be watched. Trained on a large-scale dataset of diverse videos, the model generates high-resolution videos with realistic and varied content.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltx-video-2b-v0.9.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltx-video-2b-v0.9.safetensors",
+ "size": "9.37GB"
+ },
+ {
+ "name": "LTX-Video 2B v0.9.1 Checkpoint",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "LTX-Video is the first DiT-based video generation model capable of generating high-quality videos in real-time. It produces 24 FPS videos at a 768x512 resolution faster than they can be watched. Trained on a large-scale dataset of diverse videos, the model generates high-resolution videos with realistic and varied content.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltx-video-2b-v0.9.1.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltx-video-2b-v0.9.1.safetensors",
+ "size": "5.72GB"
+ },
+ {
+ "name": "LTX-Video 2B v0.9.5 Checkpoint",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "LTX-Video is the first DiT-based video generation model capable of generating high-quality videos in real-time. It produces 24 FPS videos at a 768x512 resolution faster than they can be watched. Trained on a large-scale dataset of diverse videos, the model generates high-resolution videos with realistic and varied content.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltx-video-2b-v0.9.5.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltx-video-2b-v0.9.5.safetensors",
+ "size": "6.34GB"
+ },
+
+ {
+ "name": "XLabs-AI/flux-canny-controlnet-v3.safetensors",
+ "type": "controlnet",
+ "base": "FLUX.1",
+ "save_path": "xlabs/controlnets",
+ "description": "ControlNet checkpoints for FLUX.1-dev model by Black Forest Labs.",
+ "reference": "https://huggingface.co/XLabs-AI/flux-controlnet-collections",
+ "filename": "flux-canny-controlnet-v3.safetensors",
+ "url": "https://huggingface.co/XLabs-AI/flux-controlnet-collections/resolve/main/flux-canny-controlnet-v3.safetensors",
+ "size": "1.49GB"
+ },
+ {
+ "name": "XLabs-AI/flux-depth-controlnet-v3.safetensors",
+ "type": "controlnet",
+ "base": "FLUX.1",
+ "save_path": "xlabs/controlnets",
+ "description": "ControlNet checkpoints for FLUX.1-dev model by Black Forest Labs.",
+ "reference": "https://huggingface.co/XLabs-AI/flux-controlnet-collections",
+ "filename": "flux-depth-controlnet-v3.safetensors",
+ "url": "https://huggingface.co/XLabs-AI/flux-controlnet-collections/resolve/main/flux-depth-controlnet-v3.safetensors",
+ "size": "1.49GB"
+ },
+ {
+ "name": "XLabs-AI/flux-hed-controlnet-v3.safetensors",
+ "type": "controlnet",
+ "base": "FLUX.1",
+ "save_path": "xlabs/controlnets",
+ "description": "ControlNet checkpoints for FLUX.1-dev model by Black Forest Labs.",
+ "reference": "https://huggingface.co/XLabs-AI/flux-controlnet-collections",
+ "filename": "flux-hed-controlnet-v3.safetensors",
+ "url": "https://huggingface.co/XLabs-AI/flux-controlnet-collections/resolve/main/flux-hed-controlnet-v3.safetensors",
+ "size": "1.49GB"
+ },
+
+ {
+ "name": "XLabs-AI/realism_lora.safetensors",
+ "type": "lora",
+ "base": "FLUX.1",
+ "save_path": "xlabs/loras",
+ "description": "A checkpoint with trained LoRAs for FLUX.1-dev model by Black Forest Labs",
+ "reference": "https://huggingface.co/XLabs-AI/flux-lora-collection",
+ "filename": "realism_lora.safetensors",
+ "url": "https://huggingface.co/XLabs-AI/flux-lora-collection/resolve/main/realism_lora.safetensors",
+ "size": "44.8MB"
+ },
+ {
+ "name": "XLabs-AI/art_lora.safetensors",
+ "type": "lora",
+ "base": "FLUX.1",
+ "save_path": "xlabs/loras",
+ "description": "A checkpoint with trained LoRAs for FLUX.1-dev model by Black Forest Labs",
+ "reference": "https://huggingface.co/XLabs-AI/flux-lora-collection",
+ "filename": "art_lora.safetensors",
+ "url": "https://huggingface.co/XLabs-AI/flux-lora-collection/resolve/main/scenery_lora.safetensors",
+ "size": "44.8MB"
+ },
+ {
+ "name": "XLabs-AI/mjv6_lora.safetensors",
+ "type": "lora",
+ "base": "FLUX.1",
+ "save_path": "xlabs/loras",
+ "description": "A checkpoint with trained LoRAs for FLUX.1-dev model by Black Forest Labs",
+ "reference": "https://huggingface.co/XLabs-AI/flux-lora-collection",
+ "filename": "mjv6_lora.safetensors",
+ "url": "https://huggingface.co/XLabs-AI/flux-lora-collection/resolve/main/mjv6_lora.safetensors",
+ "size": "44.8MB"
+ },
+
+ {
+ "name": "XLabs-AI/flux-ip-adapter",
+ "type": "lora",
+ "base": "FLUX.1",
+ "save_path": "xlabs/ipadapters",
+ "description": "A checkpoint with trained LoRAs for FLUX.1-dev model by Black Forest Labs",
+ "reference": "https://huggingface.co/XLabs-AI/flux-ip-adapter",
+ "filename": "ip_adapter.safetensors",
+ "url": "https://huggingface.co/XLabs-AI/flux-ip-adapter/resolve/main/ip_adapter.safetensors",
+ "size": "982MB"
+ },
+
+ {
+ "name": "efficient_sam_s_cpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
+ "type": "efficient_sam",
+ "base": "efficient_sam",
+ "save_path": "yolo_world",
+ "description": "Install efficient_sam_s_cpu.jit into ComfyUI-YoloWorld-EfficientSAM",
+ "reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
+ "filename": "efficient_sam_s_cpu.jit",
+ "url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_cpu.jit",
+ "size": "106.0MB"
+ },
+ {
+ "name": "efficient_sam_s_gpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
+ "type": "efficient_sam",
+ "base": "efficient_sam",
+ "save_path": "yolo_world",
+ "description": "Install efficient_sam_s_gpu.jit into ComfyUI-YoloWorld-EfficientSAM",
+ "reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
+ "filename": "efficient_sam_s_gpu.jit",
+ "url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_gpu.jit",
+ "size": "106.0MB"
+ },
+
+ {
+ "name": "TencentARC/CustomNet V1",
+ "type": "CustomNet",
+ "base": "CustomNet",
+ "save_path": "checkpoints/customnet",
+ "description": "CustomNet pretrained model for ComfyUI_CustomNet",
+ "reference": "https://huggingface.co/TencentARC/CustomNet/tree/main",
+ "filename": "customnet_v1.pt",
+ "url": "https://huggingface.co/TencentARC/CustomNet/resolve/main/customnet_v1.pt",
+ "size": "5.71GB"
+ },
+ {
+ "name": "TencentARC/CustomNet Inpaint V1",
+ "type": "CustomNet",
+ "base": "CustomNet",
+ "save_path": "checkpoints/customnet",
+ "description": "CustomNet Inpaint pretrained model for ComfyUI_CustomNet",
+ "reference": "https://huggingface.co/TencentARC/CustomNet/tree/main",
+ "filename": "customnet_inpaint_v1.pt",
+ "url": "https://huggingface.co/TencentARC/CustomNet/resolve/main/customnet_inpaint_v1.pt",
+ "size": "5.71GB"
+ },
+
+ {
+ "name": "deepseek-ai/Janus-Pro-1B",
+ "type": "Janus-Pro",
+ "base": "Janus-Pro",
+ "save_path": "Janus-Pro",
+ "description": "[SNAPSHOT] Janus-Pro-1B model.[w/You cannot download this item on ComfyUI-Manager versions below V3.18]",
+ "reference": "https://huggingface.co/deepseek-ai/Janus-Pro-1B",
+ "filename": "",
+ "url": "deepseek-ai/Janus-Pro-1B",
+ "size": "7.8GB"
+ },
+ {
+ "name": "deepseek-ai/Janus-Pro-7B",
+ "type": "Janus-Pro",
+ "base": "Janus-Pro",
+ "save_path": "Janus-Pro",
+ "description": "[SNAPSHOT] Janus-Pro-7B model.[w/You cannot download this item on ComfyUI-Manager versions below V3.18]",
+ "reference": "https://huggingface.co/deepseek-ai/Janus-Pro-7B",
+ "filename": "",
+ "url": "deepseek-ai/Janus-Pro-7B",
+ "size": "14.85GB"
+ },
+ {
+ "name": "kolors/vae/diffusion_pytorch_model.fp16.safetensors",
+ "type": "VAE",
+ "base": "Kolors",
+ "save_path": "vae/kolors",
+ "description": "Kolors VAE",
+ "reference": "https://huggingface.co/Kwai-Kolors/Kolors",
+ "filename": "diffusion_pytorch_model.fp16.safetensors",
+ "url": "https://huggingface.co/Kwai-Kolors/Kolors/resolve/main/vae/diffusion_pytorch_model.fp16.safetensors",
+ "size": "167MB"
+ },
+ {
+ "name": "kolors/vae/diffusion_pytorch_model.safetensors",
+ "type": "VAE",
+ "base": "Kolors",
+ "save_path": "vae/kolors",
+ "description": "Kolors VAE",
+ "reference": "https://huggingface.co/Kwai-Kolors/Kolors",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/Kwai-Kolors/Kolors/resolve/main/vae/diffusion_pytorch_model.safetensors",
+ "size": "335MB"
+ },
+
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 480p 14B (bf16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 480p 14B (bf16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_480p_14B_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_480p_14B_bf16.safetensors",
+ "size": "32.8GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 480p 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 480p 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_480p_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_480p_14B_fp16.safetensors",
+ "size": "32.8GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 480p 14B (fp8_e4m3fn)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 480p 14B (fp8_e4m3fn)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_480p_14B_fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_480p_14B_fp8_e4m3fn.safetensors",
+ "size": "16.4GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 480p 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 480p 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_480p_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_480p_14B_fp8_scaled.safetensors",
+ "size": "16.4GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 720p 14B (bf16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 720p 14B (bf16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_720p_14B_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_720p_14B_bf16.safetensors",
+ "size": "32.8GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 720p 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 720p 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_720p_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_720p_14B_fp16.safetensors",
+ "size": "32.8GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 720p 14B (fp8_e4m3fn)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 720p 14B (fp8_e4m3fn)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_720p_14B_fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_720p_14B_fp8_e4m3fn.safetensors",
+ "size": "16.4GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 720p 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 720p 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_720p_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_720p_14B_fp8_scaled.safetensors",
+ "size": "16.4GB"
+ },
+
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 1.3B (bf16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 1.3B (bf16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_1.3B_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_1.3B_bf16.safetensors",
+ "size": "2.84GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 1.3B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 1.3B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_1.3B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_1.3B_fp16.safetensors",
+ "size": "2.84GB"
+ },
+
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 14B (bf16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 14B (bf16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_14B_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_14B_bf16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_14B_fp16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 14B (fp8_e4m3fn)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 14B (fp8_e4m3fn)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_14B_fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_14B_fp8_e4m3fn.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_14B_fp8_scaled.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 VAE",
+ "type": "vae",
+ "base": "Wan2.1",
+ "save_path": "vae",
+ "description": "Wan2.1 VAE model",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan_2.1_vae.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/vae/wan_2.1_vae.safetensors",
+ "size": "254MB"
+ },
+ {
+ "name": "Comfy-Org/clip_vision_h.safetensors",
+ "type": "clip_vision",
+ "base": "clip_vision_h",
+ "save_path": "clip_vision",
+ "description": "clip_vision_h model for Wan2.1",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "clip_vision_h.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/clip_vision/clip_vision_h.safetensors",
+ "size": "1.26GB"
+ },
+
+ {
+ "name": "Comfy-Org/Wan2.2 i2v high noise 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for i2v high noise 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_i2v_high_noise_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_i2v_high_noise_14B_fp16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 i2v high noise 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for i2v high noise 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 i2v low noise 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for i2v low noise 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_i2v_low_noise_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_i2v_low_noise_14B_fp16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 i2v low noise 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for i2v low noise 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 t2v high noise 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for t2v high noise 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_t2v_high_noise_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_t2v_high_noise_14B_fp16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 t2v high noise 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for t2v high noise 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_t2v_high_noise_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_t2v_high_noise_14B_fp8_scaled.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 t2v low noise 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for t2v low noise 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_t2v_low_noise_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_t2v_low_noise_14B_fp16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 t2v low noise 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for t2v low noise 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_t2v_low_noise_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_t2v_low_noise_14B_fp8_scaled.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 ti2v 5B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for ti2v 5B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_ti2v_5B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_ti2v_5B_fp16.safetensors",
+ "size": "10.0GB"
+ },
+
+ {
+ "name": "Comfy-Org/umt5_xxl_fp16.safetensors",
+ "type": "clip",
+ "base": "umt5_xxl",
+ "save_path": "text_encoders",
+ "description": "umt5_xxl_fp16 text encoder for Wan2.1",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "umt5_xxl_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp16.safetensors",
+ "size": "11.4GB"
+ },
+ {
+ "name": "Comfy-Org/umt5_xxl_fp8_e4m3fn_scaled.safetensors",
+ "type": "clip",
+ "base": "umt5_xxl",
+ "save_path": "text_encoders",
+ "description": "umt5_xxl_fp8_e4m3fn_scaled text encoder for Wan2.1",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors",
+ "size": "6.74GB"
+ },
+
+ {
+ "name": "lllyasviel/FramePackI2V_HY",
+ "type": "FramePackI2V",
+ "base": "FramePackI2V",
+ "save_path": "diffusers/lllyasviel",
+ "description": "[SNAPSHOT] This is the f1k1_x_g9_f1k1f2k2f16k4_td FramePack for HY. [w/You cannot download this item on ComfyUI-Manager versions below V3.18]",
+ "reference": "https://huggingface.co/lllyasviel/FramePackI2V_HY",
+ "filename": "",
+ "url": "lllyasviel/FramePackI2V_HY",
+ "size": "25.75GB"
+ },
+
+ {
+ "name": "LTX-2 19B Dev FP8",
+ "type": "checkpoint",
+ "base": "LTX-2",
+ "save_path": "checkpoints/LTX-2",
+ "description": "LTX-2 19B Dev FP8 model.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2",
+ "filename": "ltx-2-19b-dev-fp8.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-19b-dev-fp8.safetensors",
+ "size": "27.1GB"
+ },
+ {
+ "name": "LTX-2 19B Distilled FP8",
+ "type": "checkpoint",
+ "base": "LTX-2",
+ "save_path": "checkpoints/LTX-2",
+ "description": "LTX-2 19B Distilled FP8 model.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2",
+ "filename": "ltx-2-19b-distilled-fp8.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-19b-distilled-fp8.safetensors",
+ "size": "27.1GB"
+ },
+ {
+ "name": "LTX-2 19B Dev",
+ "type": "checkpoint",
+ "base": "LTX-2",
+ "save_path": "checkpoints/LTX-2",
+ "description": "LTX-2 19B Dev model.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2",
+ "filename": "ltx-2-19b-dev.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-19b-dev.safetensors",
+ "size": "43.3GB"
+ },
+ {
+ "name": "LTX-2 19B Distilled",
+ "type": "checkpoint",
+ "base": "LTX-2",
+ "save_path": "checkpoints/LTX-2",
+ "description": "LTX-2 19B Distilled model.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2",
+ "filename": "ltx-2-19b-distilled.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-19b-distilled.safetensors",
+ "size": "43.3GB"
+ },
+ {
+ "name": "LTX-2 Spatial Upscaler",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "Spatial upscaler model for LTX-2. This model enhances the spatial resolution of generated videos.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2",
+ "filename": "ltx-2-spatial-upscaler-x2-1.0.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-spatial-upscaler-x2-1.0.safetensors",
+ "size": "996MB"
+ },
+ {
+ "name": "LTX-2 Temporal Upscaler",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "Temporal upscaler model for LTX-2. This model enhances the temporal resolution of generated videos.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2",
+ "filename": "ltx-2-temporal-upscaler-x2-1.0.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-temporal-upscaler-x2-1.0.safetensors",
+ "size": "262MB"
+ },
+ {
+ "name": "LTX-2 19B Distilled LoRA",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras",
+ "description": "A LoRA adapter that transforms the standard LTX-2 19B model into a distilled version when loaded.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2",
+ "filename": "ltx-2-19b-distilled-lora-384.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-19b-distilled-lora-384.safetensors",
+ "size": "7.67GB"
+ },
+ {
+ "name": "LTX-2 19B IC LoRA - Canny Control",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras/LTX-2",
+ "description": "LoRA for canny control on LTX-2 19B IC model. Intended for advanced edge control and guided generation.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Canny-Control",
+ "filename": "ltx-2-19b-ic-lora-canny-control.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Canny-Control/resolve/main/ltx-2-19b-ic-lora-canny-control.safetensors",
+ "size": "654MB"
+ },
+ {
+ "name": "LTX-2 19B IC LoRA - Depth Control",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras/LTX-2",
+ "description": "LoRA for depth control on LTX-2 19B IC model. Adds depth-aware generation guidance.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Depth-Control",
+ "filename": "ltx-2-19b-ic-lora-depth-control.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Depth-Control/resolve/main/ltx-2-19b-ic-lora-depth-control.safetensors",
+ "size": "654MB"
+ },
+ {
+ "name": "LTX-2 19B IC LoRA - Detailer",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras/LTX-2",
+ "description": "LoRA detailer for LTX-2 19B IC. Improves fine details and sharpness in generated outputs.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Detailer",
+ "filename": "ltx-2-19b-ic-lora-detailer.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Detailer/resolve/main/ltx-2-19b-ic-lora-detailer.safetensors",
+ "size": "2.62GB"
+ },
+ {
+ "name": "LTX-2 19B IC LoRA - Pose Control",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras/LTX-2",
+ "description": "LoRA for pose control on LTX-2 19B IC model. Enables pose-guided image/video generation.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Pose-Control",
+ "filename": "ltx-2-19b-ic-lora-pose-control.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Pose-Control/resolve/main/ltx-2-19b-ic-lora-pose-control.safetensors",
+ "size": "654MB"
+ },
+ {
+ "name": "LTX-2 19B LoRA - Camera Control Dolly In",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras/LTX-2",
+ "description": "LoRA for dolly-in camera control with LTX-2 19B. Simulates camera moving closer to subject.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-In",
+ "filename": "ltx-2-19b-lora-camera-control-dolly-in.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-In/resolve/main/ltx-2-19b-lora-camera-control-dolly-in.safetensors",
+ "size": "327MB"
+ },
+ {
+ "name": "LTX-2 19B LoRA - Camera Control Dolly Left",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras/LTX-2",
+ "description": "LoRA for dolly-left camera control with LTX-2 19B. Simulates camera moving left.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Left",
+ "filename": "ltx-2-19b-lora-camera-control-dolly-left.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Left/resolve/main/ltx-2-19b-lora-camera-control-dolly-left.safetensors",
+ "size": "327MB"
+ },
+ {
+ "name": "LTX-2 19B LoRA - Camera Control Dolly Out",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras/LTX-2",
+ "description": "LoRA for dolly-out camera control with LTX-2 19B. Simulates camera moving away from subject.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Out",
+ "filename": "ltx-2-19b-lora-camera-control-dolly-out.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Out/resolve/main/ltx-2-19b-lora-camera-control-dolly-out.safetensors",
+ "size": "327MB"
+ },
+ {
+ "name": "LTX-2 19B LoRA - Camera Control Dolly Right",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras/LTX-2",
+ "description": "LoRA for dolly-right camera control with LTX-2 19B. Simulates camera moving right.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Right",
+ "filename": "ltx-2-19b-lora-camera-control-dolly-right.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Right/resolve/main/ltx-2-19b-lora-camera-control-dolly-right.safetensors",
+ "size": "327MB"
+ },
+ {
+ "name": "LTX-2 19B LoRA - Camera Control Jib Down",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras/LTX-2",
+ "description": "LoRA for jib-down camera control with LTX-2 19B. Simulates vertical camera movement downwards.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Jib-Down",
+ "filename": "ltx-2-19b-lora-camera-control-jib-down.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Jib-Down/resolve/main/ltx-2-19b-lora-camera-control-jib-down.safetensors",
+ "size": "2.21GB"
+ },
+ {
+ "name": "LTX-2 19B LoRA - Camera Control Jib Up",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras/LTX-2",
+ "description": "LoRA for jib-up camera control with LTX-2 19B. Simulates vertical camera movement upwards.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Jib-Up",
+ "filename": "ltx-2-19b-lora-camera-control-jib-up.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Jib-Up/resolve/main/ltx-2-19b-lora-camera-control-jib-up.safetensors",
+ "size": "2.21GB"
+ },
+ {
+ "name": "LTX-2 19B LoRA - Camera Control Static",
+ "type": "lora",
+ "base": "LTX-2",
+ "save_path": "loras/LTX-2",
+ "description": "LoRA for static camera control with LTX-2 19B. Simulates stationary/static camera view.",
+ "reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Static",
+ "filename": "ltx-2-19b-lora-camera-control-static.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Static/resolve/main/ltx-2-19b-lora-camera-control-static.safetensors",
+ "size": "2.21GB"
+ },
+ {
+ "name": "LTX-Video Spatial Upscaler v0.9.7",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "Spatial upscaler model for LTX-Video. This model enhances the spatial resolution of generated videos.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-spatial-upscaler-0.9.7.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-spatial-upscaler-0.9.7.safetensors",
+ "size": "505MB"
+ },
+ {
+ "name": "LTX-Video Temporal Upscaler v0.9.7",
+ "type": "upscale",
+ "base": "upscale",
+ "save_path": "default",
+ "description": "Temporal upscaler model for LTX-Video. This model enhances the temporal resolution and smoothness of generated videos.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-temporal-upscaler-0.9.7.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-temporal-upscaler-0.9.7.safetensors",
+ "size": "524MB"
+ },
+ {
+ "name": "LTX-Video 13B v0.9.7",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "High-resolution quality LTX-Video 13B model.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.7-dev.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.7-dev.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "LTX-Video 13B FP8 v0.9.7",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "Quantized version of the LTX-Video 13B model, optimized for lower VRAM usage while maintaining high quality.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.7-dev-fp8.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.7-dev-fp8.safetensors",
+ "size": "15.7GB"
+ },
+ {
+ "name": "LTX-Video 13B Distilled v0.9.7",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "Distilled version of the LTX-Video 13B model, providing improved efficiency while maintaining high-resolution quality.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.7-distilled.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.7-distilled.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "LTX-Video 13B Distilled FP8 v0.9.7",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "Quantized distilled version of the LTX-Video 13B model, optimized for even lower VRAM usage while maintaining quality.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.7-distilled-fp8.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.7-distilled-fp8.safetensors",
+ "size": "15.7GB"
+ },
+ {
+ "name": "LTX-Video 2B Distilled v0.9.8",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "LTX-Video 2B distilled model v0.9.8 with improved prompt understanding and detail generation.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-2b-0.9.8-distilled.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-2b-0.9.8-distilled.safetensors",
+ "size": "6.34GB"
+ },
+ {
+ "name": "LTX-Video 2B Distilled FP8 v0.9.8",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "Quantized LTX-Video 2B distilled model v0.9.8 with improved prompt understanding and detail generation, optimized for lower VRAM usage.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-2b-0.9.8-distilled-fp8.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-2b-0.9.8-distilled-fp8.safetensors",
+ "size": "4.46GB"
+ },
+ {
+ "name": "LTX-Video 13B Distilled v0.9.8",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "LTX-Video 13B distilled model v0.9.8 with improved prompt understanding and detail generation.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.8-distilled.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.8-distilled.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "LTX-Video 13B Distilled FP8 v0.9.8",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "Quantized LTX-Video 13B distilled model v0.9.8 with improved prompt understanding and detail generation, optimized for lower VRAM usage.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.8-distilled-fp8.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.8-distilled-fp8.safetensors",
+ "size": "15.7GB"
+ },
+ {
+ "name": "LTX-Video 13B Distilled LoRA v0.9.7",
+ "type": "lora",
+ "base": "LTX-Video",
+ "save_path": "loras",
+ "description": "A LoRA adapter that transforms the standard LTX-Video 13B model into a distilled version when loaded.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.7-distilled-lora128.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.7-distilled-lora128.safetensors",
+ "size": "1.33GB"
+ },
+ {
+ "name": "LTX-Video ICLoRA Depth 13B v0.9.7",
+ "type": "lora",
+ "base": "LTX-Video",
+ "save_path": "loras",
+ "description": "In-Context LoRA (IC LoRA) for depth-controlled video-to-video generation with precise depth conditioning.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video-ICLoRA-depth-13b-0.9.7",
+ "filename": "ltxv-097-ic-lora-depth-control-comfyui.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video-ICLoRA-depth-13b-0.9.7/resolve/main/ltxv-097-ic-lora-depth-control-comfyui.safetensors",
+ "size": "81.9MB"
+ },
+ {
+ "name": "LTX-Video ICLoRA Pose 13B v0.9.7",
+ "type": "lora",
+ "base": "LTX-Video",
+ "save_path": "loras",
+ "description": "In-Context LoRA (IC LoRA) for pose-controlled video-to-video generation with precise pose conditioning.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video-ICLoRA-pose-13b-0.9.7",
+ "filename": "ltxv-097-ic-lora-pose-control-comfyui.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video-ICLoRA-pose-13b-0.9.7/resolve/main/ltxv-097-ic-lora-pose-control-comfyui.safetensors",
+ "size": "151MB"
+ },
+ {
+ "name": "LTX-Video ICLoRA Canny 13B v0.9.7",
+ "type": "lora",
+ "base": "LTX-Video",
+ "save_path": "loras",
+ "description": "In-Context LoRA (IC LoRA) for canny edge-controlled video-to-video generation with precise edge conditioning.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video-ICLoRA-canny-13b-0.9.7",
+ "filename": "ltxv-097-ic-lora-canny-control-comfyui.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video-ICLoRA-canny-13b-0.9.7/resolve/main/ltxv-097-ic-lora-canny-control-comfyui.safetensors",
+ "size": "81.9MB"
+ },
+ {
+ "name": "LTX-Video ICLoRA Detailer 13B v0.9.8",
+ "type": "lora",
+ "base": "LTX-Video",
+ "save_path": "loras",
+ "description": "A video detailer model on top of LTXV_13B_098_DEV trained on custom data using In-Context LoRA (IC LoRA) method.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video-ICLoRA-detailer-13b-0.9.8",
+ "filename": "ltxv-098-ic-lora-detailer-comfyui.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video-ICLoRA-detailer-13b-0.9.8/resolve/main/ltxv-098-ic-lora-detailer-comfyui.safetensors",
+ "size": "1.31GB"
+ },
+ {
+ "name": "Latent Bridge Matching for Image Relighting",
+ "type": "diffusion_model",
+ "base": "LBM",
+ "save_path": "diffusion_models/LBM",
+ "description": "Latent Bridge Matching (LBM) Relighting model",
+ "reference": "https://huggingface.co/jasperai/LBM_relighting",
+ "filename": "LBM_relighting.safetensors",
+ "url": "https://huggingface.co/jasperai/LBM_relighting/resolve/main/model.safetensors",
+ "size": "5.02GB"
+ },
+ {
+ "name": "Qwen-Image VAE",
+ "type": "VAE",
+ "base": "Qwen-Image",
+ "save_path": "vae/qwen-image",
+ "description": "VAE model for Qwen-Image",
+ "reference": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI",
+ "filename": "qwen_image_vae.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/vae/qwen_image_vae.safetensors",
+ "size": "335MB"
+ },
+ {
+ "name": "Qwen 2.5 VL 7B Text Encoder (fp8_scaled)",
+ "type": "clip",
+ "base": "Qwen-2.5-VL",
+ "save_path": "text_encoders/qwen",
+ "description": "Qwen 2.5 VL 7B text encoder model (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI",
+ "filename": "qwen_2.5_vl_7b_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/text_encoders/qwen_2.5_vl_7b_fp8_scaled.safetensors",
+ "size": "3.75GB"
+ },
+ {
+ "name": "Qwen 2.5 VL 7B Text Encoder",
+ "type": "clip",
+ "base": "Qwen-2.5-VL",
+ "save_path": "text_encoders/qwen",
+ "description": "Qwen 2.5 VL 7B text encoder model",
+ "reference": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI",
+ "filename": "qwen_2.5_vl_7b.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/text_encoders/qwen_2.5_vl_7b.safetensors",
+ "size": "7.51GB"
+ },
+ {
+ "name": "Qwen-Image Diffusion Model (fp8_e4m3fn)",
+ "type": "diffusion_model",
+ "base": "Qwen-Image",
+ "save_path": "diffusion_models/qwen-image",
+ "description": "Qwen-Image diffusion model (fp8_e4m3fn)",
+ "reference": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI",
+ "filename": "qwen_image_fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/diffusion_models/qwen_image_fp8_e4m3fn.safetensors",
+ "size": "4.89GB"
+ },
+ {
+ "name": "Qwen-Image Diffusion Model (bf16)",
+ "type": "diffusion_model",
+ "base": "Qwen-Image",
+ "save_path": "diffusion_models/qwen-image",
+ "description": "Qwen-Image diffusion model (bf16)",
+ "reference": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI",
+ "filename": "qwen_image_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/diffusion_models/qwen_image_bf16.safetensors",
+ "size": "9.78GB"
+ },
+ {
+ "name": "Qwen-Image-Edit 2509 Diffusion Model (fp8_e4m3fn)",
+ "type": "diffusion_model",
+ "base": "Qwen-Image-Edit",
+ "save_path": "diffusion_models/qwen-image-edit",
+ "description": "Qwen-Image-Edit 2509 diffusion model (fp8_e4m3fn)",
+ "reference": "https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI",
+ "filename": "qwen_image_edit_2509_fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI/resolve/main/split_files/diffusion_models/qwen_image_edit_2509_fp8_e4m3fn.safetensors",
+ "size": "4.89GB"
+ },
+
+ {
+ "name": "Qwen-Image-Edit 2509 Diffusion Model (bf16)",
+ "type": "diffusion_model",
+ "base": "Qwen-Image-Edit",
+ "save_path": "diffusion_models/qwen-image-edit",
+ "description": "Qwen-Image-Edit 2509 diffusion model (bf16)",
+ "reference": "https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI",
+ "filename": "qwen_image_edit_2509_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI/resolve/main/split_files/diffusion_models/qwen_image_edit_2509_bf16.safetensors",
+ "size": "9.78GB"
+ },
+
+ {
+ "name": "Qwen-Image-Edit Diffusion Model (fp8_e4m3fn)",
+ "type": "diffusion_model",
+ "base": "Qwen-Image-Edit",
+ "save_path": "diffusion_models/qwen-image-edit",
+ "description": "Qwen-Image-Edit diffusion model (fp8_e4m3fn)",
+ "reference": "https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI",
+ "filename": "qwen_image_edit_fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI/resolve/main/split_files/diffusion_models/qwen_image_edit_fp8_e4m3fn.safetensors",
+ "size": "4.89GB"
+ },
+
+ {
+ "name": "Qwen-Image-Edit Diffusion Model (bf16)",
+ "type": "diffusion_model",
+ "base": "Qwen-Image-Edit",
+ "save_path": "diffusion_models/qwen-image-edit",
+ "description": "Qwen-Image-Edit diffusion model (bf16)",
+ "reference": "https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI",
+ "filename": "qwen_image_edit_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI/resolve/main/split_files/diffusion_models/qwen_image_edit_bf16.safetensors",
+ "size": "9.78GB"
+ },
+ {
+ "name": "Qwen-Image-Lightning 8steps V1.0",
+ "type": "lora",
+ "base": "Qwen-Image",
+ "save_path": "loras/qwen-image-lightning",
+ "description": "Qwen-Image-Lightning 8-step LoRA model V1.0",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Lightning-8steps-V1.0.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Lightning-8steps-V1.0.safetensors",
+ "size": "9.78GB"
+ },
+ {
+ "name": "Qwen-Image-Lightning 4steps V1.0",
+ "type": "lora",
+ "base": "Qwen-Image",
+ "save_path": "loras/qwen-image-lightning",
+ "description": "Qwen-Image-Lightning 4-step LoRA model V1.0",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Lightning-4steps-V1.0.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Lightning-4steps-V1.0.safetensors",
+ "size": "9.78GB"
+ },
+ {
+ "name": "Qwen-Image-Lightning 4steps V1.0 (bf16)",
+ "type": "lora",
+ "base": "Qwen-Image",
+ "save_path": "loras/qwen-image-lightning",
+ "description": "Qwen-Image-Lightning 4-step LoRA model V1.0 (bf16)",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Lightning-4steps-V1.0-bf16.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Lightning-4steps-V1.0-bf16.safetensors",
+ "size": "19.6GB"
+ },
+ {
+ "name": "Qwen-Image-Lightning 4steps V2.0",
+ "type": "lora",
+ "base": "Qwen-Image",
+ "save_path": "loras/qwen-image-lightning",
+ "description": "Qwen-Image-Lightning 4-step LoRA model V2.0",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Lightning-4steps-V2.0.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Lightning-4steps-V2.0.safetensors",
+ "size": "9.78GB"
+ },
+ {
+ "name": "Qwen-Image-Lightning 4steps V2.0 (bf16)",
+ "type": "lora",
+ "base": "Qwen-Image",
+ "save_path": "loras/qwen-image-lightning",
+ "description": "Qwen-Image-Lightning 4-step LoRA model V2.0 (bf16)",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Lightning-4steps-V2.0-bf16.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Lightning-4steps-V2.0-bf16.safetensors",
+ "size": "19.6GB"
+ },
+ {
+ "name": "Qwen-Image-Lightning 8steps V1.1",
+ "type": "lora",
+ "base": "Qwen-Image",
+ "save_path": "loras/qwen-image-lightning",
+ "description": "Qwen-Image-Lightning 8-step LoRA model V1.1",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Lightning-8steps-V1.1.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Lightning-8steps-V1.1.safetensors",
+ "size": "9.78GB"
+ },
+ {
+ "name": "Qwen-Image-Lightning 8steps V1.1 (bf16)",
+ "type": "lora",
+ "base": "Qwen-Image",
+ "save_path": "loras/qwen-image-lightning",
+ "description": "Qwen-Image-Lightning 8-step LoRA model V1.1 (bf16)",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Lightning-8steps-V1.1-bf16.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Lightning-8steps-V1.1-bf16.safetensors",
+ "size": "19.6GB"
+ },
+ {
+ "name": "Qwen-Image-Lightning 8steps V2.0",
+ "type": "lora",
+ "base": "Qwen-Image",
+ "save_path": "loras/qwen-image-lightning",
+ "description": "Qwen-Image-Lightning 8-step LoRA model V2.0",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Lightning-8steps-V2.0.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Lightning-8steps-V2.0.safetensors",
+ "size": "9.78GB"
+ },
+ {
+ "name": "Qwen-Image-Lightning 8steps V2.0 (bf16)",
+ "type": "lora",
+ "base": "Qwen-Image",
+ "save_path": "loras/qwen-image-lightning",
+ "description": "Qwen-Image-Lightning 8-step LoRA model V2.0 (bf16)",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Lightning-8steps-V2.0-bf16.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Lightning-8steps-V2.0-bf16.safetensors",
+ "size": "19.6GB"
+ },
+ {
+ "name": "Qwen-Image-Edit-Lightning 4steps V1.0",
+ "type": "lora",
+ "base": "Qwen-Image-Edit",
+ "save_path": "loras/qwen-image-edit-lightning",
+ "description": "Qwen-Image-Edit-Lightning 4-step LoRA model V1.0",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Edit-Lightning-4steps-V1.0.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Edit-Lightning-4steps-V1.0.safetensors",
+ "size": "9.78GB"
+ },
+ {
+ "name": "Qwen-Image-Edit-Lightning 4steps V1.0 (bf16)",
+ "type": "lora",
+ "base": "Qwen-Image-Edit",
+ "save_path": "loras/qwen-image-edit-lightning",
+ "description": "Qwen-Image-Edit-Lightning 4-step LoRA model V1.0 (bf16)",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Edit-Lightning-4steps-V1.0-bf16.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Edit-Lightning-4steps-V1.0-bf16.safetensors",
+ "size": "19.6GB"
+ },
+ {
+ "name": "Qwen-Image-Edit-Lightning 8steps V1.0",
+ "type": "lora",
+ "base": "Qwen-Image-Edit",
+ "save_path": "loras/qwen-image-edit-lightning",
+ "description": "Qwen-Image-Edit-Lightning 8-step LoRA model V1.0",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Edit-Lightning-8steps-V1.0.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Edit-Lightning-8steps-V1.0.safetensors",
+ "size": "9.78GB"
+ },
+ {
+ "name": "Qwen-Image-Edit-Lightning 8steps V1.0 (bf16)",
+ "type": "lora",
+ "base": "Qwen-Image-Edit",
+ "save_path": "loras/qwen-image-edit-lightning",
+ "description": "Qwen-Image-Edit-Lightning 8-step LoRA model V1.0 (bf16)",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Edit-Lightning-8steps-V1.0-bf16.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Edit-Lightning-8steps-V1.0-bf16.safetensors",
+ "size": "19.6GB"
+ },
+ {
+ "name": "Qwen-Image-Edit-2509-Lightning 4steps V1.0 (bf16)",
+ "type": "lora",
+ "base": "Qwen-Image-Edit",
+ "save_path": "loras/qwen-image-edit-lightning",
+ "description": "Qwen-Image-Edit-2509-Lightning 4-step LoRA model V1.0 (bf16)",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Edit-2509-Lightning-4steps-V1.0-bf16.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Edit-2509/Qwen-Image-Edit-2509-Lightning-4steps-V1.0-bf16.safetensors",
+ "size": "19.6GB"
+ },
+ {
+ "name": "Qwen-Image-Edit-2509-Lightning 4steps V1.0 (fp32)",
+ "type": "lora",
+ "base": "Qwen-Image-Edit",
+ "save_path": "loras/qwen-image-edit-lightning",
+ "description": "Qwen-Image-Edit-2509-Lightning 4-step LoRA model V1.0 (fp32)",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Edit-2509-Lightning-4steps-V1.0-fp32.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Edit-2509/Qwen-Image-Edit-2509-Lightning-4steps-V1.0-fp32.safetensors",
+ "size": "39.1GB"
+ },
+ {
+ "name": "Qwen-Image-Edit-2509-Lightning 8steps V1.0 (bf16)",
+ "type": "lora",
+ "base": "Qwen-Image-Edit",
+ "save_path": "loras/qwen-image-edit-lightning",
+ "description": "Qwen-Image-Edit-2509-Lightning 8-step LoRA model V1.0 (bf16)",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Edit-2509-Lightning-8steps-V1.0-bf16.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Edit-2509/Qwen-Image-Edit-2509-Lightning-8steps-V1.0-bf16.safetensors",
+ "size": "19.6GB"
+ },
+ {
+ "name": "Qwen-Image-Edit-2509-Lightning 8steps V1.0 (fp32)",
+ "type": "lora",
+ "base": "Qwen-Image-Edit",
+ "save_path": "loras/qwen-image-edit-lightning",
+ "description": "Qwen-Image-Edit-2509-Lightning 8-step LoRA model V1.0 (fp32)",
+ "reference": "https://huggingface.co/lightx2v/Qwen-Image-Lightning",
+ "filename": "Qwen-Image-Edit-2509-Lightning-8steps-V1.0-fp32.safetensors",
+ "url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Edit-2509/Qwen-Image-Edit-2509-Lightning-8steps-V1.0-fp32.safetensors",
+ "size": "39.1GB"
+ },
+ {
+ "name": "Qwen-Image InstantX ControlNet Union",
+ "type": "controlnet",
+ "base": "Qwen-Image",
+ "save_path": "controlnet/qwen-image/instantx",
+ "description": "Qwen-Image InstantX ControlNet Union model",
+ "reference": "https://huggingface.co/Comfy-Org/Qwen-Image-InstantX-ControlNets",
+ "filename": "Qwen-Image-InstantX-ControlNet-Union.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Qwen-Image-InstantX-ControlNets/resolve/main/split_files/controlnet/Qwen-Image-InstantX-ControlNet-Union.safetensors",
+ "size": "2.54GB"
+ },
+ {
+ "name": "Qwen-Image InstantX ControlNet Inpainting",
+ "type": "controlnet",
+ "base": "Qwen-Image",
+ "save_path": "controlnet/qwen-image/instantx",
+ "description": "Qwen-Image InstantX ControlNet Inpainting model",
+ "reference": "https://huggingface.co/Comfy-Org/Qwen-Image-InstantX-ControlNets",
+ "filename": "Qwen-Image-InstantX-ControlNet-Inpainting.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Qwen-Image-InstantX-ControlNets/resolve/main/split_files/controlnet/Qwen-Image-InstantX-ControlNet-Inpainting.safetensors",
+ "size": "2.54GB"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/README.md b/custom_nodes/ComfyUI-Manager/node_db/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..378845c5ed7cedfae4d4529b0dc13d25d749e48c
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/README.md
@@ -0,0 +1,95 @@
+# ComfyUI-Manager: Node Database (node_db)
+
+This directory contains the JSON database files that power ComfyUI-Manager's legacy node registry system. While the manager is gradually transitioning to the online Custom Node Registry (CNR), these local JSON files continue to provide important metadata about custom nodes, models, and their integrations.
+
+## Directory Structure
+
+The node_db directory is organized into several subdirectories, each serving a specific purpose:
+
+- **dev/**: Development channel files with latest additions and experimental nodes
+- **legacy/**: Historical/legacy nodes that may require special handling
+- **new/**: New nodes that have passed initial verification but are still being evaluated
+- **forked/**: Forks of existing nodes with modifications
+- **tutorial/**: Example and tutorial nodes designed for learning purposes
+
+## Core Database Files
+
+Each subdirectory contains a standard set of JSON files:
+
+- **custom-node-list.json**: Primary database of custom nodes with metadata
+- **extension-node-map.json**: Maps between extensions and individual nodes they provide
+- **model-list.json**: Catalog of models that can be downloaded through the manager
+- **alter-list.json**: Alternative implementations of nodes for compatibility or functionality
+- **github-stats.json**: GitHub repository statistics for node popularity metrics
+
+## Database Schema
+
+### custom-node-list.json
+```json
+{
+ "custom_nodes": [
+ {
+ "title": "Node display name",
+ "name": "Repository name",
+ "reference": "Original repository if forked",
+ "files": ["GitHub URL or other source location"],
+ "install_type": "git",
+ "description": "Description of the node's functionality",
+ "pip": ["optional pip dependencies"],
+ "js": ["optional JavaScript files"],
+ "tags": ["categorization tags"]
+ }
+ ]
+}
+```
+
+### extension-node-map.json
+```json
+{
+ "extension-id": [
+ ["list", "of", "node", "classes"],
+ {
+ "author": "Author name",
+ "description": "Extension description",
+ "nodename_pattern": "Optional regex pattern for node name matching"
+ }
+ ]
+}
+```
+
+## Transition to Custom Node Registry (CNR)
+
+This local database system is being progressively replaced by the online Custom Node Registry (CNR), which provides:
+- Real-time updates without manual JSON maintenance
+- Improved versioning support
+- Better security validation
+- Enhanced metadata
+
+The Manager supports both systems simultaneously during the transition period.
+
+## Implementation Details
+
+- The database follows a channel-based architecture for different sources
+- Multiple database modes are supported: Channel, Local, and Remote
+- The system supports differential updates to minimize bandwidth usage
+- Security levels are enforced for different node installations based on source
+
+## Usage in the Application
+
+The Manager's backend uses these database files to:
+
+1. Provide browsable lists of available nodes and models
+2. Resolve dependencies for installation
+3. Track updates and new versions
+4. Map node classes to their source repositories
+5. Assess risk levels for installation security
+
+## Maintenance Scripts
+
+Each subdirectory contains a `scan.sh` script that assists with:
+- Scanning repositories for new nodes
+- Updating metadata
+- Validating database integrity
+- Generating proper JSON structures
+
+This database system enables a flexible, secure, and comprehensive management system for the ComfyUI ecosystem while the transition to CNR continues.
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/dev/custom-node-list.json b/custom_nodes/ComfyUI-Manager/node_db/dev/custom-node-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..a51a2b561dc4a52555aa5a7b58280ea68e2c32a3
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/dev/custom-node-list.json
@@ -0,0 +1,11177 @@
+{
+ "custom_nodes": [
+ {
+ "author": "vjumpkung",
+ "title": "comfyui-mosaic-blur [NAME CONFLICT]",
+ "reference": "https://github.com/vjumpkung/comfyui-mosaic-blur",
+ "files": [
+ "https://github.com/vjumpkung/comfyui-mosaic-blur"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for applying mosaic blur effects. (Description by CC)"
+ },
+ {
+ "author": "danieljanata",
+ "title": "ComfyUI-phone_compression_ultimate [WIP]",
+ "reference": "https://github.com/danieljanata/ComfyUI-phone_compression_ultimate",
+ "files": [
+ "https://github.com/danieljanata/ComfyUI-phone_compression_ultimate"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node that simulates realistic smartphone camera compression and processing artifacts.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Norsnow",
+ "title": "comfyui-image-ratio-preset [WIP]",
+ "reference": "https://github.com/Norsnow/comfyui-image-ratio-preset",
+ "files": [
+ "https://github.com/Norsnow/comfyui-image-ratio-preset"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node for quickly setting image aspect ratios with presets and custom dimensions, directly generating latent tensors.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "svyatojdismas",
+ "title": "ComfyUI-StDismas [WIP]",
+ "reference": "https://github.com/svyatojdismas/ComfyUI-StDismas",
+ "files": [
+ "https://github.com/svyatojdismas/ComfyUI-StDismas"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for ComfyUI. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "OtwakO",
+ "title": "ComfyUI-UsefulTools",
+ "reference": "https://github.com/OtwakO/ComfyUI-UsefulTools",
+ "files": [
+ "https://github.com/OtwakO/ComfyUI-UsefulTools"
+ ],
+ "install_type": "git-clone",
+ "description": "Extract tags from your original prompts by giving it a substring or an array of substrings."
+ },
+ {
+ "author": "vito0131",
+ "title": "ComfyUI_SmartContentCrop [WIP]",
+ "reference": "https://github.com/vito0131/ComfyUI_SmartContentCrop",
+ "files": [
+ "https://github.com/vito0131/ComfyUI_SmartContentCrop"
+ ],
+ "install_type": "git-clone",
+ "description": "Smart content cropping with circle processing capabilities. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Vollond",
+ "title": "ComfyUI-LatentCutPlus",
+ "reference": "https://github.com/Vollond/ComfyUI-LatentCutPlus",
+ "files": [
+ "https://github.com/Vollond/ComfyUI-LatentCutPlus"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node: LatentCutPlus (slice latents with amount=-1 to end)"
+ },
+ {
+ "author": "gaonprime-labs",
+ "title": "nordy-custom-node-ComfyUI-NormalOverlapBandBlend",
+ "reference": "https://github.com/gaonprime-labs/nordy-custom-node-ComfyUI-NormalOverlapBandBlend",
+ "files": [
+ "https://github.com/gaonprime-labs/nordy-custom-node-ComfyUI-NormalOverlapBandBlend"
+ ],
+ "install_type": "git-clone",
+ "description": "Normal map blending node for overlapping band effects in ComfyUI. (Description by CC)"
+ },
+ {
+ "author": "muriellee1x",
+ "title": "ComfyUI-Mysterious-node3",
+ "reference": "https://github.com/muriellee1x/ComfyUI-Mysterious-node3",
+ "files": [
+ "https://github.com/muriellee1x/ComfyUI-Mysterious-node3"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom node VideoTimeRemapSpeedPresets for ComfyUI. (Description by CC)"
+ },
+ {
+ "author": "muriellee1x",
+ "title": "ComfyUI-Mysterious-node2 [WIP]",
+ "reference": "https://github.com/muriellee1x/ComfyUI-Mysterious-node2",
+ "files": [
+ "https://github.com/muriellee1x/ComfyUI-Mysterious-node2"
+ ],
+ "install_type": "git-clone",
+ "description": "Professional green/blue screen chroma keying nodes inspired by After Effects Keylight plugin, supporting automatic/manual key color detection and advanced spillage suppression. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Mexes1978",
+ "title": "Film Photography Prompt Styler [WIP]",
+ "reference": "https://github.com/Mexes1978/film_prompt_styler",
+ "files": [
+ "https://github.com/Mexes1978/film_prompt_styler"
+ ],
+ "install_type": "git-clone",
+ "description": "Photography history education tool node with 8 core categories including film stocks, lenses, lighting, genres, print styles, eras, technical processes, and photographer styles for intentional artistic choices.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "RaeZhLiu",
+ "title": "comfy_ark",
+ "reference": "https://github.com/RaeZhLiu/comfy_ark",
+ "files": [
+ "https://github.com/RaeZhLiu/comfy_ark"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for Ark functionality. (Description by CC)"
+ },
+ {
+ "author": "harishcmgit",
+ "title": "comfyui_sp [WIP]",
+ "reference": "https://github.com/harishcmgit/comfyui_sp",
+ "files": [
+ "https://github.com/harishcmgit/comfyui_sp"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for seamless pattern generation. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "teskor-hub",
+ "title": "comfyui-teskors-utils [WIP]",
+ "reference": "https://github.com/teskor-hub/comfyui-teskors-utils",
+ "files": [
+ "https://github.com/teskor-hub/comfyui-teskors-utils"
+ ],
+ "install_type": "git-clone",
+ "description": "DWpose smoothing and rendering node (body, face, hands)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Omega-L",
+ "title": "comfyUI-prompts",
+ "reference": "https://github.com/Omega-L/comfyUI-prompts",
+ "files": [
+ "https://github.com/Omega-L/comfyUI-prompts"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Frontend Vue Basic is custom node that demonstrate how to use vue as frontend framework along with primevue and vue-i18n, cooperating with ComfyUI API. Needs ComfyUI Frontend 1.25.0 or later."
+ },
+ {
+ "author": "vjumpkung",
+ "title": "comfyui-mosaic-blur [NAME CONFLICT]",
+ "reference": "https://github.com/vjumpkung/comfyui-mosaic-blur",
+ "files": [
+ "https://github.com/vjumpkung/comfyui-mosaic-blur"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for applying mosaic blur effects. (Description by CC)"
+ },
+ {
+ "author": "richardctw",
+ "title": "ComfyUI-ImageFillBackgroundColor",
+ "reference": "https://github.com/richardctw/ComfyUI-ImageFillBackgroundColor",
+ "files": [
+ "https://github.com/richardctw/ComfyUI-ImageFillBackgroundColor"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: ImageFillBackgroundColor"
+ },
+ {
+ "author": "zxq790909-maker",
+ "title": "ComfyUI-wangyi-OLED [WIP]",
+ "reference": "https://github.com/zxq790909-maker/ComfyUI-wangyi-OLED",
+ "files": [
+ "https://github.com/zxq790909-maker/ComfyUI-wangyi-OLED"
+ ],
+ "install_type": "git-clone",
+ "description": "An extension that highlights the currently running node in ComfyUI with a strong neon outline and breathing effect for easier workflow navigation.\nNOTE: The files in the repo are not organized."
+ },
+
+ {
+ "author": "ncky",
+ "title": "ComfyUI-Qwen3-TTS [NAME CONFLICT]",
+ "reference": "https://github.com/ncky/ComfyUI-Qwen3-TTS",
+ "files": [
+ "https://github.com/ncky/ComfyUI-Qwen3-TTS"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom node that wraps Qwen3-TTS voice cloning for synthesizing speech in a cloned voice. (Description by CC)"
+ },
+ {
+ "author": "starsFriday",
+ "title": "ComfyUI-Qwen3-TTS [NAME CONFLICT/WIP]",
+ "reference": "https://github.com/starsFriday/ComfyUI-Qwen3-TTS",
+ "files": [
+ "https://github.com/starsFriday/ComfyUI-Qwen3-TTS"
+ ],
+ "install_type": "git-clone",
+ "description": "Sound-related nodes for the Qwen3-TTS project\nNOTE: The files in the repo are not organized."
+ },
+
+ {
+ "author": "RicoMeng",
+ "title": "CartoonGenComfyui-PromtGenerator",
+ "reference": "https://github.com/RicoMeng/CartoonGenComfyui-PromtGenerator",
+ "files": [
+ "https://github.com/RicoMeng/CartoonGenComfyui-PromtGenerator"
+ ],
+ "install_type": "git-clone",
+ "description": "Istanbul 80s Prompt Generator Node for ComfyUI. (Description by CC)"
+ },
+ {
+ "author": "N3uR0TiCV0iD",
+ "title": "ComfyUI-ModelListTools",
+ "reference": "https://github.com/N3uR0TiCV0iD/ComfyUI-ModelListTools",
+ "files": [
+ "https://github.com/N3uR0TiCV0iD/ComfyUI-ModelListTools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CLIPModelSelectionNode, CLIPVisionModelSelectionNode, CheckpointSelectionNode, DiffusionModelSelectionNode, FilteredCLIPModelsNode, ... (13 total)"
+ },
+
+ {
+ "author": "pollockjj",
+ "title": "ComfyUI-StabilityTest",
+ "reference": "https://github.com/pollockjj/ComfyUI-StabilityTest",
+ "files": [
+ "https://github.com/pollockjj/ComfyUI-StabilityTest"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI stability testing node. (Description by CC)"
+ },
+ {
+ "author": "Tr1dae",
+ "title": "[WIP] ComfyUI-MobileSAM",
+ "reference": "https://github.com/Tr1dae/ComfyUI-MobileSAM",
+ "files": [
+ "https://github.com/Tr1dae/ComfyUI-MobileSAM"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node for text-guided image segmentation using GroundingDINO and MobileSAM to segment objects in images using natural language prompts.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Vov1ch",
+ "title": "ComfyUI_GLMImage",
+ "reference": "https://github.com/Vov1ch/ComfyUI_GLMImage",
+ "files": [
+ "https://github.com/Vov1ch/ComfyUI_GLMImage"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for GLM image generation, image-to-image translation, and flexible input handling. (Description by CC)"
+ },
+ {
+ "author": "DailyMok",
+ "title": "ComfyUI-PromptMixerNode",
+ "reference": "https://github.com/DailyMok/ComfyUI-PromptMixerNode",
+ "files": [
+ "https://github.com/DailyMok/ComfyUI-PromptMixerNode"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for prompt mixing with PromptMixerDaily node. (Description by CC)"
+ },
+ {
+ "author": "shin131002",
+ "title": "[WIP] ComfyUI-Prompt-Preset-Selector",
+ "reference": "https://github.com/shin131002/ComfyUI-Prompt-Preset-Selector",
+ "files": [
+ "https://github.com/shin131002/ComfyUI-Prompt-Preset-Selector"
+ ],
+ "install_type": "git-clone",
+ "description": "Flexible preset selector with YAML support, advanced keyword filtering, and hierarchical key search\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "fogyisland",
+ "title": "Comfy_Show_StringText [WIP]",
+ "reference": "https://github.com/fogyisland/Comfy_Show_StringText",
+ "files": [
+ "https://github.com/fogyisland/Comfy_Show_StringText"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node for text display that implements string data output. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Leecoahs",
+ "title": "ComfyUI_LeeNodes",
+ "reference": "https://github.com/Leecoahs/ComfyUI_LeeNodes",
+ "files": [
+ "https://github.com/Leecoahs/ComfyUI_LeeNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for image processing including grayscale combining, overlaying, texture inpainting. (Description by CC)"
+ },
+ {
+ "author": "tdrminglin",
+ "title": "Comfyui-hymotionbridge",
+ "reference": "https://github.com/tdrminglin/Comfyui-hymotionbridge",
+ "files": [
+ "https://github.com/tdrminglin/Comfyui-hymotionbridge"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: HYMotionToNLFBridge, HYMotionToSCAILBridge"
+ },
+ {
+ "author": "joe002",
+ "title": "comfyui-rtx-remix [UNSAFE]",
+ "reference": "https://github.com/joe002/comfyui-rtx-remix",
+ "files": [
+ "https://github.com/joe002/comfyui-rtx-remix"
+ ],
+ "install_type": "git-clone",
+ "description": "RTX Remix texture pipeline integration nodes for ComfyUI[w/This nodepack contains a path traversal vulnerability.]"
+ },
+ {
+ "author": "NakanoSanku",
+ "title": "ComfyUI-Gemini [NAME CONFLICT]",
+ "reference": "https://github.com/NakanoSanku/ComfyUI-Gemini",
+ "files": [
+ "https://github.com/NakanoSanku/ComfyUI-Gemini"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes for Google Gemini AI with text generation and image generation capabilities using the Python SDK."
+ },
+ {
+ "author": "Saganaki22",
+ "title": "ComfyUI-NovaSR",
+ "reference": "https://github.com/Saganaki22/ComfyUI-NovaSR",
+ "files": [
+ "https://github.com/Saganaki22/ComfyUI-NovaSR"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node for NovaSR - Ultra-fast audio super resolution (3600x realtime, 50KB model)"
+ },
+ {
+ "author": "GokuHiki",
+ "title": "ComfyUI-Goku-Tools",
+ "reference": "https://github.com/GokuHiki/ComfyUI-Goku-Tools",
+ "files": [
+ "https://github.com/GokuHiki/ComfyUI-Goku-Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes including FirstNonFalse utility. (Description by CC)"
+ },
+ {
+ "author": "endman100",
+ "title": "ComfyUI_tensor_script [WIP]",
+ "reference": "https://github.com/endman100/ComfyUI_tensor_script",
+ "files": [
+ "https://github.com/endman100/ComfyUI_tensor_script"
+ ],
+ "install_type": "git-clone",
+ "description": "Utility nodes for tensor manipulation including squeeze, unsqueeze, and shape operations. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "CarlMarkswx",
+ "title": "ComfyUI-Mirror-Download [UNSAFE]",
+ "reference": "https://github.com/CarlMarkswx/ComfyUI-Mirror-Download",
+ "files": [
+ "https://github.com/CarlMarkswx/ComfyUI-Mirror-Download"
+ ],
+ "install_type": "git-clone",
+ "description": "Plugin that adds a mirror download button for accessing Hugging Face models via Chinese mirror, with automatic detection and progress tracking. (Description by CC)[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "nekotxt",
+ "title": "ComfyUI-NTX-support-nodes [WIP]",
+ "reference": "https://github.com/nekotxt/ComfyUI-NTX-support-nodes",
+ "files": [
+ "https://github.com/nekotxt/ComfyUI-NTX-support-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Utility nodes to support the creation of pipes\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "killshotttttt",
+ "title": "ComfyUI-killshotttttt [WIP]",
+ "reference": "https://github.com/killshotttttt/ComfyUI-killshotttttt",
+ "files": [
+ "https://github.com/killshotttttt/ComfyUI-killshotttttt"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that integrates with the Meshy AI API for Image-to-Image transformations using nano-banana models.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "bozkut",
+ "title": "ComfyUI-Prompt-Expander [NAME CONFLICT]",
+ "reference": "https://github.com/bozkut/ComfyUI-Prompt-Expander",
+ "files": [
+ "https://github.com/bozkut/ComfyUI-Prompt-Expander"
+ ],
+ "install_type": "git-clone",
+ "description": "An LLM-powered prompt expansion node for ComfyUI. Transform simple prompts into detailed, high-quality image generation prompts."
+ },
+ {
+ "author": "my-xz-org",
+ "title": "comfyui_xz_nodes",
+ "reference": "https://github.com/my-xz-org/comfyui_xz_nodes",
+ "files": [
+ "https://github.com/my-xz-org/comfyui_xz_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: XZImageToText"
+ },
+ {
+ "author": "tackcrypto1031",
+ "title": "[WIP] tk_comfyui_SimpleSize",
+ "reference": "https://github.com/tackcrypto1031/tk_comfyui_SimpleSize",
+ "files": [
+ "https://github.com/tackcrypto1031/tk_comfyui_SimpleSize"
+ ],
+ "install_type": "git-clone",
+ "description": "A professional and intelligent aspect ratio and resolution selector for ComfyUI.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "hashms0a",
+ "title": "ComfyUI-Qwen-Multi-Angle-Camera-Nodes [WIP]",
+ "reference": "https://github.com/hashms0a/ComfyUI-Qwen-Multi-Angle-Camera-Nodes",
+ "files": [
+ "https://github.com/hashms0a/ComfyUI-Qwen-Multi-Angle-Camera-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Comprehensive custom nodes for controlling camera angles with Qwen-Image-Edit-2511-Multiple-Angles-LoRA, supporting all 96 camera positions with basic/advanced selection, orbital animation, elevation sweep, and pre-defined animation paths.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "jceme",
+ "title": "Comfy_Extensions [WIP]",
+ "reference": "https://github.com/jceme/Comfy_Extensions",
+ "files": [
+ "https://github.com/jceme/Comfy_Extensions"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI extension pack offering image dimension handling, aspect ratio presets, FPS utilities, inpainting, and prompt customization. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "saltchicken",
+ "title": "ComfyUI-Interactive-Cropper",
+ "reference": "https://github.com/saltchicken/ComfyUI-Interactive-Cropper",
+ "files": [
+ "https://github.com/saltchicken/ComfyUI-Interactive-Cropper"
+ ],
+ "install_type": "git-clone",
+ "description": "Interactive image cropping node with visual interface. (Description by CC)"
+ },
+ {
+ "author": "shenymce",
+ "title": "ComfyUI-JsonViewer [WIP]",
+ "reference": "https://github.com/shenymce/ComfyUI-JsonViewer",
+ "files": [
+ "https://github.com/shenymce/ComfyUI-JsonViewer"
+ ],
+ "install_type": "git-clone",
+ "description": "OpenPose JSON data visualization for displaying pose keypoint data exported from ComfyUI workflow nodes. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "qimi-dev",
+ "title": "ComfyUI-Qimi-Tiler",
+ "reference": "https://github.com/qimi-dev/ComfyUI-Qimi-Tiler",
+ "files": [
+ "https://github.com/qimi-dev/ComfyUI-Qimi-Tiler"
+ ],
+ "install_type": "git-clone",
+ "description": "Image tiling utility nodes for splitting and combining image tiles in ComfyUI. (Description by CC)"
+ },
+ {
+ "author": "maTORIx",
+ "title": "ComfyUI-KeypointsToImage",
+ "reference": "https://github.com/maTORIx/ComfyUI-KeypointsToImage",
+ "files": [
+ "https://github.com/maTORIx/ComfyUI-KeypointsToImage"
+ ],
+ "install_type": "git-clone",
+ "description": "Node for converting keypoints to images. (Description by CC)"
+ },
+
+ {
+ "author": "IO-AtelierTech",
+ "title": "comfyui-video-utils [NAME CONFLICT]",
+ "reference": "https://github.com/IO-AtelierTech/comfyui-video-utils",
+ "files": [
+ "https://github.com/IO-AtelierTech/comfyui-video-utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Provides utility nodes for video operations, particularly for FFmpeg integration and workflow connectivity."
+ },
+ {
+ "author": "PozzettiAndrea",
+ "title": "ComfyUI-TRELLIS2 [NAME CONFLICT]",
+ "reference": "https://github.com/PozzettiAndrea/ComfyUI-TRELLIS2",
+ "files": [
+ "https://github.com/PozzettiAndrea/ComfyUI-TRELLIS2"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes for TRELLIS.2 - Microsoft's image-to-3D generation model for creating high-quality 3D meshes with PBR materials."
+ },
+ {
+ "author": "colorAi",
+ "title": "comfyui-prompt-manager [NAME CONFLICT]",
+ "reference": "https://github.com/colorAi/comfyui-prompt-manager",
+ "files": [
+ "https://github.com/colorAi/comfyui-prompt-manager"
+ ],
+ "install_type": "git-clone",
+ "description": "A modern, powerful, and easy-to-use Prompt Manager extension for ComfyUI."
+ },
+ {
+ "author": "Yukinoshita-Yukinoe",
+ "title": "ComfyUI-SenseVoice [NAME CONFLICT]",
+ "reference": "https://github.com/Yukinoshita-Yukinoe/ComfyUI-SenseVoice",
+ "files": [
+ "https://github.com/Yukinoshita-Yukinoe/ComfyUI-SenseVoice"
+ ],
+ "install_type": "git-clone",
+ "description": "Audio processing node providing SenseVoice speech recognition, audio splitting, and SRT generation for ComfyUI. (Description by CC)"
+ },
+ {
+ "author": "satyam-fp",
+ "title": "ComfyUI-GeminiImage [NAME CONFLICT]",
+ "reference": "https://github.com/satyam-fp/ComfyUI-GeminiImage",
+ "files": [
+ "https://github.com/satyam-fp/ComfyUI-GeminiImage"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node package that integrates Google Gemini API for AI-powered image generation and enhancement."
+ },
+ {
+ "author": "ai-joe-git",
+ "title": "ComfyUI-Chatterbox [NAME CONFLICT]",
+ "reference": "https://github.com/ai-joe-git/ComfyUI-Chatterbox",
+ "files": [
+ "https://github.com/ai-joe-git/ComfyUI-Chatterbox"
+ ],
+ "install_type": "git-clone",
+ "description": "Chatterbox TTS integration for ComfyUI - Voice cloning with 3 model variants."
+ },
+ {
+ "author": "Sergey004",
+ "title": "ComfyUI-Telegram-Sender [UNSAFE/NAME CONFLICT]",
+ "reference": "https://github.com/Sergey004/ComfyUI-Telegram-Sender",
+ "files": [
+ "https://github.com/Sergey004/ComfyUI-Telegram-Sender"
+ ],
+ "install_type": "git-clone",
+ "description": "Does the same thing as comfyui_image_metadata_extension but is slightly more modern, sending the output to Telegram and downloading unnecessary metadata at the same time.[w/This nodepack contains a path traversal vulnerability.]"
+ },
+ {
+ "author": "cedarconnor",
+ "title": "ComfyUI-DAP [UNSAFE/NAME CONFLICT]",
+ "reference": "https://github.com/cedarconnor/ComfyUI-DAP",
+ "files": [
+ "https://github.com/cedarconnor/ComfyUI-DAP"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for DAP (Depth Any Panoramas) - panoramic depth estimation[w/This nodepack contains a path traversal vulnerability.]"
+ },
+ {
+ "author": "AhiruNeko",
+ "title": "ComfyUI-MiniTools [UNSAFE/NAME CONFLICT]",
+ "reference": "https://github.com/AhiruNeko/ComfyUI-MiniTools",
+ "files": [
+ "https://github.com/AhiruNeko/ComfyUI-MiniTools"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI plugins[w/This nodepack contains a path traversal vulnerability.]"
+ },
+ {
+ "author": "861289009",
+ "title": "comfyui_video_node [WIP]",
+ "reference": "https://github.com/861289009/comfyui_video_node",
+ "files": [
+ "https://github.com/861289009/comfyui_video_node"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI node for creating smooth fade transitions between two video segments using hex color effects. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "jluo-github",
+ "title": "comfyui-easy-resize [WIP]",
+ "reference": "https://github.com/jluo-github/comfyui-easy-resize",
+ "files": [
+ "https://github.com/jluo-github/comfyui-easy-resize"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes for quick image size selection with curated presets\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "w3rc",
+ "title": "lpips-similarity-comfyui",
+ "reference": "https://github.com/w3rc/lpips-similarity-comfyui",
+ "files": [
+ "https://github.com/w3rc/lpips-similarity-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: GetSimilarity, LPIPSSimilarity"
+ },
+ {
+ "author": "StevenBaby",
+ "title": "comfyui-tools",
+ "reference": "https://github.com/StevenBaby/comfyui-tools",
+ "files": [
+ "https://github.com/StevenBaby/comfyui-tools"
+ ],
+ "install_type": "git-clone",
+ "description": "IntParameterNode: A Node contain 4 int parameters to quick switch input to other nodes."
+ },
+ {
+ "author": "zhu798542746",
+ "title": "comfyui_model [UNSAFE]",
+ "reference": "https://github.com/zhu798542746/comfyui_model",
+ "files": [
+ "https://github.com/zhu798542746/comfyui_model"
+ ],
+ "install_type": "git-clone",
+ "description": "A powerful tool for managing and exporting ComfyUI plugins and models with an elegant side panel interface. (Description by CC) [w/This node pack has a vulnerability that allows it to access (or exfiltrate) data from custom nodes installed remotely.]"
+ },
+ {
+ "author": "simonri",
+ "title": "ComfyUI-SimonNodes",
+ "reference": "https://github.com/simonri/ComfyUI-SimonNodes",
+ "files": [
+ "https://github.com/simonri/ComfyUI-SimonNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Provides seed upscaling and image cropping utilities for ComfyUI workflows. (Description by CC)"
+ },
+ {
+ "author": "j-pyxal",
+ "title": "ComfyUI-Lattice-Manim [WIP]",
+ "reference": "https://github.com/j-pyxal/ComfyUI-Lattice-Manim",
+ "files": [
+ "https://github.com/j-pyxal/ComfyUI-Lattice-Manim"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI extension integrating Manim for animation rendering.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "kanttouchthis",
+ "title": "ComfyUI-SDNQ [NAME CONFLICT]",
+ "reference": "https://github.com/kanttouchthis/ComfyUI-SDNQ",
+ "files": [
+ "https://github.com/kanttouchthis/ComfyUI-SDNQ"
+ ],
+ "install_type": "git-clone",
+ "description": "SDNQ support for ComfyUI."
+ },
+ {
+ "author": "SparknightLLC",
+ "title": "ComfyUI-GraphConstantFolder",
+ "reference": "https://github.com/SparknightLLC/ComfyUI-GraphConstantFolder",
+ "files": [
+ "https://github.com/SparknightLLC/ComfyUI-GraphConstantFolder"
+ ],
+ "install_type": "git-clone",
+ "description": "Improves performance of large workflows by rewriting the submitted prompt graph before validation to constant-fold switch/selector nodes and optionally prune now-unreachable branches."
+ },
+ {
+ "author": "bryanlholland1",
+ "title": "comfyui-app-bridge [WIP]",
+ "reference": "https://github.com/bryanlholland1/comfyui-app-bridge",
+ "files": [
+ "https://github.com/bryanlholland1/comfyui-app-bridge"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for sending images to the companion iOS/macOS/visionOS app\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "HalfADog",
+ "title": "ComfyUI-Mask2JSON",
+ "reference": "https://github.com/HalfADog/ComfyUI-Mask2JSON",
+ "files": [
+ "https://github.com/HalfADog/ComfyUI-Mask2JSON"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for converting masks to contour JSON format with visualization capabilities. (Description by CC)"
+ },
+ {
+ "author": "flywhale-666",
+ "title": "ComfyUI_pixel_snapping [WIP]",
+ "reference": "https://github.com/flywhale-666/ComfyUI_pixel_snapping",
+ "files": [
+ "https://github.com/flywhale-666/ComfyUI_pixel_snapping"
+ ],
+ "install_type": "git-clone",
+ "description": "SIFT-based image alignment, intelligent mask cropping and restoration for ComfyUI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "fangg2000",
+ "title": "comfyui_fgtools [WIP]",
+ "reference": "https://github.com/fangg2000/comfyui_fgtools",
+ "files": [
+ "https://github.com/fangg2000/comfyui_fgtools"
+ ],
+ "install_type": "git-clone",
+ "description": "Personal utility tools for ComfyUI. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "HailXD",
+ "title": "comfyui-random-artist",
+ "reference": "https://github.com/HailXD/comfyui-random-artist",
+ "files": [
+ "https://github.com/HailXD/comfyui-random-artist"
+ ],
+ "install_type": "git-clone",
+ "description": "Generates random artist styles for ComfyUI workflows. (Description by CC)"
+ },
+ {
+ "author": "wandaijin",
+ "title": "ComfyUI-PaddleOCR [NAME CONFLICT]",
+ "reference": "https://github.com/wandaijin/ComfyUI-PaddleOCR",
+ "files": [
+ "https://github.com/wandaijin/ComfyUI-PaddleOCR"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI"
+ },
+ {
+ "author": "supaidauen",
+ "title": "ComfyUI-supaidauen [WIP]",
+ "reference": "https://github.com/supaidauen/ComfyUI-supaidauen",
+ "files": [
+ "https://github.com/supaidauen/ComfyUI-supaidauen"
+ ],
+ "install_type": "git-clone",
+ "description": "Collection of custom ComfyUI nodes including VRAM management, image processing, latent manipulation, character I/O, and advanced sampling utilities. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "huhu-tiger",
+ "title": "ComfyUI-RemoteResource",
+ "reference": "https://github.com/huhu-tiger/ComfyUI-RemoteResource",
+ "files": [
+ "https://github.com/huhu-tiger/ComfyUI-RemoteResource"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node for loading images from remote sources. (Description by CC)"
+ },
+ {
+ "author": "nomadop",
+ "title": "ComfyUI-Video-Matting [NAME CONFLICT]",
+ "reference": "https://github.com/nomadop/ComfyUI-Video-Matting",
+ "files": [
+ "https://github.com/nomadop/ComfyUI-Video-Matting"
+ ],
+ "install_type": "git-clone",
+ "description": "Modular video matting nodes supporting multiple models (RVM, MODNet, U2Net, RMBG-2.0) and video object segmentation with Cutie and edge refinement via ViTMatte."
+ },
+ {
+ "author": "agavesunset",
+ "title": "Comfyui_SiliconFlow_AgaveSunset",
+ "reference": "https://github.com/agavesunset/Comfyui_SiliconFlow_AgaveSunset",
+ "files": [
+ "https://github.com/agavesunset/Comfyui_SiliconFlow_AgaveSunset"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: SiliconFlowLoader_AS, SiliconFlowSampler_AS"
+ },
+ {
+ "author": "IIEleven11",
+ "title": "[WIP] ComfyUI-Dataset_Maker",
+ "reference": "https://github.com/IIEleven11/ComfyUI-Dataset_Maker",
+ "files": [
+ "https://github.com/IIEleven11/ComfyUI-Dataset_Maker"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom node pack that automates dataset creation by generating images for concept lists, each with a specific LoRA. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "bhaveek424",
+ "title": "ComfyUI-HMNodes",
+ "reference": "https://github.com/bhaveek424/ComfyUI-HMNodes",
+ "files": [
+ "https://github.com/bhaveek424/ComfyUI-HMNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for audio processing, image enhancement, and AI-powered prompting including FFT analysis, automatic white balance, lens effects, and realism optimization. (Description by CC)"
+ },
+ {
+ "author": "raohammad",
+ "title": "ComfyUI-VTUtilNodes [WIP]",
+ "reference": "https://github.com/raohammad/ComfyUI-VTUtilNodes",
+ "files": [
+ "https://github.com/raohammad/ComfyUI-VTUtilNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of utility custom nodes for ComfyUI.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "yamanacn",
+ "title": "ComfyUI-ImageMask-Random-Sync-Picker",
+ "reference": "https://github.com/yamanacn/ComfyUI-ImageMask-Random-Sync-Picker",
+ "files": [
+ "https://github.com/yamanacn/ComfyUI-ImageMask-Random-Sync-Picker"
+ ],
+ "install_type": "git-clone",
+ "description": "Node for randomly selecting and synchronizing image masks with selectable options. (Description by CC)"
+ },
+ {
+ "author": "tdrminglin",
+ "title": "ComfyUI_SceneSplitter",
+ "reference": "https://github.com/tdrminglin/ComfyUI_SceneSplitter",
+ "files": [
+ "https://github.com/tdrminglin/ComfyUI_SceneSplitter"
+ ],
+ "install_type": "git-clone",
+ "description": "Scene detection and splitting nodes for ComfyUI enabling frame-level scene detection and start frame tracking. (Description by CC)"
+ },
+ {
+ "author": "starsFriday",
+ "title": "ComfyUI-KLingAI-OmniVideo [WIP]",
+ "reference": "https://github.com/starsFriday/ComfyUI-KLingAI-OmniVideo",
+ "files": [
+ "https://github.com/starsFriday/ComfyUI-KLingAI-OmniVideo"
+ ],
+ "install_type": "git-clone",
+ "description": "Five API nodes for KLingAI's OmniVideo (O1) usage\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Hifunyo",
+ "title": "comfyui_google_ai",
+ "reference": "https://github.com/Hifunyo/comfyui_google_ai",
+ "files": [
+ "https://github.com/Hifunyo/comfyui_google_ai"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI integration node for Google AI image generation capabilities. (Description by CC)"
+ },
+ {
+ "author": "nschpy",
+ "title": "ComfyUI_MovisAdapter [UNSAFE]",
+ "reference": "https://github.com/nschpy/ComfyUI_MovisAdapter",
+ "files": [
+ "https://github.com/nschpy/ComfyUI_MovisAdapter"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "devzeroLL",
+ "title": "comfyui-lxj-Node",
+ "reference": "https://github.com/devzeroLL/comfyui-lxj-Node",
+ "files": [
+ "https://github.com/devzeroLL/comfyui-lxj-Node"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: lxj_ImageBatch14, lxj_TextBatch14"
+ },
+ {
+ "author": "hgh086",
+ "title": "Comfyui-HghImage",
+ "reference": "https://github.com/hgh086/Comfyui-HghImage",
+ "files": [
+ "https://github.com/hgh086/Comfyui-HghImage"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for image comparison functionality. (Description by CC)"
+ },
+ {
+ "author": "Ginolazy",
+ "title": "ComfyUI-FluxKontextImageCompensate [WIP]",
+ "reference": "https://github.com/Ginolazy/ComfyUI-FluxKontextImageCompensate",
+ "files": [
+ "https://github.com/Ginolazy/ComfyUI-FluxKontextImageCompensate"
+ ],
+ "install_type": "git-clone",
+ "description": "A focused ComfyUI plugin to handle the vertical stretching issue introduced by the Flux Kontext model.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "IO-AtelierTech",
+ "title": "comfyui-genai-connectors [WIP]",
+ "reference": "https://github.com/IO-AtelierTech/comfyui-genai-connectors",
+ "files": [
+ "https://github.com/IO-AtelierTech/comfyui-genai-connectors"
+ ],
+ "install_type": "git-clone",
+ "description": "The ComfyUI-fal-Connector is a tool designed to provide an integration between ComfyUI and fal. This extension allows users to execute their ComfyUI workflows directly on [a/fal.ai](https://fal.ai/). This enables users to leverage the computational power and resources provided by fal.ai for running their ComfyUI workflows.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "PozzettiAndrea",
+ "title": "ComfyUI-MVDUST3R [UNSAFE]",
+ "reference": "https://github.com/PozzettiAndrea/ComfyUI-MVDUST3R",
+ "files": [
+ "https://github.com/PozzettiAndrea/ComfyUI-MVDUST3R"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for MVDUST3R multi-view 3D reconstruction[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "ProjectAtlantis-dev",
+ "title": "comfyui-atlantis-json [UNSAFE]",
+ "reference": "https://github.com/ProjectAtlantis-dev/comfyui-atlantis-json",
+ "files": [
+ "https://github.com/ProjectAtlantis-dev/comfyui-atlantis-json"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes for JSON processing and transcription workflows, including text-to-JSON conversion, SRT subtitle parsing, and file saving. (Description by CC)[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "ShammiG",
+ "title": "ComfyUI_Text_Tools_SG [UNSAFE]",
+ "reference": "https://github.com/ShammiG/ComfyUI_Text_Tools_SG",
+ "files": [
+ "https://github.com/ShammiG/ComfyUI_Text_Tools_SG"
+ ],
+ "install_type": "git-clone",
+ "description": "Text Editor node with Markdown editing plus quick shortcuts, Text Viewer node, with extra features plus Text Merge, Text Save and Load Text from anywhere nodes.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "Smyshnikof",
+ "title": "ComfyUI-PresetDownloadManager [UNSAFE]",
+ "reference": "https://github.com/Smyshnikof/ComfyUI-PresetDownloadManager",
+ "files": [
+ "https://github.com/Smyshnikof/ComfyUI-PresetDownloadManager"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node for managing and downloading models from HuggingFace with preset support[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "gulajawalegit",
+ "title": "ComfyUI-Telegram-Sender [UNSAFE]",
+ "reference": "https://github.com/gulajawalegit/ComfyUI-Telegram-Sender",
+ "files": [
+ "https://github.com/gulajawalegit/ComfyUI-Telegram-Sender"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for sending generated videos to Telegram, enabling direct output sharing to messaging platforms. (Description by CC)[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "Laolilzp",
+ "title": "Laoli3D [UNSAFE]",
+ "reference": "https://github.com/Laolilzp/Laoli3D",
+ "files": [
+ "https://github.com/Laolilzp/Laoli3D"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI 3D pose editor enabling visual character manipulation and ControlNet image generation for precise AI figure control without prompt description. (Description by CC)[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "Goldlionren",
+ "title": "ComfyUI_Bridge_fabric [UNSAFE]",
+ "reference": "https://github.com/Goldlionren/ComfyUI_Bridge_fabric",
+ "files": [
+ "https://github.com/Goldlionren/ComfyUI_Bridge_fabric"
+ ],
+ "install_type": "git-clone",
+ "description": "AI Compute Fabric bridge for ComfyUI enabling distributed CLIP, VAE, and ControlNet inference across local and remote machines. (Description by CC)[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "CypherNaught-0x",
+ "title": "ComfyUI-StarVector [WIP]",
+ "reference": "https://github.com/CypherNaught-0x/ComfyUI-StarVector",
+ "files": [
+ "https://github.com/CypherNaught-0x/ComfyUI-StarVector"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes for SVG generation using StarVector models\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Clivey1234",
+ "title": "ComfyUI_FBX_Import [UNSAFE]",
+ "reference": "https://github.com/Clivey1234/ComfyUI_FBX_Import",
+ "files": [
+ "https://github.com/Clivey1234/ComfyUI_FBX_Import"
+ ],
+ "install_type": "git-clone",
+ "description": "Convert FBX animations into ControlNet OpenPose images for driving AI video generation with motion from any animation source. (Description by CC)[w/This nodepack has a vulnerability that allows arbitrary code execution remotely.]"
+ },
+ {
+ "author": "TobiasGlaubach",
+ "title": "ComfyUI-TG_PyCode [UNSAFE]",
+ "reference": "https://github.com/TobiasGlaubach/ComfyUI-TG_PyCode",
+ "files": [
+ "https://github.com/TobiasGlaubach/ComfyUI-TG_PyCode"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node library with an editor and nodes to run Python code within ComfyUI workflows.[w/This nodepack has a vulnerability that allows arbitrary code execution remotely.]"
+ },
+ {
+ "author": "jchiotaka",
+ "title": "ComfyUI-ClarityAI-Upscaler",
+ "reference": "https://github.com/jchiotaka/ComfyUI-ClarityAI-Upscaler",
+ "files": [
+ "https://github.com/jchiotaka/ComfyUI-ClarityAI-Upscaler"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI upscaler nodes including ClarityCreativeUpscaler, ClarityCrystalUpscaler, and ClarityFluxUpscaler. (Description by CC)"
+ },
+ {
+ "author": "tpc2233",
+ "title": "ComfyUI-TP-IMtalker [WIP]",
+ "reference": "https://github.com/tpc2233/ComfyUI-TP-IMtalker",
+ "files": [
+ "https://github.com/tpc2233/ComfyUI-TP-IMtalker"
+ ],
+ "install_type": "git-clone",
+ "description": "Comfy UI nodes for IMtalker to run native weights.)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "yuyu0218yu",
+ "title": "comfyui-NXCM-tool [UNSAFE]",
+ "reference": "https://github.com/yuyu0218yu/comfyui-NXCM-tool",
+ "files": [
+ "https://github.com/yuyu0218yu/comfyui-NXCM-tool"
+ ],
+ "install_type": "git-clone",
+ "description": "Next-generation creative media encryption toolkit for ComfyUI providing image and video encryption with AES-256-CTR + HMAC-SHA256, metadata preservation, and batch processing support. (Description by CC) [w/hardcoded encryption key]"
+ },
+ {
+ "author": "SergeyKarleev",
+ "title": "[WIP] comfyui-textutils",
+ "reference": "https://github.com/SergeyKarleev/comfyui-textutils",
+ "files": [
+ "https://github.com/SergeyKarleev/comfyui-textutils"
+ ],
+ "install_type": "git-clone",
+ "description": "Small utility nodes for ComfyUI text workflows.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "love530love",
+ "title": "[WIP] ComfyUI-TorchMonitor",
+ "reference": "https://github.com/love530love/ComfyUI-TorchMonitor",
+ "files": [
+ "https://github.com/love530love/ComfyUI-TorchMonitor"
+ ],
+ "install_type": "git-clone",
+ "description": "Fixed-position real-time monitor for ComfyUI displaying CPU, RAM, VRAM, and GPU temperature metrics with zero configuration and single-file installation.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Enferlain",
+ "title": "ComfyUI-SamplerCustom-3Decimals",
+ "reference": "https://github.com/Enferlain/ComfyUI-SamplerCustom-3Decimals",
+ "files": [
+ "https://github.com/Enferlain/ComfyUI-SamplerCustom-3Decimals"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI sampler node with custom 3 decimals precision for sampling parameters. (Description by CC)"
+ },
+ {
+ "author": "lfelipegg",
+ "title": "[WIP] lfgg_custom_nodes_comfyui",
+ "reference": "https://github.com/lfelipegg/lfgg_custom_nodes_comfyui",
+ "files": [
+ "https://github.com/lfelipegg/lfgg_custom_nodes_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "LFGG custom nodes for ComfyUI providing resolution-first utilities, latent sizing by aspect ratio, and divisibility-aware image processing.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "saltchicken",
+ "title": "ComfyUI-Selector",
+ "reference": "https://github.com/saltchicken/ComfyUI-Selector",
+ "files": [
+ "https://github.com/saltchicken/ComfyUI-Selector"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node providing simple selector functionality. (Description by CC)"
+ },
+ {
+ "author": "saltchicken",
+ "title": "ComfyUI-Video-Utils",
+ "reference": "https://github.com/saltchicken/ComfyUI-Video-Utils",
+ "files": [
+ "https://github.com/saltchicken/ComfyUI-Video-Utils"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for video processing including FinalFrameSelector and VideoMerge functionality. (Description by CC)"
+ },
+ {
+ "author": "EricRorich",
+ "title": "[WIP] ComfyUI-MegaTran-cutom-node",
+ "reference": "https://github.com/EricRorich/ComfyUI-MegaTran-cutom-node",
+ "files": [
+ "https://github.com/EricRorich/ComfyUI-MegaTran-cutom-node"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node applying image transformations (scaling, rotation, translation) around a pivot point with optional canvas expansion and pivot visualization. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "OhSeongHyeon",
+ "title": "comfyui-random-image-size",
+ "reference": "https://github.com/OhSeongHyeon/comfyui-random-image-size",
+ "files": [
+ "https://github.com/OhSeongHyeon/comfyui-random-image-size"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Random Image Size"
+ },
+ {
+ "author": "Enferlain",
+ "title": "ComfyUI-Model-Comparison [WIP]",
+ "reference": "https://github.com/Enferlain/ComfyUI-Model-Comparison",
+ "files": [
+ "https://github.com/Enferlain/ComfyUI-Model-Comparison"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node for comparing multiple models side-by-side. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "AMTPorn",
+ "title": "comfyui_amt",
+ "reference": "https://github.com/AMTPorn/comfyui_amt",
+ "files": [
+ "https://github.com/AMTPorn/comfyui_amt"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: AMTStringDeduplication"
+ },
+ {
+ "author": "gajjar4",
+ "title": "ComfyUI-Qwen-Image-i2L [UNSAFE]",
+ "reference": "https://github.com/gajjar4/ComfyUI-Qwen-Image-i2L",
+ "files": [
+ "https://github.com/gajjar4/ComfyUI-Qwen-Image-i2L"
+ ],
+ "install_type": "git-clone",
+ "description": "A fully optimized ComfyUI custom node for Qwen-Image-i2L (Image-to-LoRA) that extracts style, composition, or details from images and saves them as lightweight LoRA files with intelligent VRAM optimization. (Description by CC)[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "edvardtoth",
+ "title": "ComfyUI-ETNodes",
+ "reference": "https://github.com/edvardtoth/ComfyUI-ETNodes",
+ "files": [
+ "https://github.com/edvardtoth/ComfyUI-ETNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: ETNodes-Color-Selector, ETNodes-Gemini-API-Image, ETNodes-Gemini-API-Text, ETNodes-List-Items, ETNodes-List-Selector, ETNodes-Text-Previe"
+ },
+ {
+ "author": "jtydhr88",
+ "title": "ComfyUI-PolotnoCanvasEditor [UNSAFE]",
+ "reference": "https://github.com/jtydhr88/ComfyUI-PolotnoCanvasEditor",
+ "files": [
+ "https://github.com/jtydhr88/ComfyUI-PolotnoCanvasEditor"
+ ],
+ "install_type": "git-clone",
+ "description": "Integrates Polotno Canvas Editor into ComfyUI for advanced image editing and design.[w/This nodepack contains a path traversal vulnerability.]"
+ },
+ {
+ "author": "Taremin",
+ "title": "comfyui-remove-print",
+ "reference": "https://github.com/Taremin/comfyui-remove-print",
+ "files": [
+ "https://github.com/Taremin/comfyui-remove-print"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI extension for removing or suppressing print statements in node output. (Description by CC)"
+ },
+ {
+ "author": "JiangAogo",
+ "title": "ComfyUI-Gemini-API [WIP]",
+ "reference": "https://github.com/JiangAogo/ComfyUI-Gemini-API",
+ "files": [
+ "https://github.com/JiangAogo/ComfyUI-Gemini-API"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes for Google Gemini API integration, supporting both text generation (LLM) and image generation.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "AprEcho",
+ "title": "ComfyUI-RandomSeed",
+ "reference": "https://github.com/AprEcho/ComfyUI-RandomSeed",
+ "files": [
+ "https://github.com/AprEcho/ComfyUI-RandomSeed"
+ ],
+ "install_type": "git-clone",
+ "description": "Generates random seed values for ComfyUI workflows. (Description by CC)"
+ },
+ {
+ "author": "Suzu008",
+ "title": "ComfyUI-ImageCritic",
+ "reference": "https://github.com/Suzu008/ComfyUI-ImageCritic",
+ "files": [
+ "https://github.com/Suzu008/ComfyUI-ImageCritic"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for image analysis and evaluation. (Description by CC)"
+ },
+ {
+ "author": "Spicely",
+ "title": "[WIP] ComfyUI-Luma",
+ "reference": "https://github.com/Spicely/ComfyUI-Luma",
+ "files": [
+ "https://github.com/Spicely/ComfyUI-Luma"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI utility providing video and audio processing capabilities including text watermarking, audio-video separation, and audio-to-subtitle conversion. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "SSYCloud",
+ "title": "comfyui-ssy-syncapi [WIP]",
+ "reference": "https://github.com/SSYCloud/comfyui-ssy-syncapi",
+ "files": [
+ "https://github.com/SSYCloud/comfyui-ssy-syncapi"
+ ],
+ "install_type": "git-clone",
+ "description": "Powerful ComfyUI custom node collection providing 4 dedicated nodes to access SSY Cloud synchronous image generation and processing models including Google Gemini, ByteDance Doubao, OpenAI, and image enhancement APIs. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "LMietkiewicz",
+ "title": "HiggsfieldAPI_Node",
+ "reference": "https://github.com/LMietkiewicz/HiggsfieldAPI_Node",
+ "files": [
+ "https://github.com/LMietkiewicz/HiggsfieldAPI_Node"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for Higgsfield API integration. (Description by CC)"
+ },
+ {
+ "author": "starsFriday",
+ "title": "ComfyUI-LongCat-Image [WIP]",
+ "reference": "https://github.com/starsFriday/ComfyUI-LongCat-Image",
+ "files": [
+ "https://github.com/starsFriday/ComfyUI-LongCat-Image"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI wrapper nodes for the LongCat-Image text-to-image and image-editing pipelines with Python 3.12 support.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "logicalor",
+ "title": "comfyui_mv_adapter [WIP]",
+ "reference": "https://github.com/logicalor/comfyui_mv_adapter",
+ "files": [
+ "https://github.com/logicalor/comfyui_mv_adapter"
+ ],
+ "install_type": "git-clone",
+ "description": "MV-Adapter nodes for ComfyUI - Multi-view image generation\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "rafstahelin",
+ "title": "ComfyUI_KieNanoBananaPro",
+ "reference": "https://github.com/rafstahelin/ComfyUI_KieNanoBananaPro",
+ "files": [
+ "https://github.com/rafstahelin/ComfyUI_KieNanoBananaPro"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for processing and filtering using KieNanoBananaPro algorithm. (Description by CC)"
+ },
+ {
+ "author": "jinchanz",
+ "title": "ComfyUI-Midjourney",
+ "reference": "https://github.com/jinchanz/ComfyUI-Midjourney",
+ "files": [
+ "https://github.com/jinchanz/ComfyUI-Midjourney"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI integration for Midjourney API with nodes for submitting requests, polling results, and extracting JSON data. (Description by CC)"
+ },
+ {
+ "author": "saltchicken",
+ "title": "ComfyUI-Local-Loader",
+ "reference": "https://github.com/saltchicken/ComfyUI-Local-Loader",
+ "files": [
+ "https://github.com/saltchicken/ComfyUI-Local-Loader"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes for loading images from specified directories and file paths. (Description by CC)"
+ },
+ {
+ "author": "satyasairazole",
+ "title": "ComfyUI-Turbandetection [WIP]",
+ "reference": "https://github.com/satyasairazole/ComfyUI-Turbandetection",
+ "files": [
+ "https://github.com/satyasairazole/ComfyUI-Turbandetection"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node for detecting turbans in images using computer vision. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "dougbtv",
+ "title": "comfyui-vllm-omni",
+ "reference": "https://github.com/dougbtv/comfyui-vllm-omni",
+ "files": [
+ "https://github.com/dougbtv/comfyui-vllm-omni"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for vLLM-Omni text-to-image generation"
+ },
+ {
+ "author": "u5dev",
+ "title": "ComfyUI_u5_EasyScripter [UNSAFE]",
+ "reference": "https://github.com/u5dev/ComfyUI_u5_EasyScripter",
+ "files": [
+ "https://github.com/u5dev/ComfyUI_u5_EasyScripter"
+ ],
+ "install_type": "git-clone",
+ "description": "EASY VBA-style script for ComfyUI. Anything you want be in 1 node. Conditional branching, iteration, prompt generation, parameter adjustment, memory release, file input/output, Using HTTP RestAPI ... with 100+ built-in functions![w/This nodepack has RCE, SSRF, and arbitrary file read vulnerabilities.]"
+ },
+ {
+ "author": "stalkervr",
+ "title": "ComfyUI-StalkerVr",
+ "reference": "https://github.com/stalkervr/ComfyUI-StalkerVr",
+ "files": [
+ "https://github.com/stalkervr/ComfyUI-StalkerVr"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes for image processing, aspect ratio fixing, batch cropping, grid manipulation, JSON handling, and value extraction. (Description by CC)"
+ },
+ {
+ "author": "baoanhng",
+ "title": "ComfyUI-utils",
+ "reference": "https://github.com/baoanhng/ComfyUI-utils",
+ "files": [
+ "https://github.com/baoanhng/ComfyUI-utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Provides text utility nodes (TextJoiner, TextSplitter) for ComfyUI workflows. (Description by CC)"
+ },
+ {
+ "author": "xuchenxu168",
+ "title": "[WIP] comfyui_meituan_image",
+ "reference": "https://github.com/xuchenxu168/comfyui_meituan_image",
+ "files": [
+ "https://github.com/xuchenxu168/comfyui_meituan_image"
+ ],
+ "install_type": "git-clone",
+ "description": "Generate high-quality images from text prompts with excellent Chinese text rendering,Edit images using natural language instructions..\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "saltchicken",
+ "title": "ComfyUI-Identity-Mixer",
+ "reference": "https://github.com/saltchicken/ComfyUI-Identity-Mixer",
+ "files": [
+ "https://github.com/saltchicken/ComfyUI-Identity-Mixer"
+ ],
+ "install_type": "git-clone",
+ "description": "Mixes multiple identity LoRAs with normalized strength."
+ },
+ {
+ "author": "saltchicken",
+ "title": "ComfyUI-Prompter",
+ "reference": "https://github.com/saltchicken/ComfyUI-Prompter",
+ "files": [
+ "https://github.com/saltchicken/ComfyUI-Prompter"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node providing customizable prompt generation capabilities. (Description by CC)"
+ },
+ {
+ "author": "JBKing514",
+ "title": "[WIP] map_comfyui",
+ "reference": "https://github.com/JBKing514/map_comfyui",
+ "files": [
+ "https://github.com/JBKing514/map_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node implementing the Manifold Alignment Protocol (MAP) within ComfyUI, transforming diffusion sampling into a measurable and visualizable geometric process. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "binarystatic",
+ "title": "ComfyUI-BinarystaticMasterSeed",
+ "reference": "https://github.com/binarystatic/ComfyUI-BinarystaticMasterSeed",
+ "files": [
+ "https://github.com/binarystatic/ComfyUI-BinarystaticMasterSeed"
+ ],
+ "install_type": "git-clone",
+ "description": "BinarystaticMasterSeed node for ComfyUI. (Description by CC)"
+ },
+ {
+ "author": "Aruntd008",
+ "title": "[WIP] ComfyUI_SeamlessPattern",
+ "reference": "https://github.com/Aruntd008/ComfyUI_SeamlessPattern",
+ "files": [
+ "https://github.com/Aruntd008/ComfyUI_SeamlessPattern"
+ ],
+ "install_type": "git-clone",
+ "description": "SeamlessPatternNode for ComfyUI. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "SilentLuxRay",
+ "title": "[WIP] ComfyUI-Furrey-Super-Prompt",
+ "reference": "https://github.com/SilentLuxRay/ComfyUI-Furrey-Super-Prompt",
+ "files": [
+ "https://github.com/SilentLuxRay/ComfyUI-Furrey-Super-Prompt"
+ ],
+ "install_type": "git-clone",
+ "description": "A personalized all-in-one node for ComfyUI that simplifies prompt management and LoRA handling with automatic translation to English. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Rayen21",
+ "title": "[WIP] ComfyUI-PromptLinePlus",
+ "reference": "https://github.com/Rayen21/ComfyUI-PromptLinePlus",
+ "files": [
+ "https://github.com/Rayen21/ComfyUI-PromptLinePlus"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node that splits multi-line prompts by line, enabling batch image generation with each line triggering one execution and supporting custom prompt boxes. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "rookiestar28",
+ "title": "ComfyUI_Security_Audit",
+ "reference": "https://github.com/rookiestar28/ComfyUI_Security_Audit",
+ "files": [
+ "https://github.com/rookiestar28/ComfyUI_Security_Audit"
+ ],
+ "install_type": "git-clone",
+ "description": "A lightweight, dual-layer security extension for ComfyUI using AST-based static analysis and runtime monitoring to detect malicious code in custom nodes."
+ },
+ {
+ "author": "c1660181647-hash",
+ "title": "ComfyUI-MM-Visual-Encryption",
+ "reference": "https://github.com/c1660181647-hash/ComfyUI-MM-Visual-Encryption",
+ "files": [
+ "https://github.com/c1660181647-hash/ComfyUI-MM-Visual-Encryption"
+ ],
+ "install_type": "git-clone",
+ "description": "A visual noise encryption custom node for ComfyUI, supporting Image and Video privacy protection."
+ },
+ {
+ "author": "charlierz",
+ "title": "comfyui-charlierz",
+ "reference": "https://github.com/charlierz/comfyui-charlierz",
+ "files": [
+ "https://github.com/charlierz/comfyui-charlierz"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: BackgroundColor, ScaleDimensions"
+ },
+ {
+ "author": "lrzjason",
+ "title": "Comfyui-DiffusersUtils [WIP]",
+ "reference": "https://github.com/lrzjason/Comfyui-DiffusersUtils",
+ "files": [
+ "https://github.com/lrzjason/Comfyui-DiffusersUtils"
+ ],
+ "install_type": "git-clone",
+ "description": "A set of nodes which provide flexible inference using diffusers in comfyui env. (Description by CC)"
+ },
+ {
+ "author": "anilstream",
+ "title": "ComfyUI-NanoBananaPro",
+ "reference": "https://github.com/anilstream/ComfyUI-NanoBananaPro",
+ "files": [
+ "https://github.com/anilstream/ComfyUI-NanoBananaPro"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node implementing basic functionality with NanoBananaBasicNode. (Description by CC)"
+ },
+ {
+ "author": "Toxic1228",
+ "title": "Eleven-labs-comfyui-sts",
+ "reference": "https://github.com/Toxic1228/Eleven-labs-comfyui-sts",
+ "files": [
+ "https://github.com/Toxic1228/Eleven-labs-comfyui-sts"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI integration node for Eleven Labs text-to-speech service (requires API key). (Description by CC)"
+ },
+ {
+ "author": "NeoTech",
+ "title": "comfyui-laserprep",
+ "reference": "https://github.com/NeoTech/comfyui-laserprep",
+ "files": [
+ "https://github.com/NeoTech/comfyui-laserprep"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node implementing laser preparation functionality with LaserPrep node. (Description by CC)"
+ },
+ {
+ "author": "Enferlain",
+ "title": "ComfyUI-extra-schedulers [WIP]",
+ "reference": "https://github.com/Enferlain/ComfyUI-extra-schedulers",
+ "files": [
+ "https://github.com/Enferlain/ComfyUI-extra-schedulers"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes providing additional scheduler implementations for advanced sampling control. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "tiange-tree",
+ "title": "BLUEAI_ComfyUI_OpenAI",
+ "reference": "https://github.com/tiange-tree/BLUEAI_ComfyUI_OpenAI",
+ "files": [
+ "https://github.com/tiange-tree/BLUEAI_ComfyUI_OpenAI"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: BLUEAI_OpenAI_Node"
+ },
+ {
+ "author": "nestflow",
+ "title": "ComfyUI-WanPlus",
+ "reference": "https://github.com/nestflow/ComfyUI-WanPlus",
+ "files": [
+ "https://github.com/nestflow/ComfyUI-WanPlus"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for video frame manipulation and image-to-video conversion. (Description by CC)"
+ },
+ {
+ "author": "twdockery",
+ "title": "ComfyUI_Prompt_Batch_Generator",
+ "reference": "https://github.com/twdockery/ComfyUI_Prompt_Batch_Generator",
+ "files": [
+ "https://github.com/twdockery/ComfyUI_Prompt_Batch_Generator"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for batch image generation with Stable Diffusion 1.5, optimized for low VRAM systems. (Description by CC)"
+ },
+ {
+ "author": "tuxiansheng-ld",
+ "title": "Comfyui-tuxiansheng-nodes",
+ "reference": "https://github.com/tuxiansheng-ld/Comfyui-tuxiansheng-nodes",
+ "files": [
+ "https://github.com/tuxiansheng-ld/Comfyui-tuxiansheng-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: StringToListNode"
+ },
+ {
+ "author": "krakenunbound",
+ "title": "Kraken Discord Bot",
+ "id": "kraken-discord-bot",
+ "reference": "https://github.com/krakenunbound/kraken-discord-bot",
+ "files": [
+ "https://github.com/krakenunbound/kraken-discord-bot"
+ ],
+ "install_type": "git-clone",
+ "description": "All-in-one Discord bot node for AI image generation. Simple setup - just add token, select model, and queue. Includes style presets, rate limiting, and queue management."
+ },
+ {
+ "author": "quinteroac",
+ "title": "comfyui_api_executor_nodes",
+ "reference": "https://github.com/quinteroac/comfyui_api_executor_nodes",
+ "files": [
+ "https://github.com/quinteroac/comfyui_api_executor_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for ComfyUI that enable workflow execution via API (internal or external), as well as input/output handling and workflow selection."
+ },
+ {
+ "author": "Chang-Jin-Lee",
+ "title": "ComfyUI-PromptMixer-AI [WIP]",
+ "reference": "https://github.com/Chang-Jin-Lee/ComfyUI-PromptMixer-AI",
+ "files": [
+ "https://github.com/Chang-Jin-Lee/ComfyUI-PromptMixer-AI"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node collection for unified control of checkpoints, steps, CFG, samplers, LoRA and prompt parameters with local LLM integration. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "leacvikas0",
+ "title": "ComfyUI-Presence [WIP]",
+ "reference": "https://github.com/leacvikas0/ComfyUI-Presence",
+ "files": [
+ "https://github.com/leacvikas0/ComfyUI-Presence"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: BeautifulTextNode, FluxAdaptiveInjector, InspectNode, PresenceDirector, PresenceDirectorFireworks, PresenceDirectorVertex, PresenceSaver, UnaliverBundlePreview, UnaliverNode, UnaliverPlanner, UnaliverStepIterato, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Kraven1109",
+ "title": "ComfyUI-Llama [NAME CONFLICT]",
+ "reference": "https://github.com/Kraven1109/ComfyUI-Llama",
+ "files": [
+ "https://github.com/Kraven1109/ComfyUI-Llama"
+ ],
+ "install_type": "git-clone",
+ "description": "Lightweight ComfyUI plugin exposing llama.cpp-based one-shot Qwen VQA nodes."
+ },
+ {
+ "author": "xiaoxidashen",
+ "title": "comfyui_my_utils",
+ "reference": "https://github.com/xiaoxidashen/comfyui_my_utils",
+ "files": [
+ "https://github.com/xiaoxidashen/comfyui_my_utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Guide and utilities for creating ComfyUI custom nodes with image/video preview functionality. (Description by CC)"
+ },
+ {
+ "author": "agavesunset",
+ "title": "ComfyUI_LoRA_Tracker",
+ "reference": "https://github.com/agavesunset/ComfyUI_LoRA_Tracker",
+ "files": [
+ "https://github.com/agavesunset/ComfyUI_LoRA_Tracker"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node for tracking and displaying LoRA parameters. (Description by CC)"
+ },
+ {
+ "author": "SleazySleaze",
+ "title": "aesthetic-persona-comfyui-node",
+ "reference": "https://github.com/SleazySleaze/aesthetic-persona-comfyui-node",
+ "files": [
+ "https://github.com/SleazySleaze/aesthetic-persona-comfyui-node"
+ ],
+ "install_type": "git-clone",
+ "description": "Node providing aesthetic persona parsing capabilities for ComfyUI. (Description by CC)"
+ },
+ {
+ "author": "xtanqn",
+ "title": "comfyui-xishen [WIP]",
+ "reference": "https://github.com/xtanqn/comfyui-xishen",
+ "files": [
+ "https://github.com/xtanqn/comfyui-xishen"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that generates random numbers as text output.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "heyburns",
+ "title": "ComfyUI-Logic-Redux [WIP]",
+ "reference": "https://github.com/heyburns/ComfyUI-Logic-Redux",
+ "files": [
+ "https://github.com/heyburns/ComfyUI-Logic-Redux"
+ ],
+ "install_type": "git-clone",
+ "description": "Validation-friendly rewrite of ComfyUI Logic nodes with drop-in compatibility, featuring compare, int/float/bool/string pass-through, ternary logic, and debug nodes. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Mohamed-Sakr",
+ "title": "ComfyUI-SimpleMarkdown [UNSAFE]",
+ "reference": "https://github.com/Mohamed-Sakr/ComfyUI-SimpleMarkdown",
+ "files": [
+ "https://github.com/Mohamed-Sakr/ComfyUI-SimpleMarkdown"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple markdown node for ComfyUI[w/This nodepack has a frontend vulnerability.]"
+ },
+ {
+ "author": "starsFriday",
+ "title": "ComfyUI-Tracker-Person [WIP]",
+ "reference": "https://github.com/starsFriday/ComfyUI-Tracker-Person",
+ "files": [
+ "https://github.com/starsFriday/ComfyUI-Tracker-Person"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node using YOLO instance segmentation to track specific people in video frames with color histogram re-identification for robust tracking across occlusions. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "judian17",
+ "title": "ComfyUI-MIDI-3D [WIP]",
+ "reference": "https://github.com/judian17/ComfyUI-MIDI-3D",
+ "files": [
+ "https://github.com/judian17/ComfyUI-MIDI-3D"
+ ],
+ "install_type": "git-clone",
+ "description": "Partial implementation of the MIDI-3D project for ComfyUI with multi-view normal/depth map generation and texture baking. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "IAFFeng",
+ "title": "Comfyui_XF_Custom_Actual-Node",
+ "reference": "https://github.com/IAFFeng/Comfyui_XF_Custom_Actual-Node",
+ "files": [
+ "https://github.com/IAFFeng/Comfyui_XF_Custom_Actual-Node"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node providing GeminiMatting functionality for image matting operations. (Description by CC)"
+ },
+ {
+ "author": "LvyuanW",
+ "title": "ComfyUI-6yuan [WIP]",
+ "reference": "https://github.com/LvyuanW/ComfyUI-6yuan",
+ "files": [
+ "https://github.com/LvyuanW/ComfyUI-6yuan"
+ ],
+ "install_type": "git-clone",
+ "description": "A curated set of ComfyUI nodes under 6yuan namespace."
+ },
+ {
+ "author": "wciq1208",
+ "title": "even-comfyui-plugin",
+ "reference": "https://github.com/wciq1208/even-comfyui-plugin",
+ "files": [
+ "https://github.com/wciq1208/even-comfyui-plugin"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Gemini, NanoBanana"
+ },
+ {
+ "author": "Fuhze73",
+ "title": "ComfyUI-PainterI2V-StartEndImage-Tiled [WIP]",
+ "reference": "https://github.com/Fuhze73/ComfyUI-PainterI2V-StartEndImage-Tiled",
+ "files": [
+ "https://github.com/Fuhze73/ComfyUI-PainterI2V-StartEndImage-Tiled"
+ ],
+ "install_type": "git-clone",
+ "description": "Wan2.2 image-to-video enhancement node optimized for 4-step LoRAs, reducing slow-motion and enhancing camera movement. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "stevanisya",
+ "title": "comfyui_txt_selector [WIP]",
+ "reference": "https://github.com/stevanisya/comfyui_txt_selector",
+ "files": [
+ "https://github.com/stevanisya/comfyui_txt_selector"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple ComfyUI node that lets you choose one text from up to 10 inputs.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Isi-dev",
+ "title": "ComfyUI_DeleteModelPassthrough_ExecutionFlowControl [WIP]",
+ "reference": "https://github.com/Isi-dev/ComfyUI_DeleteModelPassthrough_ExecutionFlowControl",
+ "files": [
+ "https://github.com/Isi-dev/ComfyUI_DeleteModelPassthrough_ExecutionFlowControl"
+ ],
+ "install_type": "git-clone",
+ "description": "Memory management custom node that deletes specific models from VRAM and RAM while passing through other input types unchanged, useful for low-memory environments. (Description by CC)"
+ },
+ {
+ "author": "K1maran",
+ "title": "ComfyUI-Kimaran",
+ "reference": "https://github.com/K1maran/ComfyUI-Kimaran",
+ "files": [
+ "https://github.com/K1maran/ComfyUI-Kimaran"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes for preset latent image generation including EmptyLatentImagePresetsAIO, FLUX, QWEN, and SD1.5 variants. (Description by CC)"
+ },
+ {
+ "author": "silveroxides",
+ "title": "ComfyUI_LoHalo",
+ "reference": "https://github.com/silveroxides/ComfyUI_LoHalo",
+ "files": [
+ "https://github.com/silveroxides/ComfyUI_LoHalo"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI upscaling node package with Lohalo high-fidelity scaling and kernel-based image enhancement capabilities. (Description by CC)"
+ },
+ {
+ "author": "jorin91",
+ "title": "ComfyUI-JSG-Utils [UNSAFE]",
+ "reference": "https://github.com/jorin91/ComfyUI-JSG-Utils",
+ "files": [
+ "https://github.com/jorin91/ComfyUI-JSG-Utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Utility nodes for ComfyUI including file operations, recursive image finding, and path parsing. (Description by CC)[w/This nodepack contains a vulnerability that allows remote deletion of files at arbitrary paths.]"
+ },
+ {
+ "author": "vadimcro",
+ "title": "External-Image-Revised-with-MASK",
+ "reference": "https://github.com/vadimcro/External-Image-Revised-with-MASK",
+ "files": [
+ "https://github.com/vadimcro/External-Image-Revised-with-MASK"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI external image node with mask support for image composition and masking workflows. (Description by CC)"
+ },
+ {
+ "author": "martinken",
+ "title": "ComfyUI-KMNodes",
+ "reference": "https://github.com/martinken/ComfyUI-KMNodes",
+ "files": [
+ "https://github.com/martinken/ComfyUI-KMNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: KM_Aspect_Ratio_Selector, KM_Color_Correct, KM_Downscale_Image, KM_Merge_Images, KM_Safe_Mask_Bounds, KM_Safe_SEGS_Bounds, KM_Video_Image_Color_Match, KM_WanVideoToVideo, WanImageToVide, ..."
+ },
+ {
+ "author": "sahibalejandro",
+ "title": "ComfyUI Sahib Nodes",
+ "reference": "https://github.com/sahibalejandro/comfyui-sahib-nodes",
+ "files": [
+ "https://github.com/sahibalejandro/comfyui-sahib-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI"
+ },
+ {
+ "author": "pznodes",
+ "title": "MotionCapture [UNSAFE]",
+ "reference": "https://github.com/PozzettiAndrea/ComfyUI-MotionCapture",
+ "files": [
+ "https://github.com/PozzettiAndrea/ComfyUI-MotionCapture"
+ ],
+ "install_type": "git-clone",
+ "description": "Motion Capture nodes for ComfyUI: SMPL data/retargeting using GVHMR. This node is a very first draft, putting it out there in the hope some blender whizzes can help me figure out retargeting *prayer emoji*[w/This nodepack includes an endpoint that access files from arbitrary paths.]"
+ },
+ {
+ "author": "pznodes",
+ "title": "SAM3DObjects [UNSAFE]",
+ "reference": "https://github.com/PozzettiAndrea/ComfyUI-SAM3DObjects",
+ "files": [
+ "https://github.com/PozzettiAndrea/ComfyUI-SAM3DObjects"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI wrapper for SAM3DObjects: extract 3D meshes/gaussians from pictures. This node is a very first draft, putting it out there in the hope people help me with the development. I hate shipping broken code but I have some hope at least some linux people will manage to use it.[w/This nodepack includes an endpoint that access files from arbitrary paths.]"
+ },
+ {
+ "author": "nachoman",
+ "title": "nachoman Custom Nodes [WIP]",
+ "reference": "https://github.com/eddiehavila/comfyui-nachoman",
+ "files": [
+ "https://github.com/eddiehavila/comfyui-nachoman"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: NACHOMAN_AudioCropTime, NACHOMAN_AutoQueueController, NACHOMAN_ChunkIndexController, NACHOMAN_CombineAllChunks, NACHOMAN_Extract_Frame_Number, NACHOMAN_FullSongAnalyzerV4, NACHOMAN_GetPromptByIndex, NACHOMAN_GetRunIndexFromJson, NACHOMAN_IndexedPromptChunker, NACHOMAN_IndexedPromptChunkerV2, NACHOMAN_LoadAudioSplitDynamic, NACHOMAN_LoadAudioSplitUpload, NACHOMAN_LoadAudioSplit_HUMO, NACHOMAN_LoadAudioSplit_HUMO_Transcribe, NACHOMAN_LoadSingleAudioChunk, NACHOMAN_LoadVideos, NACHOMAN_PostRunIndexStepper, NACHOMAN_SaveVideoChunkWithIndex, NACHOMAN_TranscribeText, NACHOMAN_VideoSplitte, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "xuchenxu168",
+ "title": "ComfyUI-Gemini-3 [UNSAFE/WIP]",
+ "reference": "https://github.com/xuchenxu168/ComfyUI-Gemini-3",
+ "files": [
+ "https://github.com/xuchenxu168/ComfyUI-Gemini-3"
+ ],
+ "install_type": "git-clone",
+ "description": "Full-featured, high-performance Google Gemini 3 integration for ComfyUI. This plugin implements **all** Gemini 3 capabilities with optimized performance.\nNOTE: The files in the repo are not organized.[w/This nodepack has a vulnerability that allows arbitrary code execution remotely.]"
+ },
+ {
+ "author": "starsFriday",
+ "title": "ComfyUI-Audio-Subtitle [WIP]",
+ "reference": "https://github.com/starsFriday/ComfyUI-Audio-Subtitle",
+ "files": [
+ "https://github.com/starsFriday/ComfyUI-Audio-Subtitle"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI node that automatically transcribes audio using OpenAI Whisper and hardcodes subtitles onto video frames using FFmpeg with customizable fonts, colors, styles, and positioning. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "TheLocalLab",
+ "title": "ComfyUI-Kandinsky-GGUF [WIP]",
+ "reference": "https://github.com/TheLocalLab/ComfyUI-Kandinsky-GGUF",
+ "files": [
+ "https://github.com/TheLocalLab/ComfyUI-Kandinsky-GGUF"
+ ],
+ "install_type": "git-clone",
+ "description": "A fork of Ada123-a’s ComfyUI-Kandinsky nodes for Kandinsky 5 DiT. Enables high-quality video generation from text (T2V) and images (I2V) with advanced text-guided controls. \nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "JosDigby",
+ "title": "ComfyUI-DigbyWan",
+ "reference": "https://github.com/JosDigby/ComfyUI-DigbyWan",
+ "files": [
+ "https://github.com/JosDigby/ComfyUI-DigbyWan"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: ImageBatchLoopExtract, WanMiddleFrameToVideo, WanVACEVideoSmoother"
+ },
+ {
+ "author": "UltraNoob-NazoGiken",
+ "title": "ComfyUI-TOML-Tools [WIP]",
+ "reference": "https://github.com/UltraNoob-NazoGiken/ComfyUI-TOML-Tools",
+ "files": [
+ "https://github.com/UltraNoob-NazoGiken/ComfyUI-TOML-Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CreateTomlData, GetTomlValue, LoadToml, MergeTomlData, SaveTom, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "frost-byte",
+ "title": "fb-tools",
+ "reference": "https://github.com/frost-byte/fbTools",
+ "files": [
+ "https://github.com/frost-byte/fbTools"
+ ],
+ "install_type": "git-clone",
+ "description": "A collect of custom nodes for ComfyUI"
+ },
+ {
+ "author": "Aruntd008",
+ "title": "ComfyUI_blender_render",
+ "reference": "https://github.com/Aruntd008/ComfyUI_blender_render",
+ "files": [
+ "https://github.com/Aruntd008/ComfyUI_blender_render"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Blender Render (Auto-Setup)"
+ },
+ {
+ "author": "mertgoksel",
+ "title": "comfyui-noot-nodes [WIP]",
+ "reference": "https://github.com/mertgoksel/ComfyUI-Noot-Nodes",
+ "files": [
+ "https://github.com/mertgoksel/ComfyUI-Noot-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes i made to suit my needs, currently includes a tag randomizer and a stagedksampler which iterates sampler steps and upscaling."
+ },
+ {
+ "author": "egormly",
+ "title": "ComfyUI-EG_Tools [WIP]",
+ "reference": "https://github.com/egormly/ComfyUI-EG_Tools",
+ "files": [
+ "https://github.com/egormly/ComfyUI-EG_Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "Quality-of-life utility nodes for ComfyUI providing smart switches for dynamic data routing, path helpers for consistent file naming, and image utilities including Qwen vision model preparation.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "huhu-tiger",
+ "title": "ComfyUI-RemoteDownload",
+ "reference": "https://github.com/huhu-tiger/ComfyUI-RemoteDownload",
+ "files": [
+ "https://github.com/huhu-tiger/ComfyUI-RemoteDownload"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: LoadImageFromRemote"
+ },
+ {
+ "author": "zhupeter010903",
+ "title": "ComfyUI-prompt-library",
+ "reference": "https://github.com/zhupeter010903/ComfyUI-prompt-library",
+ "files": [
+ "https://github.com/zhupeter010903/ComfyUI-prompt-library"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Grouped Prompt Node, ..."
+ },
+ {
+ "author": "basenc",
+ "title": "Comfyui-Nodes-basenc [UNSAFE]",
+ "reference": "https://github.com/basenc/Comfyui-Nodes-basenc",
+ "files": [
+ "https://github.com/basenc/Comfyui-Nodes-basenc"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Custom OpenAI Chat Completion, Environment Variable, Eval, JSON Path Select, JSON Path Select, Wan Video Size, ... [w/This nodepack has a vulnerability that allows arbitrary file contents to be read remotely.]"
+ },
+ {
+ "author": "jkaarlehto",
+ "title": "ComfyUI-GetWorkflowName [WIP]",
+ "reference": "https://github.com/jKaarlehto/ComfyUI-GetWorkflowName",
+ "files": [
+ "https://github.com/jKaarlehto/ComfyUI-GetWorkflowName"
+ ],
+ "install_type": "git-clone",
+ "description": "Adds a node that outputs the workflow's name as a string\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "newraina",
+ "title": "comfyui-photoshop-v2 [WIP]",
+ "reference": "https://github.com/newraina/comfyui-photoshop-v2",
+ "files": [
+ "https://github.com/newraina/comfyui-photoshop-v2"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Photoshop ComfyUI Plugin, Send To Photoshop, ClipPass, modelPass, Photoshop RemoteConnection, ..."
+ },
+ {
+ "author": "eddyhhlure1Eddy",
+ "title": "ComfyUI-QwenImageWrapper [WIP]",
+ "reference": "https://github.com/eddyhhlure1Eddy/ComfyUI-QwenImageWrapper",
+ "files": [
+ "https://github.com/eddyhhlure1Eddy/ComfyUI-QwenImageWrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "Integrated Qwen-Image node for ComfyUI with all-in-one model loading, 4 LoRA slots, memory optimization via BlockSwap reducing VRAM usage by 30-60%, and multiple quantization options.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "tori29umai0123",
+ "title": "ComfyUI-SDXLGenerateFromTextFile [UNSAFE]",
+ "reference": "https://github.com/tori29umai0123/ComfyUI-SDXLGenerateFromTextFile",
+ "files": [
+ "https://github.com/tori29umai0123/ComfyUI-SDXLGenerateFromTextFile"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node for batch image generation from text file prompts with configurable resolution, quantity, and model settings for Stable Diffusion workflows. (Description by CC)[w/This nodepack has a vulnerability that allows arbitrary file contents to be read remotely.]"
+ },
+ {
+ "author": "unphased",
+ "title": "code-nodes [UNSAFE]",
+ "reference": "https://github.com/unphased/code-nodes",
+ "files": [
+ "https://github.com/unphased/code-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository provides two lightweight execution helpers for ComfyUI graphs: Shell Code, Python Code[w/This nodepack has a vulnerability that allows arbitrary code execution remotely.]"
+ },
+ {
+ "author": "marduk191",
+ "title": "comfyui_cmdtls [UNSAFE]",
+ "reference": "https://github.com/marduk191/comfyui_cmdtls",
+ "files": [
+ "https://github.com/marduk191/comfyui_cmdtls"
+ ],
+ "install_type": "git-clone",
+ "description": "A comprehensive set of ComfyUI custom nodes for file system operations, file browsing, upload/download, and shell command execution.[w/This nodepack has a vulnerability that allows arbitrary code execution remotely.]"
+ },
+ {
+ "author": "AIExplorer25",
+ "title": "ComfyUI_HuggingfaceHelper",
+ "reference": "https://github.com/AIExplorer25/ComfyUI_HuggingfaceHelper",
+ "files": [
+ "https://github.com/AIExplorer25/ComfyUI_HuggingfaceHelper"
+ ],
+ "install_type": "git-clone",
+ "description": "This repo has different functions to help dealing with huggingface data"
+ },
+ {
+ "author": "ilslli",
+ "title": "Comfyui-IV2Z",
+ "reference": "https://github.com/ilslli/Comfyui-IV2Z",
+ "files": [
+ "https://github.com/ilslli/Comfyui-IV2Z"
+ ],
+ "install_type": "git-clone",
+ "description": "Modify the VideoCombine node of [a/ComfyUI-VideoHelperSuite](https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite) so that, after encoding the video, it outputs the result as a compressed archive."
+ },
+ {
+ "author": "PladsElsker",
+ "title": "comfyui-krita [WIP]",
+ "reference": "https://github.com/PladsElsker/comfyui-krita",
+ "files": [
+ "https://github.com/PladsElsker/comfyui-krita"
+ ],
+ "install_type": "git-clone",
+ "description": "Minimal Krita extension and ComfyUI custom nodes for integrating both UIs together with workflow exposure and compositing capabilities. NOTE: The project is in active development (WIP). (Description by CC)"
+ },
+ {
+ "author": "max-dingsda",
+ "title": "ComfyUI-PromptLoop [WIP]",
+ "reference": "https://github.com/max-dingsda/ComfyUI-PromptLoop",
+ "files": [
+ "https://github.com/max-dingsda/ComfyUI-PromptLoop"
+ ],
+ "install_type": "git-clone",
+ "description": "Batch process multiple prompts from text files in a single ComfyUI queue job - supports prompt loops from files or multi-line text with optional start index and limit controls.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Gergzilla",
+ "title": "Slim-Comfy-Pack [private]",
+ "reference": "https://github.com/Gergzilla/Slim-Comfy-Pack",
+ "files": [
+ "https://github.com/Gergzilla/Slim-Comfy-Pack"
+ ],
+ "install_type": "git-clone",
+ "description": "A slimmed down collection of ComfyUI nodes either from elsewhere, custom creation or updated independently. (Description by CC)"
+ },
+ {
+ "author": "Sida Liu",
+ "title": "ComfyUI-Notebook [UNSAFE]",
+ "id": "notebook",
+ "reference": "https://github.com/liusida/ComfyUI-Notebook",
+ "files": [
+ "https://github.com/liusida/ComfyUI-Notebook"
+ ],
+ "install_type": "git-clone",
+ "description": "A Jupyter-style custom node for executing Python code and plotting within ComfyUI workflows.[w/This extension allows remote command execution.]"
+ },
+ {
+ "author": "pznodes",
+ "title": "ComfyUI-UniRig [WIP]",
+ "reference": "https://github.com/PozzettiAndrea/ComfyUI-UniRig",
+ "files": [
+ "https://github.com/PozzettiAndrea/ComfyUI-UniRig"
+ ],
+ "install_type": "git-clone",
+ "description": "WORK IN PROGRESS. Automatic skeleton extraction for ComfyUI using UniRig (SIGGRAPH 2025). Self-contained with bundled Blender."
+ },
+ {
+ "author": "pznodes",
+ "title": "CADabra [WIP]",
+ "reference": "https://github.com/PozzettiAndrea/ComfyUI-CADabra",
+ "files": [
+ "https://github.com/PozzettiAndrea/ComfyUI-CADabra"
+ ],
+ "install_type": "git-clone",
+ "description": "WORK IN PROGRESS. CAD file processing nodes for ComfyUI with interactive 3D OCC CAD viewer. Load STEP, IGES, BREP files and generate meshes using Gmsh."
+ },
+ {
+ "author": "pznodes",
+ "title": "Hunyuan3D-Part [WIP]",
+ "reference": "https://github.com/PozzettiAndrea/ComfyUI-Hunyuan3D-Part",
+ "files": [
+ "https://github.com/PozzettiAndrea/ComfyUI-Hunyuan3D-Part"
+ ],
+ "install_type": "git-clone",
+ "description": "WORK IN PROGRESS. Hunyuan3D-Part nodes for ComfyUI: 3D part segmentation with P3-SAM and high-fidelity part generation with X-Part diffusion."
+ },
+ {
+ "author": "hhelloe",
+ "title": "comfyuiWeightOnlyQuant [WIP]",
+ "reference": "https://github.com/hhelloe/comfyuiWeightOnlyQuant",
+ "files": [
+ "https://github.com/hhelloe/comfyuiWeightOnlyQuant"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Weight-Only Quantize (Linear)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "KXSR",
+ "title": "ComfyUI-Easy-s3",
+ "reference": "https://github.com/KXSR/ComfyUI-Easy-s3",
+ "files": [
+ "https://github.com/KXSR/ComfyUI-Easy-s3"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: 'URL: Load Media', 'Image: Save To Disk (No UI)', 'S3: Upload Presigned', ..."
+ },
+ {
+ "author": "akashch1512",
+ "title": "ComfyUI_UguuUploader",
+ "reference": "https://github.com/akashch1512/ComfyUI_UguuUploader",
+ "files": [
+ "https://github.com/akashch1512/ComfyUI_UguuUploader"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Uguu.se Video Uploader\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "vadimcro",
+ "title": "string_by_index",
+ "reference": "https://github.com/vadimcro/string_by_index",
+ "files": [
+ "https://github.com/vadimcro/string_by_index"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node that lets you output a string, based on int index number on input"
+ },
+ {
+ "author": "sickbraintwo",
+ "title": "WextraX [WIP]",
+ "reference": "https://github.com/sickbraintwo/WextraX",
+ "files": [
+ "https://github.com/sickbraintwo/WextraX"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes for LoRA management, including LoRA name extraction and tag filtering utilities. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "hhelloe",
+ "title": "ComfyuiQuantizerToFp8 [WIP]",
+ "reference": "https://github.com/hhelloe/ComfyuiQuantizerToFp8",
+ "files": [
+ "https://github.com/hhelloe/ComfyuiQuantizerToFp8"
+ ],
+ "install_type": "git-clone",
+ "description": "Linear quantizer node for ComfyUI that converts models to FP8 precision format for reduced memory usage and faster inference.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "nobinBB",
+ "title": "comfyui-samenodes",
+ "reference": "https://github.com/nobinBB/comfyui-samenodes",
+ "files": [
+ "https://github.com/nobinBB/comfyui-samenodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Batch Image Processor, Float to String, Float to String with Prefix, LoRA Wildcard Generator"
+ },
+ {
+ "author": "MushroomFleet",
+ "title": "ComfyUI-SCP-nodes [UNSAFE]",
+ "reference": "https://github.com/MushroomFleet/ComfyUI-SCP-nodes",
+ "files": [
+ "https://github.com/MushroomFleet/ComfyUI-SCP-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node that automatically saves generated images locally and uploads them to a remote server via SCP (Secure Copy Protocol).[w/This nodepack includes an endpoint that access files from arbitrary paths.]"
+ },
+ {
+ "author": "jonstreeter",
+ "title": "Archive Output [UNSAFE]",
+ "id": "archive-output",
+ "reference": "https://github.com/jonstreeter/comfyui-archive-output",
+ "files": [
+ "https://github.com/jonstreeter/comfyui-archive-output"
+ ],
+ "install_type": "git-clone",
+ "description": "Archive and organize your generated images into date-structured folders, and compress PNG images to JPEG/WebP with full workflow metadata preservation, saving 85-95% disk space.[w/This nodepack includes an endpoint that access files from arbitrary paths.]"
+ },
+ {
+ "author": "xuchenxu168",
+ "title": "ComfyUI-Qwen3-VL [WIP]",
+ "id": "qwen3-vl",
+ "reference": "https://github.com/xuchenxu168/ComfyUI_Qwen3-VL",
+ "files": [
+ "https://github.com/xuchenxu168/ComfyUI_Qwen3-VL"
+ ],
+ "install_type": "git-clone",
+ "description": "Enhanced Qwen3-VL integration for ComfyUI with direct image and video support.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "cedarconnor",
+ "title": "HunyuanWorld-Mirror ComfyUI Node Pack [WIP]",
+ "reference": "https://github.com/cedarconnor/ComfyUI-HunyuanWorld-Mirror",
+ "files": [
+ "https://github.com/cedarconnor/ComfyUI-HunyuanWorld-Mirror"
+ ],
+ "install_type": "git-clone",
+ "description": "Transform 2D images into 3D worlds using Tencent's HunyuanWorld-Mirror model directly in ComfyUI."
+ },
+ {
+ "author": "zRicmuriellee1xh",
+ "title": "ComfyUI-Logic-Switch",
+ "reference": "https://github.com/muriellee1x/ComfyUI-Logic-Switch",
+ "files": [
+ "https://github.com/muriellee1x/ComfyUI-Logic-Switch"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: random string selector"
+ },
+ {
+ "author": "zRich",
+ "title": "ComfyUI-zRich-ObjectCutter",
+ "reference": "https://github.com/zRich/ComfyUI-zRich-ObjectCutter",
+ "files": [
+ "https://github.com/zRich/ComfyUI-zRich-ObjectCutter"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: zRich Object Cutter (MASK to Transparent), SAM2 Auto Layer Extractor"
+ },
+ {
+ "author": "ajcampbell1333",
+ "title": "BudgetGuard for Artists [WIP]",
+ "reference": "https://github.com/ajcampbell1333/BudgetGuard_Artists",
+ "files": [
+ "https://github.com/ajcampbell1333/BudgetGuard_Artists"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node that provides cost estimation and budget management for NVIDIA NIM nodes across multiple cloud providers."
+ },
+ {
+ "author": "muriellee1x",
+ "title": "ComfyUI-switch-angles",
+ "reference": "https://github.com/muriellee1x/ComfyUI-switch-angles",
+ "files": [
+ "https://github.com/muriellee1x/ComfyUI-switch-angles"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Camera Prompt Generator, ..."
+ },
+ {
+ "author": "APZmedia",
+ "title": "ComfyUI Folder Parser [UNSAFE]",
+ "reference": "https://github.com/APZmedia/ComfyUI-folder-parser",
+ "files": [
+ "https://github.com/APZmedia/ComfyUI-folder-parser"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node that parses files from a folder with filtering and sorting capabilities. Outputs file paths for use in other ComfyUI nodes.[w/This nodepack contains a path traversal vulnerability.]"
+ },
+ {
+ "author": "Seb-Lis",
+ "title": "comfyui-seed-selector",
+ "reference": "https://github.com/Seb-Lis/comfyui-seed-selector",
+ "files": [
+ "https://github.com/Seb-Lis/comfyui-seed-selector"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Seed Selector (INT), My Seed Selector (INT), Seed Selector with Display, ..."
+ },
+ {
+ "author": "Amor718",
+ "title": "AmorForge",
+ "reference": "https://github.com/Amor718/AmorForge",
+ "files": [
+ "https://github.com/Amor718/AmorForge"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Amor's Image WebpSaver, Amor's Image Resizer, Amor's Text Translator, Amor's CogView Image Generator, ..."
+ },
+ {
+ "author": "Solarish",
+ "title": "fyUI-MidnightLook [WIP]",
+ "reference": "https://github.com/Solarish/ComfyUI-MidnightLook",
+ "files": [
+ "https://github.com/Solarish/ComfyUI-MidnightLook"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom node for MidnightLook.com\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "hujuying",
+ "title": "ComfyUI-QwenVL3-image-Plus [WIP]",
+ "reference": "https://github.com/hujuying/ComfyUI-QwenVL3-image-Plus",
+ "files": [
+ "https://github.com/hujuying/ComfyUI-QwenVL3-image-Plus"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node designed for ComfyUI that integrates the **Qwen3-VL-4B-Instruct-FP8** vision-language model for efficient image understanding and description. It supports flexible prompt-combination features to enhance the accuracy and diversity of image descriptions.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "r-vage",
+ "title": "ComfyUI_Eclipse [UNSAFE]",
+ "reference": "https://github.com/r-vage/ComfyUI_Eclipse",
+ "files": [
+ "https://github.com/r-vage/ComfyUI_Eclipse"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes and utilities for workflow building, type conversions, checkpoint/pipe loaders and file utilities.[w/This nodepack includes an endpoint that access files from arbitrary paths.]"
+ },
+ {
+ "author": "silveroxides",
+ "title": "ComfyUI_LogicMath",
+ "reference": "https://github.com/silveroxides/ComfyUI_LogicMath",
+ "files": [
+ "https://github.com/silveroxides/ComfyUI_LogicMath"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom node for with some basic logic and math nodes based on pull request [a/comfyanonymous/ComfyUI#8024](https://github.com/comfyanonymous/ComfyUI/pull/8024)"
+ },
+ {
+ "author": "lyra-ai",
+ "title": "lyra-nodes",
+ "reference": "https://github.com/lyra-ai/lyra-nodes",
+ "files": [
+ "https://github.com/lyra-ai/lyra-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Lyra – 🎞️ Image Audio Fusion, Lyra – 🌐 Load Audio from URL, Lyra – 🖼️ Load Image from URL"
+ },
+ {
+ "author": "VectorASD",
+ "title": "ComfyUI-VectorASD",
+ "reference": "https://github.com/VectorASD/ComfyUI-VectorASD",
+ "files": [
+ "https://github.com/VectorASD/ComfyUI-VectorASD"
+ ],
+ "install_type": "git-clone",
+ "description": "VectorASD's custom nodes for ComfyUI"
+ },
+ {
+ "author": "laobaishu1",
+ "title": "ComfyUI-JSON-Upload-Iterator [UNSAFE]",
+ "reference": "https://github.com/laobaishu1/ComfyUI-JSON-Upload-Iterator",
+ "files": [
+ "https://github.com/laobaishu1/ComfyUI-JSON-Upload-Iterator"
+ ],
+ "install_type": "git-clone",
+ "description": "A JSON upload and iterator node for ComfyUI that supports uploading JSON storyboard files and outputs each field sequentially.[w/This nodepack includes an endpoint that access files from arbitrary paths.]"
+ },
+ {
+ "author": "dibowei1980",
+ "title": "Comfyui-QwenEditUtilsFromRapid",
+ "reference": "https://github.com/dibowei1980/Comfyui-QwenEditUtilsFromRapid",
+ "files": [
+ "https://github.com/dibowei1980/Comfyui-QwenEditUtilsFromRapid"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: TextEncodeQwenImageEdit_FromRapid, TextEncodeQwenImageEditPlus_FromRapid"
+ },
+ {
+ "author": "minujeong",
+ "title": "comfyui-oklch-color-picker",
+ "reference": "https://github.com/minujeong/comfyui-oklch-color-picker",
+ "files": [
+ "https://github.com/minujeong/comfyui-oklch-color-picker"
+ ],
+ "install_type": "git-clone",
+ "description": "provide OKLCH space color picker as Comfy UI node"
+ },
+ {
+ "author": "gaonprime-lab",
+ "title": "ComfyUI_Nordy",
+ "reference": "https://github.com/gaonprime-labs/ComfyUI_Nordy",
+ "files": [
+ "https://github.com/gaonprime-labs/ComfyUI_Nordy"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Save Image S3 PresignedUrl (Nordy), Memory Test"
+ },
+ {
+ "author": "mittimi",
+ "title": "ComfyUI_mittimiLoadPresetLite [UNSAFE]",
+ "reference": "https://github.com/mittimi/ComfyUI_mittimiLoadPresetLite",
+ "files": [
+ "https://github.com/mittimi/ComfyUI_mittimiLoadPresetLite"
+ ],
+ "install_type": "git-clone",
+ "description": "This node can easily switch between models and prompts by saving presets.[w/This nodepack includes an endpoint that access files from arbitrary paths.]"
+ },
+ {
+ "author": "WenerSantos3",
+ "title": "ComfyUI-BlueeUtils [UNSAFE]",
+ "reference": "https://github.com/WenerSantos3/ComfyUI-BlueeUtils",
+ "files": [
+ "https://github.com/WenerSantos3/ComfyUI-BlueeUtils"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Bluee Utils - Delete File, blueeInput, Bluee Template String, Bluee Utils - Download Temp, Bluee Utils - Read Temp Image, Bluee Utils - Read Temp Audio, bluee - file exists, Bluee - Combine Images + Audio (H.264 MP4)[w/This nodepack includes an endpoint that access files from arbitrary paths.]"
+ },
+ {
+ "author": "Rosegun007",
+ "title": "ComfyUI-Pandora",
+ "reference": "https://github.com/Rosegun007/ComfyUI-Pandora",
+ "files": [
+ "https://github.com/Rosegun007/ComfyUI-Pandora"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple and user-friendly ComfyUI plugin that offers advanced text rendering, streamlined bridge-style image preview, and various convenient mask tools — primarily designed for ComfyUI tutorial creators."
+ },
+ {
+ "author": "fuselayer",
+ "title": "comfyui-libcom-image-composition",
+ "reference": "https://github.com/fuselayer/comfyui-libcom-image-composition",
+ "files": [
+ "https://github.com/fuselayer/comfyui-libcom-image-composition"
+ ],
+ "install_type": "git-clone",
+ "description": "port of bcmi/libcom and other image composition (harmonization, shadow generation) utilities"
+ },
+ {
+ "author": "Long-form-AI-video-generation",
+ "title": "ComfyUI_vaceFramepack",
+ "reference": "https://github.com/Long-form-AI-video-generation/ComfyUI_vaceFramepack",
+ "files": [
+ "https://github.com/Long-form-AI-video-generation/ComfyUI_vaceFramepack"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: WanVACE FramePack Sampler 2"
+ },
+ {
+ "author": "ifilipis",
+ "title": "ComfyUI-Auto-Prompt-Engineer",
+ "reference": "https://github.com/ifilipis/ComfyUI-Auto-Prompt-Engineer",
+ "files": [
+ "https://github.com/ifilipis/ComfyUI-Auto-Prompt-Engineer"
+ ],
+ "install_type": "git-clone",
+ "description": "Automated prompt engineering using LLMs"
+ },
+ {
+ "author": "JHBOY-ha",
+ "title": "ComfyUI-jh-essential",
+ "reference": "https://github.com/JHBOY-ha/ComfyUI-jh-essential",
+ "files": [
+ "https://github.com/JHBOY-ha/ComfyUI-jh-essential"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Start Timer, End Timer"
+ },
+ {
+ "author": "APZmedia",
+ "title": "Joshua Brand Assets Loader [private]",
+ "reference": "https://github.com/APZmedia/Joshua-brand-assets-loader",
+ "files": [
+ "https://github.com/APZmedia/Joshua-brand-assets-loader"
+ ],
+ "install_type": "git-clone",
+ "description": "A comprehensive brand asset loader for ComfyUI that handles logos, fonts, and color palettes with dual loading modes (API and manual)."
+ },
+ {
+ "author": "GoddessLabs",
+ "title": "ComfyUI-GoddessLabs-NodePack",
+ "reference": "https://github.com/GoddessLabs/ComfyUI-GoddessLabs-NodePack",
+ "files": [
+ "https://github.com/GoddessLabs/ComfyUI-GoddessLabs-NodePack"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom node pack for ComfyUI This nodepack helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more."
+ },
+ {
+ "author": "Beinsezii",
+ "title": "DEET: Diffusion Entropy Equalization Transform [WIP]",
+ "reference": "https://github.com/Beinsezii/DEET",
+ "files": [
+ "https://github.com/Beinsezii/DEET"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple transform to regulate the noise as it flows in and out of a diffusion model. Currently implemented as a nn.Module forward hook for Diffusers and as a node for ComfyUI"
+ },
+ {
+ "author": "woitec",
+ "title": "ComfyUI_ImageDimensions [WIP]",
+ "reference": "https://github.com/woitec/ComfyUI_ImageDimensions",
+ "files": [
+ "https://github.com/woitec/ComfyUI_ImageDimensions"
+ ],
+ "install_type": "git-clone",
+ "description": "Node for extraction of dimensions from an upstream-loaded tensor image.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "PopeyesBiscuit",
+ "title": "ComfyUI-WebSocketLoRAExporter",
+ "reference": "https://github.com/PopeyesBiscuit/ComfyUI-WebSocketLoRAExporter",
+ "files": [
+ "https://github.com/PopeyesBiscuit/ComfyUI-WebSocketLoRAExporter"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Simple LoRA Loader, ..."
+ },
+ {
+ "author": "PopeyesBiscuit",
+ "title": "ComfyUI Delete Folder Nodes [UNSAFE]",
+ "reference": "https://github.com/PopeyesBiscuit/ComfyUI-DeleteFolder",
+ "files": [
+ "https://github.com/PopeyesBiscuit/ComfyUI-DeleteFolder"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes for clearing folders in the input or output folder."
+ },
+ {
+ "author": "hndrr",
+ "title": "Comfyui-SceneDetect [WIP]",
+ "reference": "https://github.com/hndrr/Comfyui-SceneDetect",
+ "files": [
+ "https://github.com/hndrr/Comfyui-SceneDetect"
+ ],
+ "install_type": "git-clone",
+ "description": "Comfyui-SceneDetect is a ComfyUI custom node that uses PySceneDetect to locate scene boundaries in a video and emit one representative frame per scene as an `IMAGE` batch. It also returns per-scene metadata as JSON (`STRING`) and the total number of detected scenes (`INT`)."
+ },
+ {
+ "author": "zRich",
+ "title": "sam2_layer_node",
+ "reference": "https://github.com/zRich/sam2_layer_node",
+ "files": [
+ "https://github.com/zRich/sam2_layer_node"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Sam2 Layer Extract"
+ },
+ {
+ "author": "promptingpixels",
+ "title": "ComfyUI-DreamOmni2-GGUF [WIP]",
+ "reference": "https://github.com/xuchenxu168/Comfyui_Prompt_Edit",
+ "files": [
+ "https://github.com/xuchenxu168/Comfyui_Prompt_Edit"
+ ],
+ "install_type": "git-clone",
+ "description": "Prompt Edit is a custom node for ComfyUI that allows you to pause workflow execution, edit text prompts, and then continue. This is very useful for scenarios where you need to dynamically adjust prompts during the generation process.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "promptingpixels",
+ "title": "Simple CSV Parser [UNSAFE]",
+ "reference": "https://github.com/content-and-code/ComfyUI-SimpleCSVParse",
+ "files": [
+ "https://github.com/content-and-code/ComfyUI-SimpleCSVParse"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node for parsing CSV files with positive and negative prompts[w/This nodepack includes an endpoint that access files from arbitrary paths.]"
+ },
+ {
+ "author": "PauldeLavallaz",
+ "title": "comfyui_morpheus_NanoBanana_Mask [WIP]",
+ "reference": "https://github.com/PauldeLavallaz/comfyui_morpheus_NanoBanana_Mask",
+ "files": [
+ "https://github.com/PauldeLavallaz/comfyui_morpheus_NanoBanana_Mask"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Morpheus · Batch Images + crop image, Morpheus · NanoBanana Mask, Morpheus · Image Editing Prompt, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "silveroxides",
+ "title": "ComfyUI_PromptAttention [WIP]",
+ "reference": "https://github.com/silveroxides/ComfyUI_PromptAttention",
+ "files": [
+ "https://github.com/silveroxides/ComfyUI_PromptAttention"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Text Encode with Attention Bias"
+ },
+ {
+ "author": "cedarconnor",
+ "title": "ComfyUI Motion Transfer Pack [WIP]",
+ "reference": "https://github.com/cedarconnor/ComfyUI_MotionTransfer",
+ "files": [
+ "https://github.com/cedarconnor/ComfyUI_MotionTransfer"
+ ],
+ "install_type": "git-clone",
+ "description": "Transfer motion from low-resolution AI-generated videos to ultra-high-resolution still images (up to 16K+).\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "theshubzworld",
+ "title": "ComfyUI-NvidiaVision [WIP]",
+ "reference": "https://github.com/theshubzworld/ComfyUI-NvidiaVision",
+ "files": [
+ "https://github.com/theshubzworld/ComfyUI-NvidiaVision"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for NVIDIA AI Vision and Text models\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "MadPonyInteractive",
+ "title": "ComfyUi-MpiNodes [WIP]",
+ "reference": "https://github.com/MadPonyInteractive/ComfyUi-MpiNodes",
+ "files": [
+ "https://github.com/MadPonyInteractive/ComfyUi-MpiNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Mpi Batch Text Replace, Mpi Prompt Chain Selector, Mpi Preset Selector, Mpi Prompt Override Seed, Mpi If Else Probability Inverted, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "fantaskiss",
+ "title": "ComfyUI-Qwen3_VQA_enhanced [WIP]",
+ "reference": "https://github.com/fantaskiss/ComfyUI-Qwen3_VQA_enhanced",
+ "files": [
+ "https://github.com/fantaskiss/ComfyUI-Qwen3_VQA_enhanced"
+ ],
+ "install_type": "git-clone",
+ "description": "Enhancement of the original qwen3_VQA node. Other functions remain unchanged, with only the automatic scanning of the prompt_generator folder added. No new node group is created; only additions and modifications are made to the original node group."
+ },
+ {
+ "author": "pacchikAI",
+ "title": "comfyui_pacchik_window [UNSAFE]",
+ "reference": "https://github.com/pacchikAI/comfyui_pacchik_window",
+ "files": [
+ "https://github.com/pacchikAI/comfyui_pacchik_window"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple ComfyUI node that takes any window you have as an Input to ComfyUI node\nNOTE: WORKS IN WINDOWS ONLY[w/This nodepack has a feature that can retrieve your screen information remotely.]"
+ },
+ {
+ "author": "yamanacn",
+ "title": "ComfyUI-QwenVL3-image [WIP]",
+ "reference": "https://github.com/yamanacn/ComfyUI-QwenVL3-image",
+ "files": [
+ "https://github.com/yamanacn/ComfyUI-QwenVL3-image"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that integrates the Qwen3-VL-4B-Instruct-FP8 vision-language model for efficient image understanding and description.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "DeyanSrossturkhahov",
+ "title": "ComfyUI Primitive Mesh Generator [WIP]",
+ "reference": "https://github.com/rossturk/comfyui-primitive-mesh",
+ "files": [
+ "https://github.com/rossturk/comfyui-primitive-mesh"
+ ],
+ "install_type": "git-clone",
+ "description": "Image-to-vector art generator for ComfyUI - Convert photographs into artistic collages composed of geometric shapes using a greedy optimization algorithm.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "DeyanShahov",
+ "title": "Dynamic Prompt Selector for ComfyUI [WIP]",
+ "reference": "https://github.com/DeyanShahov/ComfyUI_RedFox",
+ "files": [
+ "https://github.com/DeyanShahov/ComfyUI_RedFox"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that allows you to dynamically select parts from large text prompts split by delimiters. The node supports 5 independent tabs (each like a mini-prompt selector), various selection behaviors, and persists state across ComfyUI restarts.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "addddd2",
+ "title": "AI_Generated_nodes",
+ "reference": "https://github.com/addddd2/AI_Generated_nodes",
+ "files": [
+ "https://github.com/addddd2/AI_Generated_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: ImageScaleToTotalPixelsRound64, ImageBlendLighter, ImageOffset, RGBtoRYGCBM, RYGCBMtoRGB, ExtractImageChannel, MatchRYGCBMColors, TextCommaToWeighted, TextCommaToRandomWeighted, RGBtoLAB, LABtoRGB, ImageMirrorPad, ImageCropBorders, ImageStitcher, ImageScaleToQwen, ..."
+ },
+ {
+ "author": "basenc",
+ "title": "ComfyUI Environment Variable Node [UNSAFE]",
+ "reference": "https://github.com/basenc/Comfyui-EnvVarNode",
+ "files": [
+ "https://github.com/basenc/Comfyui-EnvVarNode"
+ ],
+ "install_type": "git-clone",
+ "description": "Exposes environment variables inside ComfyUI workflows. Use it to keep API keys and other secrets out of your graph files while still wiring them into nodes that need them.[w/This nodepack has a vulnerability that allows reading arbitrary environment variables.]"
+ },
+ {
+ "author": "silveroxides",
+ "title": "Sampling Utility Toolkit",
+ "reference": "https://github.com/silveroxides/ComfyUI_SamplingUtils",
+ "files": [
+ "https://github.com/silveroxides/ComfyUI_SamplingUtils"
+ ],
+ "install_type": "git-clone",
+ "description": "Utilities making it easy to set up inference parameters."
+ },
+ {
+ "author": "henjicc",
+ "title": "ComfyUI-CC-ImageLoader [UNSAFE]",
+ "reference": "https://github.com/henjicc/ComfyUI-CC-ImageLoader",
+ "files": [
+ "https://github.com/henjicc/ComfyUI-CC-ImageLoader"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI-CC-ImageLoader is an enhanced image loading node designed for ComfyUI. It is developed based on two excellent projects: ComfyUI-Thumbnails and ComfyUI_Local_Media_Manager.[w/This nodepack includes an endpoint that access files from arbitrary paths.]"
+ },
+ {
+ "author": "A1rCHAN",
+ "title": "Eric's Prompt Enhancers for ComfyUI# Eric's Prompt Enhancers for ComfyUI",
+ "reference": "https://github.com/A1rCHAN/ComfyUI_A1rSpace",
+ "files": [
+ "https://github.com/A1rCHAN/ComfyUI_A1rSpace"
+ ],
+ "install_type": "git-clone",
+ "description": "A comfyui custom node package used by myself. "
+ },
+ {
+ "author": "franklydegenerate",
+ "title": "WAN Resolution Helper [WIP]",
+ "reference": "https://github.com/franklydegenerate/ComfyUI-WAN-Resolution-Helper",
+ "files": [
+ "https://github.com/franklydegenerate/ComfyUI-WAN-Resolution-Helper"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node that outputs WAN 2.2-ready sizes by preserving aspect ratio, capping the long side, and rounding both dimensions to multiples of 16 pixels to reduce artifacts.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "RM2-0",
+ "title": "ComfyUI-Upscale",
+ "reference": "https://github.com/RM2-0/ComfyUI-Upscale",
+ "files": [
+ "https://github.com/RM2-0/ComfyUI-Upscale"
+ ],
+ "install_type": "git-clone",
+ "description": "Efficient upscaling node with FP16 and batch processing support for ComfyUI"
+ },
+ {
+ "author": "light-and-ray",
+ "title": "Minimalistic-Comfy-Wrapper-WebUI",
+ "reference": "https://github.com/light-and-ray/Minimalistic-Comfy-Wrapper-WebUI",
+ "files": [
+ "https://github.com/light-and-ray/Minimalistic-Comfy-Wrapper-WebUI"
+ ],
+ "install_type": "git-clone",
+ "description": "An alternative additional non-node based UI for ComfyUI, that dynamically adapts to your workflows - you only need to change the titles of nodes that you want to see in the Minimalistic webui, and click 'Refresh' button"
+ },
+ {
+ "author": "bakker",
+ "title": "BK_Utils [WIP]",
+ "reference": "https://github.com/bakker/BK_Utils",
+ "files": [
+ "https://github.com/bakker/BK_Utils"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Same Pixel Resolution Calculator, .."
+ },
+ {
+ "author": "garciaone",
+ "title": "g_one_toolkit",
+ "reference": "https://github.com/garciaone/g_one_toolkit",
+ "files": [
+ "https://github.com/garciaone/g_one_toolkit"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of quality of life nodes"
+ },
+ {
+ "author": "banini1841",
+ "title": "BigModelPipe [WIP]",
+ "reference": "https://github.com/banini1841/BigModelPipe",
+ "files": [
+ "https://github.com/banini1841/BigModelPipe"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: BigModelPipeIn, BigModelPipeOut"
+ },
+ {
+ "author": "comfyui-wiki",
+ "title": "ComfyUI-SelectionFocus [WIP]",
+ "reference": "https://github.com/comfyui-wiki/ComfyUI-SelectionFocus",
+ "files": [
+ "https://github.com/comfyui-wiki/ComfyUI-SelectionFocus"
+ ],
+ "install_type": "git-clone",
+ "description": "A powerful ComfyUI extension that helps you focus on selected nodes by highlighting their connections while dimming or hiding unrelated links\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "pizurny",
+ "title": "ComfyUI Feedback Sampler [WIP]",
+ "reference": "https://github.com/pizurny/Comfyui-FeedbackSampler",
+ "files": [
+ "https://github.com/pizurny/Comfyui-FeedbackSampler"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI sampler for creating Deforum-style zoom animations through iterative feedback loop."
+ },
+ {
+ "author": "FlowX Team",
+ "title": "FlowX Preprocess [UNSAFE]",
+ "reference": "https://github.com/cgf120/comfyui-flowx-preprocess",
+ "files": [
+ "https://github.com/cgf120/comfyui-flowx-preprocess"
+ ],
+ "install_type": "git-clone",
+ "description": "FlowX Preprocess Node for ComfyUI - Export workflow configurations with input parameters[w/This nodepack includes an endpoint that deletes files from arbitrary paths.]"
+ },
+ {
+ "author": "jpwgad",
+ "title": "jpwgad",
+ "reference": "https://github.com/jpwgad/jpwgad-comfy",
+ "files": [
+ "https://github.com/jpwgad/jpwgad-comfy"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Image Size Input, Date/Time based output path"
+ },
+ {
+ "author": "octapus8085",
+ "title": "OpenAI-comfyui-O",
+ "reference": "https://github.com/octapus8085/OpenAI-comfyui-O",
+ "files": [
+ "https://github.com/octapus8085/OpenAI-comfyui-O"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: AI API → Image"
+ },
+ {
+ "author": "Immac",
+ "title": "Immac's Tools",
+ "reference": "https://github.com/Immac/ComfyUI-ImmacTools",
+ "files": [
+ "https://github.com/Immac/ComfyUI-ImmacTools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Concatenate Sigmas Node, Splice Sigmas At %"
+ },
+ {
+ "author": "silveroxides",
+ "title": "WIP Conditioning Toolkit [UNSAFE]",
+ "reference": "https://github.com/silveroxides/ComfyUI_CondsUtils",
+ "files": [
+ "https://github.com/silveroxides/ComfyUI_CondsUtils"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for modifying, saving and loading of various conditionings.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "ThuckMaBaws",
+ "title": "TMB Camera Modifier for ComfyUI [WIP]",
+ "reference": "https://github.com/ThuckMaBaws/TMB-Camera-Modifier",
+ "files": [
+ "https://github.com/ThuckMaBaws/TMB-Camera-Modifier"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node adds a powerful camera-based modifier system to ComfyUI, enabling rich, authentic prompt generation for image workflows. It’s designed for creators who want to simulate real-world camera setups, film types, and stylistic traits — all with flexible filtering and randomization.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "pfpb",
+ "title": "comfyui-badnodes",
+ "reference": "https://github.com/pfpb/comfyui-badnodes",
+ "files": [
+ "https://github.com/pfpb/comfyui-badnodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: ReplaceEmptyMasksWithLastMasks, ..."
+ },
+ {
+ "author": "isurulkh",
+ "title": "ComfyUI-Lovis-Node [WIP]",
+ "reference": "https://github.com/isurulkh/ComfyUI-Lovis-Node",
+ "files": [
+ "https://github.com/isurulkh/ComfyUI-Lovis-Node"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for text and audio processing in ComfyUI.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "doc",
+ "title": "doc-utils",
+ "reference": "https://github.com/doc-packages/comfyui-doc-utils",
+ "files": [
+ "https://github.com/doc-packages/comfyui-doc-utils"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: DOC_SaveImageAndAddToHistory, DOC_RandomPromptChoice"
+ },
+ {
+ "author": "Dehypnotic",
+ "title": "Save MP3 node for ComfyUI [UNSAFE]",
+ "reference": "https://github.com/Dehypnotic/comfyui-save-mp3",
+ "files": [
+ "https://github.com/Dehypnotic/comfyui-save-mp3"
+ ],
+ "install_type": "git-clone",
+ "description": "Simple, flexible MP3 saver with bitrate options and handy path/filename templates.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "obisin",
+ "title": "FSampler for ComfyUI — Fast Skips via Epsilon Extrapolation [WIP]",
+ "reference": "https://github.com/obisin/ComfyUI-FSampler",
+ "files": [
+ "https://github.com/obisin/ComfyUI-FSampler"
+ ],
+ "install_type": "git-clone",
+ "description": "FSampler is a training‑free, sampler‑agnostic acceleration layer for diffusion sampling that reduces model calls by predicting each step’s epsilon (noise) from recent real calls and feeding it into the existing integrator. It provides fixed history modes (h2/h3/h4) and an aggressive adaptive mode that, per step, builds two predictions (e.g., h3 vs h2), compares their predicted next states to get a relative error, and skips the model call when that error is below a hardcoded tolerance. Predicted epsilons are validated and scaled by a universal learning stabilizer L, skips are bounded by guard rails, and the sampler math (Euler, RES 2M/2S, DDIM, DPM++ 2M/2S, LMS) is unchanged.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "remhesneb",
+ "title": "comfyui-remote-media",
+ "reference": "https://github.com/remhesneb/comfyui-remote-media",
+ "files": [
+ "https://github.com/remhesneb/comfyui-remote-media"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load Image by URL, Load Video by URL"
+ },
+ {
+ "author": "takoyaki1118",
+ "title": "ComfyUI-Kakimoji-Layer",
+ "reference": "https://github.com/takoyaki1118/ComfyUI-Kakimoji-Layer",
+ "files": [
+ "https://github.com/takoyaki1118/ComfyUI-Kakimoji-Layer"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Kakimoji Editor (Live Preview)"
+ },
+ {
+ "author": "ethanfel",
+ "title": "ComfyUI-Mamad8 [WIP]",
+ "reference": "https://github.com/ethanfel/ComfyUI-Mamad8-QwenEdit-fix",
+ "files": [
+ "https://github.com/ethanfel/ComfyUI-Mamad8-QwenEdit-fix"
+ ],
+ "install_type": "git-clone",
+ "description": "Router nodes for optimized batch processing\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "wTechArtist",
+ "title": "ComfyUI-VVL-Tools",
+ "reference": "https://github.com/wTechArtist/ComfyUI-VVL-Tools",
+ "files": [
+ "https://github.com/wTechArtist/ComfyUI-VVL-Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: VVL For Loop Start (Async), VVL For Loop End (Async), VVL List Chunk (Async), VVL Batch Anything Dynamic, VVL Tensor List Preview, VVL JSON Object Deduplicator, ..."
+ },
+ {
+ "author": "Goldlionren",
+ "title": "ComfyUI-CleanSlate [WIP]",
+ "reference": "https://github.com/Goldlionren/ComfyUI-CleanSlate",
+ "files": [
+ "https://github.com/Goldlionren/ComfyUI-CleanSlate"
+ ],
+ "install_type": "git-clone",
+ "description": "CleanSlate: Post-Sample Cleanup — put it between Sampler and VAE Decode to free memory aggressively.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "systemaiofinterest-wq",
+ "title": "ComfyUI-GoogleFX",
+ "reference": "https://github.com/systemaiofinterest-wq/ComfyUI-GoogleFX",
+ "files": [
+ "https://github.com/systemaiofinterest-wq/ComfyUI-GoogleFX"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Google Imagen 3.5, Google Imagen R2I, Google Imagen Nano Banana x4"
+ },
+ {
+ "author": "alisson-anjos",
+ "title": "ComfyUI-Workarounds [WIP]",
+ "reference": "https://github.com/alisson-anjos/ComfyUI-Workarounds",
+ "files": [
+ "https://github.com/alisson-anjos/ComfyUI-Workarounds"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository provides practical ComfyUI nodes for fast, planar face overlay without non-linear warping, plus flexible region masks to transfer the full head (face + hair + eyebrows + eyes + nose + mouth) or any combination of regions. It also includes optional color matching and JSON diagnostics to integrate with downstream logic.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "adamdavidcole",
+ "title": "ComfyUI XY Video Plot Suite [WIP]",
+ "reference": "https://github.com/adamdavidcole/comfyui-video-xy-plot",
+ "files": [
+ "https://github.com/adamdavidcole/comfyui-video-xy-plot"
+ ],
+ "install_type": "git-clone",
+ "description": "A suite of ComfyUI nodes for generating parameter sweep video matrices with labeled grids. Create comprehensive visual comparisons of how different parameter combinations affect your video generation results.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "clubmate",
+ "title": "comfyui-boll-nodes",
+ "reference": "https://github.com/clubmate/comfyui-boll-nodes",
+ "files": [
+ "https://github.com/clubmate/comfyui-boll-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Get Last Image, Remove Last Image, WAN Config"
+ },
+ {
+ "author": "vunguyen-oss",
+ "title": "ComfyUI-ccsrv2 [WIP]",
+ "reference": "https://github.com/vunguyen-oss/ComfyUI-ccsrv2",
+ "files": [
+ "https://github.com/vunguyen-oss/ComfyUI-ccsrv2"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CCSR Upscale"
+ },
+ {
+ "author": "kesslerdev",
+ "title": "kesslerdev_comfyui_nodes [WIP/UNSAFE]",
+ "reference": "https://github.com/kesslerdev/kesslerdev_comfyui_nodes",
+ "files": [
+ "https://github.com/kesslerdev/kesslerdev_comfyui_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: S3 Upload File, File Explorer, Save Image Export Path, Save Video Export Path, Save Audio Export Path, S3 Combine Images to Video, Multi-Line Text Input, ...\nNOTE: The files in the repo are not organized.[w/This extension has a vulnerability that allows arbitrary access to local files from remote.]"
+ },
+ {
+ "author": "kesslerdev",
+ "title": "Comfyui : kesslerdev_comfyui_nodes [UNSAFE]",
+ "reference": "https://github.com/kesslerdev/kesslerdev_comfyui_nodes",
+ "files": [
+ "https://github.com/kesslerdev/kesslerdev_comfyui_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Multiline Text Choice (Kesslerdev), Environment Variable Getter (Kesslerdev)[w/This nodepack includes a node that can remotely read arbitrary environment variables.]"
+ },
+ {
+ "author": "panchovial-max",
+ "title": "ComfyUI-ListHelper [NAME CONFLICT]",
+ "reference": "https://github.com/panchovial-max/ComfyUI-ListHelper",
+ "files": [
+ "https://github.com/panchovial-max/ComfyUI-ListHelper"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI that provides enhanced list manipulation and AI integration capabilities."
+ },
+ {
+ "author": "Eric7758",
+ "title": "ComfyUI-IAT [WIP]",
+ "reference": "https://github.com/Eric7758/ComfyUI-IAT",
+ "files": [
+ "https://github.com/Eric7758/ComfyUI-IAT"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI plugin for image & text utilities with Qwen translator and prompt optimizer\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "NeuroWaifu",
+ "title": "ComfyUI.Node.MediaSuite",
+ "reference": "https://github.com/NeuroWaifu/ComfyUI.Node.MediaSuite",
+ "files": [
+ "https://github.com/NeuroWaifu/ComfyUI.Node.MediaSuite"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Image Resize, Video Resize, Resize Calculator, Mask Operations, Mask Blur, Mask Threshold, Dominant Color, Color Palette, Shadows/Highlights/Midtones, Tone Curve, Color Grading, Upscale Video (using Model), Get Video Size, Get Video Info, Compare Video Size, Math Operation, Math Function, Boolean Logic, Compare Numbers, Convert Number, Random Number, Clamp, Remap, Smooth, Constants, ..."
+ },
+ {
+ "author": "BizaNator",
+ "title": "BrainDead_QwenCharacterEditor [WIP]",
+ "reference": "https://github.com/BizaNator/BrainDead_QwenCharacterEditor",
+ "files": [
+ "https://github.com/BizaNator/BrainDead_QwenCharacterEditor"
+ ],
+ "install_type": "git-clone",
+ "description": "Created by BizaNator for the BrainDeadGuild community. These professional-grade character editing tools for ComfyUI specialize in identity preservation and multi-reference image control.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "sk-palani",
+ "title": "ComfyUI_Simpler",
+ "reference": "https://github.com/sk-palani/ComfyUI_Simpler",
+ "files": [
+ "https://github.com/sk-palani/ComfyUI_Simpler"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository contains custom nodes designed for the ComfyUI framework, focusing on simplification improvements. These nodes aim to make tasks easier and simple"
+ },
+ {
+ "author": "SushantSingh-23-01",
+ "title": "comfyui_flowrider_nodes [UNSAFE]",
+ "reference": "https://github.com/SushantSingh-23-01/comfyui_flowrider_nodes",
+ "files": [
+ "https://github.com/SushantSingh-23-01/comfyui_flowrider_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Collection of nodes performing random utility functions like: JPG Saver - Save images in jpg format. Resolution Selector - Selects from standard resolutions with aspect ratios.[w/This extension has a vulnerability that allows arbitrary access to local files from remote.]"
+ },
+ {
+ "author": "YokoYokoTEC",
+ "title": "comfyui-sequential-prompt-file [UNSAFE]",
+ "reference": "https://github.com/YokoYokoTEC/comfyui-sequential-prompt-file",
+ "files": [
+ "https://github.com/YokoYokoTEC/comfyui-sequential-prompt-file"
+ ],
+ "install_type": "git-clone",
+ "description": "This is the file-based version of comfyui-sequential-prompt. For detailed usage instructions, please refer to the following link: [a/https://note.com/alive_gibbon2712/n/n0eb671383b30](https://note.com/alive_gibbon2712/n/n0eb671383b30)[w/This extension has a vulnerability that allows arbitrary access to local files from remote.]"
+ },
+ {
+ "author": "YokoYokoTEC",
+ "title": "ComfyUI Batch Sequence Node [UNSAFE]",
+ "reference": "https://github.com/YokoYokoTEC/comfyui-batch-sequence",
+ "files": [
+ "https://github.com/YokoYokoTEC/comfyui-batch-sequence"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node is a toolkit designed to help you run batch processing (such as sequential image generation) more smoothly in ComfyUI.[w/This extension has a vulnerability that allows arbitrary access to local files from remote.]"
+ },
+ {
+ "author": "kaski23",
+ "title": "Kaskis_Comfy_Nodes",
+ "reference": "https://github.com/kaski23/Kaskis_Comfy_Nodes",
+ "files": [
+ "https://github.com/kaski23/Kaskis_Comfy_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load Image (with Filename), Load Video (with Filename), String Split & Select, Int → String, Pair Switch, Unbroken-Video-Handler, Unbroken-Controlvideo-Handler, ..."
+ },
+ {
+ "author": "asaddi",
+ "title": "Allan's ComfyUI nodes",
+ "reference": "https://github.com/asaddi/allans-comfy-nodes",
+ "files": [
+ "https://github.com/asaddi/allans-comfy-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Parameter Experimentation, Lists, Image Utilities, Utilities, Buses (Combiners/Splitters), Prompting, Switches, Tabular Data, Debugging, Third-Party Models"
+ },
+ {
+ "author": "Suzu008",
+ "title": "ComfyUI-TTYd",
+ "reference": "https://github.com/Suzu008/ComfyUI-TTYd",
+ "files": [
+ "https://github.com/Suzu008/ComfyUI-TTYd"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI extension for web-based terminal access via side panel"
+ },
+ {
+ "author": "Mets3D",
+ "title": "Mets-Nodes",
+ "reference": "https://github.com/Mets3D/mets-nodes",
+ "files": [
+ "https://github.com/Mets3D/mets-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Random nodes for now, may split them out later into properly maintained repos."
+ },
+ {
+ "author": "downlifted",
+ "title": "ComfyUI_GroqPrompt [WIP]",
+ "reference": "https://github.com/downlifted/ComfyUI_GroqPrompt",
+ "files": [
+ "https://github.com/downlifted/ComfyUI_GroqPrompt"
+ ],
+ "install_type": "git-clone",
+ "description": " Groq API Access in ComfyUI, Free Prompt Creation!\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI-WanAnimatePreprocess [WIP]",
+ "reference": "https://github.com/kijai/ComfyUI-WanAnimatePreprocess",
+ "files": [
+ "https://github.com/kijai/ComfyUI-WanAnimatePreprocess"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for WanAnimate model input preprocessing"
+ },
+ {
+ "author": "charlie-otoy",
+ "title": "ComfyUI-otoySKW-SystemMetrics",
+ "reference": "https://github.com/charlie-otoy/ComfyUI-otoySKW-SystemMetrics",
+ "files": [
+ "https://github.com/charlie-otoy/ComfyUI-otoySKW-SystemMetrics"
+ ],
+ "install_type": "git-clone",
+ "description": "System monitoring API endpoints for ComfyUI by otoy SKW"
+ },
+ {
+ "author": "lihaoyun6",
+ "title": "ComfyUI-lhyNodes",
+ "reference": "https://github.com/lihaoyun6/ComfyUI-lhyNodes",
+ "files": [
+ "https://github.com/lihaoyun6/ComfyUI-lhyNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Mask to SAM2Coordinates, String Format, String Format (Advanced), CSV RandomPicker, CSV RandomPicker (Advanced)"
+ },
+ {
+ "author": "orion4d",
+ "title": "Orion4D MasterPrompt Suite for ComfyUI [UNSAFE]",
+ "reference": "https://github.com/orion4d/Orion4D_MasterPrompt",
+ "files": [
+ "https://github.com/orion4d/Orion4D_MasterPrompt"
+ ],
+ "install_type": "git-clone",
+ "description": "Welcome to the MasterPrompt suite, a collection of custom nodes for ComfyUI designed to supercharge your text, list, and JSON manipulation workflows. Whether you need to dynamically load styles from files, mix concepts with weighted probabilities, format complex prompts, or handle JSON data, this suite provides the necessary tools with intuitive and powerful user interfaces. As a bonus I have included a basic pack of thematic lists generated with gpt5, have fun![w/This extension has a vulnerability that allows arbitrary access to local files from remote.]"
+ },
+ {
+ "author": "adigayung",
+ "title": "comfyui_PlutoNode",
+ "reference": "https://github.com/adigayung/comfyui_PlutoNode",
+ "files": [
+ "https://github.com/adigayung/comfyui_PlutoNode"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: 'Pluto : Auto Crop Faces', 'Pluto : Composite Image', 'Pluto : Float Math', 'Pluto : GetSizeFromImage', 'Pluto : Text Append', ..."
+ },
+ {
+ "author": "lu64k",
+ "title": "ks_nodes",
+ "reference": "https://github.com/lu64k/ks_nodes",
+ "files": [
+ "https://github.com/lu64k/ks_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: KS Text_String, KS Random File Name, KS Save Text, KS load text, KS get time int, KS json float range filter, KS json array constrains filter, KS json key replace, KS json value eliminator, KS json extract key and value, KS json key random, KS Json Count, KS Word Frequency Statistics, KS Load Images From Folder KS, KS Json To String, KS JsonlReader, KS JsonKeyReplacer, KS JsonKeyExtractor, KS_merge_json_node, KS_make_json_node, KS_qwen_image_api, KS_any_payload_image, KS JsonlFolderMatchReader, KS_image_metadata_node"
+ },
+ {
+ "author": "DavidJBarnes",
+ "title": "comfyui-djb-utils",
+ "reference": "https://github.com/DavidJBarnes/comfyui-djb-utils",
+ "files": [
+ "https://github.com/DavidJBarnes/comfyui-djb-utils"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Working Filename Extractor, Direct Image Filename Input"
+ },
+ {
+ "author": "husw725",
+ "title": "comfyui_alta_nodes",
+ "reference": "https://github.com/husw725/comfyui_alta_nodes",
+ "files": [
+ "https://github.com/husw725/comfyui_alta_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: 'Alta:SaveImagePlus', 'Alta:LoadImagesPath', 'Alta:LoadVideoPath', 'Alta:LoadVideosFromFolder', 'Alta:VideoCombine', ..."
+ },
+ {
+ "author": "LukeCoulson1",
+ "title": "comfyui-sundryutils",
+ "reference": "https://github.com/orpheus-gaze/comfyui-sundryutils",
+ "files": [
+ "https://github.com/orpheus-gaze/comfyui-sundryutils"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: 'Return DateString', 'Sharpen, RealGrain & Autocontrast', 'Apply HaldClut'"
+ },
+ {
+ "author": "dcduanchao",
+ "title": "comfyui_video_http",
+ "reference": "https://github.com/dcduanchao/comfyui_video_http",
+ "files": [
+ "https://github.com/dcduanchao/comfyui_video_http"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Video Upload Node"
+ },
+ {
+ "author": "AIGCZero",
+ "title": "AIGCZero-comfyui-Qwen_edit-zero",
+ "reference": "https://github.com/AIGCZero/AIGCZero-comfyui-Qwen_edit-zero",
+ "files": [
+ "https://github.com/AIGCZero/AIGCZero-comfyui-Qwen_edit-zero"
+ ],
+ "install_type": "git-clone",
+ "description": "A node that resolves the pixel offset issue in Qwen_edit."
+ },
+ {
+ "author": "SlackinJack",
+ "title": "multigpu_diffusion_comfyui",
+ "reference": "https://github.com/SlackinJack/multigpu_diffusion_comfyui",
+ "files": [
+ "https://github.com/SlackinJack/multigpu_diffusion_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: GGUFSelector, CheckpointSelector, SchedulerSelector, LoraSelector, MultiLoraJoiner, VAESelector, MotionModuleSelector, MotionAdapterSelector, MotionAdapterLoraSelector, ControlNetSelector, IPAdapterSelector, EncodePromptWithCompel, HostConfig, AsyncDiffConfig, AsyncDiffADSampler, AsyncDiffSDSampler, AsyncDiffSDUpscaleSampler, AsyncDiffSVDSampler, DistrifuserConfig, DistrifuserSDSampler, xDiTConfig, xDiTSampler, xDiTUSPConfig, xDiTUSPImageSampler, xDiTUSPVideoSampler"
+ },
+ {
+ "author": "dmitry-guskov",
+ "title": "ComfyUI_light_image_ops",
+ "reference": "https://github.com/dmitry-guskov/ComfyUI_light_image_ops",
+ "files": [
+ "https://github.com/dmitry-guskov/ComfyUI_light_image_ops"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Light Scale to Side, Light Batch to List, Light List to Batch, Wan Latents Resize To Size, Wan Embeds Resize Spatial (Packed), Wan Latents Resize + Normalize + Noise"
+ },
+ {
+ "author": "78Ventures",
+ "title": "ComfyUI-Tortu [WIP/UNSAFE]",
+ "reference": "https://github.com/78Ventures/ComfyUI-Tortu",
+ "files": [
+ "https://github.com/78Ventures/ComfyUI-Tortu"
+ ],
+ "install_type": "git-clone",
+ "description": "Opinionated custom nodes and ready-to-use workflows for dataset prep and portrait/headshot pipelines in ComfyUI.\nNOTE: The files in the repo are not organized.[w/This extension has a vulnerability that allows arbitrary access to local files from remote.]"
+ },
+ {
+ "author": "ches2010",
+ "title": "comfyui_aliyundrive_uploader",
+ "reference": "https://github.com/ches2010/comfyui_aliyundrive_uploader",
+ "files": [
+ "https://github.com/ches2010/comfyui_aliyundrive_uploader"
+ ],
+ "install_type": "git-clone",
+ "description": "comfyui_aliyundrive_uploader"
+ },
+ {
+ "author": "CooperCorona",
+ "title": "comfy-auto-unload",
+ "reference": "https://github.com/CooperCorona/comfy-auto-unload",
+ "files": [
+ "https://github.com/CooperCorona/comfy-auto-unload"
+ ],
+ "install_type": "git-clone",
+ "description": "unloads models from VRAM in comfyui after a set period of time"
+ },
+ {
+ "author": "polygoningenieur",
+ "title": "ComfyUI-Diffusion-SDXL-Video",
+ "reference": "https://github.com/Polygoningenieur/ComfyUI-Diffusion-SDXL-Video",
+ "files": [
+ "https://github.com/Polygoningenieur/ComfyUI-Diffusion-SDXL-Video"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node for a frame by frame Diffusion."
+ },
+ {
+ "author": "ric-y",
+ "title": "ComfyUI Datadog Monitor [WIP]",
+ "reference": "https://github.com/ric-yu/comfyui-datadog-monitor",
+ "files": [
+ "https://github.com/ric-yu/comfyui-datadog-monitor"
+ ],
+ "install_type": "git-clone",
+ "description": "Minimal custom node that enables comprehensive Datadog APM tracing and profiling for ComfyUI.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "synchronicity-labs",
+ "title": "ComfyUI Sync Lipsync Node",
+ "reference": "https://github.com/synchronicity-labs/sync-comfyui",
+ "files": [
+ "https://github.com/synchronicity-labs/sync-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: WanVideo T5 Apply Soft Prefix"
+ },
+ {
+ "author": "NSFW-API",
+ "title": "ComfyUI-WanSoftPrefix",
+ "reference": "https://github.com/NSFW-API/ComfyUI-WanSoftPrefix",
+ "files": [
+ "https://github.com/NSFW-API/ComfyUI-WanSoftPrefix"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Resize Frame, Pad Batch to 4n+1, Trim Padded Batch, Get Image Dimensions, Slot Frame, ..."
+ },
+ {
+ "author": "rishipandey125",
+ "title": "ComfyUI-StyleFrame-Nodes",
+ "reference": "https://github.com/rishipandey125/ComfyUI-StyleFrame-Nodes",
+ "files": [
+ "https://github.com/rishipandey125/ComfyUI-StyleFrame-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Resize Frame, Pad Batch to 4n+1, Trim Padded Batch, Get Image Dimensions, Slot Frame, ..."
+ },
+ {
+ "author": "nicolabergamascahkimkoohi",
+ "title": "ComfyUI-OSS-Upload [UNSAFE]",
+ "reference": "https://github.com/ahkimkoo/ComfyUI-OSS-Upload",
+ "files": [
+ "https://github.com/ahkimkoo/ComfyUI-OSS-Upload"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI plugin for uploading generated images and videos to Alibaba Cloud OSS (Object Storage Service).[w/This extension has a vulnerability that allows arbitrary access to local files from remote.]"
+ },
+ {
+ "author": "threecrowco",
+ "title": "ComfyUI-FlowMatchScheduler [WIP]",
+ "reference": "https://github.com/threecrowco/ComfyUI-FlowMatchScheduler",
+ "files": [
+ "https://github.com/threecrowco/ComfyUI-FlowMatchScheduler"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: FlowMatch → SIGMAS\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "NimbleWing",
+ "title": "ComfyUI-NW",
+ "reference": "https://github.com/NimbleWing/ComfyUI-NW",
+ "files": [
+ "https://github.com/NimbleWing/ComfyUI-NW"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node for a frame by frame Diffusion."
+ },
+ {
+ "author": "tfernd",
+ "title": "Auto CPU Offload for ComfyUI [WIP]",
+ "reference": "https://github.com/tfernd/ComfyUI-AutoCPUOffload",
+ "files": [
+ "https://github.com/tfernd/ComfyUI-AutoCPUOffload"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension introduces an 'Auto CPU Offload' node designed to reduce GPU VRAM usage by automatically offloading model components to the CPU. It intelligently manages the movement of model layers between the GPU and CPU, aiming to keep only the necessary parts in VRAM during inference."
+ },
+ {
+ "author": "hujuying",
+ "title": "comfyui_gemini_banana_api [WIP]",
+ "reference": "https://github.com/hujuying/comfyui_gemini_banana_api",
+ "files": [
+ "https://github.com/hujuying/comfyui_gemini_banana_api"
+ ],
+ "install_type": "git-clone",
+ "description": "A powerful ComfyUI plugin that supports image editing and generation using the Gemini API, featuring multiple API key rotation and secure storage.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "pft-ChenKu",
+ "title": "ComfyUI_system-dev [WIP]",
+ "reference": "https://github.com/pft-ChenKu/ComfyUI_system-dev",
+ "files": [
+ "https://github.com/pft-ChenKu/ComfyUI_system-dev"
+ ],
+ "install_type": "git-clone",
+ "description": "Collect Vram ram and Time\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "z604159435g",
+ "title": "comfyui_random_prompt_plugin [WIP]",
+ "reference": "https://github.com/z604159435g/comfyui_random_prompt_plugin",
+ "files": [
+ "https://github.com/z604159435g/comfyui_random_prompt_plugin"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI natural language prompt plugin specifically designed for generating realistic photos of Caucasian women. Completely restructured to produce smooth natural language paragraphs instead of CLIP-style formatting.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "edisonchan",
+ "title": "ComfyUI-Sysinfo",
+ "reference": "https://github.com/edisonchan/ComfyUI-Sysinfo",
+ "files": [
+ "https://github.com/edisonchan/ComfyUI-Sysinfo"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple ComfyUI custom node for checking system CUDA information and the PyTorch version."
+ },
+ {
+ "author": "Goldlionren",
+ "title": "comfyui-spawner-schedulers",
+ "reference": "https://github.com/spawner1145/comfyui-spawner-schedulers",
+ "files": [
+ "https://github.com/spawner1145/comfyui-spawner-schedulers"
+ ],
+ "install_type": "git-clone",
+ "description": "This plugin provides additional scheduler options for ComfyUI. Currently, it includes a smooth scheduler designed to optimize the quality and consistency of generated images."
+ },
+ {
+ "author": "nicolabergamaschi",
+ "title": "ComfyUI_XLweb [UNSAFE]",
+ "reference": "https://github.com/853587221/ComfyUI_XLweb",
+ "files": [
+ "https://github.com/853587221/ComfyUI_XLweb"
+ ],
+ "install_type": "git-clone",
+ "description": "An elegant web frontend for ComfyUI that simplifies complex node workflows.[w/This extension has a vulnerability that allows arbitrary access to local files from remote.]"
+ },
+ {
+ "author": "nicolabergamaschi",
+ "title": "ComfyUI-Dynamic-Lora-Loader",
+ "reference": "https://github.com/BARKEM-JC/ComfyUI-Dynamic-Lora-Loader",
+ "files": [
+ "https://github.com/BARKEM-JC/ComfyUI-Dynamic-Lora-Loader"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple dynamic lora loader, supports hundreds of loras at once by loading on demand and automatically adjusting weights + prompt injection."
+ },
+ {
+ "author": "kuailefengnan2024",
+ "title": "Comfyui_Layer",
+ "reference": "https://github.com/kuailefengnan2024/Comfyui_Layer",
+ "files": [
+ "https://github.com/kuailefengnan2024/Comfyui_Layer"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Vision API Node"
+ },
+ {
+ "author": "tony-zn",
+ "title": "comfyui-zn-pycode [UNSAFE]",
+ "id": "comfyui-zn-pycode",
+ "reference": "https://github.com/tony-zn/comfyui-zn-pycode",
+ "files": [
+ "https://github.com/tony-zn/comfyui-zn-pycode"
+ ],
+ "install_type": "git-clone",
+ "description": "This node allows you to run custom Python code for flexible data handling. It supports up to 20 input parameters and 20 output results, with unused slots automatically showing or hiding based on whether the parameter and result slots are connected."
+ },
+ {
+ "author": "Solankimayursinh",
+ "title": "PMSnodes [WIP]",
+ "reference": "https://github.com/Solankimayursinh/PMSnodes",
+ "files": [
+ "https://github.com/Solankimayursinh/PMSnodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom nodes for ComfyUI to Load audio in Base64 format and Send Audio to Websocket in Base64 Format for creating API of Audio related AI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "vasilmitov",
+ "title": "ComfyUI-SeedSnapShotManager [WIP]",
+ "reference": "https://github.com/vasilmitov/ComfyUI-SeedSnapShotManager",
+ "files": [
+ "https://github.com/vasilmitov/ComfyUI-SeedSnapShotManager"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node for saving and restoring random seeds. Useful for workflow reproducibility, experimentation, and quickly trying different variations.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Juste-Leo2",
+ "title": "ComfyUI-Arduino [WIP]",
+ "reference": "https://github.com/Juste-Leo2/ComfyUI-Arduino",
+ "files": [
+ "https://github.com/Juste-Leo2/ComfyUI-Arduino"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI-Arduino aims to bridge the gap between ComfyUI's powerful generative AI workflows and the physical world through Arduino. This project allows you to design, code, and interact with Arduino boards directly from your ComfyUI nodes, opening up possibilities for AI-driven robotics, physical generative art, interactive installations, and more."
+ },
+ {
+ "author": "Nienai666",
+ "title": "ComfyUI-NanoBanana-ImageGenerator",
+ "reference": "https://github.com/Nienai666/comfyui-encrypt-image-main",
+ "files": [
+ "https://github.com/Nienai666/comfyui-encrypt-image-main"
+ ],
+ "install_type": "git-clone",
+ "description": "This is an image encryption extension for ComfyUI. If you load this extension, images will be stored in an encrypted form and cannot be previewed normally."
+ },
+ {
+ "author": "Madygnomo",
+ "title": "ComfyUI-NanoBanana-ImageGenerator",
+ "reference": "https://github.com/Madygnomo/ComfyUI-NanoBanana-ImageGenerator",
+ "files": [
+ "https://github.com/Madygnomo/ComfyUI-NanoBanana-ImageGenerator"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: NanoBanana Image Generator"
+ },
+ {
+ "author": "jerryname2022",
+ "title": "MegaTTS 3 [WIP]",
+ "reference": "https://github.com/jerryname2022/ComfyUI-MegaTTS3",
+ "files": [
+ "https://github.com/jerryname2022/ComfyUI-MegaTTS3"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: MegaTTS3 Model Loader, MegaTTS3 Zero Shot, Text Editor\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "punicfaith",
+ "title": "ComfyUI-GoogleAIStudio",
+ "reference": "https://github.com/punicfaith/ComfyUI-GoogleAIStudio",
+ "files": [
+ "https://github.com/punicfaith/ComfyUI-GoogleAIStudio"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Google Gemini Prompt"
+ },
+ {
+ "author": "numq",
+ "title": "comfyui-camera-capture-node",
+ "reference": "https://github.com/numq/comfyui-camera-capture-node",
+ "files": [
+ "https://github.com/numq/comfyui-camera-capture-node"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Camera Capture"
+ },
+ {
+ "author": "maoper11",
+ "title": "ComfyUI_Inteliweb_nodes",
+ "reference": "https://github.com/maoper11/comfyui_inteliweb_nodes",
+ "files": [
+ "https://github.com/maoper11/comfyui_inteliweb_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "System Check (Inteliweb): RAM/VRAM live, Free RAM/VRAM buttons, Py Libs. + Photopea Editor integration (menu contextual)."
+ },
+ {
+ "author": "casterpollux",
+ "title": "ComfyUI Affine Transform Mapper [WIP]",
+ "reference": "https://github.com/GuardSkill/ComfyUI-AffineImage",
+ "files": [
+ "https://github.com/GuardSkill/ComfyUI-AffineImage"
+ ],
+ "install_type": "git-clone",
+ "description": "Insert one image into specific location on another image by affine transform.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "casterpollux",
+ "title": "ComfyUI USO Custom Node [WIP]",
+ "reference": "https://github.com/casterpollux/ComfyUI-USO",
+ "files": [
+ "https://github.com/casterpollux/ComfyUI-USO"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node implementation of ByteDance's USO (Unified Style and Subject-Driven Generation) model, which enables advanced style transfer and subject preservation using FLUX.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "numq",
+ "title": "comfyui-camera-capture-node",
+ "reference": "https://github.com/numq/comfyui-camera-capture-node",
+ "files": [
+ "https://github.com/numq/comfyui-camera-capture-node"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Camera Capture"
+ },
+ {
+ "author": "pickles",
+ "title": "PyPromptGenerator [UNSAFE]",
+ "reference": "https://github.com/pickles/ComfyUI-PyPromptGenerator",
+ "files": [
+ "https://github.com/pickles/ComfyUI-PyPromptGenerator"
+ ],
+ "install_type": "git-clone",
+ "description": "Generate positve/negative prompt via python script. [w/This node allows you to execute arbitrary code via the workflow.]"
+ },
+ {
+ "author": "bmgjet",
+ "title": "ComfyUI GPU Power Limit Node",
+ "reference": "https://github.com/bmgjet/comfyui-powerlimit",
+ "files": [
+ "https://github.com/bmgjet/comfyui-powerlimit"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node to change NVIDIA GPU power limits dynamically while passing through any input. NOTE: Windows only.[w/This node warns if ComfyUI is not running as administrator/root — it does not attempt to elevate the process.]"
+ },
+ {
+ "author": "Karlmeister",
+ "title": "comfyui-karlmeister-nodes-suit",
+ "reference": "https://github.com/Karlmeister/comfyui-karlmeister-nodes-suit",
+ "files": [
+ "https://github.com/Karlmeister/comfyui-karlmeister-nodes-suit"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Seed with Filename Generator, KSampler Config Selector, KSampler Config Selector With Tuple Output, KSampler Config Tuple, Text Concatenator, A If Not None., Split a string. "
+ },
+ {
+ "author": "ServiceStack",
+ "title": "classifier-agent",
+ "reference": "https://github.com/ServiceStack/classifier-agent",
+ "files": [
+ "https://github.com/ServiceStack/classifier-agent"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Classifiy Image, Classifiy Audio"
+ },
+ {
+ "author": "elfatherbrown",
+ "title": "Real-CUGAN ComfyUI Custom Node [WIP]",
+ "reference": "https://github.com/elfatherbrown/comfyui-realcugan-node",
+ "files": [
+ "https://github.com/elfatherbrown/comfyui-realcugan-node"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node implementation for Real-CUGAN anime/illustration upscaling models from Bilibili's AI Lab.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "sthao42",
+ "title": "ComfyUI Melodkeet TTS",
+ "reference": "https://github.com/sthao42/comfyui-melodkeet-tts",
+ "files": [
+ "https://github.com/sthao42/comfyui-melodkeet-tts"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that provides a simple and direct way to use OpenAI-compatible Text-to-Speech (TTS) services."
+ },
+ {
+ "author": "Jairodaniel-17",
+ "title": "ComfyUI-traductor-offline",
+ "reference": "https://github.com/Jairodaniel-17/ComfyUI-traductor-offline",
+ "files": [
+ "https://github.com/Jairodaniel-17/ComfyUI-traductor-offline"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Traductor: CLIP Texto (EN↔ES), Traductor: Prompt Texto (EN↔ES)"
+ },
+ {
+ "author": "aesethtics",
+ "title": "ComfyUI-OpenPoser [WIP]",
+ "reference": "https://github.com/aesethtics/ComfyUI-OpenPoser",
+ "files": [
+ "https://github.com/aesethtics/ComfyUI-OpenPoser"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI-OpenPoser is a custom node extension for ComfyUI that provides an interactive pose editor.\nIt allows you to freely define 18 OpenPose-style keypoints (joints) directly in the ComfyUI front-end without bone-length constraints! The node generates an image tensor representing the skeleton that can be passed to models which support OpenPose/DWPose/etc input."
+ },
+ {
+ "author": "dead-matrix",
+ "title": "ComfyUI-RMBG-Custom",
+ "reference": "https://github.com/dead-matrix/ComfyUI-RMBG-Custom",
+ "files": [
+ "https://github.com/dead-matrix/ComfyUI-RMBG-Custom"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: RMBG Custom"
+ },
+ {
+ "author": "gmammolo",
+ "title": "comfyui-gmammolo",
+ "reference": "https://github.com/gmammolo/comfyui-gmammolo",
+ "files": [
+ "https://github.com/gmammolo/comfyui-gmammolo"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Simple Textbox, Filter Text Prompt, Check Image Generation"
+ },
+ {
+ "author": "543872524",
+ "title": "ComfyUI_crdong",
+ "reference": "https://github.com/543872524/ComfyUI_crdong",
+ "files": [
+ "https://github.com/543872524/ComfyUI_crdong"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: INT Constant, Simple Int Math Handle, Simple Json Array Handle, Simple Json Object Handle, Select Image Size, Video Time & FPS, Video Frame Size, Wan22 Step Handle, Prompt Selector String, Prompt Example Node, Prompt Join or List, Prompt List, CRD Audio Length Node, ..."
+ },
+ {
+ "author": "Saganaki22",
+ "title": "ComfyUI YTDL Nodes [WIP]",
+ "reference": "https://github.com/Saganaki22/ComfyUI-ytdl_nodes",
+ "files": [
+ "https://github.com/Saganaki22/ComfyUI-ytdl_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes for downloading, converting, and previewing audio/video from YouTube and 1,000+ other platforms"
+ },
+ {
+ "author": "comfyscript",
+ "title": "ComfyUI-CloudClient",
+ "reference": "https://github.com/comfyscript/ComfyUI-CloudClient",
+ "files": [
+ "https://github.com/comfyscript/ComfyUI-CloudClient"
+ ],
+ "install_type": "git-clone",
+ "description": "Design to Easily Remote Operate ComfyUI in the Cloud"
+ },
+ {
+ "author": "RobbertB80",
+ "title": "ComfyUI SharePoint/OneDrive Upload Node [UNSAFE]",
+ "reference": "https://github.com/RobbertB80/ComfyUI-SharePoint-Upload",
+ "files": [
+ "https://github.com/RobbertB80/ComfyUI-SharePoint-Upload"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that automatically uploads generated images to SharePoint or OneDrive document libraries.[w/This nodepack contains a node that can write files to an arbitrary path.]"
+ },
+ {
+ "author": "KoinnAI",
+ "title": "ComfyUI Dynamic Prompting Simplified [WIP]",
+ "reference": "https://github.com/KoinnAI/ComfyUI-DynPromptSimplified",
+ "files": [
+ "https://github.com/KoinnAI/ComfyUI-DynPromptSimplified"
+ ],
+ "install_type": "git-clone",
+ "description": "A minimal dynamic prompting + mirrored wildcards node for ComfyUI.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "jtrue",
+ "title": "MaskTools",
+ "reference": "https://github.com/jtrue/ComfyUI-MaskTools",
+ "files": [
+ "https://github.com/jtrue/ComfyUI-MaskTools"
+ ],
+ "install_type": "git-clone",
+ "description": "Pixel-selection tools (masks) for ComfyUI — modular."
+ },
+ {
+ "author": "nadushu",
+ "title": "comfyui-handy-nodes [UNSAFE]",
+ "reference": "https://github.com/nadushu/comfyui-handy-nodes",
+ "files": [
+ "https://github.com/nadushu/comfyui-handy-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Empty Random Latent Image, Filename Prompt Extractor, My Image Save, Queue Batch Fixed Seed, Text Cleaner, Text Splitter[w/This nodepack contains a node that can write files to an arbitrary path.]"
+ },
+ {
+ "author": "borisfaley",
+ "title": "ComfyUI-ACES-EXR-OCIOr [UNSAFE]",
+ "reference": "https://github.com/borisfaley/ComfyUI-ACES-EXR-OCIO",
+ "files": [
+ "https://github.com/borisfaley/ComfyUI-ACES-EXR-OCIO"
+ ],
+ "install_type": "git-clone",
+ "description": "Save images and videos in ACESCg or ACES-2065-1[w/This nodepack contains a node that can write files to an arbitrary path.]"
+ },
+ {
+ "author": "NSFW-API",
+ "title": "ComfyUI-Embedding-Delta-Adapter",
+ "reference": "https://github.com/NSFW-API/ComfyUI-Embedding-Delta-Adapter",
+ "files": [
+ "https://github.com/NSFW-API/ComfyUI-Embedding-Delta-Adapter"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load EmbDelta Adapter, Apply EmbDelta (WAN TextEmbeds)"
+ },
+ {
+ "author": "clcimir",
+ "title": "FileTo64",
+ "reference": "https://github.com/clcimir/FileTo64",
+ "files": [
+ "https://github.com/clcimir/FileTo64"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI FileTo64"
+ },
+ {
+ "author": "LittleTechPomp",
+ "title": "comfyui-pixxio",
+ "reference": "https://github.com/LittleTechPomp/comfyui-pixxio",
+ "files": [
+ "https://github.com/LittleTechPomp/comfyui-pixxio"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load Image from Pixx.io, Auto-Upload Image to Pixxio Collection"
+ },
+ {
+ "author": "RomanticQq",
+ "title": "ComfyUI-Groudingdino-Sam",
+ "reference": "https://github.com/RomanticQq/ComfyUI-Groudingdino-Sam",
+ "files": [
+ "https://github.com/RomanticQq/ComfyUI-Groudingdino-Sam"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: GroundingDino, GroundedSam2CutGaussian"
+ },
+ {
+ "author": "Firetheft",
+ "title": "ComfyUI Local Media Manager [UNSAFE]",
+ "reference": "https://github.com/Firetheft/ComfyUI_Local_Media_Manager",
+ "files": [
+ "https://github.com/Firetheft/ComfyUI_Local_Media_Manager"
+ ],
+ "install_type": "git-clone",
+ "description": "The Ultimate Local File Manager for Images, Videos, and Audio in ComfyUI.[w/This nodepack provides functionality to access files through an endpoint.]"
+ },
+ {
+ "author": "Omario92",
+ "title": "ComfyUI-OmarioNodes",
+ "reference": "https://github.com/Omario92/ComfyUI-OmarioNodes",
+ "files": [
+ "https://github.com/Omario92/ComfyUI-OmarioNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Dual Endpoint Color Blend (by Frames)"
+ },
+ {
+ "author": "locphan201",
+ "title": "ComfyUI-Alter-Nodes",
+ "reference": "https://github.com/locphan201/ComfyUI-Alter-Nodes",
+ "files": [
+ "https://github.com/locphan201/ComfyUI-Alter-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Alter MMAudio Config, Alter MMAudio Model Loader, Alter MMAudio Feature Utils, Alter MMAudio Sampler"
+ },
+ {
+ "author": "mrCodinghero",
+ "title": "ComfyUI File Transfer Plugin (comfyui-rsync-plugin) [UNSAFE]",
+ "reference": "https://github.com/tg-tjmitchell/comfyui-rsync-plugin",
+ "files": [
+ "https://github.com/tg-tjmitchell/comfyui-rsync-plugin"
+ ],
+ "install_type": "git-clone",
+ "description": "Lightweight helper for using rsync and rclone from ComfyUI with a dedicated UI panel. This repository contains Python wrappers for file transfer CLI tools and a ComfyUI plugin that adds a user-friendly panel for file transfer operations."
+ },
+ {
+ "author": "mrCodinghero",
+ "title": "ComfyUI-Codinghero",
+ "reference": "https://github.com/mrCodinghero/ComfyUI-Codinghero",
+ "files": [
+ "https://github.com/mrCodinghero/ComfyUI-Codinghero"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Image Size, Video Settings"
+ },
+ {
+ "author": "Vsolon",
+ "title": "ComfyUI-CBZ-Pack [UNSAFE]",
+ "reference": "https://github.com/Vsolon/ComfyUI-CBZ-Pack",
+ "files": [
+ "https://github.com/Vsolon/ComfyUI-CBZ-Pack"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes for Handling CBZ MetaData and Images as List or Bash.[w/This nodepack contains a node that has a vulnerability allowing access to arbitrary file paths.]"
+ },
+ {
+ "author": "odedgranot",
+ "title": "ComfyUI Video Save Node [UNSAFE]",
+ "reference": "https://github.com/odedgranot/comfyui_video_save_node",
+ "files": [
+ "https://github.com/odedgranot/comfyui_video_save_node"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node that saves video outputs as H.264 .mp4 files with unique naming and returns the file path as a string.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "odedgranot",
+ "title": "ComfyUI FFmpeg Node [UNSAFE]",
+ "reference": "https://github.com/odedgranot/comfyui-ffmpeg-node",
+ "files": [
+ "https://github.com/odedgranot/comfyui-ffmpeg-node"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node that allows you to run FFmpeg commands directly within your ComfyUI workflows. [w/This nodepack contains a vulnerability that allows remote code execution.]"
+ },
+ {
+ "author": "viik420",
+ "title": "Model Copy Node for ComfyUI [UNSAFE]",
+ "reference": "https://github.com/apeirography/ModelCopyNode",
+ "files": [
+ "https://github.com/apeirography/ModelCopyNode"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple ComfyUI custom node that copies model files from the models/ folder to the output/ folder.[w/This nodepack has a vulnerability that allows writing files to arbitrary paths.]"
+ },
+ {
+ "author": "viik420",
+ "title": "AdvancedModelDownloader [UNSAFE]",
+ "reference": "https://github.com/viik420/AdvancedModelDownloader",
+ "files": [
+ "https://github.com/viik420/AdvancedModelDownloader"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that adds a powerful, integrated downloader to the main menu, complete with an automatic update checker.[w/This nodepack provides functionality to access files through an endpoint.]"
+ },
+ {
+ "author": "DenRakEiw",
+ "title": "Comfyui-Aspect-Ratio-Processor [WIP]",
+ "reference": "https://github.com/DenRakEiw/Comfyui-Aspect-Ratio-Processor",
+ "files": [
+ "https://github.com/DenRakEiw/Comfyui-Aspect-Ratio-Processor"
+ ],
+ "install_type": "git-clone",
+ "description": "Comfyui Aspect Ratio Processor 2:3 / 3:2\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "yuvraj108c",
+ "title": "ComfyUI HYPIR [NAME CONFLICT]",
+ "reference": "https://github.com/yuvraj108c/ComfyUI-HYPIR",
+ "files": [
+ "https://github.com/yuvraj108c/ComfyUI-HYPIR"
+ ],
+ "install_type": "git-clone",
+ "description": "This project is a ComfyUI wrapper for [a/HYPIR](https://github.com/XPixelGroup/HYPIR) (Harnessing Diffusion-Yielded Score Priors for Image Restoration)"
+ },
+ {
+ "author": "miabrahams",
+ "title": "ComfyUI-WebAutomation [UNSAFE]",
+ "reference": "https://github.com/miabrahams/ComfyUI-WebAutomation",
+ "files": [
+ "https://github.com/miabrahams/ComfyUI-WebAutomation"
+ ],
+ "install_type": "git-clone",
+ "description": "Automation for ComfyUI Web UI [w/This nodepack provides functionality to access files through an endpoint.]"
+ },
+ {
+ "author": "Rizzlord",
+ "title": "ComfyUI-SeqTex",
+ "reference": "https://github.com/Rizzlord/ComfyUI-SeqTex",
+ "files": [
+ "https://github.com/Rizzlord/ComfyUI-SeqTex"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: SeqTex Load Mesh, SeqTex Loader, SeqTex Step 1: Process Mesh, SeqTex Step 2: Generate Condition, SeqTex Step 3: Generate Texture, SeqTex Step 4: Apply Texture to Trimesh"
+ },
+ {
+ "author": "BiodigitalJaz",
+ "title": "ComfyUI-Dafaja-Nodes [WIP]",
+ "reference": "https://github.com/BiodigitalJaz/ComfyUI-Dafaja-Nodes",
+ "files": [
+ "https://github.com/BiodigitalJaz/ComfyUI-Dafaja-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes for 3D mesh processing and STL export\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ervinne13",
+ "title": "ComfyUI-Metadata-Hub",
+ "reference": "https://github.com/ervinne13/ComfyUI-Metadata-Hub",
+ "files": [
+ "https://github.com/ervinne13/ComfyUI-Metadata-Hub"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Metadata Hub, Save Image With Metadata"
+ },
+ {
+ "author": "mico-world",
+ "title": "comfyui_mico_node",
+ "reference": "https://github.com/mico-world/comfyui_mico_node",
+ "files": [
+ "https://github.com/mico-world/comfyui_mico_node"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: HF UNET Loader"
+ },
+ {
+ "author": "GuusF",
+ "title": "Comfyui_CrazyMaths [WIP]",
+ "reference": "https://github.com/GuusF/Comfyui_CrazyMaths",
+ "files": [
+ "https://github.com/GuusF/Comfyui_CrazyMaths"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom nodepack with a bunch of nodes that helps you generate fun math paterns directly inside of comfyui for masking or other reasons.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "TimothyCMeehan",
+ "title": "ComfyUI CK3 Presets",
+ "reference": "https://github.com/TimothyCMeehan/comfyui-ck3-presets",
+ "files": [
+ "https://github.com/TimothyCMeehan/comfyui-ck3-presets"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes for Crusader Kings III modding - size presets, image resize, style helpers"
+ },
+ {
+ "author": "driftjohnson",
+ "title": "DaimalyadNodes [WIP]",
+ "reference": "https://github.com/MushroomFleet/DJZ-Nodes",
+ "files": [
+ "https://github.com/MushroomFleet/DJZ-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "AspectSize and 100 more nodes\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "tnil25",
+ "title": "ComfyUI-TJNodes [WIP]",
+ "reference": "https://github.com/tnil25/ComfyUI-TJNodes",
+ "files": [
+ "https://github.com/tnil25/ComfyUI-TJNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Point Tracker\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "zhu733756",
+ "title": "ivan_knows [UNSAFE]",
+ "reference": "https://github.com/Babiduba/ivan_knows",
+ "files": [
+ "https://github.com/Babiduba/ivan_knows"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Role Selector, Save Absolute. [w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "zhu733756",
+ "title": "Comfyui-Anything-Converter [UNSAFE]",
+ "reference": "https://github.com/zhu733756/Comfyui-Anything-Converter",
+ "files": [
+ "https://github.com/zhu733756/Comfyui-Anything-Converter"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a custom node extension designed for ComfyUI, providing JSON/TEXT/IMG handling functionality etc.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "twj515895394",
+ "title": "ComfComfyUI-LowMemVideoSuite [UNSAFE]",
+ "reference": "https://github.com/twj515895394/ComfyUI-LowMemVideoSuite",
+ "files": [
+ "https://github.com/twj515895394/ComfyUI-LowMemVideoSuite"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a low-memory video composition plugin designed for ComfyUI, which uses FFmpeg to combine disk-stored frame images into a video, avoiding loading all frames into memory at once.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "chenpipi0807",
+ "title": "ComfyUI-InstantCharacterFlux [WIP]",
+ "reference": "https://github.com/chenpipi0807/ComfyUI-InstantCharacterFlux",
+ "files": [
+ "https://github.com/chenpipi0807/ComfyUI-InstantCharacterFlux"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: IC → FLUX One-Knob, IC Strength Controller (InstantCharacter → FLUX), Load IC Weights, Load SigLIP Vision, Load DINOv2 Vision, Encode Reference Image (InstantCharacter)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Randomwalkforest",
+ "title": "Comfyui-Koi-Toolkit",
+ "reference": "https://github.com/Randomwalkforest/Comfyui-Koi-Toolkit",
+ "files": [
+ "https://github.com/Randomwalkforest/Comfyui-Koi-Toolkit"
+ ],
+ "install_type": "git-clone",
+ "description": "Koi Toolkit provides advanced nodes"
+ },
+ {
+ "author": "Yuan-ManX",
+ "title": "ComfyUI-Step1X-Edit [NAME CONFLICT]",
+ "reference": "https://github.com/Yuan-ManX/ComfyUI-Step1X-Edit",
+ "files": [
+ "https://github.com/Yuan-ManX/ComfyUI-Step1X-Edit"
+ ],
+ "install_type": "git-clone",
+ "description": "Make Step1X-Edit avialbe in ComfyUI."
+ },
+ {
+ "author": "hben35096",
+ "title": "hben35096/ComfyUI-ToolBox [NAME CONFLICT]",
+ "id": "hben-toolbox",
+ "reference": "https://github.com/hben35096/ComfyUI-ToolBox",
+ "files": [
+ "https://github.com/hben35096/ComfyUI-ToolBox"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of utility nodes for ComfyUI, including audio/video processing, file uploads, and AI image generation."
+ },
+ {
+ "author": "locphan201",
+ "title": "ComfyUI-Alternatives",
+ "reference": "https://github.com/locphan201/ComfyUI-Alternatives",
+ "files": [
+ "https://github.com/locphan201/ComfyUI-Alternatives"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: LoraPreLoader, LoraApplier"
+ },
+ {
+ "author": "tg-tjmitchell",
+ "title": "ComfyUI Manager Package Lister",
+ "reference": "https://github.com/tg-tjmitchell/comfyui-custom-node-lister",
+ "files": [
+ "https://github.com/tg-tjmitchell/comfyui-custom-node-lister"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node that lists installed custom nodepackages in ComfyUI Manager compatible format, providing the exact package names and install commands for sharing or reinstalling."
+ },
+ {
+ "author": "duckmartians",
+ "title": "Duck_Nodes [UNSAFE]",
+ "reference": "https://github.com/duckmartians/Duck_Nodes",
+ "files": [
+ "https://github.com/duckmartians/Duck_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Load data from Google Sheets, Google Docs, Excel, Word, and TXT with built-in login system for ComfyUI.[w/This nodepack contains a node with a vulnerability that allows reading files from arbitrary paths.]"
+ },
+ {
+ "author": "xsai-collab",
+ "title": "ComfyUI-CombineVideoAndSubtitle",
+ "reference": "https://github.com/xsai-collab/ComfyUI-CombineVideoAndSubtitle",
+ "files": [
+ "https://github.com/xsai-collab/ComfyUI-CombineVideoAndSubtitle"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Combine Video and Subtitle"
+ },
+ {
+ "author": "Lovzu",
+ "title": "ComfyUI-Qwen [NAME CONFLICT]",
+ "reference": "https://github.com/Lovzu/ComfyUI-Qwen",
+ "files": [
+ "https://github.com/Lovzu/ComfyUI-Qwen"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node Qwen3 designed to integrate with a GPT-based system under the category GPT_QWEN/Qwen. It serves as an interface to interact with the Qwen language model, specifically the 'Qwen/Qwen3-4B-Instruct-2507' variant."
+ },
+ {
+ "author": "MatthewClayHarrison",
+ "title": "MetaMan - Universal AI Image Metadata Manager [UNSAFE]",
+ "reference": "https://github.com/MatthewClayHarrison/ComfyUI-MetaMan",
+ "files": [
+ "https://github.com/MatthewClayHarrison/ComfyUI-MetaMan"
+ ],
+ "install_type": "git-clone",
+ "description": "First universal metadata system for AI image generation, with template-driven architecture allowing easy extension to new services; comprehensive dependency tracking with automatic download resolution; lossless conversion between platform formats where possible; future-proof design with extensible schema and validation system.[w/This nodepack has a vulnerability that allows remote access to arbitrary file paths.]"
+ },
+ {
+ "author": "Charonartist",
+ "title": "ComfyUI LoRA Random Selector",
+ "reference": "https://github.com/Charonartist/comfyui-lora-random-selector",
+ "files": [
+ "https://github.com/Charonartist/comfyui-lora-random-selector"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: WanMoeKSampler, WanMoeKSamplerAdvanced"
+ },
+ {
+ "author": "Charonartist",
+ "title": "ComfyUI LoRA Random Selector [WIP]",
+ "reference": "https://github.com/Charonartist/comfyui-lora-random-selector",
+ "files": [
+ "https://github.com/Charonartist/comfyui-lora-random-selector"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node that randomly selects LoRA files by category and automatically applies corresponding trigger words.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "idoru",
+ "title": "Filestash Upload Node [UNSAFE]",
+ "reference": "https://github.com/idoru/ComfyUI-SKCFI-NetworkFileIO",
+ "files": [
+ "https://github.com/idoru/ComfyUI-SKCFI-NetworkFileIO"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for uploading files to Filestash server.[w/This nodepack has a vulnerability that allows remote access to arbitrary file paths.]"
+ },
+ {
+ "author": "HWDigi",
+ "title": "Camera Factory Station [WIP]",
+ "reference": "https://github.com/HWDigi/Camera_Factory_Station_comfyui",
+ "files": [
+ "https://github.com/HWDigi/Camera_Factory_Station_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Universal Photography & Visual Enhancement Suite for ComfyUI\nThe most comprehensive collection of 5 specialized nodes providing 600+ professional options for complete photography coverage. Designed to handle everything anyone needs to create professional images across all formats, platforms, and industries - from basic snapshots to high-end commercial photography."
+ },
+ {
+ "author": "sschleis",
+ "title": "sschl-comfyui-notes",
+ "reference": "https://github.com/sschleis/sschl-comfyui-notes",
+ "files": [
+ "https://github.com/sschleis/sschl-comfyui-notes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Add Numbers, Float to String, Input Text, Show Text, Combine Strings, Text Appender, SSchl Text Encoder, Character, Connector"
+ },
+ {
+ "author": "xgfone",
+ "title": "ComfyUI_RasterCardMaker",
+ "reference": "https://github.com/xgfone/ComfyUI_RasterCardMaker",
+ "files": [
+ "https://github.com/xgfone/ComfyUI_RasterCardMaker"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Raster Card Maker"
+ },
+ {
+ "author": "majocola",
+ "title": "Standbybutton",
+ "reference": "https://github.com/majocola/comfyui-standbybutton",
+ "files": [
+ "https://github.com/majocola/comfyui-standbybutton"
+ ],
+ "install_type": "git-clone",
+ "description": "A Simple NODE for a Standbybutton in ComyUi. It works also with the webinterface."
+ },
+ {
+ "author": "brandonkish",
+ "title": "comfyUI-extractable-text [WIP]",
+ "reference": "https://github.com/brandonkish/comfyUI-extractable-text",
+ "files": [
+ "https://github.com/brandonkish/comfyUI-extractable-text"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Save Image With Description, Save Image To Folder, Load Image With Description, LoRA Testing Node, Get Smaller Of Two Numbers, Get Larger Of Two Numbers\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Dream-Pixels-Forge",
+ "title": "ComfyUI-Mzikart-Vocal [WIP]",
+ "reference": "https://github.com/Dream-Pixels-Forge/ComfyUI-Mzikart-Vocal",
+ "files": [
+ "https://github.com/Dream-Pixels-Forge/ComfyUI-Mzikart-Vocal"
+ ],
+ "install_type": "git-clone",
+ "description": "Vocals mastering nodes for ComfyUI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Dream-Pixels-Forge",
+ "title": "ComfyUI-RendArt-Nodes",
+ "reference": "https://github.com/Dream-Pixels-Forge/ComfyUI-RendArt-Nodes",
+ "files": [
+ "https://github.com/Dream-Pixels-Forge/ComfyUI-RendArt-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: RendArt Ultimate, RendArt Pro (Legacy)"
+ },
+ {
+ "author": "Karniverse",
+ "title": "ComfyUI-Randomselector",
+ "reference": "https://github.com/Karniverse/ComfyUI-Randomselector",
+ "files": [
+ "https://github.com/Karniverse/ComfyUI-Randomselector"
+ ],
+ "install_type": "git-clone",
+ "description": "A node that dynamically accepts multiple inputs of the same type and selects one based on choice or randomly."
+ },
+ {
+ "author": "thaakeno",
+ "title": "comfyui-universal-asset-downloader [UNSAFE/WIP]",
+ "reference": "https://github.com/thaakeno/comfyui-universal-asset-downloader",
+ "files": [
+ "https://github.com/thaakeno/comfyui-universal-asset-downloader"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that intelligently downloads assets from Civitai, Hugging Face, and MEGA.\nNOTE: The files in the repo are not organized.[w/This nodepack has a vulnerability that allows remote access to arbitrary file paths.]"
+ },
+ {
+ "author": "77oussam",
+ "title": "Alo77 - ComfyUI Custom Nodes Collection [WIP]",
+ "reference": "https://github.com/77oussam/Aio77-Comfyui",
+ "files": [
+ "https://github.com/77oussam/Aio77-Comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "A comprehensive collection of three powerful ComfyUI custom nodes for advanced image processing workflows.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "xgfone",
+ "title": "ComfyUI_FaceToMask",
+ "reference": "https://github.com/xgfone/ComfyUI_FaceToMask",
+ "files": [
+ "https://github.com/xgfone/ComfyUI_FaceToMask"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Face To Mask(Copy)"
+ },
+ {
+ "author": "JasonW146",
+ "title": "JasonW146",
+ "reference": "https://github.com/pururin777/ComfyUI-Manual-Openpose",
+ "files": [
+ "https://github.com/pururin777/ComfyUI-Manual-Openpose"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node that provides the ability to manually map out Controlnet Openpose landmarks for a batch of images."
+ },
+ {
+ "author": "slezica",
+ "title": "slezica/ComfyUI Personal Nodes",
+ "reference": "https://github.com/slezica/comfyui-personal",
+ "files": [
+ "https://github.com/slezica/comfyui-personal"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node collection for ComfyUI containing simplified workflow nodes and enhanced UI features for my personal use."
+ },
+ {
+ "author": "boggerrr1110",
+ "title": "Boggerrr Nodes [WIP]",
+ "reference": "https://github.com/mamamia1110/comfyui-boggerrr-nodes",
+ "files": [
+ "https://github.com/mamamia1110/comfyui-boggerrr-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A node for comfyui to use seedream3.0 and seededit3.0\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "jonathan-bryant",
+ "title": "ComfyUI-ImageStraightener [WIP]",
+ "reference": "https://github.com/jonathan-bryant/ComfyUI-ImageStraightener",
+ "files": [
+ "https://github.com/jonathan-bryant/ComfyUI-ImageStraightener"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node that automatically detects and corrects image tilt/rotation to straighten images. This node uses computer vision techniques to detect lines in the image and calculate the optimal rotation angle to straighten the image.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "adithis197",
+ "title": "ComfyUI-multimodal-CaptionToVideoGen [WIP]",
+ "reference": "https://github.com/adithis197/ComfyUI-multimodal-CaptionToVideoGen",
+ "files": [
+ "https://github.com/adithis197/ComfyUI-multimodal-CaptionToVideoGen"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for video generation using a music prompt to generate audio.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "adithis197",
+ "title": "ComfyUI-Caption_to_audio [WIP]",
+ "reference": "https://github.com/adithis197/ComfyUI-Caption_to_audio",
+ "files": [
+ "https://github.com/adithis197/ComfyUI-Caption_to_audio"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node that converts image description to an appropriate prompt for music generation.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "alistairallan",
+ "title": "ComfyUI-skin-retouch",
+ "reference": "https://github.com/alistairallan/ComfyUI-skin-retouch",
+ "files": [
+ "https://github.com/alistairallan/ComfyUI-skin-retouch"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI"
+ },
+ {
+ "author": "sprited-ai",
+ "title": "Sprited ComfyUI Nodes [WIP]",
+ "reference": "https://github.com/sprited-ai/sprited-comfyui-nodes",
+ "files": [
+ "https://github.com/sprited-ai/sprited-comfyui-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI"
+ },
+ {
+ "author": "trashkollector",
+ "title": "ComfyUI-TKVideoZoom [WIP]",
+ "reference": "https://github.com/trashkollector/TKVideoZoom",
+ "files": [
+ "https://github.com/trashkollector/TKVideoZoom"
+ ],
+ "install_type": "git-clone",
+ "description": "Various Zoom/Slide effects for Video\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "tankenyuen-ola",
+ "title": "comfyui-wanvideo-scheduler-loop",
+ "reference": "https://github.com/tankenyuen-ola/comfyui-wanvideo-scheduler-loop",
+ "files": [
+ "https://github.com/tankenyuen-ola/comfyui-wanvideo-scheduler-loop"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: WanVideo Scheduler Selector, WanVideo Scheduler Loop, WanVideo Scheduler Info"
+ },
+ {
+ "author": "ElyZeng",
+ "title": "ComfyUI-Translator [NAME CONFLICT]",
+ "reference": "https://github.com/ElyZeng/ComfyUI-Translator",
+ "files": [
+ "https://github.com/ElyZeng/ComfyUI-Translator"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI node to translate text between multiple languages using Argos Translate."
+ },
+ {
+ "author": "lggcfx2020",
+ "title": "ComfyUI-LGGCFX-Tools",
+ "reference": "https://github.com/lggcfx2020/ComfyUI-LGGCFX-Tools",
+ "files": [
+ "https://github.com/lggcfx2020/ComfyUI-LGGCFX-Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "A small tool for calculating the frame number and total frames of a video. Originally required four nodes, but has been merged into a single node for convenience. Includes quick resolution selection and landscape mode switching."
+ },
+ {
+ "author": "206811",
+ "title": "ComfyUI_ZhipuAIO",
+ "reference": "https://github.com/206811/ComfyUI_ZhipuAIO",
+ "files": [
+ "https://github.com/206811/ComfyUI_ZhipuAIO"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: ZhipuAI AIO Config, ZhipuAI Translator, ZhipuAI GLM-4V Vision\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ahmedbana",
+ "title": "upload-to-azure",
+ "reference": "https://github.com/ahmedbana/upload-to-azure",
+ "files": [
+ "https://github.com/ahmedbana/upload-to-azure"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Upload to Azure Node"
+ },
+ {
+ "author": "Inoriac",
+ "title": "comfyui-HandDetect",
+ "reference": "https://github.com/Inoriac/comfyui-HandDetect",
+ "files": [
+ "https://github.com/Inoriac/comfyui-HandDetect"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: A custom node for ComfyUI that performs hand detection, implemented with the YOLOv8 model, supporting both hand detection and mask generation."
+ },
+ {
+ "author": "Aero-Ex",
+ "title": "comfyui_diffswap",
+ "reference": "https://github.com/Aero-Ex/comfyui_diffswap",
+ "files": [
+ "https://github.com/Aero-Ex/comfyui_diffswap"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: DiffSwap"
+ },
+ {
+ "author": "eggsbenedicto",
+ "title": "DiffusionRenderer-ComfyUI [WIP]",
+ "reference": "https://github.com/eggsbenedicto/DiffusionRenderer-ComfyUI",
+ "files": [
+ "https://github.com/eggsbenedicto/DiffusionRenderer-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "Experimental wrapper for diffusion-renderer in ComfyUI.\nNOTE: Currently unfinished and non-functioning. Will update"
+ },
+ {
+ "author": "system-out-cho",
+ "title": "displayHistory [WIP]",
+ "reference": "https://github.com/system-out-cho/displayHistory_ComfyUI",
+ "files": [
+ "https://github.com/system-out-cho/displayHistory_ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "A node that displays any node's history\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "lazybuttalented",
+ "title": "ComfyUI_LBT [WIP]",
+ "reference": "https://github.com/lazybuttalented/ComfyUI_LBT",
+ "files": [
+ "https://github.com/lazybuttalented/ComfyUI_LBT"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node to program the image & text processing flows.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "xgfone",
+ "title": "ComfyUI_PromptLogoCleaner",
+ "reference": "https://github.com/xgfone/ComfyUI_PromptLogoCleaner",
+ "files": [
+ "https://github.com/xgfone/ComfyUI_PromptLogoCleaner"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Prompt Cleaner (Remove Logo Words)"
+ },
+ {
+ "author": "dexintenebri",
+ "title": "comfyui_voxel_nodes [WIP]",
+ "reference": "https://github.com/dexintenebri/comfyui_voxel_nodes",
+ "files": [
+ "https://github.com/dexintenebri/comfyui_voxel_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Extracts RGB and depthmap from image to create 3D Voxels, for integration into MagicaVoxel and Unity Engine\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "1H-hobit",
+ "title": "ComfyComfyUI_InternVL3 [WIP]",
+ "reference": "https://github.com/1H-hobit/ComfyUI_InternVL3",
+ "files": [
+ "https://github.com/1H-hobit/ComfyUI_InternVL3"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes to use InternVL3"
+ },
+ {
+ "author": "LucianoCirino",
+ "title": "ComfyUI-invAIder-Nodes",
+ "reference": "https://github.com/LucianoCirino/ComfyUI-invAIder-Nodes",
+ "files": [
+ "https://github.com/LucianoCirino/ComfyUI-invAIder-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes I've created for my own personal workflows. Use at your own discretion.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "zhuanvi",
+ "title": "ComfyUI-ZVNodes [WIP]",
+ "reference": "https://github.com/zhuanvi/ComfyUI-ZVNodes",
+ "files": [
+ "https://github.com/zhuanvi/ComfyUI-ZVNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load One Image (Directory), Save Image (Directory), Count Image (Directory), Json Reader, Json List Node, Json List Length, Json List Indexer, Json List Slicer, Triangle Character Layout, Json List To Mask, Random Select From List, Join List, ..."
+ },
+ {
+ "author": "Filexor",
+ "title": "File_x_dynamic_prompt2",
+ "reference": "https://github.com/Filexor/File_x_dynamic_prompt2",
+ "files": [
+ "https://github.com/Filexor/File_x_dynamic_prompt2"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node for random prompt generation"
+ },
+ {
+ "author": "FileSystem Manager Team",
+ "title": "Comfyui-FileSytem-Manager",
+ "reference": "https://github.com/bleash-dev/Comfyui-FileSytem-Manager",
+ "files": [
+ "https://github.com/bleash-dev/Comfyui-FileSytem-Manager"
+ ],
+ "install_type": "git-clone",
+ "description": "Comprehensive file system management for ComfyUI with multiple upload sources"
+ },
+ {
+ "author": "thavocado",
+ "title": "comfyui-danbooru-lookup",
+ "reference": "https://github.com/thavocado/comfyui-danbooru-lookup",
+ "files": [
+ "https://github.com/thavocado/comfyui-danbooru-lookup"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node that performs FAISS cosine similarity lookup on Danbooru embeddings using multiple input modes: CLIP conditioning, images with WD14 tagging, or text tags.[w/This nodepack installs its dependencies automatically during execution.]"
+ },
+ {
+ "author": "love2hina-net",
+ "title": "ComfyUI-Local-Translator",
+ "reference": "https://github.com/love2hina-net/ComfyUI-Local-Translator",
+ "files": [
+ "https://github.com/love2hina-net/ComfyUI-Local-Translator"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a text translation node using a local SLM (Microsoft Phi-4) for ComfyUI."
+ },
+ {
+ "author": "DenRakEiw",
+ "title": "Denrakeiw Nodes [WIP]",
+ "reference": "https://github.com/DenRakEiw/DenRakEiw_Nodes",
+ "files": [
+ "https://github.com/DenRakEiw/DenRakEiw_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom nodepack for ComfyUI that provides utility nodes for image generation and manipulation.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ahmedbana",
+ "title": "json-creator [WIP]",
+ "reference": "https://github.com/ahmedbana/json-creator",
+ "files": [
+ "https://github.com/ahmedbana/json-creator"
+ ],
+ "install_type": "git-clone",
+ "description": "Create Json for ComfyUI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ahmedbana",
+ "title": "File-Rename [UNSAFE]",
+ "reference": "https://github.com/ahmedbana/File-Rename",
+ "files": [
+ "https://github.com/ahmedbana/File-Rename"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI nodepackage that allows you to rename files with incremented numbers based on various mathematical operations. Includes both basic and advanced functionality.[w/This nodepack includes a node that can rename files to arbitrary paths.]"
+ },
+ {
+ "author": "ahmedbana",
+ "title": "ComfyUI_AC_FUNV7-FLUX- [WIP]",
+ "reference": "https://github.com/A719689614/ComfyUI_AC_FUNV7-FLUX-",
+ "files": [
+ "https://github.com/A719689614/ComfyUI_AC_FUNV7-FLUX-"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: AC_Super_UNET(FLUX), AC_Super_CLIP(FLUX)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "broumbroum",
+ "title": "comfyui-time-system [WIP]",
+ "reference": "https://github.com/broumbroum/comfyui-time-system",
+ "files": [
+ "https://github.com/broumbroum/comfyui-time-system"
+ ],
+ "install_type": "git-clone",
+ "description": "Package that adds nodes to retrieve the system date and time.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "rodpl",
+ "title": "comfyui-asset-manager",
+ "reference": "https://github.com/rodpl/comfyui-asset-manager",
+ "files": [
+ "https://github.com/rodpl/comfyui-asset-manager"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Asset Manager for managing assets in ComfyUI"
+ },
+ {
+ "author": "blepping",
+ "title": "ComfyUI 'dum' samplers [WIP]",
+ "reference": "https://github.com/blepping/comfyui_dum_samplers",
+ "files": [
+ "https://github.com/blepping/comfyui_dum_samplers"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of random, experimental (and most likely 'dum') samplers for ComfyUI."
+ },
+ {
+ "author": "crimro-se",
+ "title": "ComfyUI-CascadedGaze",
+ "reference": "https://github.com/crimro-se/ComfyUI-CascadedGaze",
+ "files": [
+ "https://github.com/crimro-se/ComfyUI-CascadedGaze"
+ ],
+ "install_type": "git-clone",
+ "description": "Two custom nodes that bring the CascadedGaze image denoising model architecture to ComfyUI."
+ },
+ {
+ "author": "RamonGuthrie",
+ "title": "ComfyUI-RBG-LoRA-Converter [UNSAFE]",
+ "reference": "https://github.com/RamonGuthrie/ComfyUI-RBG-LoraConverter",
+ "files": [
+ "https://github.com/RamonGuthrie/ComfyUI-RBG-LoraConverter"
+ ],
+ "install_type": "git-clone",
+ "description": "A node for converting LoRA (Low-Rank Adaptation) keys in ComfyUI.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "Estanislao-Oviedo",
+ "title": "ComfyUI-CustomNodes [NAME CONFLICT]",
+ "reference": "https://github.com/Estanislao-Oviedo/ComfyUI-CustomNodes",
+ "files": [
+ "https://github.com/Estanislao-Oviedo/ComfyUI-CustomNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load Image Folder (Custom), Make Batch from Single Image (Custom)"
+ },
+ {
+ "author": "ctf05",
+ "title": "ComfyUI-AudioDuration",
+ "reference": "https://github.com/ctf05/ComfyUI-AudioDuration",
+ "files": [
+ "https://github.com/ctf05/ComfyUI-AudioDuration"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Audio Duration, Audio Overlay (Mix)"
+ },
+ {
+ "author": "soliton",
+ "title": "Watermark Detection YOLO Custom Node [WIP]",
+ "reference": "https://github.com/Soliton80/ComfyUI-Watermark-Detection-YOLO",
+ "files": [
+ "https://github.com/Soliton80/ComfyUI-Watermark-Detection-YOLO"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom watermark detection using rained on 24,558 watermark images YOLO11 model for ComfyUI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Jpzz",
+ "title": "IxiWorks StoryBoard Nodes [WIP]",
+ "reference": "https://github.com/IXIWORKS-KIMJUNGHO/comfyui-ixiworks",
+ "files": [
+ "https://github.com/IXIWORKS-KIMJUNGHO/comfyui-ixiworks"
+ ],
+ "install_type": "git-clone",
+ "description": "StoryBoard nodes for ComfyUI - Parse JSON templates and build prompts for generative movie creation\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "siyonomicon",
+ "title": "ComfyUI-Pin",
+ "reference": "https://github.com/siyonomicon/ComfyUI-Pin",
+ "files": [
+ "https://github.com/siyonomicon/ComfyUI-Pin"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Pin Grid Node"
+ },
+ {
+ "author": "rakete",
+ "title": "comfyui-rakete",
+ "reference": "https://github.com/rakete/comfyui-rakete",
+ "files": [
+ "https://github.com/rakete/comfyui-rakete"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Get Widget or Default Value, GPU Garbage Collector, Build String from Widget Values"
+ },
+ {
+ "author": "boricuapab",
+ "title": "ComfyUI-Bori-KontextPresets [WIP]",
+ "reference": "https://github.com/boricuapab/ComfyUI-Bori-KontextPresets",
+ "files": [
+ "https://github.com/boricuapab/ComfyUI-Bori-KontextPresets"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a custom node for ComfyUI that uses the Kontext Presets.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "sh570655308",
+ "title": "Comfyui-RayNodes [WIP]",
+ "reference": "https://github.com/sh570655308/Comfyui-RayNodes",
+ "files": [
+ "https://github.com/sh570655308/Comfyui-RayNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Bracketed Tag-Index Merger, Florence2 Tag Processor, Image List Converter, Image Selector, Mask Blackener, Mask Applier and Combiner, Mask Processor, Tag Array to Lines, Tag-Index Merger, Grabber Tag Processor, Image Resizer, Save Image Websocket, Border Mask, SaturationAdjuster, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Rocky-Lee-001",
+ "title": "ComfyUI_SZtools",
+ "reference": "https://github.com/Rocky-Lee-001/ComfyUI_SZtools",
+ "files": [
+ "https://github.com/Rocky-Lee-001/ComfyUI_SZtools"
+ ],
+ "install_type": "git-clone",
+ "description": "This project is the comfyui implementation of ComfyUI_SZtools, a labeling and naming tool developed for Kontext's local training package T2ITrainer.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "stalkervr",
+ "title": "Custom Path Nodes for ComfyUI [UNSAFE]",
+ "reference": "https://github.com/stalkervr/comfyui-custom-path-nodes",
+ "files": [
+ "https://github.com/stalkervr/comfyui-custom-path-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes for path handling and image cropping.[w/This nodepack contains a node that has a vulnerability allowing access to arbitrary file paths.]"
+ },
+ {
+ "author": "gorillaframeai",
+ "title": "GF_pixtral_node [WIP]",
+ "reference": "https://github.com/gorillaframeai/GF_pixtral_node",
+ "files": [
+ "https://github.com/gorillaframeai/GF_pixtral_node"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: GF Mistral & Pixtral"
+ },
+ {
+ "author": "enlo",
+ "title": "ComfyUI-CheckpointSettings",
+ "reference": "https://github.com/enlo/ComfyUI-CheckpointSettings",
+ "files": [
+ "https://github.com/enlo/ComfyUI-CheckpointSettings"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node created to fulfill a personal need I thought of while playing around with ComfyUI — 'I want to save checkpoint names and KSampler settings together and randomly switch between them for fun.'"
+ },
+ {
+ "author": "Mzikart",
+ "title": "ComfyUI-Mzikart-Player [WIP]",
+ "reference": "https://github.com/Dream-Pixels-Forge/ComfyUI-Mzikart-Player",
+ "files": [
+ "https://github.com/Dream-Pixels-Forge/ComfyUI-Mzikart-Player"
+ ],
+ "install_type": "git-clone",
+ "description": "Interactive audio player for ComfyUI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "babydjac",
+ "title": "comfyui-grok-ponyxl [WIP]",
+ "reference": "https://github.com/babydjac/comfyui-grok-ponyxl",
+ "files": [
+ "https://github.com/babydjac/comfyui-grok-ponyxl"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: GrokPonyXLPrompter\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "MarkFreeDom168",
+ "title": "ComfyUI-image-load-url [WIP]",
+ "reference": "https://github.com/MarkFreeDom168/ComfyUI-image-load-url",
+ "files": [
+ "https://github.com/MarkFreeDom168/ComfyUI-image-load-url"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load Image From URL/Base64, Load Mask From URL/Base64, Load img and mask from url\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "realm-weaver",
+ "title": "Tile Seamstress 360° [WIP]",
+ "reference": "https://github.com/realm-weaver/ComfyUI-tile-seamstress-360",
+ "files": [
+ "https://github.com/realm-weaver/ComfyUI-tile-seamstress-360"
+ ],
+ "install_type": "git-clone",
+ "description": "Tile Seamstress 360 is a set of tools for fixing seams & poles in 360° panoramic equirectangular images inside ComfyUI."
+ },
+ {
+ "author": "jisenhua",
+ "title": "ComfyUI-yolov5-face [WIP]",
+ "reference": "https://github.com/UmutGuzel/tryvariantai-comfyui",
+ "files": [
+ "https://github.com/UmutGuzel/tryvariantai-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Fill Transparency, Mask Expand Border, Mask Expand Border (Advanced), Mask to Transparent, Debug Mask Visualizer, White to Transparent, White Detector\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "visualbruno",
+ "title": "ComfyUI-QRemeshify",
+ "reference": "https://github.com/visualbruno/ComfyUI-QRemeshify",
+ "files": [
+ "https://github.com/visualbruno/ComfyUI-QRemeshify"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: QRemeshify"
+ },
+ {
+ "author": "jisenhua",
+ "title": "ComfyUI-yolov5-face [WIP]",
+ "reference": "https://github.com/JiSenHua/ComfyUI-yolov5-face",
+ "files": [
+ "https://github.com/JiSenHua/ComfyUI-yolov5-face"
+ ],
+ "install_type": "git-clone",
+ "description": "A YOLOv5 face detection project for ComfyUI.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "zopieux",
+ "title": "ComfyUI-zopi [UNSAFE]",
+ "reference": "https://github.com/zopieux/ComfyUI-zopi",
+ "files": [
+ "https://github.com/zopieux/ComfyUI-zopi"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Eval Python, Load TensortRT + checkpoint + CLIP + VAE [w/This nodepack contains a vulnerability that allows remote code execution.]"
+ },
+ {
+ "author": "przewodo",
+ "title": "ComfyUI-Przewodo-Utils [WIP]",
+ "reference": "https://github.com/przewodo/ComfyUI-Przewodo-Utils",
+ "files": [
+ "https://github.com/przewodo/ComfyUI-Przewodo-Utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Utilities to make it easy to develop advanced Workflows without having to use a lot of nodes for simple stuff.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "hulipanpan",
+ "title": "Comfyui_tuteng [WIP]",
+ "reference": "https://github.com/hulipanpan/Comfyui_tuteng",
+ "files": [
+ "https://github.com/hulipanpan/Comfyui_tuteng"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Tuteng Mj, Tuteng Mj Style, Tuteng Upload, Tuteng Mj Upscale, Tuteng Mj Vary/Zoom, Tuteng Kling Text2Video, Tuteng Kling Image2Video, Tuteng Kling Video Extend, Tuteng Gemini API, Tuteng Doubao SeedEdit, Tuteng ChatGPT API, Tuteng Jimeng API, Tuteng GPT-Image-1 Edit, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "PaleBloodq",
+ "title": "ComfyUI-HFTransformers",
+ "reference": "https://github.com/PaleBloodq/ComfyUI-HFTransformers",
+ "files": [
+ "https://github.com/PaleBloodq/ComfyUI-HFTransformers"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: HFT Pipeline Loader, HFT Classifier, HFT Classification Selector, HFT Object Detector, HFT Image to Text, HFT Depth Estimator"
+ },
+ {
+ "author": "whmc76",
+ "title": "ComfyUI-AudioSuiteAdvanced [WIP]",
+ "reference": "https://github.com/whmc76/ComfyUI-AudioSuiteAdvanced",
+ "files": [
+ "https://github.com/whmc76/ComfyUI-AudioSuiteAdvanced"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI plugin for processing long text files and generating speech, supporting features such as audio separation, text segmentation, and audio merging.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Letz-AI",
+ "title": "ComfyUI-LetzAI [UNSAFE]",
+ "reference": "https://github.com/Letz-AI/ComfyUI-LetzAI",
+ "files": [
+ "https://github.com/Letz-AI/ComfyUI-LetzAI"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI Node for LetzAI Image Generation[w/The API key is embedded in the workflow.]"
+ },
+ {
+ "author": "ZhouNLP",
+ "title": "comfyui_LK_selfuse",
+ "reference": "https://github.com/LK-168/comfyui_LK_selfuse",
+ "files": [
+ "https://github.com/LK-168/comfyui_LK_selfuse"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Mask Diff, Mask Connected Remove, Mask Get Max, Mask Filter with Rate, InspectModelArchitecture, Print Sigma, Adv Scheduler, LK_MaskToSEGS, LK_SegsAdjust, String Filter, String Remove Duplicate, String Modify, ... \nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "junhe421",
+ "title": "comfyui_batch_image_processor [WIP]",
+ "reference": "https://github.com/junhe421/comfyui_batch_image_processor",
+ "files": [
+ "https://github.com/junhe421/comfyui_batch_image_processor"
+ ],
+ "install_type": "git-clone",
+ "description": "A Kontext Bench-style ComfyUI image difference analysis node that supports instruction-based prompt generation and batch TXT editing.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Tr1dae",
+ "title": "ComfyUI-CustomNodes-MVM",
+ "reference": "https://github.com/Tr1dae/ComfyUI-CustomNodes-MVM",
+ "files": [
+ "https://github.com/Tr1dae/ComfyUI-CustomNodes-MVM"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load Image From Folder MVM, Load Guidance Images From Folder MVM, Load Text From Folder MVM"
+ },
+ {
+ "author": "Vkabuto23",
+ "title": "ComfyUI Custom Nodes: OpenRouter & Ollama [UNSAFE]",
+ "reference": "https://github.com/Vkabuto23/comfyui_openrouter_ollama",
+ "files": [
+ "https://github.com/Vkabuto23/comfyui_openrouter_ollama"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Custom Nodes: OpenRouter & Ollama[w/The API key is embedded in the workflow.]"
+ },
+ {
+ "author": "subnet99",
+ "title": "ComfyUI-URLLoader",
+ "reference": "https://github.com/subnet99/ComfyUI-URLLoader",
+ "files": [
+ "https://github.com/subnet99/ComfyUI-URLLoader"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI plugin for downloading and loading media files from URLs."
+ },
+ {
+ "author": "bikiam",
+ "title": "Comfyui_AudioRecoder",
+ "reference": "https://github.com/bikiam/Comfyui_AudioRecoder",
+ "files": [
+ "https://github.com/bikiam/Comfyui_AudioRecoder"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: AUDIO Recorder"
+ },
+ {
+ "author": "saulchiu",
+ "title": "comfyui-saul-plugin [WIP]",
+ "reference": "https://github.com/saulchiu/comfy_saul_plugin",
+ "files": [
+ "https://github.com/saulchiu/comfy_saul_plugin"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Cutting Video\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "wasilone11",
+ "title": "comfyui-sync-translate-node",
+ "reference": "https://github.com/wasilone11/comfyui-sync-translate-node",
+ "files": [
+ "https://github.com/wasilone11/comfyui-sync-translate-node"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Sync.so Translator"
+ },
+ {
+ "author": "ashllay",
+ "title": "ComfyUI_MoreComfy",
+ "reference": "https://github.com/ashllay/ComfyUI_MoreComfy",
+ "files": [
+ "https://github.com/ashllay/ComfyUI_MoreComfy"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: MC Switch Seed, MC Switch Image, MC Switch String, MC Alter Seed, MC Set Tile Size, MC Get Image Size, MC Get Image Min Max, MC Multi Concat, MC Multi Concat(Advanced), MC Noise"
+ },
+ {
+ "author": "gaowei-space",
+ "title": "ComfyUI Doubao LLM [WIP]",
+ "reference": "https://github.com/gaowei-space/ComfyUI-Doubao-LLM",
+ "files": [
+ "https://github.com/gaowei-space/ComfyUI-Doubao-LLM"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for Doubao (ByteDance) LLM and Vision Language Model integration\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "BrettMedia",
+ "title": "comfyui-bhtools [WIP]",
+ "reference": "https://github.com/BrettMedia/comfyui-bhtools",
+ "files": [
+ "https://github.com/BrettMedia/comfyui-bhtools"
+ ],
+ "install_type": "git-clone",
+ "description": "A suite of creative tools designed to help AI artists with continuity, brainstorming, and workflow optimization. Born from real-world needs during my AI journey, these nodes solve common pain points in creative workflows.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "XiaoHeiziGGG",
+ "title": "ComfyUI-Gemini-Kontext [WIP]",
+ "reference": "https://github.com/XiaoHeiziGGG/ComfyUI-Gemini-Kontext",
+ "files": [
+ "https://github.com/XiaoHeiziGGG/ComfyUI-Gemini-Kontext"
+ ],
+ "install_type": "git-clone",
+ "description": "Google Gemini API powered translation nodes for ComfyUI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Bwebbfx",
+ "title": "ComfyUI Face Parsing Nodes [WIP]",
+ "reference": "https://github.com/Bwebbfx/ComfyUI_FaceParsing",
+ "files": [
+ "https://github.com/Bwebbfx/ComfyUI_FaceParsing"
+ ],
+ "install_type": "git-clone",
+ "description": "This package provides ComfyUI nodes for face parsing using BiSeNet (from yakhyo/face-parsing), supporting batch and video workflows.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "orion4d",
+ "title": "Unified List Selector for ComfyUI [UNSAFE]",
+ "reference": "https://github.com/orion4d/ComfyUI_unified_list_selector",
+ "files": [
+ "https://github.com/orion4d/ComfyUI_unified_list_selector"
+ ],
+ "install_type": "git-clone",
+ "description": "This project is a custom node for ComfyUI that allows you to dynamically load lists from text (.txt) or CSV (.csv) files and select an item to use in your workflow. It features a manual selection mode (via a dropdown list) and a random selection mode, as well as the ability to add prefixes and suffixes to the selected text.[w/This nodepack contains a node with a vulnerability that allows reading files from arbitrary paths.]"
+ },
+ {
+ "author": "kongds1999",
+ "title": "ComfyUI_was_image",
+ "reference": "https://github.com/kongds1999/ComfyUI_was_image",
+ "files": [
+ "https://github.com/kongds1999/ComfyUI_was_image"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Replace Color By Palette, ConvertGrayToImage"
+ },
+ {
+ "author": "zl9739379",
+ "title": "ComfyUI Qwen Vision Language API Node [NAME CONFLICT]",
+ "reference": "https://github.com/zl9739379/comfyui-qwen-vl-api",
+ "files": [
+ "https://github.com/zl9739379/comfyui-qwen-vl-api"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node for describing images using Qwen Vision Language models through OpenAI-compatible APIs."
+ },
+ {
+ "author": "bikiam",
+ "title": "ComfyUi_WhisperGTranslate",
+ "reference": "https://github.com/bikiam/ComfyUi_WhisperGTranslate",
+ "files": [
+ "https://github.com/bikiam/ComfyUi_WhisperGTranslate"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Whisper + AudioTranslate, Google Translate Node"
+ },
+ {
+ "author": "edgerunner",
+ "title": "ComfyUI Queue Manager [WIP]",
+ "reference": "https://github.com/QuietNoise/ComfyUI-Queue-Manager",
+ "files": [
+ "https://github.com/QuietNoise/ComfyUI-Queue-Manager"
+ ],
+ "install_type": "git-clone",
+ "description": "An extension supporting more streamlined prompt queue management."
+ },
+ {
+ "author": "fylrid2",
+ "title": "lockValue",
+ "reference": "https://github.com/fylrid2/comfyui_lock_previous_value",
+ "files": [
+ "https://github.com/fylrid2/comfyui_lock_previous_value"
+ ],
+ "install_type": "git-clone",
+ "description": "Allows the locking of a nodes value\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "XiaoHeiziGGG",
+ "title": "ComfyUI Gemini Translator [WIP]",
+ "reference": "https://github.com/XiaoHeiziGGG/ComfyUI-GeminiTranslator",
+ "files": [
+ "https://github.com/XiaoHeiziGGG/ComfyUI-GeminiTranslator"
+ ],
+ "install_type": "git-clone",
+ "description": "The API node library of gemini can be translated and recognized.The API node library of gemini can be translated and recognized.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "DiffusionWave-YT",
+ "title": "DiffusionWave_PickResolution [WIP]",
+ "reference": "https://github.com/DiffusionWave-YT/DiffusionWave_PickResolution",
+ "files": [
+ "https://github.com/DiffusionWave-YT/DiffusionWave_PickResolution"
+ ],
+ "install_type": "git-clone",
+ "description": "Change of resolutions for ComfyUI and Upscalers\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "PeterMikhai",
+ "title": "DoomFLUX Nodes [WIP]",
+ "reference": "https://github.com/PeterMikhai/Doom_Flux_NodePack",
+ "files": [
+ "https://github.com/PeterMikhai/Doom_Flux_NodePack"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for FLUX models, including a loader and specialized samplers for standard and inpaint generation.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "maque",
+ "title": "comfyui_video_BC [WIP]",
+ "reference": "https://github.com/JioJe/comfyui_video_BC",
+ "files": [
+ "https://github.com/JioJe/comfyui_video_BC"
+ ],
+ "install_type": "git-clone",
+ "description": "Batch load video nodes and save videos in custom paths\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ZHO-ZHO-ZHO",
+ "title": "ComfyUI-Gemini [NAME CONFLICT]",
+ "id": "gemini",
+ "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini",
+ "files": [
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini"
+ ],
+ "install_type": "git-clone",
+ "description": "Using Gemini-pro & Gemini-pro-vision in ComfyUI."
+ },
+ {
+ "author": "No-22-Github",
+ "title": "ComfyUI_SaveImageCustom",
+ "reference": "https://github.com/No-22-Github/ComfyUI_SaveImageCustom",
+ "files": [
+ "https://github.com/No-22-Github/ComfyUI_SaveImageCustom"
+ ],
+ "install_type": "git-clone",
+ "description": "Easy save image with dir+name"
+ },
+ {
+ "author": "jiafuzeng",
+ "title": "comfyui-fishSpeech",
+ "reference": "https://github.com/jiafuzeng/comfyui-fishSpeech",
+ "files": [
+ "https://github.com/jiafuzeng/comfyui-fishSpeech"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Fish-Speech Loader, Fish-Speech TTS, Fish-Speech Audio Preview"
+ },
+ {
+ "author": "bleash-dev",
+ "title": "ComfyUI-Auth-Manager",
+ "reference": "https://github.com/bleash-dev/ComfyUI-Auth-Manager",
+ "files": [
+ "https://github.com/bleash-dev/ComfyUI-Auth-Manager"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node that provides email/password authentication for ComfyUI pods with a beautiful modal interface."
+ },
+ {
+ "author": "filliptm",
+ "title": "ComfyUI_Fill-Node-Loader [WIP]",
+ "reference": "https://github.com/filliptm/ComfyUI_Fill-Node-Loader",
+ "files": [
+ "https://github.com/filliptm/ComfyUI_Fill-Node-Loader"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI plugin to simplify loading and managing custom nodes with a sidebar interface."
+ },
+ {
+ "author": "diogod",
+ "title": "Comfy Inpainting Works [WIP]",
+ "reference": "https://github.com/diodiogod/Comfy-Inpainting-Works",
+ "files": [
+ "https://github.com/diodiogod/Comfy-Inpainting-Works"
+ ],
+ "install_type": "git-clone",
+ "description": "Go to the top menu>Workflow>Browse Templates. This is a collection of my Inpainting workflows for Flux (expanded and COMPACT) + others. Previously called: 'Proper Flux Control-Net inpainting and/or outpainting with batch size - Alimama or Flux Fill'. By installing this 'node' you can always keep them up to date by updating on the manager. This is not a new custom node. You will still need to install all other custom nodes used on the workflows. You will also find my 'Flux LoRA Block Weights Preset Tester' here as well.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Malloc-pix",
+ "title": "comfyui-QwenVL",
+ "reference": "https://github.com/Malloc-pix/comfyui-QwenVL",
+ "files": [
+ "https://github.com/Malloc-pix/comfyui-QwenVL"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Qwen2.5VL, Qwen2.5"
+ },
+ {
+ "author": "artifyfun",
+ "title": "ComfyUI-JS [UNSAFE]",
+ "reference": "https://github.com/artifyfun/ComfyUI-JS",
+ "files": [
+ "https://github.com/artifyfun/ComfyUI-JS"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node capable of executing JavaScript code: it takes JavaScript code as input and outputs the execution result.[w/This extension has an XSS vulnerability that can be triggered through workflow execution.]"
+ },
+ {
+ "author": "OgreLemonSoup",
+ "title": "ComfyUI-Notes-manager",
+ "reference": "https://github.com/OgreLemonSoup/ComfyUI-Notes-manager",
+ "files": [
+ "https://github.com/OgreLemonSoup/ComfyUI-Notes-manager"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension provides the note feature."
+ },
+ {
+ "author": "WozStudios",
+ "title": "ComfyUI-WozNodes",
+ "reference": "https://github.com/WozStudios/ComfyUI-WozNodes",
+ "files": [
+ "https://github.com/WozStudios/ComfyUI-WozNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Trim Image Batch, Create Image Batch, Select Image Batch by Mask, Advanced Batch Creator"
+ },
+ {
+ "author": "stalkervr",
+ "title": "comfyui-custom-path-nodes [UNSAFE]",
+ "reference": "https://github.com/stalkervr/comfyui-custom-path-nodes",
+ "files": [
+ "https://github.com/stalkervr/comfyui-custom-path-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes for path handling and image cropping.[w/This nodepack has a vulnerability that allows remote access to arbitrary file paths.]"
+ },
+ {
+ "author": "vovler",
+ "title": "comfyui-vovlertools",
+ "reference": "https://github.com/vovler/ComfyUI-vovlerTools",
+ "files": [
+ "https://github.com/vovler/ComfyUI-vovlerTools"
+ ],
+ "install_type": "git-clone",
+ "description": "Advanced ComfyUI nodes for WD14 tagging, image filtering, and CLIP to TensorRT conversion"
+ },
+ {
+ "author": "ELiZswe",
+ "title": "ComfyUI-ELiZTools",
+ "reference": "https://github.com/ELiZswe/ComfyUI-ELiZTools",
+ "files": [
+ "https://github.com/ELiZswe/ComfyUI-ELiZTools"
+ ],
+ "install_type": "git-clone",
+ "description": "ELIZ Tools"
+ },
+ {
+ "author": "yamanacn",
+ "title": "comfyui_qwenbbox",
+ "reference": "https://github.com/yamanacn/comfyui_qwenbbox",
+ "files": [
+ "https://github.com/yamanacn/comfyui_qwenbbox"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load Qwen Model (v2), Qwen Bbox Detection, Prepare BBox for SAM (v2)"
+ },
+ {
+ "author": "mikheys",
+ "title": "ComfyUI-mikheys",
+ "reference": "https://github.com/mikheys/ComfyUI-mikheys",
+ "files": [
+ "https://github.com/mikheys/ComfyUI-mikheys"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: WAN Optimal Resolution Selector, WAN Show Image Dimensions"
+ },
+ {
+ "author": "yamanacn",
+ "title": "comfyui_qwen_object [WIP]",
+ "reference": "https://github.com/yamanacn/comfyui_qwen_object",
+ "files": [
+ "https://github.com/yamanacn/comfyui_qwen_object"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a custom node for ComfyUI that integrates the Qwen vision model for tasks such as object detection.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "neverbiasu",
+ "title": "ComfyUI-Show-o [WIP]",
+ "reference": "https://github.com/neverbiasu/ComfyUI-Show-o",
+ "files": [
+ "https://github.com/neverbiasu/ComfyUI-Show-o"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Show-o Model Loader, Show-o Text to Image, Show-o Image Captioning, Show-o Image Inpainting"
+ },
+ {
+ "author": "zyquon",
+ "title": "ComfyUI Stash",
+ "reference": "https://github.com/zyquon/ComfyUI-Stash",
+ "files": [
+ "https://github.com/zyquon/ComfyUI-Stash"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes to use Stash within Comfy workflows"
+ },
+ {
+ "author": "tankenyuen-ola",
+ "title": "comfyui-env-variable-reader [UNSAFE]",
+ "reference": "https://github.com/tankenyuen-ola/comfyui-env-variable-reader",
+ "files": [
+ "https://github.com/tankenyuen-ola/comfyui-env-variable-reader"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Environment Variable Reader [w/Installing this node may expose environment variables that contain sensitive information such as API keys.]"
+ },
+ {
+ "author": "ftf001-tech",
+ "title": "ComfyUI-Lucian [WIP]",
+ "reference": "https://github.com/ftf001-tech/ComfyUI-ExternalLLMDetector",
+ "files": [
+ "https://github.com/ftf001-tech/ComfyUI-ExternalLLMDetector"
+ ],
+ "install_type": "git-clone",
+ "description": "These nodes allow you to configure LLM API connections, send images with custom prompts, and convert the LLM's JSON bounding box responses into a format compatible with segmentation nodes like SAM2\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "LucianGnn",
+ "title": "ComfyUI-Lucian [WIP]",
+ "reference": "https://github.com/LucianGnn/ComfyUI-Lucian",
+ "files": [
+ "https://github.com/LucianGnn/ComfyUI-Lucian"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Audio Duration Calculator\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "akatz-ai",
+ "title": "ComfyUI-Execution-Inversion",
+ "reference": "https://github.com/akatz-ai/ComfyUI-Execution-Inversion",
+ "files": [
+ "https://github.com/akatz-ai/ComfyUI-Execution-Inversion"
+ ],
+ "install_type": "git-clone",
+ "description": "Contains nodes related to the new execution inversion engine in ComfyUI. nodepack originally from [a/https://github.com/BadCafeCode/execution-inversion-demo-comfyui](https://github.com/BadCafeCode/execution-inversion-demo-comfyui)"
+ },
+ {
+ "author": "mamorett",
+ "title": "comfyui_minicpm_vision",
+ "reference": "https://github.com/mamorett/comfyui_minicpm_vision",
+ "files": [
+ "https://github.com/mamorett/comfyui_minicpm_vision"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: MiniCPM Vision GGUF"
+ },
+ {
+ "author": "BigStationW",
+ "title": "flowmatch_scheduler-comfyui",
+ "reference": "https://github.com/BigStationW/flowmatch_scheduler-comfyui",
+ "files": [
+ "https://github.com/BigStationW/flowmatch_scheduler-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: FlowMatchSigmas"
+ },
+ {
+ "author": "franky519",
+ "title": "ComfyUI Face Four Image Matcher [WIP]",
+ "reference": "https://github.com/franky519/comfyui_fnckc_Face_analysis",
+ "files": [
+ "https://github.com/franky519/comfyui_fnckc_Face_analysis"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for four face image matching and face swap control\nNOTE: Invalid pyproject.toml"
+ },
+ {
+ "author": "bleash-dev",
+ "title": "Comfyui-Iddle-Checker",
+ "reference": "https://github.com/bleash-dev/Comfyui-Idle-Checker",
+ "files": [
+ "https://github.com/bleash-dev/Comfyui-Idle-Checker"
+ ],
+ "install_type": "git-clone",
+ "description": "front extension for idle checker"
+ },
+ {
+ "author": "fangg2000",
+ "title": "ComfyUI-StableAudioFG [WIP]",
+ "reference": "https://github.com/fangg2000/ComfyUI-StableAudioFG",
+ "files": [
+ "https://github.com/fangg2000/ComfyUI-StableAudioFG"
+ ],
+ "install_type": "git-clone",
+ "description": "The ComfyUI plugin for stable-audio (supports offline use)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "hdfhssg",
+ "title": "comfyui_EvoSearch [WIP]",
+ "reference": "https://github.com/hdfhssg/comfyui_EvoSearch",
+ "files": [
+ "https://github.com/hdfhssg/comfyui_EvoSearch"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: EvoSearch_FLUX, EvoSearch_SD21, EvoSearch_WAN, EvolutionScheduleGenerator, GuidanceRewardsGenerator"
+ },
+ {
+ "author": "simonjaq",
+ "title": "ComfyUI-sjnodes",
+ "reference": "https://github.com/simonjaq/ComfyUI-sjnodes",
+ "files": [
+ "https://github.com/simonjaq/ComfyUI-sjnodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Some modified ComfyUI custom nodes"
+ },
+ {
+ "author": "A4P7J1N7M05OT",
+ "title": "ComfyUI-VAELoaderSDXLmod",
+ "reference": "https://github.com/A4P7J1N7M05OT/ComfyUI-VAELoaderSDXLmod",
+ "files": [
+ "https://github.com/A4P7J1N7M05OT/ComfyUI-VAELoaderSDXLmod"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Modified SDXL VAE Loader, Empty Latent Image Variable"
+ },
+ {
+ "author": "xzuyn",
+ "title": "xzuynodes-ComfyUI",
+ "reference": "https://github.com/xzuyn/ComfyUI-xzuynodes",
+ "files": [
+ "https://github.com/xzuyn/ComfyUI-xzuynodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: First/Last Frame (XZ), Resize Image (Original KJ), Resize Image (XZ), CLIP Text Encode (XZ), Load CLIP (XZ), TripleCLIPLoader (XZ), WanImageToVideo (XZ)"
+ },
+ {
+ "author": "gilons",
+ "title": "ComfyUI-GoogleDrive-Downloader [UNSAFE]",
+ "reference": "https://github.com/gilons/ComfyUI-GoogleDrive-Downloader",
+ "files": [
+ "https://github.com/gilons/ComfyUI-GoogleDrive-Downloader"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for downloading files from Google Drive.[w/There is a vulnerability that allows saving a remote file to an arbitrary local path.]"
+ },
+ {
+ "author": "moonwhaler",
+ "title": "ComfyUI-FileBrowserAPI [UNSAFE]",
+ "reference": "https://github.com/GalactusX31/ComfyUI-FileBrowserAPI",
+ "files": [
+ "https://github.com/GalactusX31/ComfyUI-FileBrowserAPI"
+ ],
+ "install_type": "git-clone",
+ "description": "A general-purpose, dependency-free File and Folder Browser API for ComfyUI custom nodes.[w/path traversal vulnerability]"
+ },
+ {
+ "author": "DreamsInAutumn",
+ "title": "ComfyUI-Autumn-LLM-Nodes",
+ "reference": "https://github.com/DreamsInAutumn/ComfyUI-Autumn-LLM-Nodes",
+ "files": [
+ "https://github.com/DreamsInAutumn/ComfyUI-Autumn-LLM-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Gemini-Image-To-Prompt, Gemini-Prompt-Builder, LLM-Prompt-Builder"
+ },
+ {
+ "author": "alexgenovese",
+ "title": "ComfyUI-Reica",
+ "reference": "https://github.com/alexgenovese/ComfyUI-Reica",
+ "files": [
+ "https://github.com/alexgenovese/ComfyUI-Reica"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: 'Reica GCP: Read Image', 'Reica GCP: Write Image & Get URL', 'Reica Text Image Display', 'Reica Read Image URL', 'Reica URL Image Loader Filename', 'Reica API: Send HTTP Notification', 'Insert Anything'"
+ },
+ {
+ "author": "yichengup",
+ "title": "ComfyUI-Transition",
+ "reference": "https://github.com/yichengup/ComfyUI-Transition",
+ "files": [
+ "https://github.com/yichengup/ComfyUI-Transition"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Linear Transition, Gradient Transition, Dual Line Transition, Sequence Transition, Circular Transition, Circular Sequence Transition"
+ },
+ {
+ "author": "wildminder",
+ "title": "ComfyUI-MagCache [NAME CONFLICT|WIP]",
+ "reference": "https://github.com/wildminder/ComfyUI-MagCache",
+ "files": [
+ "https://github.com/wildminder/ComfyUI-MagCache"
+ ],
+ "install_type": "git-clone",
+ "description": "official implementation of [zehong-ma/MagCache](https://github.com/zehong-ma/MagCache) for ComfyUI"
+ },
+ {
+ "author": "laubsauger",
+ "title": "ComfyUI Storyboard [WIP]",
+ "reference": "https://github.com/laubsauger/comfyui-storyboard",
+ "files": [
+ "https://github.com/laubsauger/comfyui-storyboard"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node for ComfyUI provides a markdown renderer to display formatted text and notes within your workflow."
+ },
+ {
+ "author": "grokuku",
+ "title": "ComfyUI-Holaf-Terminal [UNSAFE]",
+ "reference": "https://github.com/grokuku/ComfyUI-Holaf-Utilities",
+ "files": [
+ "https://github.com/grokuku/ComfyUI-Holaf-Utilities"
+ ],
+ "install_type": "git-clone",
+ "description": "Interactive Terminal in a node for ComfyUI[w/This custom extension provides a remote web-based shell (terminal) interface to the machine running the ComfyUI server. By installing and using this extension, you are opening a direct, powerful, and potentially dangerous access point to your system.]"
+ },
+ {
+ "author": "usrname0",
+ "title": "ComfyUI-AllergicPack [WIP]",
+ "reference": "https://github.com/usrname0/ComfyUI-AllergicPack",
+ "files": [
+ "https://github.com/usrname0/ComfyUI-AllergicPack"
+ ],
+ "install_type": "git-clone",
+ "description": "This package is not ready for primetime but I'm making it public anyway. If I'm using the node then I'm putting it here. Might make it more official later. Use at your own risk."
+ },
+ {
+ "author": "cesilk10",
+ "title": "cesilk-comfyui-nodes",
+ "reference": "https://github.com/cesilk10/cesilk-comfyui-nodes",
+ "files": [
+ "https://github.com/cesilk10/cesilk-comfyui-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Save and Upload to S3, SDXL Image Sizes"
+ },
+ {
+ "author": "COcisuts",
+ "title": "CObot-ComfyUI-WhisperToTranscription [WIP]",
+ "reference": "https://github.com/COcisuts/CObot-ComfyUI-WhisperToTranscription",
+ "files": [
+ "https://github.com/COcisuts/CObot-ComfyUI-WhisperToTranscription"
+ ],
+ "install_type": "git-clone",
+ "description": "CObot-ComfyUI-WhisperToTranscription\nNOTE: missing requirements.txt"
+ },
+ {
+ "author": "jinchanz",
+ "title": "ComfyUI-AliCloud-Bailian [WIP]",
+ "reference": "https://github.com/jinchanz/ComfyUI-AliCloud-Bailian",
+ "files": [
+ "https://github.com/jinchanz/ComfyUI-AliCloud-Bailian"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a collection of custom nodes for invoking Alibaba Cloud's DashScope API within ComfyUI.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Yukinoshita-Yukinoe",
+ "title": "ComfyUI-KontextOfficialNode",
+ "reference": "https://github.com/Yukinoshita-Yukinoe/ComfyUI-KontextOfficialNode",
+ "files": [
+ "https://github.com/Yukinoshita-Yukinoe/ComfyUI-KontextOfficialNode"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Kontext Text-to-Image (Official Max), Kontext Image Editing (Official Max)"
+ },
+ {
+ "author": "takoyaki1118",
+ "title": "ComfyUI_PromptExtractor",
+ "reference": "https://github.com/takoyaki1118/ComfyUI_PromptExtractor",
+ "files": [
+ "https://github.com/takoyaki1118/ComfyUI_PromptExtractor"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Custom Load Image With Path, Prompt Extractor Node"
+ },
+ {
+ "author": "littleowl",
+ "title": "ComfyUI-MV-HECV",
+ "reference": "https://github.com/littleowl/ComfyUI-MV-HECV",
+ "files": [
+ "https://github.com/littleowl/ComfyUI-MV-HECV"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI export of 3D Videos and Images Compatible with VR / XR, including the AVP."
+ },
+ {
+ "author": "BinglongLi",
+ "title": "ComfyUI_ToolsForAutomask",
+ "reference": "https://github.com/BinglongLi/ComfyUI_ToolsForAutomask",
+ "files": [
+ "https://github.com/BinglongLi/ComfyUI_ToolsForAutomask"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Directional Mask Expansion, Remove Small Regions Mask, Precise Subtract Mask, Precise Add Mask, Closing Mask, Opening Mask, Conditional Mask Selector, Prune Thin Branches Mask, Mask Fill Gaps Convex Hull"
+ },
+ {
+ "author": "strhwste",
+ "title": "CSV Utils [WIP]",
+ "reference": "https://github.com/strhwste/comfyui_csv_utils",
+ "files": [
+ "https://github.com/strhwste/comfyui_csv_utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom CSV handling nodes for ComfyUI\nNOTE: invalid pyproject.toml"
+ },
+ {
+ "author": "retech995",
+ "title": "ComfyUI_SaveImageBulk [UNSAFE]",
+ "reference": "https://github.com/retech995/Save_Florence2_Bulk_Prompts",
+ "files": [
+ "https://github.com/retech995/Save_Florence2_Bulk_Prompts"
+ ],
+ "install_type": "git-clone",
+ "description": "This comfyui node helps save image[w/This nodepack contains a node that can write files to an arbitrary path.]"
+ },
+ {
+ "author": "Oct7",
+ "title": "ComfyUI-LaplaMask",
+ "reference": "https://github.com/Oct7/ComfyUI-LaplaMask",
+ "files": [
+ "https://github.com/Oct7/ComfyUI-LaplaMask"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Blur→Mask"
+ },
+ {
+ "author": "etng",
+ "title": "ComfyUI-Heartbeat [UNSAFE]",
+ "reference": "https://github.com/etng/ComfyUI-Heartbeat",
+ "files": [
+ "https://github.com/etng/ComfyUI-Heartbeat"
+ ],
+ "install_type": "git-clone",
+ "description": "A plugin for ComfyUI that sends periodic heartbeat requests to a configured gateway, including system information and node status."
+ },
+ {
+ "author": "Novavision0313",
+ "title": "ComfyUI-NVVS [WIP]",
+ "reference": "https://github.com/Novavision0313/ComfyUI-NVVS",
+ "files": [
+ "https://github.com/Novavision0313/ComfyUI-NVVS"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI plugin customized by NOVEVISION\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "zackabrams",
+ "title": "ComfyUI-KeySyncWrapper [WIP]",
+ "reference": "https://github.com/zackabrams/ComfyUI-KeySyncWrapper",
+ "files": [
+ "https://github.com/zackabrams/ComfyUI-KeySyncWrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "implementation of KeySync in ComfyUI"
+ },
+ {
+ "author": "godric8",
+ "title": "ComfyUI_Step1X-Edit [NAME CONFLICT]",
+ "reference": "https://github.com/godric8/ComfyUI_Step1X-Edit",
+ "files": [
+ "https://github.com/godric8/ComfyUI_Step1X-Edit"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for Step1X-Edit"
+ },
+ {
+ "author": "violet0927",
+ "title": "ComfyUI-Direct3DS2 [WIP]",
+ "reference": "https://github.com/y4my4my4m/ComfyUI_Direct3DS2",
+ "files": [
+ "https://github.com/y4my4my4m/ComfyUI_Direct3DS2"
+ ],
+ "install_type": "git-clone",
+ "description": "Direct3D-S2 plugin for ComfyUI. [w/Doesn't work yet]"
+ },
+ {
+ "author": "gamtruliar",
+ "title": "ComfyUI-N_SwapInput [UNSAFE]",
+ "reference": "https://github.com/gamtruliar/ComfyUI-N_SwapInput",
+ "files": [
+ "https://github.com/gamtruliar/ComfyUI-N_SwapInput"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a simple tool for swapping input folders with custom suffix in comfy-UI[w/]This nodepack performs deletion operations on local files and contains a vulnerability that allows arbitrary paths to be deleted."
+ },
+ {
+ "author": "bulldog68",
+ "title": "ComfyUI_FMJ [WIP]",
+ "reference": "https://github.com/bulldog68/ComfyUI_FMJ",
+ "files": [
+ "https://github.com/bulldog68/ComfyUI_FMJ"
+ ],
+ "install_type": "git-clone",
+ "description": "Generate random prompts easily for FMJ.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "pictorialink",
+ "title": "comfyui-static-resource[UNSAFE]",
+ "reference": "https://github.com/pictorialink/ComfyUI-static-resource",
+ "files": [
+ "https://github.com/pictorialink/ComfyUI-static-resource"
+ ],
+ "install_type": "git-clone",
+ "description": "Use model bending to push your model beyond its visuals' limits. These nodes allow you to apply transformations to the intemediate densoising steps during sampling, e.g. add, multiplty, scale, rotate, dilate, erode ..etc.[w/This nodepack includes a feature that allows downloading remote files to arbitrary local paths. This is a vulnerability that can lead to Remote Code Execution.]"
+ },
+ {
+ "author": "brace-great",
+ "title": "comfyui-mc [WIP]",
+ "reference": "https://github.com/brace-great/comfyui-mc",
+ "files": [
+ "https://github.com/brace-great/comfyui-mc"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: IncrementCounterOnMatch\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "blueraincoatli",
+ "title": "ComfyModelCleaner [WIP]",
+ "reference": "https://github.com/blueraincoatli/ComfyUI-Model-Cleaner",
+ "files": [
+ "https://github.com/blueraincoatli/ComfyUI-Model-Cleaner"
+ ],
+ "install_type": "git-clone",
+ "description": "This plugin helps identify and clean up unused model files in ComfyUI installations. It analyzes workflows, custom nodes, and model usage to safely identify redundant files."
+ },
+ {
+ "author": "avocadori",
+ "title": "ComfyUI Audio Amplitude Converter [WIP]",
+ "reference": "https://github.com/avocadori/ComfyUI-AudioAmplitudeConverter",
+ "files": [
+ "https://github.com/avocadori/ComfyUI-AudioAmplitudeConverter"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a high-performance custom node for ComfyUI that performs audio amplitude conversion.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "wTechArtist",
+ "title": "ComfyUI_VVL_VideoCamera",
+ "reference": "https://github.com/wTechArtist/ComfyUI_VVL_VideoCamera",
+ "files": [
+ "https://github.com/wTechArtist/ComfyUI_VVL_VideoCamera"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: VVL Video Camera Estimator, VVL Video Frame Extractor"
+ },
+ {
+ "author": "wTechArtist",
+ "title": "ComfyUI_VVL_Segmentation [WIP]",
+ "reference": "https://github.com/wTechArtist/ComfyUI_VVL_Segmentation",
+ "files": [
+ "https://github.com/wTechArtist/ComfyUI_VVL_Segmentation"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: VVL Mask2Former Panoptic (Enhanced), VVL OneFormer Universal Segmentation\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "lum3on",
+ "title": "comfyui_RollingDepth [WIP]",
+ "reference": "https://github.com/lum3on/comfyui_RollingDepth",
+ "files": [
+ "https://github.com/lum3on/comfyui_RollingDepth"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyuI Needs longer to start the first time, because the mode gets downloaded.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "abuzreq",
+ "title": "ComfyUI Model Bending [UNSAFE]",
+ "reference": "https://github.com/abuzreq/ComfyUI-Model-Bending",
+ "files": [
+ "https://github.com/abuzreq/ComfyUI-Model-Bending"
+ ],
+ "install_type": "git-clone",
+ "description": "Use model bending to push your model beyond its visuals' limits. These nodes allow you to apply transformations to the intemediate densoising steps during sampling, e.g. add, multiplty, scale, rotate, dilate, erode ..etc.[w/This nodepack contains a vulnerability that allows remote code execution.]"
+ },
+ {
+ "author": "Stable Diffusion VN",
+ "title": "SDVN Comfy node [UNSAFE]",
+ "id": "SDVN",
+ "reference": "https://github.com/StableDiffusionVN/SDVN_Comfy_node",
+ "files": [
+ "https://github.com/StableDiffusionVN/SDVN_Comfy_node"
+ ],
+ "install_type": "git-clone",
+ "description": "Update IC Lora Layout Support Node[w/This nodepack contains a vulnerability that allows remote code execution.]"
+ },
+ {
+ "author": "Sephrael",
+ "title": "comfyui_caption-around-image",
+ "reference": "https://github.com/Sephrael/comfyui_caption-around-image",
+ "files": [
+ "https://github.com/Sephrael/comfyui_caption-around-image"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: A comfyUI node to create captions around a generated image with the ability to dynamically include generation parameters"
+ },
+ {
+ "author": "yincangshiwei",
+ "title": "ComfyUI-SEQLToolNode",
+ "reference": "https://github.com/yincangshiwei/ComfyUI-SEQLToolNode",
+ "files": [
+ "https://github.com/yincangshiwei/ComfyUI-SEQLToolNode"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: ImageCropAlphaNode (Image), CanvasFusionNode (Image)"
+ },
+ {
+ "author": "gabe-init",
+ "title": "comfyui_ui_render [UNSAFE]",
+ "reference": "https://github.com/gabe-init/comfyui_ui_render",
+ "files": [
+ "https://github.com/gabe-init/comfyui_ui_render"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI HTML Renderer Node - Display rich HTML content within ComfyUI nodes[w/This nodepack contains nodes that potentially have XSS vulnerabilities.]"
+ },
+ {
+ "author": "gabe-init",
+ "title": "ComfyUI LM Studio Node [WIP]",
+ "reference": "https://github.com/gabe-init/ComfyUI-LM-Studio",
+ "files": [
+ "https://github.com/gabe-init/ComfyUI-LM-Studio"
+ ],
+ "install_type": "git-clone",
+ "description": "A powerful ComfyUI custom node that seamlessly integrates LM Studio's local language models into your ComfyUI workflows. This node supports both text-only and multimodal (text + image) inputs, making it perfect for complex AI-driven creative workflows.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "LyazS",
+ "title": "ComfyUI-aznodes",
+ "reference": "https://github.com/LyazS/ComfyUI-aznodes",
+ "files": [
+ "https://github.com/LyazS/ComfyUI-aznodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CrossFadeImageSequence, SaveImageAZ"
+ },
+ {
+ "author": "truebillyblue",
+ "title": "lC.ComfyUI_epistemic_nodes [WIP]",
+ "reference": "https://github.com/truebillyblue/lC.ComfyUI_epistemic_nodes",
+ "files": [
+ "https://github.com/truebillyblue/lC.ComfyUI_epistemic_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: lC L1 Startle, lC L2 FrameClick, lC L3 KeymapClick, lC L4 AnchorClick, lC L5 FieldClick, lC L6 ReflectBoom, lC Epistemic Pipeline (L1-L7), Create PBI (lC), Query PBIs (lC), Update PBI (lC), lC API LLM Agent, lC Web LLM Agent, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "aklevecz",
+ "title": "ComfyUI-AutoPrompt [WIP]",
+ "reference": "https://github.com/aklevecz/ComfyUI-AutoPrompt",
+ "files": [
+ "https://github.com/aklevecz/ComfyUI-AutoPrompt"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Ollama Prompt Generator, Ollama Model Lister, Ollama Chat, Text Display"
+ },
+ {
+ "author": "AlexYez",
+ "title": "ComfyUI Timesaver Nodes",
+ "reference": "https://github.com/AlexYez/comfyui-timesaver",
+ "files": [
+ "https://github.com/AlexYez/comfyui-timesaver"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes from [Timesaver](https://github.com/AlexYez/comfyui-timesaver)."
+ },
+ {
+ "author": "aa-parky",
+ "title": "pipemind-comfyui",
+ "reference": "https://github.com/aa-parky/pipemind-comfyui",
+ "files": [
+ "https://github.com/aa-parky/pipemind-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Random Line from File (Seeded), Keyword Prompt Composer, Simple Prompt Combiner (5x), Boolean Switch (Any), Select Line from TxT (Any), Multiline Text Input, Flux 2M Aspect Ratios, SDXL Aspect Ratios, Room Mapper, ..."
+ },
+ {
+ "author": "pacchikAI",
+ "title": "ImagePromptBatch [UNSAFE]",
+ "reference": "https://github.com/pacchikAI/ImagePromptBatch",
+ "files": [
+ "https://github.com/pacchikAI/ImagePromptBatch"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load Image and Prompt[w/This includes a node that can read the contents of a `.csv` file from an arbitrary path.]"
+ },
+ {
+ "author": "papcorns",
+ "title": "ComfyUI-Papcorns-Node-UploadToGCS",
+ "reference": "https://github.com/papcorns/ComfyUI-Papcorns-Node-UploadToGCS",
+ "files": [
+ "https://github.com/papcorns/ComfyUI-Papcorns-Node-UploadToGCS"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Upload Image To GCS"
+ },
+ {
+ "author": "ZHO-ZHO-ZHO",
+ "title": "Qwen-2.5 in ComfyUI [NAME CONFLICT]",
+ "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen",
+ "files": [
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen"
+ ],
+ "install_type": "git-clone",
+ "description": "Using Qwen-2.5 in ComfyUI"
+ },
+ {
+ "author": "Charonartist",
+ "title": "gabe-init [WIP]",
+ "reference": "https://github.com/gabe-init/ComfyUI-Repo-Eater",
+ "files": [
+ "https://github.com/gabe-init/ComfyUI-Repo-Eater"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node that ingests GitHub repositories and outputs their content as text along with token count.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Charonartist",
+ "title": "ComfyUI-send-eagle-pro",
+ "reference": "https://github.com/Charonartist/ComfyUI-send-eagle-pro_2",
+ "files": [
+ "https://github.com/Charonartist/ComfyUI-send-eagle-pro_2"
+ ],
+ "install_type": "git-clone",
+ "description": "Eagle integration extension node for ComfyUI (Pro version)"
+ },
+ {
+ "author": "Mervent",
+ "title": "comfyui-yaml-prompt",
+ "reference": "https://github.com/Mervent/comfyui-yaml-prompt",
+ "files": [
+ "https://github.com/Mervent/comfyui-yaml-prompt"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: YAMLPromptParser"
+ },
+ {
+ "author": "dhpdong",
+ "title": "ComfyUI-IPAdapter-Flux-Repair",
+ "reference": "https://github.com/dhpdong/ComfyUI-IPAdapter-Flux-Repair",
+ "files": [
+ "https://github.com/dhpdong/ComfyUI-IPAdapter-Flux-Repair"
+ ],
+ "install_type": "git-clone",
+ "description": "The IPAdapter-Flux node may cause some GPU memory to not be properly released during multiple inferences or when alternating between two nodes, eventually leading to a memory overflow. This project addresses and fixes that issue."
+ },
+ {
+ "author": "Mervent",
+ "title": "comfyui-telegram-send",
+ "reference": "https://github.com/Mervent/comfyui-telegram-send",
+ "files": [
+ "https://github.com/Mervent/comfyui-telegram-send"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: TelegramSend, TelegramReply"
+ },
+ {
+ "author": "qlikpetersen",
+ "title": "ComfyUI-AI_Tools [UNSAFE]",
+ "reference": "https://github.com/qlikpetersen/ComfyUI-AI_Tools",
+ "files": [
+ "https://github.com/qlikpetersen/ComfyUI-AI_Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: DoLogin, HttpRequest, Json2String, String2Json, CreateListString, CreateListJSON, Query_OpenAI, Image_Attachment, JSON_Attachment, String_Attachment, RunPython\n[w/This nodepack contains a node with a vulnerability that allows arbitrary code execution.]"
+ },
+ {
+ "author": "MuAIGC",
+ "title": "DMXAPI Nodes [WIP]",
+ "reference": "https://github.com/MuAIGC/ComfyUI-DMXAPI_mmx",
+ "files": [
+ "https://github.com/MuAIGC/ComfyUI-DMXAPI_mmx"
+ ],
+ "install_type": "git-clone",
+ "description": "DMXAPI integration for ComfyUI with Seedream-3.0 text-to-image model\nNOTE: invalid pyproject.toml"
+ },
+ {
+ "author": "Hapseleg",
+ "title": "This n that (Hapse)",
+ "reference": "https://github.com/Hapseleg/ComfyUI-This-n-That",
+ "files": [
+ "https://github.com/Hapseleg/ComfyUI-This-n-That"
+ ],
+ "install_type": "git-clone",
+ "description": "Comfyui custom nodes I use for... This n That..."
+ },
+ {
+ "author": "matDobek",
+ "title": "ComfyUI_duck",
+ "reference": "https://github.com/matDobek/ComfyUI_duck",
+ "files": [
+ "https://github.com/matDobek/ComfyUI_duck"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Combine Images (duck)"
+ },
+ {
+ "author": "usman2003",
+ "title": "ComfyUI-Gender-Classifier",
+ "reference": "https://github.com/usman2003/ComfyUI-Gender-Classifier",
+ "files": [
+ "https://github.com/usman2003/ComfyUI-Gender-Classifier"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Gender Classification"
+ },
+ {
+ "author": "wTechArtist",
+ "title": "ComfyUI_vvl_BBOX",
+ "reference": "https://github.com/wTechArtist/ComfyUI_vvl_BBOX",
+ "files": [
+ "https://github.com/wTechArtist/ComfyUI_vvl_BBOX"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: vvl BBox Input"
+ },
+ {
+ "author": "zhengxyz123",
+ "title": "zhengxyz123/ComfyUI-CLIPSeg [NAME CONFLICT]",
+ "reference": "https://github.com/zhengxyz123/ComfyUI-CLIPSeg",
+ "files": [
+ "https://github.com/zhengxyz123/ComfyUI-CLIPSeg"
+ ],
+ "install_type": "git-clone",
+ "description": "Using CLIPSeg model to generate masks for image inpainting tasks based on text or image prompts."
+ },
+ {
+ "author": "Alazuaka",
+ "title": "ComfyUI Image Analysis Toolkit [WIP]",
+ "reference": "https://github.com/ThatGlennD/ComfyUI-Image-Analysis-Tools",
+ "files": [
+ "https://github.com/ThatGlennD/ComfyUI-Image-Analysis-Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "A suite of custom ComfyUI nodes built to evaluate and diagnose the technical qualities of images—especially those generated by AI models. Rather than creating visuals, these tools measure them, offering precise insights into sharpness, noise, exposure, color balance, and more.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "trampolin",
+ "title": "comfy-ui-scryfall",
+ "reference": "https://github.com/trampolin/comfy-ui-scryfall",
+ "files": [
+ "https://github.com/trampolin/comfy-ui-scryfall"
+ ],
+ "install_type": "git-clone",
+ "description": "Some ComfyUI nodes to fetch cards from scryfall"
+ },
+ {
+ "author": "pomelyu",
+ "title": "cy-prompt-tools",
+ "reference": "https://github.com/pomelyu/cy-prompt-tools",
+ "files": [
+ "https://github.com/pomelyu/cy-prompt-tools"
+ ],
+ "install_type": "git-clone",
+ "description": "prompt tools for comfyui"
+ },
+ {
+ "author": "Alazuaka",
+ "title": "ES_nodes for ComfyUI by Alazuka [WIP]",
+ "reference": "https://github.com/Alazuaka/comfyui-lora-stack-node",
+ "files": [
+ "https://github.com/Alazuaka/comfyui-lora-stack-node"
+ ],
+ "install_type": "git-clone",
+ "description": "Node for LoRA stack management in ComfyUI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "PabloGrant",
+ "title": "comfyui-giraffe-test-panel",
+ "reference": "https://github.com/PabloGrant/comfyui-giraffe-test-panel",
+ "files": [
+ "https://github.com/PabloGrant/comfyui-giraffe-test-panel"
+ ],
+ "install_type": "git-clone",
+ "description": "General-purpose test node. [w/Use at your own risk. No warranties. No guaranteed support or future updates. Feel free to fork, but remember to share in case anyone else can benefit.]"
+ },
+ {
+ "author": "lrzjason",
+ "title": "Comfyui-Condition-Utils [WIP]",
+ "reference": "https://github.com/lrzjason/Comfyui-Condition-Utils",
+ "files": [
+ "https://github.com/lrzjason/Comfyui-Condition-Utils"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of utility nodes for handling condition tensors in ComfyUI."
+ },
+ {
+ "author": "gordon123",
+ "title": "ComfyUI_DreamBoard [WIP]",
+ "reference": "https://github.com/gordon123/ComfyUI_DreamBoard",
+ "files": [
+ "https://github.com/gordon123/ComfyUI_DreamBoard"
+ ],
+ "install_type": "git-clone",
+ "description": "for making storyboard UNDERCONSTRUCTION!"
+ },
+ {
+ "author": "erosDiffusion",
+ "title": "Select key from JSON (Alpha) [UNSAFE]",
+ "reference": "https://github.com/erosDiffusion/ComfyUI-enricos-json-file-load-and-value-selector",
+ "files": [
+ "https://github.com/erosDiffusion/ComfyUI-enricos-json-file-load-and-value-selector"
+ ],
+ "install_type": "git-clone",
+ "description": "this node lists json files in the ComfyUI input folder[w/If this nodepack is installed and the server is running with remote access enabled, it can read the contents of JSON files located in arbitrary paths.]"
+ },
+ {
+ "author": "yichengup",
+ "title": "ComfyUI-YCNodes_Advance",
+ "reference": "https://github.com/yichengup/ComfyUI-YCNodes_Advance",
+ "files": [
+ "https://github.com/yichengup/ComfyUI-YCNodes_Advance"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Face Detector Selector, YC Human Parts Ultra(Advance), Color Match (YC)"
+ },
+ {
+ "author": "maizerrr",
+ "title": "comfyui-code-nodes",
+ "reference": "https://github.com/maizerrr/comfyui-code-nodes",
+ "files": [
+ "https://github.com/maizerrr/comfyui-code-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: BBox Drawer, BBox Parser, Dummy Passthrough Node, Batch Images (up to 5), Mask Editor, OpenAI GPT-Image-1 Node, GhatGPT Node"
+ },
+ {
+ "author": "virallover",
+ "title": "comfyui-virallover",
+ "reference": "https://github.com/virallover/comfyui-virallover",
+ "files": [
+ "https://github.com/virallover/comfyui-virallover"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Download and Load Lora Model Only, Depth Fitter, Brightness Correction, Edge Noise, Feathered Sharpen, Concat Horizontal With Mask"
+ },
+ {
+ "author": "jax-explorer",
+ "title": "ComfyUI-DreamO",
+ "reference": "https://github.com/jax-explorer/ComfyUI-DreamO",
+ "files": [
+ "https://github.com/jax-explorer/ComfyUI-DreamO"
+ ],
+ "install_type": "git-clone",
+ "description": "[a/https://github.com/bytedance/DreamO](https://github.com/bytedance/DreamO]) ComfyUI Warpper"
+ },
+ {
+ "author": "SKBv0",
+ "title": "Retro Engine Node for ComfyUI",
+ "reference": "https://github.com/SKBv0/ComfyUI-RetroEngine",
+ "files": [
+ "https://github.com/SKBv0/ComfyUI-RetroEngine"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node integrates [a/EmulatorJS](https://github.com/EmulatorJS/EmulatorJS) into ComfyUI, allowing you to run retro games and capture their screens for your image generation workflows."
+ },
+ {
+ "author": "brace-great",
+ "title": "comfyui-eim",
+ "reference": "https://github.com/brace-great/comfyui-eim",
+ "files": [
+ "https://github.com/brace-great/comfyui-eim"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: EncryptImage"
+ },
+ {
+ "author": "p1atdev",
+ "title": "comfyui-aesthetic-predictor",
+ "reference": "https://github.com/p1atdev/comfyui-aesthetic-predictor",
+ "files": [
+ "https://github.com/p1atdev/comfyui-aesthetic-predictor"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load Aesthetic Predictor, Predict Aesthetic Score"
+ },
+ {
+ "author": "barakapa",
+ "title": "barakapa-nodes",
+ "reference": "https://github.com/barakapa/barakapa-nodes",
+ "files": [
+ "https://github.com/barakapa/barakapa-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Compare and save unique workflows, count tokens in prompt, and other utility."
+ },
+ {
+ "author": "VictorLopes643",
+ "title": "ComfyUI-Video-Dataset-Tools [WIP]",
+ "reference": "https://github.com/VictorLopes643/ComfyUI-Video-Dataset-Tools",
+ "files": [
+ "https://github.com/VictorLopes643/ComfyUI-Video-Dataset-Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Video Frame Extractor, Image Frame Saver\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "George0726",
+ "title": "ComfyUI-video-accessory [WIP]",
+ "reference": "https://github.com/George0726/ComfyUI-video-accessory",
+ "files": [
+ "https://github.com/George0726/ComfyUI-video-accessory"
+ ],
+ "install_type": "git-clone",
+ "description": "accessory nodes for video generation"
+ },
+ {
+ "author": "bheins",
+ "title": "ComfyUI-glb-to-stl [WIP]",
+ "reference": "https://github.com/maurorilla/ComfyUI-MisterMR-Nodes",
+ "files": [
+ "https://github.com/maurorilla/ComfyUI-MisterMR-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI that add drawing capabilities to your workflow.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "TheJorseman",
+ "title": "IntrinsicCompositingClean-ComfyUI",
+ "reference": "https://github.com/TheJorseman/IntrinsicCompositingClean-ComfyUI",
+ "files": [
+ "https://github.com/TheJorseman/IntrinsicCompositingClean-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: DepthModelLoader, NormalsModelLoader, IntrinsicModelLoader, AlbedoModelLoader, ReshadingModelLoader, ReshadingProcessor, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "bheins",
+ "title": "ComfyUI-glb-to-stl [WIP]",
+ "reference": "https://github.com/bheins/ComfyUI-glb-to-stl",
+ "files": [
+ "https://github.com/bheins/ComfyUI-glb-to-stl"
+ ],
+ "install_type": "git-clone",
+ "description": "GLB conversion to STL node for ComfyUI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Anonymzx",
+ "title": "ComfyUI-Indonesia-TTS [WIP]",
+ "reference": "https://github.com/Anonymzx/ComfyUI-Indonesia-TTS",
+ "files": [
+ "https://github.com/Anonymzx/ComfyUI-Indonesia-TTS"
+ ],
+ "description": "Repositori ini menyediakan integrasi model Text-to-Speech (TTS) Bahasa Indonesia dari Facebook (MMS-TTS-IND) ke dalam ComfyUI, sehingga Anda dapat langsung menyintesis suara berbahasa Indonesia dengan kontrol penuh via antarmuka node-based.\nNOTE: The files in the repo are not organized.",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "3dmindscapper",
+ "title": "ComfyUI-Sam-Mesh [WIP]",
+ "reference": "https://github.com/3dmindscapper/ComfyUI-Sam-Mesh",
+ "files": [
+ "https://github.com/3dmindscapper/ComfyUI-Sam-Mesh"
+ ],
+ "install_type": "git-clone",
+ "description": "comfyui implementation of SaMesh segmentation of 3d meshes\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-run-js [UNSAFE]",
+ "reference": "https://github.com/shinich39/comfyui-run-js",
+ "files": [
+ "https://github.com/shinich39/comfyui-run-js"
+ ],
+ "description": "Manipulate workflow via javascript on node.",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "fangg2000",
+ "title": "ComfyUI-SenseVoice [WIP]",
+ "reference": "https://github.com/fangg2000/ComfyUI-SenseVoice",
+ "files": [
+ "https://github.com/fangg2000/ComfyUI-SenseVoice"
+ ],
+ "description": "A comfyui node plug-in developed based on the SenseVoise project, and a simple recording node.\nNOTE: The files in the repo are not organized.",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "risunobushi",
+ "title": "ComfyUI_FaceMesh_Eyewear_Mask",
+ "reference": "https://github.com/risunobushi/ComfyUI_FaceMesh_Eyewear_Mask",
+ "files": [
+ "https://github.com/risunobushi/ComfyUI_FaceMesh_Eyewear_Mask"
+ ],
+ "description": "NODES: Face Mesh Eyewear Mask, MediaPipe Face to Mask, OpenPose Eyewear Mask (DWPose), Mask From Facial Keypoints",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "machinesarenotpeople",
+ "title": "comfyui-energycost",
+ "reference": "https://github.com/machinesarenotpeople/comfyui-energycost",
+ "files": [
+ "https://github.com/machinesarenotpeople/comfyui-energycost"
+ ],
+ "description": "NODES: Energy Cost Timer, Energy Cost Calculator",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "xqqe",
+ "title": "honey_nodes [WIP]",
+ "reference": "https://github.com/xqqe/honey_nodes",
+ "files": [
+ "https://github.com/xqqe/honey_nodes"
+ ],
+ "description": "honey nodes for comfyui\nNOTE: The files in the repo are not organized.",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "Raidez",
+ "title": "Kuniklo Collection",
+ "reference": "https://github.com/Raidez/comfyui-kuniklo-collection",
+ "files": [
+ "https://github.com/Raidez/comfyui-kuniklo-collection"
+ ],
+ "description": "NODES: Properties, Apply SVG to Image",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "Kur0butiMegane",
+ "title": "Comfyui-StringUtils",
+ "reference": "https://github.com/Kur0butiMegane/Comfyui-StringUtils2",
+ "files": [
+ "https://github.com/Kur0butiMegane/Comfyui-StringUtils2"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Normalizer, Splitter, Selector, XML Parser, XML Parser, Make Property, Add XML Tag, Is String Empty, Cond Passthrough, CLIP Passthrough, ClipRegion Passthrough, Scheduler Selector (Impact), Scheduler Selector (Inspire), Save Text, XML to Cutoff"
+ },
+ {
+ "author": "ronaldstg",
+ "title": "comfyui-plus-integrations [WIP]",
+ "reference": "https://github.com/ronalds-eu/comfyui-plus-integrations",
+ "files": [
+ "https://github.com/ronalds-eu/comfyui-plus-integrations"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Image Pass Through, Upload Image to S3\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "kevin314",
+ "title": "ComfyUI-FastVideo",
+ "reference": "https://github.com/kevin314/ComfyUI-FastVideo",
+ "files": [
+ "https://github.com/kevin314/ComfyUI-FastVideo"
+ ],
+ "description": "NODES: Video Generator, Inference Args, VAE Config, Text Encoder Config, DIT Config",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "benda1989",
+ "title": "Comfyui lama remover [WIP]",
+ "reference": "https://github.com/benda1989/WaterMarkRemover_ComfyUI",
+ "files": [
+ "https://github.com/benda1989/WaterMarkRemover_ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "A very simple ComfyUI node to remove item like image/video with mask watermark\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "3dmindscapper",
+ "title": "ComfyUI-PartField [WIP]",
+ "reference": "https://github.com/3dmindscapper/ComfyUI-PartField",
+ "files": [
+ "https://github.com/3dmindscapper/ComfyUI-PartField"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI implementation of the partfield nvidea segmentation models\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "silveroxides",
+ "title": "ComfyUI_ReduxEmbedToolkit",
+ "reference": "https://github.com/silveroxides/ComfyUI_ReduxEmbedToolkit",
+ "files": [
+ "https://github.com/silveroxides/ComfyUI_ReduxEmbedToolkit"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for managing, saving and loading of Redux/Style based embeddings."
+ },
+ {
+ "author": "StaffsGull",
+ "title": "comfyui_scene_builder [WIP]",
+ "reference": "https://github.com/StaffsGull/comfyui_scene_builder",
+ "files": [
+ "https://github.com/StaffsGull/comfyui_scene_builder"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CharacterBuilderNode, ClothingItemNode, ClothingMergerNode, EnvironmentBuilderNode, MergeCharactersNode, PhotoStyleBuilderNode, SceneCombinerNode\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "gagaprince",
+ "title": "ComfyUI_gaga_utils",
+ "reference": "https://github.com/gagaprince/ComfyUI_gaga_utils",
+ "files": [
+ "https://github.com/gagaprince/ComfyUI_gaga_utils"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: GagaGetFileList, GagaGetStringListSize, GagaSplitStringToList, GagaTest, GagaBatchStringReplace"
+ },
+ {
+ "author": "ftechmax",
+ "title": "ComfyUI-NovaKit-Pack",
+ "reference": "https://github.com/ftechmax/ComfyUI-NovaKit-Pack",
+ "files": [
+ "https://github.com/ftechmax/ComfyUI-NovaKit-Pack"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Count Tokens"
+ },
+ {
+ "author": "jtydhr88",
+ "title": "ComfyUI Frontend Vue Basic [WIP]",
+ "reference": "https://github.com/jtydhr88/ComfyUI_frontend_vue_basic",
+ "files": [
+ "https://github.com/jtydhr88/ComfyUI_frontend_vue_basic"
+ ],
+ "install_type": "git-clone",
+ "description": "A demonstration custom node that showcases how to integrate Vue as a frontend framework within ComfyUI, complete with PrimeVue components and vue-i18n support."
+ },
+ {
+ "author": "silent-rain",
+ "title": "ComfyUI-SilentRain",
+ "reference": "https://github.com/silent-rain/ComfyUI-SilentRain",
+ "files": [
+ "https://github.com/silent-rain/ComfyUI-SilentRain"
+ ],
+ "install_type": "git-clone",
+ "description": "Ecological extension of comfyui using Rust language."
+ },
+ {
+ "author": "EricRollei",
+ "title": "Comfy-Metadata-System [WIP]",
+ "reference": "https://github.com/EricRollei/Comfy-Metadata-System",
+ "files": [
+ "https://github.com/EricRollei/Comfy-Metadata-System"
+ ],
+ "install_type": "git-clone",
+ "description": "Series of custom Comfyui Nodes that collects and saves metadata to embedded (png, jpg) as well as optional xmp and txt sidecars and database"
+ },
+ {
+ "author": "turskeli",
+ "title": "comfyui-SetWallpaper",
+ "reference": "https://github.com/turskeli/comfyui-SetWallpaper",
+ "files": [
+ "https://github.com/turskeli/comfyui-SetWallpaper"
+ ],
+ "install_type": "git-clone",
+ "description": "Simple wallpaper node for ComfyUI. Curently only supports Windows OS"
+ },
+ {
+ "author": "Sophylax",
+ "title": "ComfyUI-ReferenceMerge",
+ "reference": "https://github.com/Sophylax/ComfyUI-ReferenceMerge",
+ "files": [
+ "https://github.com/Sophylax/ComfyUI-ReferenceMerge"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Combine Images and Mask, Restitch Combined Crop"
+ },
+ {
+ "author": "bandido37",
+ "title": "Kaggle ComfyUI Local Save Node [WIP]",
+ "reference": "https://github.com/bandido37/comfyui-kaggle-local-save",
+ "files": [
+ "https://github.com/bandido37/comfyui-kaggle-local-save"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node for ComfyUI allows you to save generated images directly to your local PC instead of Kaggle's cloud output folder.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "springjk",
+ "title": "Psutil Container Memory Patch",
+ "reference": "https://github.com/springjk/ComfyUI-Psutil-Container-Memory-Patch",
+ "files": [
+ "https://github.com/springjk/ComfyUI-Psutil-Container-Memory-Patch"
+ ],
+ "install_type": "git-clone",
+ "description": "Make ComfyUI get correct memory information in the container (psutil monkey path)"
+ },
+ {
+ "author": "songtianhui",
+ "title": "ComfyUI-DMM [WIP]",
+ "reference": "https://github.com/songtianhui/ComfyUI-DMM",
+ "files": [
+ "https://github.com/songtianhui/ComfyUI-DMM"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: DMMLoader, DMMApply"
+ },
+ {
+ "author": "leon-etienne",
+ "title": "ComfyUI_Scoring-Nodes",
+ "reference": "https://github.com/leon-etienne/ComfyUI_Scoring-Nodes",
+ "files": [
+ "https://github.com/leon-etienne/ComfyUI_Scoring-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Text Similarity (CLIP), Image Similarity (CLIP), Multi Text→Image Similarity, Multi Image→Text Similarity, Aesthetic Score, Multi Aesthetic Comparison"
+ },
+ {
+ "author": "tanmoy-it",
+ "title": "comfyuiCustomNode",
+ "reference": "https://github.com/tanmoy-it/comfyuiCustomNode",
+ "files": [
+ "https://github.com/tanmoy-it/comfyuiCustomNode"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Download Image (Direct/No Save)"
+ },
+ {
+ "author": "Jingwen-genies",
+ "title": "comfyui-genies-nodes",
+ "reference": "https://github.com/Jingwen-genies/comfyui-genies-nodes",
+ "files": [
+ "https://github.com/Jingwen-genies/comfyui-genies-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Genies Pose Estimation, Genies Scale Face by Keypoints, Get V Channel from HSV, Select RGB by Mask"
+ },
+ {
+ "author": "Tawbaware",
+ "title": "ComfyUI-Tawbaware [WIP]",
+ "reference": "https://github.com/Tawbaware/ComfyUI-Tawbaware",
+ "files": [
+ "https://github.com/Tawbaware/ComfyUI-Tawbaware"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "lucafoscili",
+ "title": "LF Nodes [UNSAFE]",
+ "reference": "https://github.com/lucafoscili/lf-nodes",
+ "files": [
+ "https://github.com/lucafoscili/lf-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes with a touch of extra UX, including: history for primitives, JSON manipulation, logic switches with visual feedback, LLM chat... and more!\n[w/This nodepack contains a node with a vulnerability that allows arbitrary code execution.]"
+ },
+ {
+ "author": "jerryname2022",
+ "title": "ComfyUI-Real-ESRGAN [WIP]",
+ "reference": "https://github.com/jerryname2022/ComfyUI-Real-ESRGAN",
+ "files": [
+ "https://github.com/jerryname2022/ComfyUI-Real-ESRGAN"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Real-ESRGAN Model Loader, GFPGAN Model Loader, Real-ESRGAN Image Generator, GFPGAN Image Generator"
+ },
+ {
+ "author": "mm-akhtar",
+ "title": "comfyui-mask-selector-node",
+ "reference": "https://github.com/mm-akhtar/comfyui-mask-selector-node",
+ "files": [
+ "https://github.com/mm-akhtar/comfyui-mask-selector-node"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Mask Selector"
+ },
+ {
+ "author": "ryanontheinside",
+ "title": "ComfyUI-Livepeer [WIP]",
+ "reference": "https://github.com/ryanontheinside/ComfyUI-Livepeer",
+ "files": [
+ "https://github.com/ryanontheinside/ComfyUI-Livepeer"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI extension that provides integration with [a/Livepeer](https://livepeer.org/)'s AI services allowing for both sync and async generation."
+ },
+ {
+ "author": "newraina",
+ "title": "ComfyUI-Remote-Save-Image [UNSAFE]",
+ "reference": "https://github.com/newraina/ComfyUI-Remote-Save-Image",
+ "files": [
+ "https://github.com/newraina/ComfyUI-Remote-Save-Image"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that allows uploading generated images to any HTTP endpoint.[w/This node allows any users to send any locally stored image to a specified URL.]"
+ },
+ {
+ "author": "SXQBW",
+ "title": "ComfyUI-Qwen-VLM [WIP]",
+ "reference": "https://github.com/SXQBW/ComfyUI-Qwen3",
+ "files": [
+ "https://github.com/SXQBW/ComfyUI-Qwen3"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: QwenVLM"
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI-FramePackWrapper [WIP]",
+ "reference": "https://github.com/kijai/ComfyUI-FramePackWrapper",
+ "files": [
+ "https://github.com/kijai/ComfyUI-FramePackWrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Wrapper for FramePack by lllyasviel"
+ },
+ {
+ "author": "WaiyanLing",
+ "title": "ComfyUI-Tracking [WIP]",
+ "reference": "https://github.com/WaiyanLing/ComfyUI-Tracking",
+ "files": [
+ "https://github.com/WaiyanLing/ComfyUI-Tracking"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI-Tracking This nodepack helps to conveniently collect invocation data from workflows for further study.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "vladp0727",
+ "title": "ComfyUI Simple Image Tools [WIP]",
+ "reference": "https://github.com/vladp0727/Comfyui-with-Furniture",
+ "files": [
+ "https://github.com/vladp0727/Comfyui-with-Furniture"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Get Mask From Alpha, Get Quadrilateral Outfit\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ryanontheinside",
+ "title": "ComfyUI MineWorld Nodes [WIP]",
+ "reference": "https://github.com/ryanontheinside/ComfyUI-MineWorld",
+ "files": [
+ "https://github.com/ryanontheinside/ComfyUI-MineWorld"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension integrates Microsoft's MineWorld - an interactive world model for Minecraft - into ComfyUI.\nMineWorld allows you to generate interactive Minecraft gameplay based on actions you provide, creating realistic Minecraft gameplay videos."
+ },
+ {
+ "author": "SanDiegoDude",
+ "title": "HiDreamSampler for ComfyUI [WIP]",
+ "reference": "https://github.com/SanDiegoDude/ComfyUI-HiDream-Sampler",
+ "files": [
+ "https://github.com/SanDiegoDude/ComfyUI-HiDream-Sampler"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node for generating images using the HiDream AI model.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ZenAI-Vietnam",
+ "title": "ComfyUI_InfiniteYou [NAME CONFLICT]",
+ "reference": "https://github.com/ZenAI-Vietnam/ComfyUI_InfiniteYou",
+ "files": [
+ "https://github.com/ZenAI-Vietnam/ComfyUI_InfiniteYou"
+ ],
+ "install_type": "git-clone",
+ "description": "An implementation of InfiniteYou for ComfyUI. Native support for [a/InfiniteYou](https://github.com/bytedance/InfiniteYou) in ComfyUI, designed by the ZenAI team."
+ },
+ {
+ "author": "filipemeneses",
+ "title": "ComfyUI_html [UNSAFE]",
+ "reference": "https://github.com/filipemeneses/ComfyUI_html",
+ "files": [
+ "https://github.com/filipemeneses/ComfyUI_html"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes to manipulate HTML.[w/This extension poses a risk of XSS vulnerability.]"
+ },
+ {
+ "author": "m-ai-studio",
+ "title": "mai-prompt-progress",
+ "reference": "https://github.com/m-ai-studio/mai-prompt-progress",
+ "files": [
+ "https://github.com/m-ai-studio/mai-prompt-progress"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI extensions for sending prompt progress to webhook"
+ },
+ {
+ "author": "ashllay",
+ "title": "ComfyUI_MoreComfy",
+ "reference": "https://github.com/ashllay/ComfyUI_MoreComfy",
+ "files": [
+ "https://github.com/ashllay/ComfyUI_MoreComfy"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: MC Switch Seed/Image/Latent/Model/String, MC Alter Seed, MC Set Tile Size, MC Get Image Size, MC Multi Concat"
+ },
+ {
+ "author": "gordon1chuge2623",
+ "title": "ComfyUI_seal_migration [WIP]",
+ "reference": "https://github.com/chuge26/ComfyUI_seal_migration",
+ "files": [
+ "https://github.com/chuge26/ComfyUI_seal_migration"
+ ],
+ "install_type": "git-clone",
+ "description": "This project implements stamp migration in PDF files based on ComfyUI, allowing stamps from specified pages of a source PDF to be transferred to specified pages of a target PDF.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "gordon123",
+ "title": "ComfyUI_srt2speech [WIP]",
+ "reference": "https://github.com/gordon123/ComfyUI_srt2speech",
+ "files": [
+ "https://github.com/gordon123/ComfyUI_srt2speech"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI_srt2speech"
+ },
+ {
+ "author": "hnmr293",
+ "title": "ComfyUI-SamOne - one-step sampling",
+ "reference": "https://github.com/hnmr293/ComfyUI-SamOne",
+ "files": [
+ "https://github.com/hnmr293/ComfyUI-SamOne"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a node that advances sampling by just one step in ComfyUI."
+ },
+ {
+ "author": "rphmeier",
+ "title": "comfyui-videodepthanything",
+ "reference": "https://github.com/rphmeier/comfyui-videodepthanything",
+ "files": [
+ "https://github.com/rphmeier/comfyui-videodepthanything"
+ ],
+ "install_type": "git-clone",
+ "description": "VideoDepthAnything nodes for ComfyUI"
+ },
+ {
+ "author": "benmizrahi",
+ "title": "ComfyGCS [WIP]",
+ "reference": "https://github.com/benmizrahi/ComfyGCS",
+ "files": [
+ "https://github.com/benmizrahi/ComfyGCS"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyGCS is a robust read/write plugin for Google Cloud Storage, designed to simplify interaction with GCS buckets in your projects.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "dogcomplex",
+ "title": "ComfyUI-LOKI [WIP]",
+ "reference": "https://github.com/dogcomplex/ComfyUI-LOKI",
+ "files": [
+ "https://github.com/dogcomplex/ComfyUI-LOKI"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Glamour\nNOTE: This nodepack installs pip dependencies outside the control of ComfyUI-Manager."
+ },
+ {
+ "author": "hunzmusic",
+ "title": "Comfyui-CraftsMan3DWrapper [WIP]",
+ "reference": "https://github.com/hunzmusic/Comfyui-CraftsMan3DWrapper",
+ "files": [
+ "https://github.com/hunzmusic/Comfyui-CraftsMan3DWrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "A wrapper for CraftsMan\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Slix-M-Lestragg",
+ "title": "comfyui-enhanced [WIP]",
+ "reference": "https://github.com/Slix-M-Lestragg/comfyui-enhanced",
+ "files": [
+ "https://github.com/Slix-M-Lestragg/comfyui-enhanced"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of enhanced nodes for ComfyUI that provide powerful additional functionality to your workflows.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "tzsoulcap",
+ "title": "ComfyUI-SaveImg-W-MetaData",
+ "reference": "https://github.com/tzsoulcap/ComfyUI-SaveImg-W-MetaData",
+ "files": [
+ "https://github.com/tzsoulcap/ComfyUI-SaveImg-W-MetaData"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CAP Checkpoint Selector, CAP Save Image w/Metadata, CAP Load Image with Metadata, CAP Tag Image, CAP Sampler Selector, CAP Scheduler Selector, CAP Seed Generator, CAP String Literal, CAP Width/Height Literal, CAP Cfg Literal, CAP Int Literal"
+ },
+ {
+ "author": "hylarucoder",
+ "title": "comfyui-copilot",
+ "reference": "https://github.com/hylarucoder/comfyui-copilot",
+ "files": [
+ "https://github.com/hylarucoder/comfyui-copilot"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Eagle Image Node for PNGInfo, SDXL Resolution Presets (ws), SDXL Prompt Styler, SDXL Prompt Styler Advanced"
+ },
+ {
+ "author": "AlejandroTuzzi",
+ "title": "TUZZI-ByPass [WIP]",
+ "reference": "https://github.com/AlejandroTuzzi/TUZZI-ByPass",
+ "files": [
+ "https://github.com/AlejandroTuzzi/TUZZI-ByPass"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for automated AI pipelines\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "oxysoft",
+ "title": "Comfy-Compel",
+ "reference": "https://github.com/oxysoft/Comfy-Compel",
+ "files": [
+ "https://github.com/oxysoft/Comfy-Compel"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CLIP Embed (Compel)"
+ },
+ {
+ "author": "QingLuanWithoutHeart",
+ "title": "ComfyUI File/Image Utils Nodes [UNSAFE]",
+ "reference": "https://github.com/QingLuanWithoutHeart/comfyui-file-image-utils",
+ "files": [
+ "https://github.com/QingLuanWithoutHeart/comfyui-file-image-utils"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node set provides useful utilities for file operations and image loading in ComfyUI."
+ },
+ {
+ "author": "pmarmotte2",
+ "title": "VibeVoiceSelector [WIP]",
+ "reference": "https://github.com/pmarmotte2/Comfyui-VibeVoiceSelector",
+ "files": [
+ "https://github.com/pmarmotte2/Comfyui-VibeVoiceSelector"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Vibe Voice Selector"
+ },
+ {
+ "author": "Temult",
+ "title": "TWanVideoSigmaSampler: EXPERIMENTAL [WIP]",
+ "reference": "https://github.com/Temult/TWanSigmaSampler",
+ "files": [
+ "https://github.com/Temult/TWanSigmaSampler"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node that modifies the WanVideoSampler to accept an external sigma schedule. Allows for customized and non-standard noise schedules in Wan 2.1 video generation workflow.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "wordbrew",
+ "title": "WAN Control Nodes for ComfyUI [WIP]",
+ "reference": "https://github.com/wordbrew/comfyui-wan-control-nodes",
+ "files": [
+ "https://github.com/wordbrew/comfyui-wan-control-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "This pack provides enhanced control nodes for working with Wan video models in ComfyUI. It is under active development and may change regularly, or may not. Depends entirely on my free time and waning interest. Please don't come to rely on it for anything, but you are welcome to improve on it.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "techtruth",
+ "title": "ComfyUI-Dreambooth",
+ "reference": "https://github.com/techtruth/ComfyUI-Dreambooth",
+ "files": [
+ "https://github.com/techtruth/ComfyUI-Dreambooth"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Dreambooth Trainer"
+ },
+ {
+ "author": "438443467",
+ "title": "ComfyUI-SanMian-Nodes",
+ "reference": "https://github.com/438443467/ComfyUI-SanMian-Nodes",
+ "files": [
+ "https://github.com/438443467/ComfyUI-SanMian-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Add Text To Image, Adjust Hex Brightness, Adjust Transparency By Mask, Align Images with Mask, Align Restore Json, Binarize Mask, Blend ICLight, ..."
+ },
+ {
+ "author": "alexgenovese",
+ "title": "ComfyUI-Reica",
+ "reference": "https://github.com/alexgenovese/ComfyUI-Reica",
+ "files": [
+ "https://github.com/alexgenovese/ComfyUI-Reica"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Reica Text Image Display, Flux Image Generator, Reica GCP: Read Image, Reica GCP: Write Image & Get URL, Reica API: Send HTTP Notification"
+ },
+ {
+ "author": "Stable-X",
+ "title": "ComfyUI-Hi3DGen",
+ "reference": "https://github.com/Stable-X/ComfyUI-Hi3DGen",
+ "files": [
+ "https://github.com/Stable-X/ComfyUI-Hi3DGen"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension integrates [a/Hi3DGen](https://github.com/Stable-X/Hi3DGen) into ComfyUI, allowing user to generate high-fidelity 3D geometry generation from Images.[w/If the *sageattention* package is installed, this nodepack causes problems.]"
+ },
+ {
+ "author": "stiffy-committee",
+ "title": "comfyui-stiffy-nodes",
+ "reference": "https://github.com/V-woodpecker-V/comfyui-stiffy-nodes",
+ "files": [
+ "https://github.com/V-woodpecker-V/comfyui-stiffy-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: StiffyPrompter, StiffyPersistentPrompter, StiffyDecoder, StiffyDebugger, ..."
+ },
+ {
+ "author": "chetusangolgi",
+ "title": "Comfyui-supabase",
+ "reference": "https://github.com/chetusangolgi/Comfyui-supabase",
+ "files": [
+ "https://github.com/chetusangolgi/Comfyui-supabase"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Watch Supabase Bucket, Upload Image to Supabase"
+ },
+ {
+ "author": "rickyars",
+ "title": "sd-cn-animation",
+ "reference": "https://github.com/rickyars/sd-cn-animation",
+ "files": [
+ "https://github.com/rickyars/sd-cn-animation"
+ ],
+ "install_type": "git-clone",
+ "description": "SD-CN animation for Comfyui"
+ },
+ {
+ "author": "daracazamea",
+ "title": "DCNodess [WIP]",
+ "reference": "https://github.com/daracazamea/comfyUI-DCNodes",
+ "files": [
+ "https://github.com/daracazamea/comfyUI-DCNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Start Timer (Pass-Through), Get Generation Time, Manual Trigger, Flux: Resolution Picker, SDXL: Resolution Picker\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "hunzmusic",
+ "title": "ComfyUI-Hunyuan3DTools [WIP]",
+ "reference": "https://github.com/hunzmusic/ComfyUI-Hunyuan3DTools",
+ "files": [
+ "https://github.com/hunzmusic/ComfyUI-Hunyuan3DTools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Hy3DTools Render Specific View, Hy3DTools Back-Project Inpaint\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "grokuku",
+ "title": "Holaf Custom Nodes for ComfyUI",
+ "reference": "https://github.com/grokuku/ComfyUI-Holaf",
+ "files": [
+ "https://github.com/grokuku/ComfyUI-Holaf"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Neurogrid Overload, Tile Calculator, Slice Calculator, Save Image, Tiled KSampler, KSampler, Image Comparer, Upscale, Overlay, Resolution Preset, Benchmark Runner, Benchmark Plotter, Benchmark Loader"
+ },
+ {
+ "author": "Burgstall-labs",
+ "title": "ComfyUI-BS_FalAi-API-Video [WIP]",
+ "reference": "https://github.com/Burgstall-labs/ComfyUI-BS_FalAi-API-Video",
+ "files": [
+ "https://github.com/Burgstall-labs/ComfyUI-BS_FalAi-API-Video"
+ ],
+ "install_type": "git-clone",
+ "description": "Experimental ComfyUI Custom Node for generating videos using various FAL AI API endpoints.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "uauaouau",
+ "title": "Mycraft [WIP]",
+ "reference": "https://github.com/sorption-dev/mycraft-comfyui",
+ "files": [
+ "https://github.com/sorption-dev/mycraft-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Mycraft provides a limitless storyboard experience for image generation, powered by the ComfyUI API.\nEach container functions as an independent ComfyUI workflow, Supports workflows (text-to-text) and fine-tuning (image-to-image), Supports workflow customization."
+ },
+ {
+ "author": "zhaorishuai",
+ "title": "ComfyUI-StoryboardDistributor",
+ "reference": "https://github.com/zhaorishuai/ComfyUI-StoryboardDistributor",
+ "files": [
+ "https://github.com/zhaorishuai/ComfyUI-StoryboardDistributor"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI plugin that automatically assigns storyboard content to 9 storyboard nodes."
+ },
+ {
+ "author": "alexgenovese",
+ "title": "ComfyUI-Diffusion-4k [WIP]",
+ "reference": "https://github.com/alexgenovese/ComfyUI-Diffusion-4k",
+ "files": [
+ "https://github.com/alexgenovese/ComfyUI-Diffusion-4k"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node implementation of the Diffusion 4K research paper.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "KERRY-YUAN",
+ "title": "Python_Executor [UNSAFE]",
+ "id": "PythonExecutor",
+ "reference": "https://github.com/KERRY-YUAN/ComfyUI_Python_Executor",
+ "files": [
+ "https://github.com/KERRY-YUAN/ComfyUI_Python_Executor"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: Provides nodes to execute arbitrary Python code snippets and Resize images directly within ComfyUI workflows. [w/This node allows you to execute arbitrary code via the workflow.]"
+ },
+ {
+ "author": "ashllay",
+ "title": "ComfyUI_MoreComfy",
+ "reference": "https://github.com/ashllay/ComfyUI_MoreComfy",
+ "files": [
+ "https://github.com/ashllay/ComfyUI_MoreComfy"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: MC Switch Seed, MC Alter Seed, MC Set Tile Size, MC Multi Concat"
+ },
+ {
+ "author": "ayaoayaoayaoaya",
+ "title": "ComfyUI-KLUT-DeepSeek-API [WIP]",
+ "reference": "https://github.com/ayaoayaoayaoaya/ComfyUI-KLUT-DeepSeek-API",
+ "files": [
+ "https://github.com/ayaoayaoayaoaya/ComfyUI-KLUT-DeepSeek-API"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of utility / quality-of-life nodes for ComfyUI. Probably only useful to me.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "olyyarm",
+ "title": "ComfyUI-VLMStudio",
+ "reference": "https://github.com/KurtHokke/ComfyUI_KurtHokke_Nodes",
+ "files": [
+ "https://github.com/KurtHokke/ComfyUI_KurtHokke_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Node_BOOL/INT/Float, BooleanToPipe, BooleanFromPipe, ExpMath, ExpMathDual/Quad, ...."
+ },
+ {
+ "author": "olyyarm",
+ "title": "ComfyUI-VLMStudio",
+ "reference": "https://github.com/olyyarm/ComfyUI-VLMStudio",
+ "files": [
+ "https://raw.githubusercontent.com/olyyarm/ComfyUI-VLMStudio/refs/heads/master/vlm_visionary_node_v3_.py"
+ ],
+ "install_type": "copy",
+ "description": "NODES: GemmaMultimodalAnalyzer"
+ },
+ {
+ "author": "apetitbois",
+ "title": "nova_utils",
+ "reference": "https://github.com/apetitbois/nova_utils",
+ "files": [
+ "https://github.com/apetitbois/nova_utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Nova utils for ComfyUI"
+ },
+ {
+ "author": "sugarkwork",
+ "title": "comfyui_my_img_util",
+ "reference": "https://github.com/sugarkwork/comfyui_my_img_util",
+ "files": [
+ "https://github.com/sugarkwork/comfyui_my_img_util"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Simple Image Rotate"
+ },
+ {
+ "author": "sugarkwork",
+ "title": "comfyui-trtools",
+ "reference": "https://github.com/sugarkwork/comfyui-trtools",
+ "files": [
+ "https://github.com/sugarkwork/comfyui-trtools"
+ ],
+ "install_type": "git-clone",
+ "description": "TensorRT Tools for ComfyUI"
+ },
+ {
+ "author": "DonutsDelivery",
+ "title": "ComfyUI-DonutDetailer",
+ "reference": "https://github.com/DonutsDelivery/ComfyUI-DonutNodes",
+ "files": [
+ "https://github.com/DonutsDelivery/ComfyUI-DonutNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "This is an experimental node I made to mimick the 'adjust' in A1111 Supermerger [a/https://github.com/hako-mikan/sd-webui-supermerger?tab=readme-ov-file#adjust](https://github.com/hako-mikan/sd-webui-supermerger?tab=readme-ov-file#adjust)."
+ },
+ {
+ "author": "ZenAI-Vietnam",
+ "title": "ComfyUI-gemini-IG",
+ "reference": "https://github.com/ZenAI-Vietnam/ComfyUI-gemini-IG",
+ "files": [
+ "https://github.com/ZenAI-Vietnam/ComfyUI-gemini-IG"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Gemini Image Generation, Gemini Text Generation"
+ },
+ {
+ "author": "hunzmusic",
+ "title": "comfyui-hnznodes",
+ "reference": "https://github.com/hunzmusic/comfyui-hnznodes",
+ "files": [
+ "https://github.com/hunzmusic/comfyui-hnznodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Combine Channels Grayscale, Reorder Image Batch, Male Character Prompt"
+ },
+ {
+ "author": "cidiro",
+ "title": "cid-node-pack",
+ "reference": "https://github.com/cidiro/cid-node-pack",
+ "files": [
+ "https://github.com/cidiro/cid-node-pack"
+ ],
+ "install_type": "git-clone",
+ "description": "A lightweight nodepack for ComfyUI that adds a few handy nodes that I use in my workflows"
+ },
+ {
+ "author": "CeeVeeR",
+ "title": "ComfyUi-Text-Tiler",
+ "reference": "https://github.com/CeeVeeR/ComfyUi-Text-Tiler",
+ "files": [
+ "https://github.com/CeeVeeR/ComfyUi-Text-Tiler"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Text Tiler"
+ },
+ {
+ "author": "Dreamshot-io",
+ "title": "ComfyUI-Extend-Resolution",
+ "reference": "https://github.com/Dreamshot-io/ComfyUI-Extend-Resolution",
+ "files": [
+ "https://github.com/Dreamshot-io/ComfyUI-Extend-Resolution"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Resolution Padding"
+ },
+ {
+ "author": "l1yongch1",
+ "title": "ComfyUI-YcNodes",
+ "reference": "https://github.com/l1yongch1/ComfyUI-YcNodes",
+ "files": [
+ "https://github.com/l1yongch1/ComfyUI-YcNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: RemoveHighlightAndBlur, RoundedCorners, PaddingAccordingToBackground\npersonal custom nodes for learning"
+ },
+ {
+ "author": "GeekatplayStudio",
+ "title": "PMSnodes [WIP]",
+ "reference": "https://github.com/GeekatplayStudio/ComfyUI_Toolbox",
+ "files": [
+ "https://github.com/GeekatplayStudio/ComfyUI_Toolbox"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom nodes for ComfyUI to Load audio in Base64 format and Send Audio to Websocket in Base64 Format for creating API of Audio related AI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "rhinoflavored",
+ "title": "comfyui_QT",
+ "reference": "https://github.com/rhinoflavored/comfyui_QT",
+ "files": [
+ "https://github.com/rhinoflavored/comfyui_QT"
+ ],
+ "install_type": "git-clone",
+ "description": "bunch of image manipulation nodes....\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ricklove",
+ "title": "ComfyUI-AutoSeg-SAM2",
+ "reference": "https://github.com/ricklove/ComfyUI-AutoSeg-SAM2",
+ "files": [
+ "https://github.com/ricklove/ComfyUI-AutoSeg-SAM2"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: AutoSeg-SAM2 Batch Segmentation"
+ },
+ {
+ "author": "JoeAu",
+ "title": "ComfyUI-PythonNode [UNSAFE]",
+ "reference": "https://github.com/JoeAu/ComfyUI-PythonNode",
+ "files": [
+ "https://github.com/JoeAu/ComfyUI-PythonNode"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node that allows users to execute arbitrary Python code with a single input (value) and output (result), enabling flexible processing of the input value using any Python code before assigning the final result to result. It also captures print() output and exceptions for debugging.[w/This node is an unsafe node that includes the capability to execute arbitrary python script.]"
+ },
+ {
+ "author": "smthemex",
+ "title": "ComfyUI_GPT_SoVITS_Lite",
+ "reference": "https://github.com/smthemex/ComfyUI_GPT_SoVITS_Lite",
+ "files": [
+ "https://github.com/smthemex/ComfyUI_GPT_SoVITS_Lite"
+ ],
+ "install_type": "git-clone",
+ "description": "[a/GPT_SoVITS](https://github.com/RVC-Boss/GPT-SoVITS) infer only for ComfyUI users\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Nambi24",
+ "title": "ComfyUI-Save_Image",
+ "reference": "https://github.com/Nambi24/ComfyUI-Save_Image",
+ "files": [
+ "https://github.com/Nambi24/ComfyUI-Save_Image"
+ ],
+ "description": "NODES: Save Image With Subfolder, Extract Last Path Component\nNOTE: The files in the repo are not organized.",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "sugarkwork",
+ "title": "comfyui_image_crop",
+ "reference": "https://github.com/sugarkwork/comfyui_image_crop",
+ "files": [
+ "https://github.com/sugarkwork/comfyui_image_crop"
+ ],
+ "description": "NODES: CropTransparent, RestoreCrop, ExpandMultiple, CropReapply",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "AkiEvansDev",
+ "title": "ComfyUI-Tools",
+ "reference": "https://github.com/AkiEvansDev/ComfyUI-Tools",
+ "files": [
+ "https://github.com/AkiEvansDev/ComfyUI-Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for basic actions."
+ },
+ {
+ "author": "longzoho",
+ "title": "ComfyUI-Qdrant-Saver",
+ "reference": "https://github.com/longzoho/ComfyUI-Qdrant-Saver",
+ "files": [
+ "https://github.com/longzoho/ComfyUI-Qdrant-Saver"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: QDrant Saver Node"
+ },
+ {
+ "author": "RUFFY-369",
+ "title": "ComfyUI-FeatureBank",
+ "reference": "https://github.com/RUFFY-369/ComfyUI-FeatureBank",
+ "files": [
+ "https://github.com/RUFFY-369/ComfyUI-FeatureBank"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: FeatureBankAttentionProcessor"
+ },
+ {
+ "author": "Pablerdo",
+ "title": "ComfyUI-Sa2VAWrapper [WIP]",
+ "reference": "https://github.com/Pablerdo/ComfyUI-Sa2VAWrapper",
+ "files": [
+ "https://github.com/Pablerdo/ComfyUI-Sa2VAWrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "Wrapper for the Sa2VA model"
+ },
+ {
+ "author": "aria1th",
+ "title": "ComfyUI-camietagger-onnx",
+ "reference": "https://github.com/aria1th/ComfyUI-camietagger-onnx",
+ "files": [
+ "https://github.com/aria1th/ComfyUI-camietagger-onnx"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Camie Tagger"
+ },
+ {
+ "author": "zjkhurry",
+ "title": "comfyui_MetalFX [WIP]",
+ "reference": "https://github.com/zjkhurry/comfyui_MetalFX",
+ "files": [
+ "https://github.com/zjkhurry/comfyui_MetalFX"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that enables high-quality image and video upscaling using Apple MetalFX technology.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "RoyKillington",
+ "title": "Miscomfy Nodes [WIP]",
+ "reference": "https://github.com/RoyKillington/miscomfy-nodes",
+ "files": [
+ "https://github.com/RoyKillington/miscomfy-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A repo of custom nodes for ComfyUI, from interacting with certain APIs to whatever other miscellanea I end up making"
+ },
+ {
+ "author": "Elypha",
+ "title": "ComfyUI-Prompt-Helper [WIP]",
+ "reference": "https://github.com/Elypha/ComfyUI-Prompt-Helper",
+ "files": [
+ "https://github.com/Elypha/ComfyUI-Prompt-Helper"
+ ],
+ "install_type": "git-clone",
+ "description": "Concat conditions and prompts for ComfyUI"
+ },
+ {
+ "author": "StoryWalker",
+ "title": "comfyui_flux_collection_advanced [WIP]",
+ "reference": "https://github.com/StoryWalker/comfyui_flux_collection_advanced",
+ "files": [
+ "https://github.com/StoryWalker/comfyui_flux_collection_advanced"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a collection focused in give a little more flexibility in the use of Flux models."
+ },
+ {
+ "author": "OSAnimate",
+ "title": "ComfyUI-SpriteSheetMaker [WIP]",
+ "reference": "https://github.com/OSAnimate/ComfyUI-SpriteSheetMaker",
+ "files": [
+ "https://github.com/OSAnimate/ComfyUI-SpriteSheetMaker"
+ ],
+ "install_type": "git-clone",
+ "description": "The sprite sheet maker node is a simple way to create sprite sheets and image grids.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "BuffMcBigHuge",
+ "title": "ComfyUI-Buff-Nodes [WIP]",
+ "reference": "https://github.com/BuffMcBigHuge/ComfyUI-Buff-Nodes",
+ "files": [
+ "https://github.com/BuffMcBigHuge/ComfyUI-Buff-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Several quality-of-life batch operation and string manipulation nodes."
+ },
+ {
+ "author": "ritikvirus",
+ "title": "ComfyUI Terminal Command Node [UNSAFE]",
+ "reference": "https://github.com/ritikvirus/comfyui-terminal-modal-node",
+ "files": [
+ "https://github.com/ritikvirus/comfyui-terminal-modal-node"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository provides a custom ComfyUI node that lets you execute arbitrary terminal commands directly from the ComfyUI interface. [w/This extension allows remote command execution.]"
+ },
+ {
+ "author": "pixuai",
+ "title": "ComfyUI-PixuAI",
+ "reference": "https://github.com/pixuai/ComfyUI-PixuAI",
+ "files": [
+ "https://github.com/pixuai/ComfyUI-PixuAI"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of ComfyUI nodes designed to streamline prompt creation, organization, and discovery - making your workflows faster and more intuitive."
+ },
+ {
+ "author": "techidsk",
+ "title": "comfyui_molook_nodes [WIP]",
+ "reference": "https://github.com/techidsk/comfyui_molook_nodes",
+ "files": [
+ "https://github.com/techidsk/comfyui_molook_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Some extra nodes"
+ },
+ {
+ "author": "Northerner1",
+ "title": "ComfyUI_North_Noise [WIP]",
+ "reference": "https://github.com/Northerner1/ComfyUI_North_Noise",
+ "files": [
+ "https://github.com/Northerner1/ComfyUI_North_Noise"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: North Noise"
+ },
+ {
+ "author": "ManuShamil",
+ "title": "ComfyUI_BodyEstimation_Nodes",
+ "reference": "https://github.com/ManuShamil/ComfyUI_BodyEstimation_Nodes",
+ "files": [
+ "https://github.com/ManuShamil/ComfyUI_BodyEstimation_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CogitareLabsPoseIDExtractor"
+ },
+ {
+ "author": "MockbaTheBorg",
+ "title": "ComfyUI-Mockba",
+ "reference": "https://github.com/MockbaTheBorg/ComfyUI-Mockba",
+ "files": [
+ "https://github.com/MockbaTheBorg/ComfyUI-Mockba"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Image Batch/Flip/Rotate/Subtract/Dither, Barcode, Select, ..."
+ },
+ {
+ "author": "jcomeme",
+ "title": "AsunaroTools",
+ "reference": "https://github.com/jcomeme/ComfyUI-AsunaroTools",
+ "files": [
+ "https://github.com/jcomeme/ComfyUI-AsunaroTools"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI"
+ },
+ {
+ "author": "ZHO-ZHO-ZHO",
+ "title": "ComfyUI Wan2.1 [WIP]",
+ "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Wan-ZHO",
+ "files": [
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Wan-ZHO"
+ ],
+ "install_type": "git-clone",
+ "description": "It’s estimated that ComfyUI itself will support it soon, so go ahead and give it a try!"
+ },
+ {
+ "author": "ltdrdata",
+ "title": "comfyui-unsafe-torch [UNSAFE]",
+ "reference": "https://github.com/ltdrdata/comfyui-unsafe-torch",
+ "files": [
+ "https://github.com/ltdrdata/comfyui-unsafe-torch"
+ ],
+ "install_type": "git-clone",
+ "description": "disable torch.load's `weigths_only`"
+ },
+ {
+ "author": "muvich3n",
+ "title": "ComfyUI-Crop-Border",
+ "reference": "https://github.com/muvich3n/ComfyUI-Crop-Border",
+ "files": [
+ "https://github.com/muvich3n/ComfyUI-Crop-Border"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Crop Image Borders"
+ },
+ {
+ "author": "masmullin2000",
+ "title": "ComfyUI-MMYolo",
+ "reference": "https://github.com/masmullin2000/ComfyUI-MMYolo",
+ "files": [
+ "https://github.com/masmullin2000/ComfyUI-MMYolo"
+ ],
+ "install_type": "git-clone",
+ "description": "A comfy node to find faces and output a mask"
+ },
+ {
+ "author": "Yeonri",
+ "title": "ComfyUI_LLM_Are_You_Listening [WIP]",
+ "reference": "https://github.com/Yeonri/ComfyUI_LLM_Are_You_Listening",
+ "files": [
+ "https://github.com/Yeonri/ComfyUI_LLM_Are_You_Listening"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: AYL_Node, AYL_GGUF_Node, AYL_API_Node\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "altkeyproject",
+ "title": "Dream Painter [WIP]",
+ "reference": "https://github.com/alt-key-project/comfyui-dream-painter",
+ "files": [
+ "https://github.com/alt-key-project/comfyui-dream-painter"
+ ],
+ "install_type": "git-clone",
+ "description": "Provide utilities for 2D image generation and processing."
+ },
+ {
+ "author": "kimara-ai",
+ "title": "ComfyUI-Kimara-AI-Image-From-URL [WIP]",
+ "reference": "https://github.com/kimara-ai/ComfyUI-Kimara-AI-Image-From-URL",
+ "files": [
+ "https://github.com/kimara-ai/ComfyUI-Kimara-AI-Image-From-URL"
+ ],
+ "install_type": "git-clone",
+ "description": "Load image from URL and downscale to desired megapixels. Set megapixels to 0 for no downscaling."
+ },
+ {
+ "author": "krisshen2021",
+ "title": "comfyui_OpenRouterNodes [WIP]",
+ "reference": "https://github.com/krisshen2021/comfyui_OpenRouterNodes",
+ "files": [
+ "https://github.com/krisshen2021/comfyui_OpenRouterNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "LLM custom nodes for comfyui\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Velour-Fog",
+ "title": "comfy-latent-nodes [UNSAFE]",
+ "reference": "https://github.com/Velour-Fog/comfy-latent-nodes",
+ "files": [
+ "https://github.com/Velour-Fog/comfy-latent-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes to save and load a latent to a specified directory. Saves time for doing operations on a latent such as upscaling without having to re-trigger the creation of the original latent.[w/This node can write files to an arbitrary path.]"
+ },
+ {
+ "author": "jgbyte",
+ "title": "ComfyUI-RandomCube [WIP]",
+ "reference": "https://github.com/jgbyte/ComfyUI-RandomCube",
+ "files": [
+ "https://github.com/jgbyte/ComfyUI-RandomCube"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: RandomCubeGrid"
+ },
+ {
+ "author": "thot-experiment",
+ "title": "comfy-live-preview [WIP]",
+ "reference": "https://github.com/thot-experiment/comfy-live-preview",
+ "files": [
+ "https://github.com/thot-experiment/comfy-live-preview"
+ ],
+ "install_type": "git-clone",
+ "description": "external live preview plugin for ComfyUI"
+ },
+ {
+ "author": "AhBumm",
+ "title": "ComfyUI-Upscayl",
+ "reference": "https://github.com/AhBumm/ComfyUI-Upscayl",
+ "files": [
+ "https://github.com/AhBumm/ComfyUI-Upscayl"
+ ],
+ "nodename_pattern": "\\(BillBum\\)$",
+ "install_type": "git-clone",
+ "description": "NODES: Upscayl Upscaler"
+ },
+ {
+ "author": "NEZHA625",
+ "title": "ComfyUI-tools-by-dong [UNSAFE]",
+ "reference": "https://github.com/NEZHA625/ComfyUI-tools-by-dong",
+ "files": [
+ "https://github.com/NEZHA625/ComfyUI-tools-by-dong"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: HuggingFaceUploadNode, ImageDownloader, LoraIterator, FileMoveNode, InputDetectionNode, ...\nNOTE: The files in the repo are not organized.[w/This nodepack includes nodes that can modify arbitrary files.]"
+ },
+ {
+ "author": "if-ai",
+ "title": "ComfyUI-IF_Zonos [WIP]",
+ "reference": "https://github.com/if-ai/ComfyUI-IF_Zonos",
+ "files": [
+ "https://github.com/if-ai/ComfyUI-IF_Zonos"
+ ],
+ "install_type": "git-clone",
+ "description": "Zonos for ComfyUI"
+ },
+ {
+ "author": "grinlau18",
+ "title": "Xiser_Nodes [WIP]",
+ "reference": "https://github.com/grinlau18/ComfyUI_XISER_Nodes",
+ "files": [
+ "https://github.com/grinlau18/ComfyUI_XISER_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for customizing workflows\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "LAOGOU-666",
+ "title": "Comfyui_StartPatch [UNSAFE]",
+ "reference": "https://github.com/LAOGOU-666/Comfyui_StartPatch",
+ "files": [
+ "https://github.com/LAOGOU-666/Comfyui_StartPatch"
+ ],
+ "install_type": "git-clone",
+ "description": "This patch plugin optimizes the node information processing mechanism of the ComfyUI server, significantly improving server performance and response speed. It greatly reduces the browser page initialization waiting time. [w/Since this patch modifies key functions of ComfyUI, it is highly likely to cause compatibility issues.]"
+ },
+ {
+ "author": "badmike",
+ "title": "Prompt Factory [CONFLICT]",
+ "reference": "https://github.com/badmike/comfyui-prompt-factory",
+ "files": [
+ "https://github.com/badmike/comfyui-prompt-factory"
+ ],
+ "install_type": "git-clone",
+ "description": "A modular system that adds randomness to prompt generation [w/This nodepack is causing a name conflict with https://github.com/satche/comfyui-prompt-factory]"
+ },
+ {
+ "author": "owengillett",
+ "title": "ComfyUI-tilefusion",
+ "reference": "https://github.com/owengillett/ComfyUI-tilefusion",
+ "files": [
+ "https://github.com/owengillett/ComfyUI-tilefusion"
+ ],
+ "install_type": "git-clone",
+ "description": "Helper nodes for generating seamless tiles."
+ },
+ {
+ "author": "Scaryplasmon",
+ "title": "ComfTrellis [WIP]",
+ "reference": "https://github.com/Scaryplasmon/ComfTrellis",
+ "files": [
+ "https://github.com/Scaryplasmon/ComfTrellis"
+ ],
+ "install_type": "git-clone",
+ "description": "1 click install to run Trellis in ComfyUI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "fangziheng2321",
+ "title": "comfyuinode_chopmask [WIP]",
+ "reference": "https://github.com/fangziheng2321/comfyuinode_chopmask",
+ "files": [
+ "https://github.com/fangziheng2321/comfyuinode_chopmask"
+ ],
+ "install_type": "git-clone",
+ "description": "a custom comfyui node for '/fooocusinpaint_upload'\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "D1-3105",
+ "title": "ComfyUI-VideoStream",
+ "reference": "https://github.com/D1-3105/ComfyUI-VideoStream",
+ "files": [
+ "https://github.com/D1-3105/ComfyUI-VideoStream"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: FloWWeaverExportSingleFrameGRPC"
+ },
+ {
+ "author": "wirytiox",
+ "title": "ComfyUI-Qwen [CONFLICT]",
+ "reference": "https://github.com/mr-krak3n/ComfyUI-Qwen",
+ "files": [
+ "https://github.com/mr-krak3n/ComfyUI-Qwen"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository contains custom nodes for ComfyUI, designed to facilitate working with language models such as Qwen2.5 and DeepSeek. [w/This nodepack is causing a name conflict with https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen]"
+ },
+ {
+ "author": "hiusdev",
+ "title": "ComfyUI_Lah_Toffee",
+ "reference": "https://github.com/hiusdev/ComfyUI_Lah_Toffee",
+ "files": [
+ "https://github.com/hiusdev/ComfyUI_Lah_Toffee"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Lah LoadVideoRandom"
+ },
+ {
+ "author": "hdfhssg",
+ "title": "ComfyUI_pxtool [WIP]",
+ "reference": "https://github.com/hdfhssg/ComfyUI_pxtool",
+ "files": [
+ "https://github.com/hdfhssg/ComfyUI_pxtool"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a custom plugin node for ComfyUI that modifies and extends some features from existing projects. The main implementations include:\n* Reproducing some features of the [a/Stable-Diffusion-Webui-Civitai-Helper](https://github.com/zixaphir/Stable-Diffusion-Webui-Civitai-Helper) project within ComfyUI\n* Implementing a feature to randomly generate related prompt words by referencing the [a/noob-wiki dataset](https://huggingface.co/datasets/Laxhar/noob-wiki/tree/main)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "franky519",
+ "title": "comfyui-redux-style",
+ "reference": "https://github.com/franky519/comfyui-redux-style",
+ "files": [
+ "https://github.com/franky519/comfyui-redux-style"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Style Model Grid, Style Model Apply, Style Model Advanced"
+ },
+ {
+ "author": "rishipandey125",
+ "title": "ComfyUI-FramePacking [WIP]",
+ "reference": "https://github.com/rishipandey125/ComfyUI-FramePacking",
+ "files": [
+ "https://github.com/rishipandey125/ComfyUI-FramePacking"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Add Grid Boundaries, Pack Frames, Unpack Frames, Resize Frame"
+ },
+ {
+ "author": "Northerner1",
+ "title": "ComfyUI_North_Noise [WIP]",
+ "reference": "https://github.com/Northerner1/ComfyUI_North_Noise",
+ "files": [
+ "https://github.com/Northerner1/ComfyUI_North_Noise"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Unsampler"
+ },
+ {
+ "author": "kimara-ai",
+ "title": "ComfyUI-Kimara-AI-Image-From-URL [WIP]",
+ "reference": "https://github.com/kimara-ai/ComfyUI-Kimara-AI-Image-From-URL",
+ "files": [
+ "https://github.com/kimara-ai/ComfyUI-Kimara-AI-Image-From-URL"
+ ],
+ "install_type": "git-clone",
+ "description": "Load image from URL and downscale to desired megapixels. Set megapixels to 0 for no downscaling."
+ },
+ {
+ "author": "tc8M4lF3s88",
+ "title": "comfy-tif-support",
+ "reference": "https://github.com/M4lF3s/comfy-tif-support",
+ "files": [
+ "https://github.com/M4lF3s/comfy-tif-support"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load TIFF"
+ },
+ {
+ "author": "tc888",
+ "title": "ComfyUI_Save_Flux_Image",
+ "reference": "https://github.com/tc888/ComfyUI_Save_Flux_Image",
+ "files": [
+ "https://github.com/tc888/ComfyUI_Save_Flux_Image"
+ ],
+ "install_type": "git-clone",
+ "description": "Customized version of comfyui-image-save tailored for saving Flux images"
+ },
+ {
+ "author": "xinyiSS",
+ "title": "CombineMasksNode",
+ "reference": "https://github.com/xinyiSS/CombineMasksNode",
+ "files": [
+ "https://github.com/xinyiSS/CombineMasksNode"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Combine Masks Node"
+ },
+ {
+ "author": "osuiso-depot",
+ "title": "comfyui-keshigom_custom",
+ "reference": "https://github.com/osuiso-depot/comfyui-keshigom_custom",
+ "files": [
+ "https://github.com/osuiso-depot/comfyui-keshigom_custom"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: RegexpChopper, FLIP-W/H Selector, FLIP-W/H SelectorConst, TextFind, ckpt_Loader_Simple, True-or-False, myStringNode"
+ },
+ {
+ "author": "LucipherDev",
+ "title": "ComfyUI-Sentinel [WIP]",
+ "reference": "https://github.com/LucipherDev/ComfyUI-Sentinel",
+ "files": [
+ "https://github.com/LucipherDev/ComfyUI-Sentinel"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Extension for Advanced Security. Implements login, multi-user registration, IP filtering, and user-specific input/output directories.[w/WARN:While ComfyUI Sentinel enhances security for ComfyUI, it does not guarantee absolute protection. Security is about risk mitigation, not elimination. Users are responsible for implementing their own security measures.]"
+ },
+ {
+ "author": "threadedblue",
+ "title": "MLXnodes [WIP]",
+ "reference": "https://github.com/threadedblue/MLXnodes",
+ "files": [
+ "https://github.com/threadedblue/MLXnodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A port of MLX Examples to ComfyUI custom_nodes. These are intended to run on a macOS M1.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "jschoormans",
+ "title": "Comfy-InterestingPixels [WIP]",
+ "reference": "https://github.com/jschoormans/Comfy-InterestingPixels",
+ "files": [
+ "https://github.com/jschoormans/Comfy-InterestingPixels"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Shareable Image Slider, Random Palette\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "jschoormans",
+ "title": "ComfyUI-TexturePacker [WIP]",
+ "reference": "https://github.com/kijai/ComfyUI-TexturePacker",
+ "files": [
+ "https://github.com/jschoormans/Comfy-InterestingPixels"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node to use PyTexturePacker\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "MickeyJ",
+ "title": "ComfyUI_mickster_nodes [WIP]",
+ "reference": "https://github.com/MickeyJ/ComfyUI_mickster_nodes",
+ "files": [
+ "https://github.com/MickeyJ/ComfyUI_mickster_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI, focusing on image handling and LoRA training."
+ },
+ {
+ "author": "gold24park",
+ "title": "loki-comfyui-node",
+ "reference": "https://github.com/gold24park/loki-comfyui-node",
+ "files": [
+ "https://github.com/gold24park/loki-comfyui-node"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Get Image Luminance, Get Dominant Color, Overlay Text"
+ },
+ {
+ "author": "hayden-fr",
+ "title": "ComfyUI-Image-Browsing [USAFE]",
+ "id": "image-browsing",
+ "reference": "https://github.com/hayden-fr/ComfyUI-Image-Browsing",
+ "files": [
+ "https://github.com/hayden-fr/ComfyUI-Image-Browsing"
+ ],
+ "install_type": "git-clone",
+ "description": "Image Browsing: browsing, download and delete."
+ },
+ {
+ "author": "molbal",
+ "title": "comfy-url-fetcher [WIP]",
+ "reference": "https://github.com/molbal/comfy-url-fetcher",
+ "files": [
+ "https://github.com/molbal/comfy-url-fetcher"
+ ],
+ "install_type": "git-clone",
+ "description": "Fetches URLs"
+ },
+ {
+ "author": "neverbiasu",
+ "title": "ComfyUI_Output_as_Input",
+ "reference": "https://github.com/a-und-b/ComfyUI_Output_as_Input",
+ "files": [
+ "https://github.com/a-und-b/ComfyUI_Output_as_Input"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a simple custom ComfyUI node that allows you to easily use recent output images as input in your workflows. It does not allow image uploads on purpose and does not require any additional dependencies.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "neverbiasu",
+ "title": "ComfyUI-DeepSeek",
+ "reference": "https://github.com/neverbiasu/ComfyUI-DeepSeek",
+ "files": [
+ "https://github.com/neverbiasu/ComfyUI-DeepSeek"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: DeepSeek Caller"
+ },
+ {
+ "author": "Krish-701",
+ "title": "RK_Comfyui",
+ "reference": "https://github.com/Krish-701/RK_Comfyui",
+ "files": [
+ "https://github.com/Krish-701/RK_Comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: RK Excel File State Looper, RK Accumulate Text, RK Advanced Script Finder, RK CSV File State Looper, RK Read Excel Row, RK Sequential Image Viewer, RK Concatenate Text, RK Write Text, RK Save Image, RK Seed Loop"
+ },
+ {
+ "author": "Kayarte",
+ "title": "Time Series Nodes for ComfyUI [Experimental]",
+ "reference": "https://github.com/Kayarte/Time-Series-Nodes-for-ComfyUI",
+ "files": [
+ "https://github.com/Kayarte/Time-Series-Nodes-for-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "Basic nodes for time series analysis in ComfyUI. Currently in early development."
+ },
+ {
+ "author": "HuangYuChuh",
+ "title": "ComfyUI-LLMs-Toolkit [WIP]",
+ "reference": "https://github.com/HuangYuChuh/ComfyUI-LLMs-Toolkit",
+ "files": [
+ "https://github.com/HuangYuChuh/ComfyUI-LLMs-Toolkit"
+ ],
+ "install_type": "git-clone",
+ "description": "Enhance your ComfyUI workflows with powerful LLMs! This custom node suite integrates DeepSeek, Qwen, and other leading Chinese LLMs directly into your ComfyUI environment. Create innovative AI-powered applications with a range of useful nodes designed to leverage the advanced capabilities of these LLMs for image generation, understanding, and more.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "comfyuiblog",
+ "title": "deepseek_prompt_generator_comfyui [WIP]",
+ "reference": "https://github.com/comfyuiblog/deepseek_prompt_generator_comfyui",
+ "files": [
+ "https://github.com/comfyuiblog/deepseek_prompt_generator_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Prompt Expansion for Stable Diffusion, using Deepseek API.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "risunobushi",
+ "title": "ComfyUI_HEXtoRGB",
+ "reference": "https://github.com/risunobushi/ComfyUI_HEXtoRGB",
+ "files": [
+ "https://github.com/risunobushi/ComfyUI_HEXtoRGB"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Hex to RGB Converter"
+ },
+ {
+ "author": "EmanueleUniroma2",
+ "title": "ComfyUI-FLAC-to-WAV [WIP]",
+ "reference": "https://github.com/EmanueleUniroma2/ComfyUI-FLAC-to-WAV",
+ "files": [
+ "https://github.com/EmanueleUniroma2/ComfyUI-FLAC-to-WAV"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node to convert flac files to wav inside comfy UI\nComfyUI Custom Node: FLAC to WAV Converter Welcome to the ComfyUI Custom Node: FLAC to WAV Converter repository! This project provides a custom node for ComfyUI that allows you to easily convert .flac audio files to .wav format, making it simpler to work with a variety of audio tools and applications.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "eyekayem",
+ "title": "comfyui_runway_gen3",
+ "reference": "https://github.com/eyekayem/comfyui_runway_gen3",
+ "files": [
+ "https://github.com/eyekayem/comfyui_runway_gen3"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Runway Video Gen, Runway Video Preview"
+ },
+ {
+ "author": "StartHua",
+ "title": "Comfyui_CXH_joy_caption [SECURITY SCREENING]",
+ "reference": "https://github.com/StartHua/Comfyui_CXH_joy_caption",
+ "files": [
+ "https://github.com/StartHua/Comfyui_CXH_joy_caption"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Joy_caption_load, Joy_caption\nNOTE:This nodepack has been transitioned to a security screening status due to policy."
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI-ComfyUI-Hunyuan3DWrapper [WIP]",
+ "reference": "https://github.com/kijai/ComfyUI-Hunyuan3DWrapper",
+ "files": [
+ "https://github.com/kijai/ComfyUI-Hunyuan3DWrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "Wrapper nodes for https://github.com/Tencent/Hunyuan3D-2, additional installation steps needed, please check the github repository"
+ },
+ {
+ "author": "7BEII",
+ "title": "comfyui-promptbymood [WIP]",
+ "reference": "https://github.com/7BEII/Comfyui_PDuse",
+ "files": [
+ "https://github.com/7BEII/Comfyui_PDuse"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: PD_json_group_fontsize, PD_Incremental_JSON, PD_removeword, PD_Image Crop Location, PD_ImageConcanate, PD_FileName_refixer\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "RLW-Chars",
+ "title": "comfyui-promptbymood [WIP]",
+ "reference": "https://github.com/RLW-Chars/comfyui-promptbymood",
+ "files": [
+ "https://github.com/RLW-Chars/comfyui-promptbymood"
+ ],
+ "install_type": "git-clone",
+ "description": "A plugin for ComfyUI to create random prompts.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "mohamedsobhi777",
+ "title": "ComfyUI-FramerComfy [WIP]",
+ "reference": "https://github.com/mohamedsobhi777/ComfyUI-FramerComfy",
+ "files": [
+ "https://github.com/mohamedsobhi777/ComfyUI-FramerComfy"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: FramerComfy Input String/Number/Image/Float/Boolean/Image, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "naderzare",
+ "title": "comfyui-inodes",
+ "reference": "https://github.com/naderzare/comfyui-inodes",
+ "files": [
+ "https://github.com/naderzare/comfyui-inodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: If-Else, Multiline Split, Azure AI API"
+ },
+ {
+ "author": "sizzlebop",
+ "title": "ComfyUI LLM Prompt Enhancer [WIP]",
+ "reference": "https://github.com/pinkpixel-dev/comfyui-llm-prompt-enhancer",
+ "files": [
+ "https://github.com/pinkpixel-dev/comfyui-llm-prompt-enhancer"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI node for enhancing prompts using various LLM providers\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "a-One-Fan",
+ "title": "ComfyUI-Blenderesque-Nodes [WIP]",
+ "reference": "https://github.com/a-One-Fan/ComfyUI-Blenderesque-Nodes",
+ "files": [
+ "https://github.com/a-One-Fan/ComfyUI-Blenderesque-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Blender-like nodes for ComfyUI."
+ },
+ {
+ "author": "yanhuifair",
+ "title": "comfyui-deepseek [WIP]",
+ "reference": "https://github.com/yanhuifair/comfyui-deepseek",
+ "files": [
+ "https://github.com/yanhuifair/comfyui-deepseek"
+ ],
+ "install_type": "git-clone",
+ "description": "nodes for deepseek api\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "IfnotFr",
+ "title": "ComfyUI-Ifnot-Pack",
+ "reference": "https://github.com/IfnotFr/ComfyUI-Ifnot-Pack",
+ "files": [
+ "https://github.com/IfnotFr/ComfyUI-Ifnot-Pack"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Face Crop, [w/A pack of custom nodes used in my projects. Not intended to be used by other persons as the usage is not documented. But if something interests you in this repository, go for it !]"
+ },
+ {
+ "author": "KihongK",
+ "title": "ComfyUI-RoysNodes [WIP]",
+ "reference": "https://github.com/KihongK/comfyui-roysnodes",
+ "files": [
+ "https://github.com/KihongK/comfyui-roysnodes"
+ ],
+ "install_type": "git-clone",
+ "description": "WIP custom nodes for Creation of AI images & videos"
+ },
+ {
+ "author": "catboxanon",
+ "title": "ComfyUI-Pixelsmith [WIP]",
+ "reference": "https://github.com/catboxanon/ComfyUI-Pixelsmith",
+ "files": [
+ "https://github.com/catboxanon/ComfyUI-Pixelsmith"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Pixelsmith"
+ },
+ {
+ "author": "hunterssl",
+ "title": "ComfyUI_SSLNodes",
+ "reference": "https://github.com/hunterssl/ComfyUI_SSLNodes",
+ "files": [
+ "https://github.com/hunterssl/ComfyUI_SSLNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: SSL Load Json, SSL Get Json Keys Count, SSL Load Checkpoint By Name, SSL Random Num In Loop, SSL Save Image Outside"
+ },
+ {
+ "author": "ammahmoudi",
+ "title": "ComfyUI-Legendary-Nodes",
+ "reference": "https://github.com/ammahmoudi/ComfyUI-Legendary-Nodes",
+ "files": [
+ "https://github.com/ammahmoudi/ComfyUI-Legendary-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Legendary Lora URL Loader, Legendary Lora URL Loader"
+ },
+ {
+ "author": "yichengup",
+ "title": "Comfyui-NodeSpark",
+ "reference": "https://github.com/yichengup/Comfyui-NodeSpark",
+ "files": [
+ "https://github.com/yichengup/Comfyui-NodeSpark"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Image Circle Warp, Image Stretch, Image Wave Warp, Liquify Effect"
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI-VideoNoiseWarp [WIP]",
+ "reference": "https://github.com/kijai/ComfyUI-VideoNoiseWarp",
+ "files": [
+ "https://github.com/kijai/ComfyUI-VideoNoiseWarp"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes to generate noise from video for [a/https://github.com/Eyeline-Research/Go-with-the-Flow](https://github.com/Eyeline-Research/Go-with-the-Flow)"
+ },
+ {
+ "author": "muvich3n",
+ "title": "ComfyUI-Claude-I2T",
+ "reference": "https://github.com/muvich3n/ComfyUI-Claude-I2T",
+ "files": [
+ "https://github.com/muvich3n/ComfyUI-Claude-I2T"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Claude Image to Prompt Generator"
+ },
+ {
+ "author": "maekawataiki",
+ "title": "ComfyUI-ALB-Login",
+ "reference": "https://github.com/maekawataiki/ComfyUI-ALB-Login",
+ "files": [
+ "https://github.com/maekawataiki/ComfyUI-ALB-Login"
+ ],
+ "install_type": "git-clone",
+ "description": "Auth library to inspect token provided by ALB to protect ComfyUI."
+ },
+ {
+ "author": "ArmandAlbert",
+ "title": "Kwai_font_comfyui",
+ "reference": "https://github.com/ArmandAlbert/Kwai_font_comfyui",
+ "files": [
+ "https://github.com/ArmandAlbert/Kwai_font_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Kwaifont_Resnet50_Runner, Kwaifont_Resnet50_Loader, Kwaifont_Resnet101_Runner, Kwaifont_Resnet101_Loader, Kwaifont_Image_Cropper"
+ },
+ {
+ "author": "PATATAJEC",
+ "title": "Patatajec-Nodes [WIP]",
+ "reference": "https://github.com/PATATAJEC/ComfyUI-PatatajecNodes",
+ "files": [
+ "https://github.com/PATATAJEC/ComfyUI-PatatajecNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Path Tool, Color Match Falloff, Sequence Content Zoom, Sequence Blend, Color Picker"
+ },
+ {
+ "author": "sourceful-official",
+ "title": "comfyui-sourceful-official",
+ "reference": "https://github.com/sourceful-official/comfyui-sourceful-official",
+ "files": [
+ "https://github.com/sourceful-official/comfyui-sourceful-official"
+ ],
+ "description": "NODES: SourcefulOfficialComfyuiIncontextThreePanels, FalFluxLoraSourcefulOfficial, FalIcLightV2SourcefulOfficial",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "Alvaroeai",
+ "title": "ComfyUI-SunoAI-Mds",
+ "reference": "https://github.com/Alvaroeai/ComfyUI-SunoAI-Mds",
+ "files": [
+ "https://github.com/Alvaroeai/ComfyUI-SunoAI-Mds"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Suno Generate, Suno Download, Suno Proxy Generate, Suno Proxy Download"
+ },
+ {
+ "author": "parmarjh",
+ "title": "ComfyUI-MochiWrapper-I2V [WIP]",
+ "reference": "https://github.com/parmarjh/ComfyUI-MochiWrapper-I2V",
+ "files": [
+ "https://github.com/parmarjh/ComfyUI-MochiWrapper-I2V"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI wrapper nodes for [a/Mochi](https://github.com/genmoai/models) video generator"
+ },
+ {
+ "author": "Symbiomatrix",
+ "title": "Comfyui-Sort-Files",
+ "reference": "https://github.com/Symbiomatrix/Comfyui-Sort-Files",
+ "files": [
+ "https://github.com/Symbiomatrix/Comfyui-Sort-Files"
+ ],
+ "install_type": "git-clone",
+ "description": "Monkeypatch file sort to date modified or custom instead of lexicographic."
+ },
+ {
+ "author": "x3bits",
+ "title": "ComfyUI-Power-Flow [UNSAFE]",
+ "reference": "https://github.com/x3bits/ComfyUI-Power-Flow",
+ "files": [
+ "https://github.com/x3bits/ComfyUI-Power-Flow"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI nodepackage that introduces common programming logic to enhance the flexibility of ComfyUI workflows. It supports features such as function definition and execution, 'for' loops, 'while' loops, and Python code execution.\n[w/This extension allows the execution of arbitrary Python code from a workflow.]"
+ },
+ {
+ "author": "EmilioPlumed",
+ "title": "ComfyUI-Math [WIP]",
+ "reference": "https://github.com/EmilioPlumed/ComfyUI-Math",
+ "files": [
+ "https://github.com/EmilioPlumed/ComfyUI-Math"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes that take 2 float inputs and calculates greatest common denominator and least common multiple, returning them as ints.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "mliand",
+ "title": "ComfyUI-Calendar-Node [WIP]",
+ "reference": "https://github.com/mliand/ComfyUI-Calendar-Node",
+ "files": [
+ "https://github.com/mliand/ComfyUI-Calendar-Node"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for Comfyui to create a Calendar like grid\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "phamngoctukts",
+ "title": "ComyUI-Tupham",
+ "reference": "https://github.com/phamngoctukts/ComyUI-Tupham",
+ "files": [
+ "https://github.com/phamngoctukts/ComyUI-Tupham"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Ghép Ảnh, Multi Prompt v2.0, Condition Upscale, Multi sampler, Run node selected"
+ },
+ {
+ "author": "5x00",
+ "title": "ComfyUI-Prompt-Plus [WIP]",
+ "reference": "https://github.com/5x00/ComfyUI-Prompt-Plus",
+ "files": [
+ "https://github.com/5x00/ComfyUI-Prompt-Plus"
+ ],
+ "install_type": "git-clone",
+ "description": "Prompt Plus is a collection of LLM and VLM nodes that make prompting easier for image and video generation.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "aria1th",
+ "title": "ComfyUI-CairoSVG",
+ "reference": "https://github.com/aria1th/ComfyUI-CairoSVG",
+ "files": [
+ "https://github.com/aria1th/ComfyUI-CairoSVG"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: VectorizedUpscaleScaling, VectorizedUpscaleSize"
+ },
+ {
+ "author": "gitmylo",
+ "title": "FlowNodes [WIP]",
+ "reference": "https://github.com/gitmylo/FlowNodes",
+ "files": [
+ "https://github.com/gitmylo/FlowNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI nodepack containing nodes for basic programming logic."
+ },
+ {
+ "author": "chengzeyi",
+ "title": "Comfy-WaveSpeed [WIP]",
+ "reference": "https://github.com/chengzeyi/Comfy-WaveSpeed",
+ "files": [
+ "https://github.com/chengzeyi/Comfy-WaveSpeed"
+ ],
+ "install_type": "git-clone",
+ "description": "The all in one inference optimization solution for ComfyUI, universal, flexible, and fast."
+ },
+ {
+ "author": "zyd232",
+ "title": "ComfyUI-zyd232-Nodes",
+ "reference": "https://github.com/zyd232/ComfyUI-zyd232-Nodes",
+ "files": [
+ "https://github.com/zyd232/ComfyUI-zyd232-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Image Pixels Compare, Save Preview Images"
+ },
+ {
+ "author": "yanhuifair",
+ "title": "ComfyUI-FairLab",
+ "reference": "https://github.com/yanhuifair/ComfyUI-FairLab",
+ "files": [
+ "https://github.com/yanhuifair/ComfyUI-FairLab"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CLIP Text Encode Translated, Translate String, Load Image From Folder, Save String To Folder, Fix UTF-8 String, String Combine, String Field, Download Image, Save Images To Folder, Save Image To Folder, Image Resize, ..."
+ },
+ {
+ "author": "nomcycle",
+ "title": "ComfyUI_Cluster [WIP]",
+ "reference": "https://github.com/nomcycle/ComfyUI_Cluster",
+ "files": [
+ "https://github.com/nomcycle/ComfyUI_Cluster"
+ ],
+ "install_type": "git-clone",
+ "description": "Very early W.I.P of clustered ComfyUI inference."
+ },
+ {
+ "author": "waynepimpzhang",
+ "title": "FindBrightestSpot [WIP]",
+ "reference": "https://github.com/waynepimpzhang/comfyui-opencv-brightestspot",
+ "files": [
+ "https://github.com/waynepimpzhang/comfyui-opencv-brightestspot"
+ ],
+ "install_type": "git-clone",
+ "description": "Analyze the image to find the x and y coordinates of the brightest point.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "power88",
+ "title": "ComfyUI-PDiD-Nodes [WIP]",
+ "reference": "https://github.com/power88/ComfyUI-PDiD-Nodes",
+ "files": [
+ "https://github.com/power88/ComfyUI-PDiD-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Get Image Size, Check Character Tag, Nearest SDXL Resolution divided by 64, Get Image Main Color, Blend Images, List Operations, Make Image Gray.\nNOTE: not working"
+ },
+ {
+ "author": "FinetunersAI",
+ "title": "ComfyUI Finetuners [WIP]",
+ "reference": "https://github.com/FinetunersAI/finetuners",
+ "files": [
+ "https://github.com/FinetunersAI/finetuners"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of utility nodes for ComfyUI to enhance your workflow.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "sourceful-official",
+ "title": "ComfyUI_InstructPixToPixConditioningLatent [WIP]",
+ "reference": "https://github.com/sourceful-official/ComfyUI_InstructPixToPixConditioningLatent",
+ "files": [
+ "https://github.com/sourceful-official/ComfyUI_InstructPixToPixConditioningLatent"
+ ],
+ "description": "ComfyUI-ComfyUI_InstructPixToPixConditioningLatent\nNOTE:invalid pyproject.toml",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "fritzprix",
+ "title": "ComfyUI-LLM-Utils [WIP]",
+ "reference": "https://github.com/fritzprix/ComfyUI-LLM-Utils",
+ "files": [
+ "https://github.com/fritzprix/ComfyUI-LLM-Utils"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of utility nodes for ComfyUI focused on text and LLM-related operations\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ciga2011",
+ "title": "ComfyUI-AppGen [UNSAFE]",
+ "reference": "https://github.com/ciga2011/ComfyUI-AppGen",
+ "files": [
+ "https://github.com/ciga2011/ComfyUI-AppGen"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI nodepack designed to generate and edit Single Page Applications (SPAs) using natural language.[w/This extension allows arbitrary JavaScript code to be executed through the execution of workflows.]"
+ },
+ {
+ "author": "DraconicDragon",
+ "title": "ComfyUI e621 booru Toolkit",
+ "reference": "https://github.com/DraconicDragon/ComfyUI_e621_booru_toolkit",
+ "files": [
+ "https://github.com/DraconicDragon/ComfyUI_e621_booru_toolkit"
+ ],
+ "install_type": "git-clone",
+ "description": "WIP. Nodes: Fetch e621/danbooru image and/or tags etc from a given URL; Get the Wiki entry for a tag through a button press."
+ },
+ {
+ "author": "Grey3016",
+ "title": "Save2Icon",
+ "reference": "https://github.com/Grey3016/Save2Icon",
+ "files": [
+ "https://github.com/Grey3016/Save2Icon"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Save2Icon"
+ },
+ {
+ "author": "Chargeuk",
+ "title": "ComfyUI-vts-nodes [WIP]",
+ "reference": "https://github.com/Chargeuk/ComfyUI-vts-nodes",
+ "files": [
+ "https://github.com/Chargeuk/ComfyUI-vts-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Clean Text, Color Mask To Mask, Conditioning Set Batch Mask, Merge Delimited Text, Reduce Batch Size, Text To Batch Prompt, To Text, "
+ },
+ {
+ "author": "ryanontheinside",
+ "title": "ComfyUI_YoloNasObjectDetection_Tensorrt [WIP]",
+ "reference": "https://github.com/ryanontheinside/ComfyUI_YoloNasObjectDetection_Tensorrt",
+ "files": [
+ "https://github.com/ryanontheinside/ComfyUI_YoloNasObjectDetection_Tensorrt"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI YOLO NAS Object Detection with TensorRT"
+ },
+ {
+ "author": "steelan9199",
+ "title": "ComfyUI-Teeth [UNSAFE]",
+ "reference": "https://github.com/steelan9199/ComfyUI-Teeth",
+ "files": [
+ "https://github.com/steelan9199/ComfyUI-Teeth"
+ ],
+ "install_type": "git-clone",
+ "description": "Run Python code, Outline, List, Four-quadrant grid, Nine-square grid[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]"
+ },
+ {
+ "author": "aiden1020",
+ "title": "ComfyUI_Artcoder [WIP]",
+ "reference": "https://github.com/aiden1020/ComfyUI_Artcoder",
+ "files": [
+ "https://github.com/aiden1020/ComfyUI_Artcoder"
+ ],
+ "install_type": "git-clone",
+ "description": "This project is a custom node for ComfyUI that uses [a/ArtCoder](https://arxiv.org/abs/2011.07815) [CVPR 2021] to refine videos generated by [a/AnimateDiff](https://arxiv.org/abs/2307.04725) [ICLR2024 Spotlight] or the other video. The node is to transform these videos into functional QR code videos that can be scanned.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "A4P7J1N7M05OT",
+ "title": "ComfyUI-ManualSigma",
+ "reference": "https://github.com/A4P7J1N7M05OT/ComfyUI-ManualSigma",
+ "files": [
+ "https://github.com/A4P7J1N7M05OT/ComfyUI-ManualSigma"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Manual Sigma"
+ },
+ {
+ "author": "neverbiasu",
+ "title": "ComfyUI-StereoCrafter [WIP]",
+ "reference": "https://github.com/neverbiasu/ComfyUI-StereoCrafter",
+ "files": [
+ "https://github.com/neverbiasu/ComfyUI-StereoCrafter"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Depth Splatting Model Loader, Depth Splatting Node, Inpainting Inference Node"
+ },
+ {
+ "author": "watarika",
+ "title": "ComfyUI-exit [UNSAFE]",
+ "reference": "https://github.com/watarika/ComfyUI-exit",
+ "files": [
+ "https://github.com/watarika/ComfyUI-exit"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom node to handle text.[w/This custom node includes a custom node that can terminate ComfyUI.]"
+ },
+ {
+ "author": "watarika",
+ "title": "ComfyUI-Text-Utility [UNSAFE]",
+ "reference": "https://github.com/watarika/ComfyUI-Text-Utility",
+ "files": [
+ "https://github.com/watarika/ComfyUI-Text-Utility"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom node to handle text.[w/This nodepack contains a custom node that poses a security risk by providing the ability to read text from arbitrary paths.]"
+ },
+ {
+ "author": "mehbebe",
+ "title": "ComfyLoraGallery [WIP]",
+ "reference": "https://github.com/mehbebe/ComfyLoraGallery",
+ "files": [
+ "https://github.com/mehbebe/ComfyLoraGallery"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that will provide a gallery style lora selector similar to the 'lora' tab in Automatic1111."
+ },
+ {
+ "author": "karthikg-09",
+ "title": "ComfyUI-KG09 [WIP]",
+ "reference": "https://github.com/karthikg-09/ComfyUI-3ncrypt",
+ "files": [
+ "https://github.com/karthikg-09/ComfyUI-3ncrypt"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Save Image+[w/The web extension of this nodepack modifies part of ComfyUI's asset files.]"
+ },
+ {
+ "author": "glamorfleet0i",
+ "title": "ComfyUI Firewall",
+ "reference": "https://github.com/glamorfleet0i/ComfyUI-Firewall",
+ "files": [
+ "https://github.com/glamorfleet0i/ComfyUI-Firewall"
+ ],
+ "install_type": "git-clone",
+ "description": "A very basic firewall-like middleware that restricts access to your ComfyUI server based on a list of specified IP addresses. As this is configured as middleware, the firewall will restrict both the web UI and any API endpoints."
+ },
+ {
+ "author": "warshanks",
+ "title": "Shank-Tools",
+ "reference": "https://github.com/warshanks/Shank-Tools",
+ "files": [
+ "https://github.com/warshanks/Shank-Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Tile Calculator, Resolution Divider, Height & Width"
+ },
+ {
+ "author": "BaronVonBoolean",
+ "title": "ComfyUI-FileOps [UNSAFE]",
+ "reference": "https://github.com/BaronVonBoolean/ComfyUI-FileOps",
+ "files": [
+ "https://github.com/BaronVonBoolean/ComfyUI-FileOps"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: File Mv, File Path, File Dir.\n[w/This is dangerous as it provides the ability to manipulate arbitrary user files.]"
+ },
+ {
+ "author": "JissiChoi",
+ "title": "ComfyUI-Jissi-List [WIP]",
+ "reference": "https://github.com/JissiChoi/ComfyUI-Jissi-List",
+ "files": [
+ "https://github.com/JissiChoi/ComfyUI-Jissi-List"
+ ],
+ "install_type": "git-clone",
+ "description": "Data List Management for ComfyUI\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Maxim-Dey",
+ "title": "ComfyUI-MS_Tools [WIP]",
+ "reference": "https://github.com/Maxim-Dey/ComfyUI-MaksiTools",
+ "files": [
+ "https://github.com/Maxim-Dey/ComfyUI-MaksiTools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: MS Time Measure NodeMaksiTools"
+ },
+ {
+ "author": "krich-cto",
+ "title": "ComfyUI Flow Control [UNSTABLE]",
+ "reference": "https://github.com/krich-cto/ComfyUI-Flow-Control",
+ "files": [
+ "https://github.com/krich-cto/ComfyUI-Flow-Control"
+ ],
+ "install_type": "git-clone",
+ "description": "This is an Extension for ComfyUI. This project will help you control the flow logic via many controls.[w/Installing this custom node currently causes a conflict with the UnetLoaderGGUF of ComfyUI-GGUF.]"
+ },
+ {
+ "author": "dihan",
+ "title": "ComfyUI Random Keypoints for InstantID [WIP]",
+ "reference": "https://github.com/dihan/comfyui-random-kps",
+ "files": [
+ "https://github.com/dihan/comfyui-random-kps"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that generates random facial keypoints compatible with InstantID.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "emranemran",
+ "title": "ComfyUI-FasterLivePortrait",
+ "reference": "https://github.com/emranemran/ComfyUI-FasterLivePortrait",
+ "files": [
+ "https://github.com/emranemran/ComfyUI-FasterLivePortrait"
+ ],
+ "install_type": "git-clone",
+ "description": "Improve mouth tracking with live AI Video"
+ },
+ {
+ "author": "kandy",
+ "title": "ComfyUI-KAndy",
+ "reference": "https://github.com/kandy/ComfyUI-KAndy",
+ "files": [
+ "https://github.com/kandy/ComfyUI-KAndy"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Civit Prompt API, Load Image From Url, Civit Images API, KAndyNoiseCondition, KAndyImagesByCss"
+ },
+ {
+ "author": "StartHua",
+ "title": "Comfyui_leffa",
+ "reference": "https://github.com/StartHua/Comfyui_leffa",
+ "files": [
+ "https://github.com/StartHua/Comfyui_leffa"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CXH_Leffa_Viton_Load, CXH_Leffa_Viton_Run"
+ },
+ {
+ "author": "logtd",
+ "title": "ComfyUI-HunyuanLoom [WIP]",
+ "id": "comfyui-42lux",
+ "reference": "https://github.com/logtd/ComfyUI-HunyuanLoom",
+ "files": [
+ "https://github.com/logtd/ComfyUI-HunyuanLoom"
+ ],
+ "install_type": "git-clone",
+ "description": "A set of nodes to edit videos using the Hunyuan Video model"
+ },
+ {
+ "author": "watarika",
+ "title": "ComfyUI-exit [UNSAFE]",
+ "reference": "https://github.com/watarika/ComfyUI-exit",
+ "files": [
+ "https://github.com/watarika/ComfyUI-exit"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node that terminates ComfyUI after a specified number of seconds. Use this node if you want Google Colab to automatically terminate after mass generation. It is necessary to disconnect and delete the Google Colab runtime on the Notebook side."
+ },
+ {
+ "author": "backearth1",
+ "title": "Comfyui-MiniMax-Video [WIP]",
+ "reference": "https://github.com/backearth1/Comfyui-MiniMax-Video",
+ "files": [
+ "https://github.com/backearth1/Comfyui-MiniMax-Video"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI extension that integrates MiniMax AI's image-to-video and text-to-video generation capabilities, allowing users to easily convert static images into dynamic videos.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "FinetunersAI",
+ "title": "Fast Group Link [WIP]",
+ "id": "fast-group-link",
+ "reference": "https://github.com/FinetunersAI/comfyui-fast-group-link",
+ "files": [
+ "https://github.com/FinetunersAI/comfyui-fast-group-link"
+ ],
+ "install_type": "git-clone",
+ "description": "Link and control ComfyUI groups with a simple ON/OFF toggle. Control multiple groups at once with an easy-to-use interface.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI-MMAudio [WIP]",
+ "reference": "https://github.com/kijai/ComfyUI-MMAudio",
+ "files": [
+ "https://github.com/kijai/ComfyUI-MMAudio"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes to use [a/MMAudio](https://github.com/hkchengrex/MMAudio)"
+ },
+ {
+ "author": "kuschanow",
+ "title": "ComfyUI-SD-Slicer",
+ "reference": "https://github.com/kuschanow/ComfyUI-SD-Slicer",
+ "files": [
+ "https://github.com/kuschanow/ComfyUI-SD-Slicer"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Slicer"
+ },
+ {
+ "author": "ralonsobeas",
+ "title": "ComfyUI-HDRConversion [WIP]",
+ "reference": "https://github.com/ralonsobeas/ComfyUI-HDRConversion",
+ "files": [
+ "https://github.com/ralonsobeas/ComfyUI-HDRConversion"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Generate HDR image"
+ },
+ {
+ "author": "Matrix-King-Studio",
+ "title": "ComfyUI-MoviePy",
+ "reference": "https://github.com/Matrix-King-Studio/ComfyUI-MoviePy",
+ "files": [
+ "https://github.com/Matrix-King-Studio/ComfyUI-MoviePy"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Image Clip Node, Audio Duration Node, Save Video Node"
+ },
+ {
+ "author": "oxysoft",
+ "title": "ComfyUI-uiapi",
+ "reference": "https://github.com/oxysoft/ComfyUI-uiapi",
+ "files": [
+ "https://github.com/oxysoft/ComfyUI-uiapi"
+ ],
+ "install_type": "git-clone",
+ "description": "UIAPI is an intermediate and frontend plugin which allow communicating with the Comfy webui through server connection. This saves the need to export a workflow.json and instead directly sending a queue command to the frontend. This way, the user can experiment in realtime as they are running some professional industry or rendering software which uses UIAPI / ComfyUI as a backend. There is no way to switch seamlessly between UIAPI and regular server connection - though as of late summer 2023 it was inferior to use the server connection because the server would constantly unload models and start from scratch, and the schema of the workfow json was completely different and much less convenient, losing crucial information for efficient querying of nodes and assigning data dynamically."
+ },
+ {
+ "author": "hotpot-killer",
+ "title": "ComfyUI_AlexNodes",
+ "reference": "https://github.com/hotpot-killer/ComfyUI_AlexNodes",
+ "files": [
+ "https://github.com/hotpot-killer/ComfyUI_AlexNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: InstructPG - editing images with text prompt, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "pschroedl",
+ "title": "ComfyUI-StreamDiffusion",
+ "reference": "https://github.com/pschroedl/ComfyUI-StreamDiffusion",
+ "files": [
+ "https://github.com/pschroedl/ComfyUI-StreamDiffusion"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: StreamDiffusionConfig, StreamDiffusionAccelerationSampler, StreamDiffusionLoraLoader, StreamDiffusionAccelerationConfig, StreamDiffusionSimilarityFilterConfig, StreamDiffusionModelLoader, ..."
+ },
+ {
+ "author": "Junst",
+ "title": "ComfyUI-PNG2SVG2PNG",
+ "reference": "https://github.com/Junst/ComfyUI-PNG2SVG2PNG",
+ "files": [
+ "https://github.com/Junst/ComfyUI-PNG2SVG2PNG"
+ ],
+ "description": "NODES:PNG2SVG2PNG",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "animEEEmpire",
+ "title": "ComfyUI-Animemory-Loader",
+ "reference": "https://github.com/animEEEmpire/ComfyUI-Animemory-Loader",
+ "files": [
+ "https://github.com/animEEEmpire/ComfyUI-Animemory-Loader"
+ ],
+ "install_type": "git-clone",
+ "description": "AniMemory-alpha Custom Node for ComfyUI"
+ },
+ {
+ "author": "ShahFaisalWani",
+ "title": "ComfyUI-Mojen-Nodeset",
+ "reference": "https://github.com/ShahFaisalWani/ComfyUI-Mojen-Nodeset",
+ "files": [
+ "https://github.com/ShahFaisalWani/ComfyUI-Mojen-Nodeset"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of powerful, versatile, and community-driven custom nodes for ComfyUI, designed to elevate AI workflows!"
+ },
+ {
+ "author": "grimli333",
+ "title": "ComfyUI_Grim",
+ "reference": "https://github.com/grimli333/ComfyUI_Grim",
+ "files": [
+ "https://github.com/grimli333/ComfyUI_Grim"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Generate a unique filename and folder name, Format Strings with Two Inputs"
+ },
+ {
+ "author": "risunobushi",
+ "title": "ComfyUI_FocusMask",
+ "reference": "https://github.com/risunobushi/ComfyUI_FocusMask",
+ "files": [
+ "https://github.com/risunobushi/ComfyUI_FocusMask"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Extract Focus Mask"
+ },
+ {
+ "author": "RicherdLee",
+ "title": "comfyui-oss-image-save [WIP]",
+ "reference": "https://github.com/RicherdLee/comfyui-oss-image-save",
+ "files": [
+ "https://github.com/RicherdLee/comfyui-oss-image-save"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: SaveImageOSS."
+ },
+ {
+ "author": "Matrix-King-Studio",
+ "title": "ComfyUI-MoviePy",
+ "reference": "https://github.com/Matrix-King-Studio/ComfyUI-MoviePy",
+ "files": [
+ "https://github.com/Matrix-King-Studio/ComfyUI-MoviePy"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Image Clip Node, Audio Duration Node, Save Video Node,..."
+ },
+ {
+ "author": "Big Idea Technology",
+ "title": "ComfyUI-Movie-Tools [WIP]",
+ "reference": "https://github.com/Big-Idea-Technology/ComfyUI-Movie-Tools",
+ "files": [
+ "https://github.com/Big-Idea-Technology/ComfyUI-Movie-Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "Movie Tools is a set of custom nodes, designed to simplify saving and loading batches of images with enhanced functionality like subfolder management and batch image handling."
+ },
+ {
+ "author": "ArthusLiang",
+ "title": "comfyui-face-remap [WIP]",
+ "reference": "https://github.com/ArthusLiang/comfyui-face-remap",
+ "files": [
+ "https://github.com/ArthusLiang/comfyui-face-remap"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: FaceRemap\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "trithemius",
+ "title": "ComfyUI-SmolVLM [WIP]",
+ "reference": "https://github.com/mamorett/ComfyUI-SmolVLM",
+ "files": [
+ "https://github.com/mamorett/ComfyUI-SmolVLM"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes to use SmolVLM for image tagging and captioning.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "anze",
+ "title": "ComfyUI-OIDN [WIP]",
+ "reference": "https://github.com/Anze-/ComfyUI-OIDN",
+ "files": [
+ "https://github.com/Anze-/ComfyUI-OIDN"
+ ],
+ "install_type": "git-clone",
+ "description": "ComyUI wrapper for Intel OIDN image denoising\nWARNING! : this is a development repo, usage in production environments is not advised! Bugs are to be expected."
+ },
+ {
+ "author": "techzuhaib",
+ "title": "ComfyUI-CacheImageNode",
+ "reference": "https://github.com/techzuhaib/ComfyUI-CacheImageNode",
+ "files": [
+ "https://github.com/techzuhaib/ComfyUI-CacheImageNode"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CacheImageNode"
+ },
+ {
+ "author": "hay86",
+ "title": "ComfyUI AceNodes [UNSAFE]",
+ "reference": "https://github.com/hay86/ComfyUI_AceNodes",
+ "files": [
+ "https://github.com/hay86/ComfyUI_AceNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Some useful custom nodes that are not included in ComfyUI core yet.\nNOTE: Vulnerability discovered. Not being managed."
+ },
+ {
+ "author": "dowands",
+ "title": "AddMaskForICLora",
+ "reference": "https://github.com/dowands/ComfyUI-AddMaskForICLora",
+ "files": [
+ "https://github.com/dowands/ComfyUI-AddMaskForICLora"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Add Mask For IC Lora x"
+ },
+ {
+ "author": "exectails",
+ "title": "Scripting",
+ "id": "et_scripting [UNSAFE]",
+ "reference": "https://github.com/exectails/comfyui-et_scripting",
+ "files": [
+ "https://github.com/exectails/comfyui-et_scripting"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes that can be used to write Python scripts directly on a node. Useful for quick prototyping and testing, at the cost of security.[w/This extension allows the execution of arbitrary Python code from a workflow.]"
+ },
+ {
+ "author": "AIFSH",
+ "title": "UltralightDigitalHuman-ComfyUI",
+ "reference": "https://github.com/AIFSH/UltralightDigitalHuman-ComfyUI",
+ "files": [
+ "https://github.com/AIFSH/UltralightDigitalHuman-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "a custom node for [a/Ultralight-Digital-Human](https://github.com/anliyuan/Ultralight-Digital-Human)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "StartHua",
+ "title": "Comfyui_Flux_Style_Ctr [WIP]",
+ "reference": "https://github.com/StartHua/Comfyui_Flux_Style_Ctr",
+ "files": [
+ "https://github.com/StartHua/Comfyui_Flux_Style_Ctr"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:CXH_StyleModelApply\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "miragecoa",
+ "title": "ComfyUI-LLM-Evaluation [WIP]",
+ "reference": "https://github.com/miragecoa/ComfyUI-LLM-Evaluation",
+ "files": [
+ "https://github.com/miragecoa/ComfyUI-LLM-Evaluation"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Load File, Select Item by Index, Select Item by Key, JSONToListNode, MathOperationNode, F1ScoreNode, AccuracyNode, ..."
+ },
+ {
+ "author": "WASasquatch",
+ "title": "ASTERR [UNSAFE]",
+ "id": "asterr",
+ "reference": "https://github.com/WASasquatch/ASTERR",
+ "files": [
+ "https://github.com/WASasquatch/ASTERR"
+ ],
+ "install_type": "git-clone",
+ "description": "Abstract Syntax Trees Evaluated Restricted Run (ASTERR) is a Python Script executor for ComfyUI. [w/Warning:ASTERR runs Python Code from a Web Interface! It is highly recommended to run this in a closed-off environment, as it could have potential security risks.]"
+ },
+ {
+ "author": "BenjaMITM",
+ "title": "ComfyUI_On_The_Fly_Wildcards [WIP]",
+ "reference": "https://github.com/BenjaMITM/ComfyUI_On_The_Fly_Wildcards",
+ "files": [
+ "https://github.com/BenjaMITM/ComfyUI_On_The_Fly_Wildcards"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Wildcard Creator, Wildcard Loader, Wildcard Selector, Display String.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "celll1",
+ "title": "cel_sampler [WIP]",
+ "reference": "https://github.com/celll1/cel_sampler",
+ "files": [
+ "https://github.com/celll1/cel_sampler"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Latent Value Tracker\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "DataCTE",
+ "title": "ComfyUI-DataVoid-nodes [WIP]",
+ "reference": "https://github.com/DataCTE/ComfyUI-DataVoid-nodes",
+ "files": [
+ "https://github.com/DataCTE/ComfyUI-DataVoid-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI focused on model merging and style adaptation.[w/It may cause a lot of node conflicts with comfyui_ipadapter_plus.]"
+ },
+ {
+ "author": "minhtuannhn",
+ "title": "comfyui-gemini-studio [WIP]",
+ "reference": "https://github.com/minhtuannhn/comfyui-gemini-studio",
+ "files": [
+ "https://github.com/minhtuannhn/comfyui-gemini-studio"
+ ],
+ "install_type": "git-clone",
+ "description": "comfyui-gemini-studio[w/This extension uses the legacy method of copying JS.]"
+ },
+ {
+ "author": "artem-konevskikh",
+ "title": "ComfyUI Video Processing Nodes [WIP]",
+ "reference": "https://github.com/artem-konevskikh/comfyui-split-merge-video",
+ "files": [
+ "https://github.com/artem-konevskikh/comfyui-split-merge-video"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for ComfyUI that add video splitting and merging capabilities with crossfade transitions."
+ },
+ {
+ "author": "Poseidon-fan",
+ "title": "ComfyUI-fileCleaner [UNSAFE]",
+ "reference": "https://github.com/Poseidon-fan/ComfyUI-fileCleaner",
+ "files": [
+ "https://github.com/Poseidon-fan/ComfyUI-fileCleaner"
+ ],
+ "install_type": "git-clone",
+ "description": "In production environments, images are usually saved on storage servers such as S3, rather than local folders. So the method of placing images in local folders using ComfyUI's native LoadImage and SaveImage nodes cannot be used as a deployment service method, but can only be used as a temporary storage place for images. This requires a way to delete images from the input and output folders.\nThis node is used to delete images from the input and output folders. It is recommended to use this node through api call in the backend after the image processing is completed.[w/Users can use the file deletion feature through the workflow.]"
+ },
+ {
+ "author": "yorkane",
+ "title": "Comfy UI Robe Nodes [UNSAFE]",
+ "reference": "https://github.com/RobeSantoro/ComfyUI-RobeNodes",
+ "files": [
+ "https://github.com/RobeSantoro/ComfyUI-RobeNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: List Video Path Node, List Image Path Node\nThis is a collection of utility nodes for the ComfyUI stable diffusion client that provides enhanced file path handling capabilities.[w/Users will be able to access images from arbitrary paths through the workflow.]"
+ },
+ {
+ "author": "Clybius",
+ "title": "ComfyUI-FluxDeCLIP",
+ "reference": "https://github.com/Clybius/ComfyUI-FluxDeCLIP",
+ "files": [
+ "https://github.com/Clybius/ComfyUI-FluxDeCLIP"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:FluxDeCLIPCheckpointLoader"
+ },
+ {
+ "author": "ZHO-ZHO-ZHO",
+ "title": "ComfyUI-BiRefNet-ZHO [BROKEN]",
+ "id": "birefnet",
+ "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO",
+ "files": [
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO"
+ ],
+ "install_type": "git-clone",
+ "description": "Better version for [a/BiRefNet](https://github.com/zhengpeng7/birefnet) in ComfyUI | Both img and video.\nNOTE: You need to do [a/manual patch](https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO/issues/20)"
+ },
+ {
+ "author": "trashgraphicard",
+ "title": "Albedo-Sampler-for-ComfyUI",
+ "reference": "https://github.com/trashgraphicard/Albedo-Sampler-for-ComfyUI",
+ "files": [
+ "https://github.com/trashgraphicard/Albedo-Sampler-for-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Sample Image, Make Seamless Tile"
+ },
+ {
+ "author": "Anze-",
+ "title": "ComfyUI_deepDeband [WIP]",
+ "reference": "https://github.com/Anze-/ComfyUI_deepDeband",
+ "files": [
+ "https://github.com/Anze-/ComfyUI_deepDeband"
+ ],
+ "install_type": "git-clone",
+ "description": "ComyUI wrapper for RaymondLZhou/deepDeband image and video debanding\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "bmad4ever",
+ "title": "Bmad Nodes [UNSAFE]",
+ "id": "bmad",
+ "reference": "https://github.com/bmad4ever/comfyui_bmad_nodes",
+ "files": [
+ "https://github.com/bmad4ever/comfyui_bmad_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node offers the following functionalities: API support for setting up API requests, computer vision primarily for masking or collages, and general utility to streamline workflow setup or implement essential missing features.\nNOTE: Vulnerability discovered. Not being managed."
+ },
+ {
+ "author": "suncat2ps",
+ "title": "ComfyUI-SaveImgNextcloud",
+ "reference": "https://github.com/suncat2ps/ComfyUI-SaveImgNextcloud",
+ "files": [
+ "https://github.com/suncat2ps/ComfyUI-SaveImgNextcloud"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Save Image to Nextcloud"
+ },
+ {
+ "author": "DoctorDiffusion",
+ "title": "ComfyUI-Flashback",
+ "reference": "https://github.com/DoctorDiffusion/ComfyUI-Flashback",
+ "files": [
+ "https://github.com/DoctorDiffusion/ComfyUI-Flashback"
+ ],
+ "description": "NODES:Latent Export, Latent Import, Latent Loop",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "sswink",
+ "title": "comfyui-lingshang",
+ "reference": "https://github.com/sswink/comfyui-lingshang",
+ "files": [
+ "https://github.com/sswink/comfyui-lingshang"
+ ],
+ "description": "NODES:LS_SaveImageToOss, LS_LoadMaskFromUrl, LS_DigImageByMask, LS_ALY_Seg_Utils, LS_ALY_UploadToOssAndGetUrl, LS_GrowMaskWithBlur, LS_ALY_Seg_Body_Utils, LS_ALY_Seg_Common_Utils, LS_ALY_Seg_Clothes_Utils, LS_ALY_Seg_Body_Utils_Return_crop, ...",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "AICodeFactory",
+ "title": "ComfyUI-Viva",
+ "reference": "https://github.com/AICodeFactory/ComfyUI-Viva",
+ "files": [
+ "https://github.com/AICodeFactory/ComfyUI-Viva"
+ ],
+ "description": "NODES:HttpTrigger (Viva), HttpTrigger (Image), HttpTrigger (Common)",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "LogicAI",
+ "title": "ComfyUI-MagicAI [UNSAFE]",
+ "reference": "https://github.com/lcolok/ComfyUI-MagicAI",
+ "files": [
+ "https://github.com/lcolok/ComfyUI-MagicAI"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Mask Size Calculator (MagicAI), Universal Mask Converter (MagicAI), Python Execution (MagicAI), Extract JSON From Text Node(MagicAI)\n[w/This extension allows the execution of arbitrary Python code from a workflow.]"
+ },
+ {
+ "author": "aria1th",
+ "title": "ComfyUI-SkipCFGSigmas",
+ "reference": "https://github.com/aria1th/ComfyUI-SkipCFGSigmas",
+ "files": [
+ "https://github.com/aria1th/ComfyUI-SkipCFGSigmas"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CFGControl_SKIPCFG"
+ },
+ {
+ "author": "Clelstyn",
+ "title": "ComfyUI-Inpaint_with_Detailer",
+ "reference": "https://github.com/Clelstyn/ComfyUI-Inpaint_with_Detailer",
+ "files": [
+ "https://github.com/Clelstyn/ComfyUI-Inpaint_with_Detailer"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Masked Resize Image, Paste Masked Image, Filter And Blur Mask"
+ },
+ {
+ "author": "Looking-Glass",
+ "title": "LKG-ComfyUI",
+ "reference": "https://github.com/Looking-Glass/LKG-ComfyUI",
+ "files": [
+ "https://github.com/Looking-Glass/LKG-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Side by Side Node, Bridge Preview Node, Load Folder, Scale Maintain Aspect Ratio Node, "
+ },
+ {
+ "author": "xiaoyumu",
+ "title": "ComfyUI-XYNodes",
+ "reference": "https://github.com/xiaoyumu/ComfyUI-XYNodes",
+ "files": [
+ "https://github.com/xiaoyumu/ComfyUI-XYNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:PrimitiveBBOX."
+ },
+ {
+ "author": "ainanoha",
+ "title": "etm_comfyui_nodes",
+ "reference": "https://github.com/ainanoha/etm_comfyui_nodes",
+ "files": [
+ "https://github.com/ainanoha/etm_comfyui_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:LETM Save Image, ETM Load Image From Local"
+ },
+ {
+ "author": "m-ai-studio",
+ "title": "mai-prompt-progress",
+ "reference": "https://github.com/m-ai-studio/mai-prompt-progress",
+ "files": [
+ "https://github.com/m-ai-studio/mai-prompt-progress"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI extensions for sending prompt progress to webhook"
+ },
+ {
+ "author": "neeltheninja",
+ "title": "ComfyUI-TempFileDeleter [UNSAFE]",
+ "reference": "https://github.com/neeltheninja/ComfyUI-TempFileDeleter",
+ "files": [
+ "https://github.com/neeltheninja/ComfyUI-TempFileDeleter"
+ ],
+ "install_type": "git-clone",
+ "description": "This node is designed to streamline your workflow in ComfyUI by efficiently cleaning up temporary files on each run. This node takes no input. You can specify 'on' or 'off' in the node itself, or just bypass to not use use it.[w/This node can delete any files in the folder mentioned in 'folder_path' in the node. Be aware of this and change the folder path correctly before running any workflow with this node. I will NOT be responsible for wrongly deleted files because you didn't read this beforehand.]"
+ },
+ {
+ "author": "kylegrover",
+ "title": "comfyui-python-cowboy [UNSAFE]",
+ "reference": "https://github.com/kylegrover/comfyui-python-cowboy",
+ "files": [
+ "https://github.com/kylegrover/comfyui-python-cowboy"
+ ],
+ "install_type": "git-clone",
+ "description": "run python code in comfyui\nuses codemirror for nice syntax highlighting\nNOTE: based on ComfyUI-nidefawl[w/This node is an unsafe node that includes the capability to execute arbitrary python script.]"
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI-MochiWrapper [WIP]",
+ "reference": "https://github.com/kijai/ComfyUI-MochiWrapper",
+ "files": [
+ "https://github.com/kijai/ComfyUI-MochiWrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI wrapper nodes for [a/Mochi](https://github.com/genmoai/models) video generator"
+ },
+ {
+ "author": "leadbreak",
+ "title": "Face Aging [WIP]",
+ "reference": "https://github.com/leadbreak/comfyui-faceaging",
+ "files": [
+ "https://github.com/leadbreak/comfyui-faceaging"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a comfyui custom node version of [a/Age Transformation](https://github.com/yuval-alaluf/SAM).\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "downlifted",
+ "title": "ComfyUI_BWiZ_Nodes [WIP]",
+ "reference": "https://github.com/downlifted/ComfyUI_BWiZ_Nodes",
+ "files": [
+ "https://github.com/downlifted/ComfyUI_BWiZ_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:CaptainWebhook, CaptainWebhook-Email, CaptainWebhook-Push, BWIZ_AdvancedLoadImageBatch, BWIZ_ErrorDetector, BWIZ_HFRepoBatchLoader, BWIZ_NotificationSound.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "blurymind",
+ "title": "cozy-fireplace [WIP]",
+ "reference": "https://github.com/blurymind/cozy-fireplace",
+ "files": [
+ "https://github.com/blurymind/cozy-fireplace"
+ ],
+ "install_type": "git-clone",
+ "description": "Cozy fireplace is a ComfyUI workflow prompter that brings a localhost server frontend for existing workflows created in ComfyUi. Just place your favorite or lovingly crafted workflows in a folder and cozy fireplace will let you select and run any of them (export them as API type in comfyui) It's a cozy UI that scales all the way down to mobile phone devices - to let you prompt your beefy pc at home with your smartphone."
+ },
+ {
+ "author": "lordwedggie",
+ "title": "xcpNodes [WIP]",
+ "reference": "https://github.com/lordwedggie/xcpNodes",
+ "files": [
+ "https://github.com/lordwedggie/xcpNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Slider nodes based on Smirnov75's codes [a/https://github.com/Smirnov75/ComfyUI-mxToolkit](https://github.com/Smirnov75/ComfyUI-mxToolkit)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "kxh",
+ "title": "ComfyUI-ImageUpscaleWithModelMultipleTimes",
+ "reference": "https://github.com/kxh/ComfyUI-ImageUpscaleWithModelMultipleTimes",
+ "files": [
+ "https://github.com/kxh/ComfyUI-ImageUpscaleWithModelMultipleTimes"
+ ],
+ "install_type": "git-clone",
+ "description": "Upscale image with model multiple times !"
+ },
+ {
+ "author": "rouxianmantou",
+ "title": "comfyui-rxmt-nodes",
+ "reference": "https://github.com/rouxianmantou/comfyui-rxmt-nodes",
+ "files": [
+ "https://github.com/rouxianmantou/comfyui-rxmt-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Check Value Type, Why Prompt Text"
+ },
+ {
+ "author": "SirVeggie",
+ "title": "SirVeggie/Custom nodes for ComfyUI",
+ "reference": "https://github.com/SirVeggie/comfyui-sv-nodes",
+ "files": [
+ "https://github.com/SirVeggie/comfyui-sv-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:SV-SimpleText, SV-PromptProcessing, SV-PromptProcessingRecursive, SV-PromptProcessingAdvanced, SV-PromptProcessingEncode,..."
+ },
+ {
+ "author": "artisanalcomputing",
+ "title": "artcpu-custom-nodes",
+ "reference": "https://github.com/artisanalcomputing/ComfyUI-Custom-Nodes",
+ "files": [
+ "https://github.com/artisanalcomputing/ComfyUI-Custom-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Random Video Mixer, Spotify Canvas Generator, Video Writer\ncustom comfyui nodes for audio/visual purposes# ComfyUI-Custom-Nodes"
+ },
+ {
+ "author": "kxh",
+ "title": "ComfyUI-sam2",
+ "reference": "https://github.com/kxh/ComfyUI-sam2",
+ "files": [
+ "https://github.com/kxh/ComfyUI-sam2"
+ ],
+ "install_type": "git-clone",
+ "description": "use semantic tag to segment any element in an image, output a mask.\nNOTE: Repo name is conflicting with neverbiasu/ComfyUI-SAM2"
+ },
+ {
+ "author": "AIFSH",
+ "title": "UtilNodes-ComfyUI [WIP]",
+ "reference": "https://github.com/AIFSH/UtilNodes-ComfyUI",
+ "files": [
+ "https://github.com/AIFSH/UtilNodes-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "here put custom input nodes such as text,video...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "alchemist-novaro",
+ "title": "ComfyUI-Simple-Image-Tools [WIP]",
+ "reference": "https://github.com/alchemist-novaro/ComfyUI-Simple-Image-Tools",
+ "files": [
+ "https://github.com/alchemist-novaro/ComfyUI-Simple-Image-Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "Get mask from image based on alpha (Get Mask From Alpha)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "galoreware",
+ "title": "ComfyUI-GaloreNodes [WIP]",
+ "reference": "https://github.com/galoreware/ComfyUI-GaloreNodes",
+ "files": [
+ "https://github.com/galoreware/ComfyUI-GaloreNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Color and Image related nodes for ComfyUI."
+ },
+ {
+ "author": "lgldlk",
+ "title": "ComfyUI-img-tiler",
+ "reference": "https://github.com/lgldlk/ComfyUI-img-tiler",
+ "files": [
+ "https://github.com/lgldlk/ComfyUI-img-tiler"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:TilerImage, TilerSelect, TileMaker, ImageListTileMaker"
+ },
+ {
+ "author": "wilzamguerrero",
+ "title": "Comfyui-zZzZz [UNSAFE]",
+ "reference": "https://github.com/wilzamguerrero/Comfyui-zZzZz",
+ "files": [
+ "https://github.com/wilzamguerrero/Comfyui-zZzZz"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Download Z, Compress Z, Move Z, Delete Z, Rename Z, Create Z, Infinite Z, Share Screen Z"
+ },
+ {
+ "author": "alchemist-novaro",
+ "title": "Affine Transform ComfyUI Node [WIP]",
+ "reference": "https://github.com/alchemist-novaro/ComfyUI-Affine-Transform",
+ "files": [
+ "https://github.com/alchemist-novaro/ComfyUI-Affine-Transform"
+ ],
+ "install_type": "git-clone",
+ "description": "This node output the image that are transfromed by affine matrix what is made according to 4 points of output.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ruka-game",
+ "title": "ComfyUI RukaLib [WIP]",
+ "reference": "https://github.com/ruka-game/rukalib_comfyui",
+ "files": [
+ "https://github.com/ruka-game/rukalib_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Ruka Prompt Enhancer, Ruka Debug Probe.\nMy utilities for comfy (WIP / ollama is required for LLM nodes)"
+ },
+ {
+ "author": "MythicalChu",
+ "title": "ComfyUI-APG_ImYourCFGNow",
+ "reference": "https://github.com/MythicalChu/ComfyUI-APG_ImYourCFGNow",
+ "files": [
+ "https://github.com/MythicalChu/ComfyUI-APG_ImYourCFGNow"
+ ],
+ "install_type": "git-clone",
+ "description": "Use this node like a RescaleCFG node, ... modelIn -> ThisNode -> ModelOut ... -> KSampler\n'scale' acts like your CFG, your CFG doesn't do anything anymore white this node is active. See paper [a/https://arxiv.org/pdf/2410.02416](https://arxiv.org/pdf/2410.02416) for instructions about the other parameters. (Pages 20-21)"
+ },
+ {
+ "author": "okg21",
+ "title": "VLLMVisionChatNode",
+ "reference": "https://github.com/okg21/VLLMVisionChatNode",
+ "files": [
+ "https://raw.githubusercontent.com/okg21/VLLMVisionChatNode/refs/heads/main/VLLMVisionChatNode.py"
+ ],
+ "pip": ["openai", "numpy"],
+ "install_type": "copy",
+ "description": "This platform extension provides ZhipuAI nodes, enabling you to configure a workflow for online video generation."
+ },
+ {
+ "author": "netanelben",
+ "title": "comfyui-photobooth-customnode",
+ "reference": "https://github.com/netanelben/comfyui-photobooth-customnode",
+ "files": [
+ "https://github.com/netanelben/comfyui-photobooth-customnode"
+ ],
+ "install_type": "git-clone",
+ "description": "comfyui-photobooth-customnode"
+ },
+ {
+ "author": "netanelben",
+ "title": "comfyui-text2image-customnode",
+ "reference": "https://github.com/netanelben/comfyui-text2image-customnode",
+ "files": [
+ "https://github.com/netanelben/comfyui-text2image-customnode"
+ ],
+ "install_type": "git-clone",
+ "description": "comfyui-text2image-customnode"
+ },
+ {
+ "author": "netanelben",
+ "title": "comfyui-camera2image-customnode",
+ "reference": "https://github.com/netanelben/comfyui-camera2image-customnode",
+ "files": [
+ "https://github.com/netanelben/comfyui-camera2image-customnode"
+ ],
+ "install_type": "git-clone",
+ "description": "comfyui-camera2image-customnode"
+ },
+ {
+ "author": "netanelben",
+ "title": "comfyui-image2image-customnode",
+ "reference": "https://github.com/netanelben/comfyui-image2image-customnode",
+ "files": [
+ "https://github.com/netanelben/comfyui-image2image-customnode"
+ ],
+ "install_type": "git-clone",
+ "description": "comfyui-image2image-customnode"
+ },
+ {
+ "author": "JayLyu",
+ "title": "ComfyUI_BaiKong_Node",
+ "id": "baikong",
+ "reference": "https://github.com/JayLyu/ComfyUI_BaiKong_Node",
+ "files": [
+ "https://github.com/JayLyu/ComfyUI_BaiKong_Node"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes for advanced color manipulation and image processing: BK Img To Color, BK Color Selector, BK Color Contrast, BK Color Limit, BK Color Luminance, BK Gradient Image, and BK Image Aspect Filter.\n[w/requirements.txt is broken.]"
+ },
+ {
+ "author": "ZHO-ZHO-ZHO",
+ "title": "ComfyUI Llama 3.1 [WIP]",
+ "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Llama-3-2",
+ "files": [
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Llama-3-2"
+ ],
+ "install_type": "git-clone",
+ "description": "Using Llama-3-1 in ComfyUI"
+ },
+ {
+ "author": "netanelben",
+ "title": "comfyui-text2image-customnode [WIP]",
+ "reference": "https://github.com/netanelben/comfyui-text2image-customnode",
+ "files": [
+ "https://github.com/netanelben/comfyui-text2image-customnode"
+ ],
+ "install_type": "git-clone",
+ "description": "text2image web extension"
+ },
+ {
+ "author": "leeguandong",
+ "title": "ComfyUI_AliControlnetInpainting [WIP]",
+ "reference": "https://github.com/leeguandong/ComfyUI_AliControlnetInpainting",
+ "files": [
+ "https://github.com/leeguandong/ComfyUI_AliControlnetInpainting"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes to use AliControlnetInpainting"
+ },
+ {
+ "author": "jordancoult",
+ "title": "ComfyUI_HelpfulNodes",
+ "reference": "https://github.com/jordancoult/ComfyUI_HelpfulNodes",
+ "files": [
+ "https://github.com/jordancoult/ComfyUI_HelpfulNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Prep Crop Around Keypoints"
+ },
+ {
+ "author": "ashishsaini",
+ "title": "comfyui_segformer_b2_sleeves",
+ "reference": "https://github.com/ashishsaini/comfyui-segment-clothing-sleeves",
+ "files": [
+ "https://github.com/ashishsaini/comfyui-segment-clothing-sleeves"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:segformer_b2_sleeves"
+ },
+ {
+ "author": "io-club",
+ "title": "ComfyUI-LuminaNext [WIP]",
+ "reference": "https://github.com/io-club/ComfyUI-LuminaNext",
+ "files": [
+ "https://github.com/io-club/ComfyUI-LuminaNext"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: GemmaClipLoader"
+ },
+ {
+ "author": "shadowcz007",
+ "title": "Comfyui-EzAudio [WIP]",
+ "reference": "https://github.com/shadowcz007/Comfyui-EzAudio",
+ "files": [
+ "https://github.com/shadowcz007/Comfyui-EzAudio"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: EZ Generate Audio, EZ Load Model\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "neo0801",
+ "title": "my-comfy-node",
+ "reference": "https://github.com/neo0801/my-comfy-node",
+ "files": [
+ "https://github.com/neo0801/my-comfy-node"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Deep Mosaic Get Image Mosaic Mask, Deep Mosaic Get Video Mosaic Mask, Deep Mosaic Remove Image Mosaic, Deep Mosaic Remove Video Mosaic"
+ },
+ {
+ "author": "nikkuexe",
+ "title": "List Data Helper Nodes",
+ "reference": "https://github.com/paulhoux/Smart-Prompting",
+ "files": [
+ "https://github.com/paulhoux/Smart-Prompting"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for ComfyUI, allowing you to more easily manipulate text and create good prompts.[w/The use of outdated front extension techniques results in remnants being left behind during uninstallation.]"
+ },
+ {
+ "author": "nikkuexe",
+ "title": "List Data Helper Nodes",
+ "reference": "https://github.com/nikkuexe/ComfyUI-ListDataHelpers",
+ "files": [
+ "https://github.com/nikkuexe/ComfyUI-ListDataHelpers"
+ ],
+ "install_type": "git-clone",
+ "description": "A set of custom nodes for handling lists in ComfyUI."
+ },
+ {
+ "author": "Fannovel16",
+ "title": "ComfyUI-AppIO",
+ "reference": "https://github.com/Fannovel16/ComfyUI-AppIO",
+ "files": [
+ "https://github.com/Fannovel16/ComfyUI-AppIO"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:AppIO_StringInput, AppIO_ImageInput, AppIO_StringOutput, AppIO_ImageOutput"
+ },
+ {
+ "author": "seancheung",
+ "title": "comfyui-creative-nodes",
+ "reference": "https://github.com/seancheung/comfyui-creative-nodes",
+ "files": [
+ "https://github.com/seancheung/comfyui-creative-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Stop Flow, Skip From Flow, Skip To Flow, Resolution Selector, ResolutionXL Selector"
+ },
+ {
+ "author": "AlexXi19",
+ "title": "ComfyUI-OpenAINode",
+ "reference": "https://github.com/AlexXi19/ComfyUI-OpenAINode",
+ "files": [
+ "https://github.com/AlexXi19/ComfyUI-OpenAINode"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI-OpenAINode is a user-friendly node that serves as an interface to the OpenAI Models.[w/Repo name conflict with Electrofried/ComfyUI-OpenAINode]"
+ },
+ {
+ "author": "IgPoly",
+ "title": "ComfyUI-igTools",
+ "reference": "https://github.com/IgPoly/ComfyUI-igTools",
+ "files": [
+ "https://github.com/IgPoly/ComfyUI-igTools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:IGT Simple Tiles Calc"
+ },
+ {
+ "author": "Ryota",
+ "title": "Ryota's Nodes",
+ "reference": "https://github.com/lichenhao/Comfyui_Ryota",
+ "files": [
+ "https://github.com/lichenhao/Comfyui_Ryota"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:CombineTexts, FontLoader, DrawText, TxtFileLoader, SaveTxtFile, SwitchModelClip, SwitchAnyInputs, Reroute2, Reroute3"
+ },
+ {
+ "author": "Soppatorsk",
+ "title": "comfyui_img_to_ascii [WIP]",
+ "reference": "https://github.com/Soppatorsk/comfyui_img_to_ascii",
+ "files": [
+ "https://github.com/Soppatorsk/comfyui_img_to_ascii"
+ ],
+ "install_type": "git-clone",
+ "description": "Basic functionality for converting an image to ASCII art returned as a png image based on [a/ascii_magic](https://github.com/LeandroBarone/python-ascii_magic)"
+ },
+ {
+ "author": "Lilien86",
+ "title": "Comfyui_Latent_Interpolation [WIP]",
+ "reference": "https://github.com/Lilien86/Comfyui_Latent_Interpolation",
+ "files": [
+ "https://github.com/Lilien86/Comfyui_Latent_Interpolation"
+ ],
+ "install_type": "git-clone",
+ "description": "Hey everyone it's my Custom ComfyUI Nodes Pack repository! This project contains a collection of custom nodes designed to extend the functionality of ComfyUI. These nodes offer capabilities and new creative possibilities, especially in the realms of latent space manipulation and interpolation.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "haodman",
+ "title": "ComfyUI_Rain",
+ "reference": "https://github.com/haodman/ComfyUI_Rain",
+ "files": [
+ "https://github.com/haodman/ComfyUI_Rain"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Rain_ValueSwitch, Rain_Math, Rain_IntToFloat, Rain_ImageSize."
+ },
+ {
+ "author": "bananasss00",
+ "title": "Comfyui-PyExec [UNSAFE]",
+ "reference": "https://github.com/bananasss00/Comfyui-PyExec",
+ "files": [
+ "https://github.com/bananasss00/Comfyui-PyExec"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:PyExec.[w/This node allows access to arbitrary files through the workflow, which could pose a security threat.]"
+ },
+ {
+ "author": "jgbrblmd",
+ "title": "ComfyUI-ComfyFluxSize [WIP]",
+ "reference": "https://github.com/jgbrblmd/ComfyUI-ComfyFluxSize",
+ "files": [
+ "https://github.com/jgbrblmd/ComfyUI-ComfyFluxSize"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:ComfyFlux Size\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "yojimbodayne",
+ "title": "ComfyUI-Dropbox-API [WIP]",
+ "reference": "https://github.com/yojimbodayne/ComfyUI-Dropbox-API",
+ "files": [
+ "https://github.com/yojimbodayne/ComfyUI-Dropbox-API"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom nodepackage for ComfyUI allows users to interact with Dropbox API, enabling image, text, and video uploads, downloads, and management directly from ComfyUI workflows.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ilovejohnwhite",
+ "title": "Kolors Awesome Prompts [WIP]",
+ "reference": "https://github.com/ilovejohnwhite/Tracer",
+ "files": [
+ "https://github.com/ilovejohnwhite/Tracer"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Image Load TTK, SuckerPunch, LinkMasterNode, PixelPerfectResolution, ImageGenResolutionFromImage, ImageGenResolutionFromLatent, HintImageEnchance\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "shuanshtalon468uan",
+ "title": "ComfyUI-Rpg-Architect [WIP]",
+ "reference": "https://github.com/talon468/ComfyUI-Rpg-Architect",
+ "files": [
+ "https://github.com/talon468/ComfyUI-Rpg-Architect"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom Node for ComfyUI to create RPG Characters\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "shuanshuan",
+ "title": "ComfyUI_CheckPointLoader_Ext [WIP]",
+ "reference": "https://github.com/shuanshuan/ComfyUI_CheckPointLoader_Ext",
+ "files": [
+ "https://github.com/shuanshuan/ComfyUI_CheckPointLoader_Ext"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Checkpoint Loader Ext"
+ },
+ {
+ "author": "123jimin",
+ "title": "ComfyUI MobileForm [WIP]",
+ "reference": "https://github.com/123jimin/ComfyUI-MobileForm",
+ "files": [
+ "https://github.com/123jimin/ComfyUI-MobileForm"
+ ],
+ "install_type": "git-clone",
+ "description": "MobileForm is an extension for ComfyUI, providing simple form for any workflows, suitable for use on mobile phones.[w/Currently MobileForm is in a PoC state; expect bugs and breaking changes.]"
+ },
+ {
+ "author": "go-package-lab",
+ "title": "ComfyUI-Tools-Video-Combine [WIP]",
+ "reference": "https://github.com/go-package-lab/ComfyUI-Tools-Video-Combine",
+ "files": [
+ "https://github.com/go-package-lab/ComfyUI-Tools-Video-Combine"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:LoadAudioUrl, VideoWatermark"
+ },
+ {
+ "author": "zhongpei",
+ "title": "Comfyui_image2prompt",
+ "id": "img2prompt",
+ "reference": "https://github.com/zhongpei/Comfyui_image2prompt",
+ "files": [
+ "https://github.com/zhongpei/Comfyui_image2prompt"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Image to Text, Loader Image to Text Model.[w/This custom node may break dependencies by reinstalling the torch package.]"
+ },
+ {
+ "author": "APZmedia",
+ "title": "comfyui-textools [WIP]",
+ "reference": "https://github.com/APZmedia/comfyui-textools",
+ "files": [
+ "https://github.com/APZmedia/comfyui-textools"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI-textools is a collection of custom nodes designed for use with ComfyUI. These nodes enhance text processing capabilities, including applying rich text overlays on images and cleaning file names for safe and consistent file management.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Comfy Org",
+ "title": "ComfyUI_devtools [WIP]",
+ "reference": "https://github.com/Comfy-Org/ComfyUI_devtools",
+ "files": [
+ "https://github.com/Comfy-Org/ComfyUI_devtools"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI developer tools (Custom Node)"
+ },
+ {
+ "author": "Sakura-nee",
+ "title": "ComfyUI_Save2Discord",
+ "reference": "https://github.com/Sakura-nee/ComfyUI_Save2Discord",
+ "files": [
+ "https://github.com/Sakura-nee/ComfyUI_Save2Discord"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Send Generated Image To Discord Webhook.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "ThisModernDay",
+ "title": "ComfyUI Instructor Ollama",
+ "reference": "https://github.com/ThisModernDay/ComfyUI-InstructorOllama",
+ "files": [
+ "https://github.com/ThisModernDay/ComfyUI-InstructorOllama"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI Nodes for interacting with Ollama using the Instructor. Library to provide structured output from your LLM. To use this properly, you would need a running Ollama server reachable from the host that is running ComfyUI.\nNOTE: The files in the repo are not organized, which may lead to update issues."
+ },
+ {
+ "author": "gioferreira",
+ "title": "ComfyUI-Molde-Utils",
+ "reference": "https://github.com/gioferreira/ComfyUI-Molde-Utils",
+ "files": [
+ "https://github.com/gioferreira/ComfyUI-Molde-Utils"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI-Molde-Utils is a utility library designed to provide various helper functions for working with UI elements. This project includes modules for handling bezier curves and color conversions.\nNOTE: The files in the repo are not organized, which may lead to update issues."
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI nodes for VEnhancer [WIP]",
+ "reference": "https://github.com/kijai/ComfyUI-VEnhancer",
+ "files": [
+ "https://github.com/kijai/ComfyUI-VEnhancer"
+ ],
+ "install_type": "git-clone",
+ "description": "Original repo: [a/https://github.com/Vchitect/VEnhancer](https://github.com/Vchitect/VEnhancer)"
+ },
+ {
+ "author": "jimstudt",
+ "title": "Jim's ComfyUI Nodes [WIP]",
+ "reference": "https://github.com/jimstudt/ComfyUI-Jims-Nodes",
+ "files": [
+ "https://github.com/jimstudt/ComfyUI-Jims-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Zoom and Enhance Nodes, Text To String List, Choose String, Define Word, Lookup Word, Substitute Words, Dictionary to JSON, JSON file to Dictionary, JSON to Dictionary, Load Image And Info From Path, CubbyHack, Image to Solid Background"
+ },
+ {
+ "author": "ChrisColeTech",
+ "title": "ComfyUI-Get-Random-File [UNSAFE]",
+ "reference": "https://github.com/ChrisColeTech/ComfyUI-Get-Random-File",
+ "files": [
+ "https://github.com/ChrisColeTech/ComfyUI-Get-Random-File"
+ ],
+ "install_type": "git-clone",
+ "description": "Gets a random file from a directory. Returns the filpath as a STRING. [w/This node allows access to arbitrary files through the workflow, which could pose a security threat.]"
+ },
+ {
+ "author": "neeltheninja",
+ "title": "ComfyUI-TextOverlay",
+ "reference": "https://github.com/neeltheninja/ComfyUI-TextOverlay",
+ "files": [
+ "https://github.com/neeltheninja/ComfyUI-TextOverlay"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that adds text overlay to images, with options for text and background color, opacity, vertical positioning, and custom font selection. [w/Name conflict with munkyfoot/ComfyUI-TextOverlay. Cannot install simulatenously.]"
+ },
+ {
+ "author": "comfyanonymous",
+ "title": "ComfyUI_bitsandbytes_NF4 [EXPERIMENTAL]",
+ "reference": "https://github.com/comfyanonymous/ComfyUI_bitsandbytes_NF4",
+ "files": [
+ "https://github.com/comfyanonymous/ComfyUI_bitsandbytes_NF4"
+ ],
+ "install_type": "git-clone",
+ "description": "A quickly written custom node that uses code from Forge to support the nf4 flux dev checkpoint and nf4 flux schnell checkpoint.\nRequires installing bitsandbytes.\nMake sure your ComfyUI is updated.\nThe node is: CheckpointLoaderNF4, just plug it in your flux workflow instead of the regular one.[w/NF4 checckpoint doesn't support LoRA.]"
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI-EasyAnimateWrapper [WIP]",
+ "reference": "https://github.com/kijai/ComfyUI-EasyAnimateWrapper",
+ "files": [
+ "https://github.com/kijai/ComfyUI-EasyAnimateWrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "EasyAnimateWrapper for ComfyUI"
+ },
+ {
+ "author": "logtd",
+ "title": "ComfyUI-Veevee [WIP]",
+ "reference": "https://github.com/logtd/ComfyUI-Veevee",
+ "files": [
+ "https://github.com/logtd/ComfyUI-Veevee"
+ ],
+ "install_type": "git-clone",
+ "description": "A Video2Video framework for text2image models in ComfyUI. Supports SD1.5 and SDXL."
+ },
+ {
+ "author": "chrisdreid",
+ "title": "ComfyUI_EnvAutopsyAPI Debugger [UNSAFE]",
+ "id": "chrisdreid",
+ "reference": "https://github.com/chrisdreid/ComfyUI_EnvAutopsyAPI",
+ "files": [
+ "https://github.com/chrisdreid/ComfyUI_EnvAutopsyAPI"
+ ],
+ "install_type": "git-clone",
+ "description": "A powerful debugging tool designed to provide in-depth analysis of your environment and dependencies by exposing API endpoints. This tool allows you to inspect environment variables, pip packages, python info and dependency trees, making it easier to diagnose and resolve issues in your ComfyUI setup.[w/This tool may expose sensitive system information if used on a public server]"
+ },
+ {
+ "author": "denislov",
+ "title": "Comfyui_AutoSurvey",
+ "reference": "https://github.com/denislov/Comfyui_AutoSurvey",
+ "files": [
+ "https://github.com/denislov/Comfyui_AutoSurvey"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:AutoSurvey, WriteOutline, WriteSection, ChatModel, QueryKnowledge, ManageDatabase, AddDoc2Knowledge"
+ },
+ {
+ "author": "leoleelxh",
+ "title": "ComfyUI-MidjourneyNode-leoleexh",
+ "reference": "https://github.com/leoleelxh/ComfyUI-MidjourneyNode-leoleexh",
+ "files": [
+ "https://github.com/leoleelxh/ComfyUI-MidjourneyNode-leoleexh"
+ ],
+ "install_type": "git-clone",
+ "description": "This node allows ComfyUI to easily integrate with Midjourney, utilizing the ultra-high quality of Midjourney and the powerful control of SD to provide more convenient capabilities for AIGC.\nNOTE: This node relies on the midjourney proxy project and requires API deployment in advance. For detailed installation, please refer to the instructions of the project. https://github.com/novicezk/midjourney-proxy"
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI-FollowYourEmojiWrapper [WIP]",
+ "reference": "https://github.com/kijai/ComfyUI-FollowYourEmojiWrapper",
+ "files": [
+ "https://github.com/kijai/ComfyUI-FollowYourEmojiWrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "Original repo: [a/https://github.com/mayuelala/FollowYourEmoji](https://github.com/mayuelala/FollowYourEmoji)"
+ },
+ {
+ "author": "haomole",
+ "title": "Comfyui-SadTalker",
+ "reference": "https://github.com/haomole/Comfyui-SadTalker",
+ "files": [
+ "https://github.com/haomole/Comfyui-SadTalker"
+ ],
+ "install_type": "git-clone",
+ "description": "[a/SadTalker](https://github.com/OpenTalker/SadTalker) for ComfyUI"
+ },
+ {
+ "author": "hotpizzatactics",
+ "title": "ComfyUI-WaterMark-Detector",
+ "id": "watermark-detector",
+ "reference": "https://github.com/hotpizzatactics/ComfyUI-WaterMark-Detector",
+ "files": [
+ "https://github.com/hotpizzatactics/ComfyUI-WaterMark-Detector"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:CLAHE Enhancement, High Pass Filter, Edge Detection, Combine Enhancements, Adaptive Thresholding, Morphological Operations, Gray Color Enhancement, Improved Gray Color Enhancement, Texture Enhancement, Denoising Filter, Flexible Combine Enhancements."
+ },
+ {
+ "author": "BetaDoggo",
+ "title": "ComfyUI-LogicGates",
+ "id": "logicgates",
+ "reference": "https://github.com/BetaDoggo/ComfyUI-LogicGates",
+ "files": [
+ "https://github.com/BetaDoggo/ComfyUI-LogicGates"
+ ],
+ "install_type": "git-clone",
+ "description": "Binary Nodes, Byte Nodes, ..."
+ },
+ {
+ "author": "shadowcz007",
+ "title": "comfyui-hydit",
+ "reference": "https://github.com/shadowcz007/comfyui-hydit-lowvram",
+ "files": [
+ "https://github.com/shadowcz007/comfyui-hydit-lowvram"
+ ],
+ "install_type": "git-clone",
+ "description": "HunYuan Diffusers Nodes"
+ },
+ {
+ "author": "walterFeng",
+ "title": "ComfyUI-Image-Utils",
+ "reference": "https://github.com/walterFeng/ComfyUI-Image-Utils",
+ "files":[
+ "https://github.com/walterFeng/ComfyUI-Image-Utils"
+ ],
+ "install_type":"git-clone",
+ "description":"Nodes: Calculate Image Brightness"
+ },
+ {
+ "author": "zml-ai",
+ "title": "comfyui-hydit",
+ "reference": "https://github.com/zml-ai/comfyui-hydit",
+ "files":[
+ "https://github.com/zml-ai/comfyui-hydit"
+ ],
+ "install_type":"git-clone",
+ "description":"The ComfyUI code is under review in the official repository. Meanwhile, a temporary version is available below for immediate community use. We welcome users to try our workflow and appreciate any inquiries or suggestions."
+ },
+ {
+ "author": "melMass",
+ "title": "ComfyUI-Lygia",
+ "id": "lygia",
+ "reference": "https://github.com/melMass/ComfyUI-Lygia",
+ "files": [
+ "https://github.com/melMass/ComfyUI-Lygia"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: LygiaProgram, LygiaUniforms"
+ },
+ {
+ "author": "SpaceWarpStudio",
+ "title": "ComfyUI_Remaker_FaceSwap",
+ "reference": "https://github.com/SpaceWarpStudio/ComfyUI_Remaker_FaceSwap",
+ "files": [
+ "https://github.com/SpaceWarpStudio/ComfyUI_Remaker_FaceSwap"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Remaker Face Swap"
+ },
+ {
+ "author": "VisionExp",
+ "title": "ve_custom_comfyui_nodes",
+ "reference": "https://github.com/VisionExp/ve_custom_comfyui_nodes",
+ "files": [
+ "https://github.com/VisionExp/ve_custom_comfyui_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:LoadImgFromInputUrl"
+ },
+ {
+ "author": "StartHua",
+ "title": "Comfyui_CXH_CRM",
+ "id": "csdmt-cxh",
+ "reference": "https://github.com/StartHua/Comfyui_CSDMT_CXH",
+ "files": [
+ "https://github.com/StartHua/Comfyui_CSDMT_CXH"
+ ],
+ "install_type": "git-clone",
+ "description": "Node:CSD_Makeup\nNOTE:You need to download [a/pre-trained model file](https://github.com/StartHua/Comfyui_CSDMT_CXH)."
+ },
+ {
+ "author": "ZHO-ZHO-ZHO",
+ "title": "ComfyUI-AuraSR-ZHO",
+ "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AuraSR-ZHO",
+ "files": [
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AuraSR-ZHO"
+ ],
+ "install_type": "git-clone",
+ "description": "AuraSR in ComfyUI for img & video\n[w/If the custom_nodes path is not under ComfyUI, be careful as it may not install properly.]"
+ },
+ {
+ "author": "tom-doerr",
+ "title": "DSPy Nodes [WIP]",
+ "reference": "https://github.com/tom-doerr/dspy_nodes",
+ "files": [
+ "https://github.com/tom-doerr/dspy_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "This is an attempt to make all DSPy features available in ComfyUI. Using an UI to devlop DSPy programs should be way faster since it makes it easier to see what is happening and allows to quickly iterate on the DSPy program structure."
+ },
+ {
+ "author": "Grant-CP",
+ "title": "ComfyUI-LivePortraitKJ-MPS",
+ "reference": "https://github.com/Grant-CP/ComfyUI-LivePortraitKJ-MPS",
+ "files": [
+ "https://github.com/Grant-CP/ComfyUI-LivePortraitKJ-MPS"
+ ],
+ "install_type": "git-clone",
+ "description": "If you wish to incorporate these changes into your repo, feel free to open an issue and ask. The commits should be pretty clear, and I also label almost all changes with #HACK so a full text search will work too.\nPlease let me know if you decide to incorporate any of these changes into your LivePortrait implementation so I can direct people to you repository. I do not intend to maintain this repo.\nSome operations are simply not supported on MPS and I didn't rewrite them. Most of my changes are just to .cuda calls and that sort of thing. Many operations are still done on CPU, so don't expect awesome performance."
+ },
+ {
+ "author": "thderoo",
+ "title": "_topfun_s_nodes",
+ "reference": "https://github.com/thderoo/ComfyUI-_topfun_s_nodes",
+ "files": [
+ "https://github.com/thderoo/ComfyUI-_topfun_s_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Conditioning Perturbation"
+ },
+ {
+ "author": "willblaschko",
+ "title": "ComfyUI-Unload-Models",
+ "reference": "https://github.com/willblaschko/ComfyUI-Unload-Models",
+ "files": [
+ "https://github.com/willblaschko/ComfyUI-Unload-Models"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository provides developers with a way to better manage their ComfyUI model memory. It includes nodes that allow developers to either unload all models or unload one model at a time. These nodes are designed as pass-through nodes, so they can be used anywhere in the flow. The nodes can be found in the 'Unload Model' section.[w/These are massive hammers, and it could be possible to break things, please don't use them if you need finesse.]"
+ },
+ {
+ "author": "AIFSH",
+ "title": "ComfyUI-OpenDIT [WIP]",
+ "id": "opendit",
+ "reference": "https://github.com/AIFSH/ComfyUI-OpenDIT",
+ "files": [
+ "https://github.com/AIFSH/ComfyUI-OpenDIT"
+ ],
+ "install_type": "git-clone",
+ "description": "make [a/OpenDIT](https://github.com/NUS-HPC-AI-Lab/OpenDiT) avaliable in ComfyUI"
+ },
+ {
+ "author": "alexisrolland",
+ "title": "alexisrolland/ComfyUI-AuraSR",
+ "id": "aurasr-alexisrolland",
+ "reference": "https://github.com/alexisrolland/ComfyUI-AuraSR",
+ "files": [
+ "https://github.com/alexisrolland/ComfyUI-AuraSR"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes to run [a/fal-ai/AuraSR](https://huggingface.co/fal-ai/AuraSR) model.[w/This node cannot be installed simultaneously with AIFSH/ComfyUI-AuraSR due to overlapping repository names.]"
+ },
+ {
+ "author": "linhusyung",
+ "title": "ComfyUI Build and Train Your Network [WIP]",
+ "id": "cfgpp",
+ "reference": "https://github.com/linhusyung/comfyui-Build-and-train-your-network",
+ "files": [
+ "https://github.com/linhusyung/comfyui-Build-and-train-your-network"
+ ],
+ "install_type": "git-clone",
+ "description": "Stable Diffusion is an image generation technique based on diffusion models. Its core idea involves simulating diffusion processes by iteratively adding noise and using neural networks to predict and remove the noise, thereby generating high-quality images. This approach is not limited to image generation; with appropriate network architecture and training data, it can be adapted for various other tasks. The application of neural networks extends beyond image generation. By adjusting network structures and loss functions, neural networks can also perform tasks such as classification and regression. This flexibility makes neural networks a powerful tool for handling a wide range of machine learning tasks. This project aims to expand custom neural network layers (such as linear layers, convolutional layers, etc.) within ComfyUI and provide simplified task training functionalities. Through this project, users can easily construct custom neural network layers and perform training in ComfyUI using a graphical interface."
+ },
+ {
+ "author": "Fucci-Mateo",
+ "title": "ComfyUI-Airtable [WIP]",
+ "id": "airtable",
+ "reference": "https://github.com/Fucci-Mateo/ComfyUI-Airtable",
+ "files": [
+ "https://github.com/Fucci-Mateo/ComfyUI-Airtable"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple node to load image from local path or http url. You can find this node from 'image' category."
+ },
+ {
+ "author": "majorsauce",
+ "title": "comfyui_indieTools [WIP]",
+ "id": "indie-tools",
+ "reference": "https://github.com/majorsauce/comfyui_indieTools",
+ "files": [
+ "https://github.com/majorsauce/comfyui_indieTools"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:[Indie] Cut by Mask, [Indie] Paste Image, [Indie] Local Scale, [Indie] Solidify, [Indie] Yolo Detector.[w/Install may fail due to invliad requirements.txt file]"
+ },
+ {
+ "author": "AIFSH",
+ "title": "ComfyUI-ViViD",
+ "id": "vivid",
+ "reference": "https://github.com/AIFSH/ComfyUI-ViViD",
+ "files": [
+ "https://github.com/AIFSH/ComfyUI-ViViD"
+ ],
+ "install_type": "git-clone",
+ "description": "a comfyui custom node for ViViD"
+ },
+ {
+ "author": "nat-chan",
+ "title": "comfyui-paint",
+ "reference": "https://github.com/nat-chan/comfyui-paint",
+ "files": [
+ "https://github.com/nat-chan/comfyui-paint"
+ ],
+ "install_type": "git-clone",
+ "description": "comfyui-paint\n[w/You need to clone submodule manually after clone. There is permission issue.]"
+ },
+ {
+ "author": "prabinpebam",
+ "title": "anyPython [UNSAFE]",
+ "reference": "https://github.com/prabinpebam/anyPython",
+ "files": [
+ "https://github.com/prabinpebam/anyPython"
+ ],
+ "install_type": "git-clone",
+ "description": "This node was inspired by AnyNode. I wanted to have a node where I can paste any python script and execute it. That way I can use this node in combination with a Custom node like the Ollama node that can generate the python code and feed into this node. This also makes it much easier to debug or modify the code iteratively. As of the current version, I've created separate nodes for no input, 1 input and 2 inputs. The input also currently takes only sting as input. Let me know in the discussion how you would use this node.\n[w/This extension allows the execution of arbitrary Python code from a workflow.]"
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI DiffSynth wrapper nodes",
+ "id": "diffsynth-wrapper",
+ "reference": "https://github.com/kijai/ComfyUI-DiffSynthWrapper",
+ "files": [
+ "https://github.com/kijai/ComfyUI-DiffSynthWrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "Currently only the new extended SVD model 'ExVideo' is supported.\nOriginal repo:[a/https://github.com/modelscope/DiffSynth-Studio](https://github.com/modelscope/DiffSynth-Studio)"
+ },
+ {
+ "author": "AllenEdgarPoe",
+ "title": "ComfyUI-Xorbis-nodes [WIP]",
+ "id": "xorbis",
+ "reference": "https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes",
+ "files": [
+ "https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository is for MuseumX Update. We use ComfyUI as our framework, and the nodes are built for my comfort.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "mikeymcfish",
+ "title": "LaserCutterFull and Deptherize Nodes",
+ "id": "fishtools",
+ "reference": "https://github.com/mikeymcfish/FishTools",
+ "files": [
+ "https://github.com/mikeymcfish/FishTools"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository contains two custom nodes, LaserCutterFull and Deptherize, designed for use in image processing workflows. The LaserCutterFull node processes input images to generate layers for laser cutting, while the Deptherize node converts SVG data into a depth map image."
+ },
+ {
+ "author": "pzzmyc",
+ "title": "comfyui-sd3-simple-simpletuner",
+ "id": "simpletuner",
+ "reference": "https://github.com/pzzmyc/comfyui-sd3-simple-simpletuner",
+ "files": [
+ "https://github.com/pzzmyc/comfyui-sd3-simple-simpletuner"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:sd3 simple simpletuner by hhy."
+ },
+ {
+ "author": "horidream",
+ "title": "ComfyUI-Horidream",
+ "id": "horidream",
+ "reference": "https://github.com/horidream/ComfyUI-Horidream",
+ "files": [
+ "https://github.com/horidream/ComfyUI-Horidream"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Pass Through With Sound."
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI-DiffusersSD3Wrapper",
+ "id": "diffusers-sd3-wrapper",
+ "reference": "https://github.com/kijai/ComfyUI-DiffusersSD3Wrapper",
+ "files": [
+ "https://github.com/kijai/ComfyUI-DiffusersSD3Wrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Load SD3DiffusersPipeline, SD3 ControlNet Sampler"
+ },
+ {
+ "author": "AustinMroz",
+ "title": "ComfyUI-SD3-Medium-CN-Diffusers [WIP]",
+ "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SD3-Medium-CN-Diffusers",
+ "files": [
+ "https://github.com/AustinMroz/ComfyUI-WorkflowCheckpointing"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI SD3-Medium ControlNet (Diffusers)"
+ },
+ {
+ "author": "redhottensors",
+ "title": "ComfyUI-ODE",
+ "id": "ode",
+ "reference": "https://github.com/redhottensors/ComfyUI-ODE",
+ "files": [
+ "https://github.com/redhottensors/ComfyUI-ODE"
+ ],
+ "install_type": "git-clone",
+ "description": "ODE Solvers for ComfyUI\nThis node enables use of torchdiffeq ODE solvers with models. Intended for use with Stable Diffusion 3 and similar flow models."
+ },
+ {
+ "author": "maruhidd",
+ "title": "Transparent Background for ComfyUI",
+ "id": "transparent-bg",
+ "reference": "https://github.com/maruhidd/ComfyUI_Transparent-Background",
+ "files": [
+ "https://github.com/maruhidd/ComfyUI_Transparent-Background"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Remove Background, Fill Transparent"
+ },
+ {
+ "author": "ejektaflex",
+ "title": "ComfyUI - Ty",
+ "id": "ty-nodes",
+ "reference": "https://github.com/ejektaflex/ComfyUI-Ty",
+ "files": [
+ "https://github.com/ejektaflex/ComfyUI-Ty"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Lora Block Weight Regex Loader"
+ },
+ {
+ "author": "jtydhr88",
+ "title": "ComfyUI-Unique3D [WIP]",
+ "id": "unique3d",
+ "reference": "https://github.com/jtydhr88/ComfyUI-Unique3D",
+ "files": [
+ "https://github.com/jtydhr88/ComfyUI-Unique3D"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Unique3D is custom nodes that running [a/AiuniAI/Unique3D](https://github.com/AiuniAI/Unique3D) into ComfyUI."
+ },
+ {
+ "author": "kycg",
+ "title": "comfyui-Kwtoolset",
+ "id": "kwtoolset",
+ "reference": "https://github.com/kycg/comfyui-Kwtoolset",
+ "files": [
+ "https://github.com/kycg/comfyui-Kwtoolset"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:KwtoolsetLoraLoaderwithpreview, KwtoolsetCheckpointLoaderwithpreview, KwtoolsetLoadCheckpointsBatch, KwtoolsetGrowMaskPlus, KwtoolsetGetHipMask, KwtoolsetGetHipMasktest, KwtoolsetGetImageSize, KWPositiveString, KWNagetiveString, KWanywhereString, KwtoolsetChangeOpenpose, ..."
+ },
+ {
+ "author": "mashb1t",
+ "title": "ComfyUI mashb1t nodes",
+ "id": "mashb1t",
+ "reference": "https://github.com/mashb1t/comfyui-nodes-mashb1t",
+ "files": [
+ "https://github.com/mashb1t/comfyui-nodes-mashb1t"
+ ],
+ "install_type": "git-clone",
+ "description": "This Python script is an optional add-on to the Comfy UI stable diffusion client."
+ },
+ {
+ "author": "immersiveexperience",
+ "title": "ie-comfyui-color-nodes",
+ "reference": "https://github.com/immersiveexperience/ie-comfyui-color-nodes",
+ "files": [
+ "https://github.com/immersiveexperience/ie-comfyui-color-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes for simple color correction."
+ },
+ {
+ "author": "LZpenguin",
+ "title": "ComfyUI-Text",
+ "id": "comfy-text",
+ "reference": "https://github.com/LZpenguin/ComfyUI-Text",
+ "files": [
+ "https://github.com/LZpenguin/ComfyUI-Text"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Add_text_by_mask.[w/This custom node cannot be installed simultaneously as it has the same repository name as MarkoCa1/ComfyUI-Text.]"
+ },
+ {
+ "author": "norgeous",
+ "title": "UI Builder [WIP]",
+ "id": "norgeous",
+ "reference": "https://github.com/norgeous/ComfyUI-UI-Builder",
+ "files": [
+ "https://github.com/norgeous/ComfyUI-UI-Builder"
+ ],
+ "install_type": "git-clone",
+ "description": "Alternative configurable React UI overlay for Comfy UI."
+ },
+ {
+ "author": "Shinsplat",
+ "title": "ComfyUI-Shinsplat [UNSAFE]",
+ "id": "shinsplat",
+ "reference": "https://github.com/Shinsplat/ComfyUI-Shinsplat",
+ "files": [
+ "https://github.com/Shinsplat/ComfyUI-Shinsplat"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: Clip Text Encode (Shinsplat), Clip Text Encode SDXL (Shinsplat), Lora Loader (Shinsplat).\n[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]"
+ },
+ {
+ "author": "hy134300",
+ "title": "comfyui-hydit",
+ "reference": "https://github.com/hy134300/comfyui-hydit",
+ "files": [
+ "https://github.com/hy134300/comfyui-hydit"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository contains a customized node and workflow designed specifically for HunYuan DIT. The official tests conducted on DDPM, DDIM, and DPMMS have consistently yielded results that align with those obtained through the Diffusers library. However, it's important to note that we cannot assure the consistency of results from other ComfyUI native samplers with the Diffusers inference. We cordially invite users to explore our workflow and are open to receiving any inquiries or suggestions you may have."
+ },
+ {
+ "author": "corbin-hayden13",
+ "title": "ComfyUI-Better-Dimensions",
+ "id": "better-dim",
+ "reference": "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions",
+ "files": [
+ "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:BetterImageDimensions, SDXLDimensions, PureRatio"
+ },
+ {
+ "author": "endman100",
+ "title": "ComfyUI-augmentation",
+ "id": "augmentation",
+ "reference": "https://github.com/endman100/ComfyUI-augmentation",
+ "files": [
+ "https://github.com/endman100/ComfyUI-augmentation"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:RamdomFlipImage (endman100)"
+ },
+ {
+ "author": "endman100",
+ "title": "ComfyUI Nodes: SaveConditioning and LoadConditioning",
+ "id": "save-load-conditioning",
+ "reference": "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition",
+ "files": [
+ "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition"
+ ],
+ "install_type": "git-clone",
+ "description": "The SaveConditioning node is designed to save conditioning data to binary files. This is useful for storing and reusing conditioning information across different sessions or applications.\n[w/This node can only handle very limited conditioning at the text prompt level.]"
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI-CV-VAE",
+ "id": "cv-vae",
+ "reference": "https://github.com/kijai/ComfyUI-CV-VAE",
+ "files": [
+ "https://github.com/kijai/ComfyUI-CV-VAE"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:CV_VAE_Load, CV_VAE_Encode, CV_VAE_Decode"
+ },
+ {
+ "author": "GentlemanHu",
+ "title": "ComfyUI Notifier",
+ "id": "notifier",
+ "reference": "https://github.com/GentlemanHu/ComfyUI-Notifier",
+ "files": [
+ "https://github.com/GentlemanHu/ComfyUI-Notifier"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:GentlemanHu_Notifier"
+ },
+ {
+ "author": "jimmm-ai",
+ "title": "TimeUi a ComfyUI Timeline Node System [WIP]",
+ "id": "timeline",
+ "reference": "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node",
+ "files": [
+ "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node"
+ ],
+ "install_type": "git-clone",
+ "description": "I've been working on the UX/UI of a timeline custom node system for ComfyUI over the past two weeks. The goal is to create a timeline similar to video/animation editing tools, without relying on traditional timeframe code. You can effortlessly add, delete, or rearrange rows, providing a streamlined user experience."
+ },
+ {
+ "author": "StartHua",
+ "title": "Comfyui_CXH_CRM",
+ "id": "cxh-crm",
+ "reference": "https://github.com/StartHua/Comfyui_CXH_CRM",
+ "files": [
+ "https://github.com/StartHua/Comfyui_CXH_CRM"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:CRM"
+ },
+ {
+ "author": "comfypod",
+ "title": "ComfyUI-Comflow",
+ "id": "comflow",
+ "reference": "https://github.com/comfypod/ComfyUI-Comflow",
+ "files": [
+ "https://github.com/comfypod/ComfyUI-Comflow"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI-Comflow."
+ },
+ {
+ "author": "FoundD-oka",
+ "title": "ComfyUI KISEKAE-OOTD",
+ "id": "kisekae-ootd",
+ "reference": "https://github.com/FoundD-oka/ComfyUI-kisekae-OOTD",
+ "files": [
+ "https://github.com/FoundD-oka/ComfyUI-kisekae-OOTD"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:LoadOOTDPipeline, LoadOOTDPipelineHub, LoadOOTDPipelineHub."
+ },
+ {
+ "author": "bruce007lee",
+ "title": "comfyui-tiny-utils",
+ "id": "tiny-utils",
+ "reference": "https://github.com/bruce007lee/comfyui-tiny-utils",
+ "files": [
+ "https://github.com/bruce007lee/comfyui-tiny-utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:FaceAlign, FaceAlignImageProcess, FaceAlignMaskProcess, ImageFillColorByMask, CropImageByMask, LoadImageAdvance, ImageTransposeAdvance, ImageSAMMask"
+ },
+ {
+ "author": "brycegoh",
+ "title": "brycegoh/comfyui-custom-nodes",
+ "reference": "https://github.com/brycegoh/comfyui-custom-nodes",
+ "files": [
+ "https://github.com/brycegoh/comfyui-custom-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:MaskAreaComparisonSegment, FillMaskedArea, OCRAndMask, CombineTwoImageIntoOne"
+ },
+ {
+ "author": "LykosAI",
+ "title": "ComfyUI Nodes for Inference.Core",
+ "id": "inference-core",
+ "reference": "https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes",
+ "files": [
+ "https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Primary Nodes for Inference.Core and Stability Matrix. With a focus on not impacting startup performance and using fully qualified Node names. [w/This custom node is likely to conflict with many other nodes.]"
+ },
+ {
+ "author": "tracerstar",
+ "title": "comfyui-p5js-node",
+ "id": "p5js",
+ "reference": "https://github.com/tracerstar/comfyui-p5js-node",
+ "files": [
+ "https://github.com/tracerstar/comfyui-p5js-node"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple proof of concept node to pass a p5js canvas through ComfyUI for img2img generation use."
+ },
+ {
+ "author": "chaojie",
+ "title": "ComfyUI-mobvoi-openapi",
+ "id": "mobvoi-openapi",
+ "reference": "https://github.com/chaojie/ComfyUI-mobvoi-openapi",
+ "files": [
+ "https://github.com/chaojie/ComfyUI-mobvoi-openapi"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:MobvoiOpenapiMetamanText, MobvoiOpenapiMetamanAudio, MobvoiOpenapiTts, HtmlViewer, OssUploadImage, OssUploadAudio"
+ },
+ {
+ "author": "immersiveexperience",
+ "title": "ie-comfyui-color-nodes",
+ "id": "ie-color-nodes",
+ "reference": "https://github.com/immersiveexperience/ie-comfyui-color-nodes",
+ "files": [
+ "https://github.com/immersiveexperience/ie-comfyui-color-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes for simple color correction."
+ },
+ {
+ "author": "beyastard",
+ "title": "ComfyUI_BeySoft",
+ "reference": "https://github.com/beyastard/ComfyUI_BeySoft",
+ "files": [
+ "https://github.com/beyastard/ComfyUI_BeySoft"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:BeySoft"
+ },
+ {
+ "author": "christian-byrne",
+ "title": "🌌 Infinite Parallax Nodes [WIP]",
+ "reference": "https://github.com/christian-byrne/infinite-zoom-parallax-nodes",
+ "files": [
+ "https://github.com/christian-byrne/infinite-zoom-parallax-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Parallax Config, Load Parallax Frame, Save Parallax Object Layers, Layer Shifter for Parallax Outpainting, Save Parallax Frame, Shrink and Pad for Outpainting, Create Infinite Zoom Video"
+ },
+ {
+ "author": "flyingdogsoftware",
+ "title": "Gyre for ComfyUI",
+ "id": "gyre",
+ "reference": "https://github.com/flyingdogsoftware/gyre_for_comfyui",
+ "files": [
+ "https://github.com/flyingdogsoftware/gyre_for_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:BackgroundRemoval, GyreLoopStart, GyreLoopEnd, GyreIfElse"
+ },
+ {
+ "author": "githubYiheng",
+ "title": "comfyui_median_filter",
+ "id": "median-filter",
+ "reference": "https://github.com/githubYiheng/comfyui_median_filter",
+ "files": [
+ "https://github.com/githubYiheng/comfyui_median_filter"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Apply Median Filter. [w/This has been updated to be equivalent to the comfyui_kmeans_filter node. Mistake?]"
+ },
+ {
+ "author": "nat-chan",
+ "title": "comfyui-exec [UNSAFE]",
+ "id": "evalnode",
+ "reference": "https://github.com/nat-chan/comfyui-exec",
+ "files": [
+ "https://github.com/nat-chan/comfyui-exec"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:EvalNode [w/Please do not use the node that executes arbitrary code and outputs in any type, as it is dangerous.]"
+ },
+ {
+ "author": "haofanwang",
+ "title": "ComfyUI-InstantStyle",
+ "id": "instantstyle",
+ "reference": "https://github.com/haofanwang/ComfyUI-InstantStyle",
+ "files": [
+ "https://github.com/haofanwang/ComfyUI-InstantStyle"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:PromptLoader, BaseModelLoader, InstantStyleLoader, InstantStyleGenerationNode"
+ },
+ {
+ "author": "jp0215",
+ "title": "comfyUI_padding-resize_node",
+ "reference": "https://github.com/jp0215/comfyUI_padding-resize_node",
+ "files": [
+ "https://raw.githubusercontent.com/jp0215/comfyUI_padding-resize_node/main/PaddingNode.py",
+ "https://raw.githubusercontent.com/jp0215/comfyUI_padding-resize_node/main/ResizeNode.py"
+ ],
+ "install_type": "copy",
+ "description": "Padding image to 8x: input image and mask, if the side length is not an integer multiple of 8, expand the side length to the smallest multiple of 8 greater than the original side length. Output padding image and mask. Resize to the origin: input the generated image and the original image, crop the generated image to the size of the original image, output the cropped image."
+ },
+ {
+ "author": "Quasimondo",
+ "title": "ComfyUI-QuasimondoNodes [WIP]",
+ "id": "quasimondo-nodes",
+ "reference": "https://github.com/Quasimondo/ComfyUI-QuasimondoNodes",
+ "files": [
+ "https://github.com/Quasimondo/ComfyUI-QuasimondoNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Custom Shader, Spring Mesh"
+ },
+ {
+ "author": "TSFSean",
+ "title": "ComfyUI-TSFNodes",
+ "id": "tsfnodes",
+ "reference": "https://github.com/TSFSean/ComfyUI-TSFNodes",
+ "files": [
+ "https://github.com/TSFSean/ComfyUI-TSFNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:GyroOSC"
+ },
+ {
+ "author": "blib-la",
+ "title": "ComfyUI-Captain-Extensions",
+ "id": "captain",
+ "reference": "https://github.com/blib-la/ComfyUI-Captain-Extensions",
+ "files": [
+ "https://github.com/blib-la/ComfyUI-Captain-Extensions"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI extensions for better [a/Captain](https://github.com/blib-la/captain) integration."
+ },
+ {
+ "author": "ejektaflex",
+ "title": "ComfyUI-Ty",
+ "reference": "https://github.com/ejektaflex/ComfyUI-Ty",
+ "files": [
+ "https://github.com/ejektaflex/ComfyUI-Ty"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Lora Block Weight Regex Loader"
+ },
+ {
+ "author": "christian-byrne",
+ "title": "Python Interpreter ComfyUI Node [UNSAFE]",
+ "reference": "https://github.com/christian-byrne/python-interpreter-node",
+ "files": [
+ "https://github.com/christian-byrne/python-interpreter-node"
+ ],
+ "install_type": "git-clone",
+ "description": "For debugging, parsing data, generating random values, converting types, testing custom nodes faster.\nReference and use variables in the code using the same names as the inputs in the UI\nWrapper class around tensors with operator overloading for doing common image manipulation tasks.I might remove this aspect\n[w/This extension allows you to run programs through Python code in your workflow, which may not be secure. Use with caution.]"
+ },
+ {
+ "author": "sofakid",
+ "title": "dandy [UNSAFE]",
+ "reference": "https://github.com/sofakid/dandy",
+ "files": [
+ "https://github.com/sofakid/dandy"
+ ],
+ "install_type": "git-clone",
+ "description": "Dandy is a JavaScript bridge for ComfyUI. It includes everything you need to make JavaScript enabled extensions, or just load and code in little editor nodes right in ComfyUI.[w/This code can cause security issues because it allows for the execution of arbitrary JavaScript input.]"
+ },
+ {
+ "author": "shadowcz007",
+ "title": "ComfyUI-PuLID [TEST]",
+ "reference": "https://github.com/shadowcz007/ComfyUI-PuLID-Test",
+ "files": [
+ "https://github.com/shadowcz007/ComfyUI-PuLID-Test"
+ ],
+ "install_type": "git-clone",
+ "description": "[a/PuLID](https://github.com/ToTheBeginning/PuLID) ComfyUI native implementation."
+ },
+ {
+ "author": "sangeet",
+ "title": "Simple Frontend For ComfyUI workflow [TEST]",
+ "reference": "https://github.com/sangeet/testui",
+ "files": [
+ "https://github.com/sangeet/testui"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple base front-end for text-to-image workflow in ComfyUI. Meant to serve as a base to be modified for future complex workflows"
+ },
+ {
+ "author": "jtscmw01",
+ "title": "ComfyUI-DiffBIR",
+ "id": "diffbir",
+ "reference": "https://github.com/jtscmw01/ComfyUI-DiffBIR",
+ "files": [
+ "https://github.com/jtscmw01/ComfyUI-DiffBIR"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension provides [a/DiffBIR](https://github.com/XPixelGroup/DiffBIR) feature."
+ },
+ {
+ "author": "ericbeyer",
+ "title": "guidance_interval",
+ "reference": "https://github.com/ericbeyer/guidance_interval",
+ "files": [
+ "https://github.com/ericbeyer/guidance_interval"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Guidance Interval\nNOTE: Because the sampling function is replaced, you must restart after executing this custom node to restore the original state."
+ },
+ {
+ "author": "oztrkoguz",
+ "title": "Kosmos2_BBox_Cutter Models",
+ "reference": "https://github.com/oztrkoguz/ComfyUI_Kosmos2_BBox_Cutter",
+ "files": [
+ "https://github.com/oztrkoguz/ComfyUI_Kosmos2_BBox_Cutter"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:KosmosLoader, Kosmos2SamplerSimple, Write"
+ },
+ {
+ "author": "ZHO-ZHO-ZHO",
+ "title": "ComfyUI-PuLID-ZHO [WIP]",
+ "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO",
+ "files": [
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO"
+ ],
+ "install_type": "git-clone",
+ "description": "Unofficial implementation of [a/PuLID](https://github.com/ToTheBeginning/PuLID)(diffusers) for ComfyUI"
+ },
+ {
+ "author": "longgui0318",
+ "title": "comfyui-one-more-step [WIP]",
+ "reference": "https://github.com/longgui0318/comfyui-one-more-step",
+ "files": [
+ "https://github.com/longgui0318/comfyui-one-more-step"
+ ],
+ "install_type": "git-clone",
+ "description": "[a/(OMS)mhh0318/OneMoreStep](https://github.com/mhh0318/OneMoreStep) comfyui support ."
+ },
+ {
+ "author": "unknown",
+ "title": "CLIPTextEncodeAndEnhancev4 (shirazdesigner)",
+ "reference": "https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4",
+ "files": [
+ "https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:CLIPTextEncodeAndEnhance.\nNOTE:Translation:This is a wrapper that simply makes it easy to install an existing node via git."
+ },
+ {
+ "author": "Video3DGenResearch",
+ "title": "ComfyUI Batch Input Node",
+ "reference": "https://github.com/Video3DGenResearch/comfyui-batch-input-node",
+ "files": [
+ "https://github.com/Video3DGenResearch/comfyui-batch-input-node"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:BatchInputText"
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI nodes to use DeepSeek-VL",
+ "reference": "https://github.com/kijai/ComfyUI-DeepSeek-VL",
+ "files": [
+ "https://github.com/kijai/ComfyUI-DeepSeek-VL"
+ ],
+ "install_type": "git-clone",
+ "description": "[a/https://huggingface.co/deepseek-ai](https://huggingface.co/deepseek-ai)"
+ },
+ {
+ "author": "GentlemanHu",
+ "title": "ComfyUI-Notifier",
+ "reference": "https://github.com/GentlemanHu/ComfyUI-Notifier",
+ "files": [
+ "https://github.com/GentlemanHu/ComfyUI-Notifier"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:GentlemanHu_Notifier"
+ },
+ {
+ "author": "nat-chan",
+ "title": "Transceiver📡",
+ "reference": "https://github.com/nat-chan/transceiver",
+ "files": [
+ "https://github.com/nat-chan/transceiver"
+ ],
+ "install_type": "git-clone",
+ "description": "Why? When processing a large number of requests, the SaveImage and LoadImage nodes may be IO-limited, and using shared memory improves performance by passing images only through memory access, not through IO."
+ },
+ {
+ "author": "DrMWeigand",
+ "title": "ComfyUI_LineBreakInserter",
+ "reference": "https://github.com/DrMWeigand/ComfyUI_LineBreakInserter",
+ "files": [
+ "https://github.com/DrMWeigand/ComfyUI_LineBreakInserter"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Line Break Inserter"
+ },
+ {
+ "author": "WilliamStanford",
+ "title": "visuallabs_comfyui_nodes",
+ "reference": "https://github.com/WilliamStanford/ComfyUI-VisualLabs",
+ "files": [
+ "https://github.com/WilliamStanford/ComfyUI-VisualLabs"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:PointStringFromFloatArray"
+ },
+ {
+ "author": "bruce007lee",
+ "title": "comfyui-cleaner",
+ "reference": "https://github.com/bruce007lee/comfyui-cleaner",
+ "files": [
+ "https://github.com/bruce007lee/comfyui-cleaner"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:cleaner"
+ },
+ {
+ "author": "ExponentialML",
+ "title": "ComfyUI_LiveDirector (WIP)",
+ "reference": "https://github.com/ExponentialML/ComfyUI_LiveDirector",
+ "files": [
+ "https://github.com/ExponentialML/ComfyUI_LiveDirector"
+ ],
+ "install_type": "git-clone",
+ "description": "Experimental method to use reference video to drive motion in generations without training in ComfyUI."
+ },
+ {
+ "author": "hy134300",
+ "title": "comfyui-hb-node",
+ "reference": "https://github.com/hy134300/comfyui-hb-node",
+ "files": [
+ "https://github.com/hy134300/comfyui-hb-node"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:sound voice, text concat, latent to list, movie generate, movie batch, hy save image, generate story"
+ },
+ {
+ "author": "gameltb",
+ "title": "io_comfyui",
+ "reference": "https://github.com/gameltb/io_comfyui",
+ "files": [
+ "https://github.com/gameltb/io_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Let Blender work with ComfyUI by ComfyScript. This addon is still in development."
+ },
+ {
+ "author": "Jiffies-64",
+ "title": "ComfyUI-SaveImagePlus",
+ "reference": "https://github.com/Jiffies-64/ComfyUI-SaveImagePlus",
+ "files": [
+ "https://github.com/Jiffies-64/ComfyUI-SaveImagePlus"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:SaveImagePlus"
+ },
+ {
+ "author": "kadirnar",
+ "title": "ComfyUI-Adapter [WIP]",
+ "reference": "https://github.com/kadirnar/ComfyUI-Adapter",
+ "files": [
+ "https://github.com/kadirnar/ComfyUI-Adapter"
+ ],
+ "install_type": "git-clone",
+ "description": "WIP"
+ },
+ {
+ "author": "Beinsezii",
+ "title": "comfyui-amd-go-fast",
+ "reference": "https://github.com/Beinsezii/comfyui-amd-go-fast",
+ "files": [
+ "https://github.com/Beinsezii/comfyui-amd-go-fast"
+ ],
+ "install_type": "git-clone",
+ "description": "This contains all-in-one 'principled' nodes for T2I, I2I, refining, and scaling. Additionally it has many tools for directly manipulating the color of latents, high res fix math, and scripted image post-processing."
+ },
+ {
+ "author": "sugarkwork",
+ "title": "comfyui_psd [WIP]",
+ "reference": "https://github.com/sugarkwork/comfyui_psd",
+ "files": [
+ "https://github.com/sugarkwork/comfyui_psd"
+ ],
+ "install_type": "git-clone",
+ "description": "Not working yet."
+ },
+ {
+ "author": "SadaleNet",
+ "title": "ComfyUI Port for Google's Prompt-to-Prompt",
+ "reference": "https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt",
+ "files": [
+ "https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a PoC port of [a/Google's Prompt-to-Prompt](https://github.com/google/prompt-to-prompt/) to ComfyUI. It isn't feature complete. But it's good enough for evaluating if prompt-to-prompt is of any good."
+ },
+ {
+ "author": "stavsap",
+ "title": "ComfyUI Ollama [WIP]",
+ "reference": "https://github.com/stavsap/ComfyUI-React-SDK",
+ "files": [
+ "https://github.com/stavsap/ComfyUI-React-SDK"
+ ],
+ "install_type": "git-clone",
+ "description": "This project is for building React application as an overlay upon ComfyUI.\nProviding and ability to provide desired UI with ComfyUI API and workflows.\nInspired by: [a/https://github.com/cubiq/Comfy_Dungeon](https://github.com/cubiq/Comfy_Dungeon)"
+ },
+ {
+ "author": "cubiq",
+ "title": "Comfy Dungeon [WIP]",
+ "reference": "https://github.com/cubiq/Comfy_Dungeon",
+ "files": [
+ "https://github.com/cubiq/Comfy_Dungeon"
+ ],
+ "install_type": "git-clone",
+ "description": "Build D&D Character Portraits with ComfyUI.\nIMPORTANT: At the moment this is mostly a tech demo to show how to build a web app on top of ComfyUI. The code is very messy and the application doesn't guaratee consistent results."
+ },
+ {
+ "author": "dfl",
+ "title": "comfyui-stylegan",
+ "reference": "https://github.com/dfl/comfyui-stylegan",
+ "files": [
+ "https://github.com/dfl/comfyui-stylegan"
+ ],
+ "install_type": "git-clone",
+ "description": "Generator for StyleGAN 3"
+ },
+ {
+ "author": "A719689614",
+ "title": "ComfyUI_AC_FUNV8Beta1",
+ "reference": "https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1",
+ "files": [
+ "https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:AC_Super_Controlnet/Checkpoint/Loras/Lora&LCM/KSampler/UpKSampler/SaveImage/PreviewImage/CKPT&LCM/CLIPEN/EmptLatent, AC_FUN_SUPER_LARGE, AC_Super_Come_Ckpt, AC_Super_Come_Lora"
+ },
+ {
+ "author": "houdinii",
+ "title": "comfy-magick [WIP]",
+ "reference": "https://github.com/houdinii/comfy-magick",
+ "files": [
+ "https://github.com/houdinii/comfy-magick"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a way to implement ImageMagick functionality in ComfyUI, which is generally PIL (pillow) based. I'm not sure the best way to handle this, as batch images make it a lot more complex, but the general idea will be two nodes to translate the IMAGE type, a torch.tensor of shape [batch, height, width, channels], or [1, 600, 800, 3] for a single 800x600 image, into/from a wand Image object."
+ },
+ {
+ "author": "tjorbogarden",
+ "title": "my-useful-comfyui-custom-nodes",
+ "reference": "https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes",
+ "files": [
+ "https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:My-Image Sizer, KSamplerSDXLAdvanced."
+ },
+ {
+ "author": "DeTK",
+ "title": "ComfyUI Node Switcher",
+ "reference": "https://github.com/DeTK/ComfyUI-Switch",
+ "files": [
+ "https://github.com/DeTK/ComfyUI-Switch"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:NodeSwitch."
+ },
+ {
+ "author": "GrindHouse66",
+ "title": "GH Tools for ComfyUI",
+ "reference": "https://github.com/GrindHouse66/ComfyUI-GH_Tools",
+ "files": [
+ "https://github.com/GrindHouse66/ComfyUI-GH_Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:GH Tools Image Sizer, GH Tools Simple Scale. Simple quality of life Tools for ComfyUI. Basically, If it makes my life easier, it will be here. The list will grow over time."
+ },
+ {
+ "author": "Beinsezii",
+ "title": "comfyui-amd-go-fast",
+ "reference": "https://github.com/Beinsezii/comfyui-amd-go-fast",
+ "files": [
+ "https://github.com/Beinsezii/comfyui-amd-go-fast"
+ ],
+ "install_type": "git-clone",
+ "description": "See details: [a/link](https://github.com/Beinsezii/comfyui-amd-go-fast?tab=readme-ov-file)"
+ },
+ {
+ "author": "SeedV",
+ "title": "ComfyUI-SeedV-Nodes [UNSAFE]",
+ "reference": "https://github.com/SeedV/ComfyUI-SeedV-Nodes",
+ "files": [
+ "https://github.com/SeedV/ComfyUI-SeedV-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Script.\n[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]"
+ },
+ {
+ "author": "mut-ex",
+ "title": "ComfyUI GLIGEN GUI Node",
+ "reference": "https://github.com/mut-ex/comfyui-gligengui-node",
+ "files": [
+ "https://github.com/mut-ex/comfyui-gligengui-node"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a simple, straightforward ComfyUI node to be used along with the [a/GLIGEN GUI](https://github.com/mut-ex/gligen-gui) I developed.\nNOTE:[a/Make sure you have the GLIGEN GUI up and running](https://github.com/mut-ex/gligen-gui/tree/main)"
+ },
+ {
+ "author": "unanan",
+ "title": "ComfyUI-Dist [WIP]",
+ "reference": "https://github.com/unanan/ComfyUI-Dist",
+ "files": [
+ "https://github.com/unanan/ComfyUI-Dist"
+ ],
+ "install_type": "git-clone",
+ "description": "For distributed processing ComfyUI workflows within a local area network.\nNot Finished Yet."
+ },
+ {
+ "author": "NicholasKao1029",
+ "title": "comfyui-hook",
+ "reference": "https://github.com/NicholasKao1029/comfyui-hook",
+ "files": [
+ "https://github.com/NicholasKao1029/comfyui-hook"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension provides additional API"
+ },
+ {
+ "author": "Extraltodeus",
+ "title": "Conditioning-token-experiments-for-ComfyUI",
+ "reference": "https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI",
+ "files": [
+ "https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "I made these nodes for experimenting so it's far from perfect but at least it is entertaining!\nIt uses cosine similarities or smallest euclidean distances to find the closest tokens."
+ },
+ {
+ "author": "shadowcz007",
+ "title": "comfyui-llamafile [WIP]",
+ "reference": "https://github.com/shadowcz007/comfyui-sd-prompt-mixlab",
+ "files": [
+ "https://github.com/shadowcz007/comfyui-sd-prompt-mixlab"
+ ],
+ "install_type": "git-clone",
+ "description": "This node is an experimental node aimed at exploring the collaborative way of human-machine creation."
+ },
+ {
+ "author": "gameltb",
+ "title": "ComfyUI paper playground",
+ "reference": "https://github.com/gameltb/ComfyUI_paper_playground",
+ "files": [
+ "https://github.com/gameltb/ComfyUI_paper_playground"
+ ],
+ "install_type": "git-clone",
+ "description": "Evaluate some papers in ComfyUI, just playground.\nNOTE: Various models need to be installed, so please visit the repository to check."
+ },
+ {
+ "author": "huizhang0110",
+ "title": "ComfyUI_Easy_Nodes_hui",
+ "reference": "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui",
+ "files": [
+ "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:EasyEmptyLatentImage"
+ },
+ {
+ "author": "tuckerdarby",
+ "title": "ComfyUI-TDNodes [WIP]",
+ "reference": "https://github.com/tuckerdarby/ComfyUI-TDNodes",
+ "files": [
+ "https://github.com/tuckerdarby/ComfyUI-TDNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:KSampler (RAVE), KSampler (TF), Object Tracker, KSampler Batched, Video Tracker Prompt, TemporalNet Preprocessor, Instance Tracker Prompt, Instance Diffusion Loader, Hand Tracker Node"
+ },
+ {
+ "author": "shadowcz007",
+ "title": "comfyui-CLIPSeg",
+ "reference": "https://github.com/shadowcz007/comfyui-CLIPSeg",
+ "files": [
+ "https://github.com/shadowcz007/comfyui-CLIPSeg"
+ ],
+ "install_type": "git-clone",
+ "description": "Download [a/CLIPSeg](https://huggingface.co/CIDAS/clipseg-rd64-refined/tree/main), move to : models/clipseg"
+ },
+ {
+ "author": "stutya",
+ "title": "ComfyUI-Terminal [UNSAFE]",
+ "reference": "https://github.com/stutya/ComfyUI-Terminal",
+ "files": [
+ "https://github.com/stutya/ComfyUI-Terminal"
+ ],
+ "install_type": "git-clone",
+ "description": "Run Terminal Commands from ComfyUI.\n[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]"
+ },
+ {
+ "author": "marcueberall",
+ "title": "ComfyUI-BuildPath",
+ "reference": "https://github.com/marcueberall/ComfyUI-BuildPath",
+ "files": [
+ "https://github.com/marcueberall/ComfyUI-BuildPath"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: Build Path Adv."
+ },
+ {
+ "author": "LotzF",
+ "title": "ComfyUI simple ChatGPT completion [UNSAFE]",
+ "reference": "https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion",
+ "files": [
+ "https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple node to request ChatGPT completions. [w/Do not share your workflows including the API key! I'll take no responsibility for your leaked keys.]"
+ },
+ {
+ "author": "17Retoucher",
+ "title": "ComfyUI_Fooocus",
+ "reference": "https://github.com/17Retoucher/ComfyUI_Fooocus",
+ "files": [
+ "https://github.com/17Retoucher/ComfyUI_Fooocus"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes that help reproduce image generation in Fooocus."
+ },
+ {
+ "author": "BadCafeCode",
+ "title": "execution-inversion-demo-comfyui",
+ "reference": "https://github.com/BadCafeCode/execution-inversion-demo-comfyui",
+ "files": [
+ "https://github.com/BadCafeCode/execution-inversion-demo-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "execution-inversion-demo-comfyui"
+ },
+ {
+ "author": "prodogape",
+ "title": "ComfyUI-clip-interrogator [WIP]",
+ "reference": "https://github.com/prodogape/ComfyUI-clip-interrogator",
+ "files": [
+ "https://github.com/prodogape/ComfyUI-clip-interrogator"
+ ],
+ "install_type": "git-clone",
+ "description": "Unofficial ComfyUI extension of clip-interrogator"
+ },
+ {
+ "author": "poisenbery",
+ "title": "NudeNet-Detector-Provider [WIP]",
+ "reference": "https://github.com/poisenbery/NudeNet-Detector-Provider",
+ "files": [
+ "https://github.com/poisenbery/NudeNet-Detector-Provider"
+ ],
+ "install_type": "git-clone",
+ "description": "BBOX Detector Provider for NudeNet. Bethesda version of NudeNet V3 detector provider to work with Impact Pack ComfyUI."
+ },
+ {
+ "author": "LarryJane491",
+ "title": "ComfyUI-ModelUnloader",
+ "reference": "https://github.com/LarryJane491/ComfyUI-ModelUnloader",
+ "files": [
+ "https://github.com/LarryJane491/ComfyUI-ModelUnloader"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple custom node that unloads all models. Useful for developers or users who want to free some memory."
+ },
+ {
+ "author": "MrAdamBlack",
+ "title": "CheckProgress [WIP]",
+ "reference": "https://github.com/MrAdamBlack/CheckProgress",
+ "files": [
+ "https://github.com/MrAdamBlack/CheckProgress"
+ ],
+ "install_type": "git-clone",
+ "description": "I was looking for a node to put in place to ensure my prompt etc where going as expected before the rest of the flow executed. To end the session, I just return the input image as None (see expected error). Recommend using it alongside PreviewImage, then output to the rest of the flow and Save Image."
+ },
+ {
+ "author": "birnam",
+ "title": "Gen Data Tester [WIP]",
+ "reference": "https://github.com/birnam/ComfyUI-GenData-Pack",
+ "files": [
+ "https://github.com/birnam/ComfyUI-GenData-Pack"
+ ],
+ "install_type": "git-clone",
+ "description": "This answers the itch for being able to easily paste [a/CivitAI.com](https://civitai.com/) generated data (or other simple metadata) into Comfy in a way that makes it easy to test with multiple checkpoints."
+ },
+ {
+ "author": "nidefawl",
+ "title": "ComfyUI-nidefawl [UNSAFE]",
+ "reference": "https://github.com/nidefawl/ComfyUI-nidefawl",
+ "files": [
+ "https://github.com/nidefawl/ComfyUI-nidefawl"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:PythonScript, BlendImagesWithBoundedMasks, CropImagesWithMasks, VAELoaderDataType, ModelSamplerTonemapNoiseTest, gcLatentTunnel, ReferenceOnlySimple, EmptyImageWithColor, MaskFromColor, SetLatentCustomNoise, LatentToImage, ImageToLatent, LatentScaledNoise, DisplayAnyType, SamplerCustomCallback, CustomCallback, SplitCustomSigmas, SamplerDPMPP_2M_SDE_nidefawl, LatentPerlinNoise. [w/This node is an unsafe node that includes the capability to execute arbitrary python script.]"
+ },
+ {
+ "author": "foglerek",
+ "title": "comfyui-cem-tools",
+ "reference": "https://github.com/foglerek/comfyui-cem-tools",
+ "files": [
+ "https://github.com/foglerek/comfyui-cem-tools"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:ProcessImageBatch"
+ },
+ {
+ "author": "komojini",
+ "title": "ComfyUI_Prompt_Template_CustomNodes",
+ "reference": "https://github.com/komojini/ComfyUI_Prompt_Template_CustomNodes",
+ "files": [
+ "https://raw.githubusercontent.com/komojini/ComfyUI_Prompt_Template_CustomNodes/main/prompt_with_template.py"
+ ],
+ "install_type": "copy",
+ "description": "Nodes:Prompt with Template"
+ },
+ {
+ "author": "talesofai",
+ "title": "comfyui-supersave [WIP]",
+ "reference": "https://github.com/talesofai/comfyui-supersave",
+ "files": [
+ "https://github.com/talesofai/comfyui-supersave"
+ ],
+ "install_type": "git-clone",
+ "description": "WIP"
+ },
+ {
+ "author": "Sai-ComfyUI",
+ "title": "ComfyUI-MS-Nodes [WIP]",
+ "reference": "https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes",
+ "files": [
+ "https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "WIP"
+ },
+ {
+ "author": "eigenpunk",
+ "title": "ComfyUI-audio",
+ "reference": "https://github.com/eigenpunk/ComfyUI-audio",
+ "files": [
+ "https://github.com/eigenpunk/ComfyUI-audio"
+ ],
+ "install_type": "git-clone",
+ "description": "generative audio tools for ComfyUI. highly experimental-expect things to break."
+ },
+ {
+ "author": "Jaxkr",
+ "title": "comfyui-terminal-command [UNSAFE]",
+ "reference": "https://github.com/Jaxkr/comfyui-terminal-command",
+ "files": [
+ "https://github.com/Jaxkr/comfyui-terminal-command"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: Run Terminal Command. [w/This node is an unsafe node that includes the capability to execute terminal commands.]"
+ },
+ {
+ "author": "BlueDangerX",
+ "title": "ComfyUI-BDXNodes [WIP]",
+ "reference": "https://github.com/BlueDangerX/ComfyUI-BDXNodes",
+ "files": [
+ "https://github.com/BlueDangerX/ComfyUI-BDXNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: Node Jumper. Various quality of life testing nodes"
+ },
+ {
+ "author": "IvanZhd",
+ "title": "comfyui-codeformer [WIP]",
+ "reference": "https://github.com/IvanZhd/comfyui-codeformer",
+ "files": [
+ "https://github.com/IvanZhd/comfyui-codeformer"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Image Inverter"
+ },
+ {
+ "author": "romeobuilderotti",
+ "title": "ComfyUI-EZ-Pipes",
+ "reference": "https://github.com/romeobuilderotti/ComfyUI-EZ-Pipes",
+ "files": [
+ "https://github.com/romeobuilderotti/ComfyUI-EZ-Pipes"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI-EZ-Pipes is a set of custom pipe nodes for ComfyUI. It provides a set of Input/Edit/Output nodes for each pipe type."
+ },
+ {
+ "author": "wormley",
+ "title": "comfyui-wormley-nodes",
+ "reference": "https://github.com/wormley/comfyui-wormley-nodes",
+ "files": [
+ "https://github.com/wormley/comfyui-wormley-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: CheckpointVAELoaderSimpleText, CheckpointVAESelectorText, LoRA_Tag_To_Stack"
+ },
+ {
+ "author": "Brandelan",
+ "title": "ComfyUI_bd_customNodes",
+ "reference": "https://github.com/Brandelan/ComfyUI_bd_customNodes",
+ "files": [
+ "https://github.com/Brandelan/ComfyUI_bd_customNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: BD Random Range, BD Settings, BD Sequencer."
+ },
+ {
+ "author": "Jordach",
+ "title": "comfy-consistency-vae",
+ "reference": "https://github.com/Jordach/comfy-consistency-vae",
+ "files": [
+ "https://github.com/Jordach/comfy-consistency-vae"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: Comfy_ConsistencyVAE"
+ },
+ {
+ "author": "gameltb",
+ "title": "ComfyUI_stable_fast",
+ "reference": "https://github.com/gameltb/ComfyUI_stable_fast",
+ "files": [
+ "https://github.com/gameltb/ComfyUI_stable_fast"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:ApplyStableFastUnet. Experimental usage of stable-fast."
+ },
+ {
+ "author": "jn-jairo",
+ "title": "jn_node_suite_comfyui [WIP]",
+ "reference": "https://github.com/jn-jairo/jn_node_suite_comfyui",
+ "files": [
+ "https://github.com/jn-jairo/jn_node_suite_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Image manipulation nodes, Temperature control nodes, Tiling nodes, Primitive and operation nodes, ..."
+ },
+ {
+ "author": "laksjdjf",
+ "title": "ssd-1b-comfyui",
+ "reference": "https://github.com/laksjdjf/ssd-1b-comfyui",
+ "files": [
+ "https://github.com/laksjdjf/ssd-1b-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Experimental node for SSD-1B. This node is not need for latest comfyui."
+ },
+ {
+ "author": "flowtyone",
+ "title": "comfyui-flowty-lcm",
+ "reference": "https://github.com/flowtyone/comfyui-flowty-lcm",
+ "files": [
+ "https://github.com/flowtyone/comfyui-flowty-lcm"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a comfyui early testing node for LCM, adapted from [a/https://github.com/0xbitches/sd-webui-lcm](https://github.com/0xbitches/sd-webui-lcm). It uses the diffusers backend unfortunately and not comfy's model loading mechanism. But the intention here is just to be able to execute lcm inside comfy.\nNOTE: 0xbitches's 'Latent Consistency Model for ComfyUI' is original implementation."
+ },
+ {
+ "author": "doucx",
+ "title": "ComfyUI_WcpD_Utility_Kit",
+ "reference": "https://github.com/doucx/ComfyUI_WcpD_Utility_Kit",
+ "files": [
+ "https://github.com/doucx/ComfyUI_WcpD_Utility_Kit"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: MergeStrings, ExecStrAsCode, RandnLatentImage. [w/NOTE: This extension includes the ability to execute code as a string in nodes. Be cautious during installation, as it can pose a security risk.]"
+ },
+ {
+ "author": "WSJUSA",
+ "title": "pre-comfyui-stablsr",
+ "reference": "https://github.com/WSJUSA/Comfyui-StableSR",
+ "files": [
+ "https://github.com/WSJUSA/Comfyui-StableSR"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a development respository for debugging migration of StableSR to Comfyui"
+ },
+ {
+ "author": "Dr.Lt.Data",
+ "title": "ComfyUI-Workflow-Component [WIP]",
+ "reference": "https://github.com/ltdrdata/ComfyUI-Workflow-Component",
+ "files": [
+ "https://github.com/ltdrdata/ComfyUI-Workflow-Component"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension provides the capability to use ComfyUI Workflow as a component and the ability to use the Image Refiner functionality based on components. NOTE: This is an experimental extension feature with no consideration for backward compatibility and can be highly unstable."
+ }
+ ]
+}
diff --git a/custom_nodes/ComfyUI-Manager/node_db/dev/extension-node-map.json b/custom_nodes/ComfyUI-Manager/node_db/dev/extension-node-map.json
new file mode 100644
index 0000000000000000000000000000000000000000..02ca866322d88bffd6e3a015dad72198a032c5ab
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/dev/extension-node-map.json
@@ -0,0 +1,14880 @@
+{
+ "https://github.com/17Retoucher/ComfyUI_Fooocus": [
+ [
+ "BasicScheduler",
+ "CLIPLoader",
+ "CLIPMergeSimple",
+ "CLIPSave",
+ "CLIPSetLastLayer",
+ "CLIPTextEncode",
+ "CLIPTextEncodeSDXL",
+ "CLIPTextEncodeSDXLRefiner",
+ "CLIPVisionEncode",
+ "CLIPVisionLoader",
+ "Canny",
+ "CheckpointLoader",
+ "CheckpointLoaderSimple",
+ "CheckpointSave",
+ "ConditioningAverage",
+ "ConditioningCombine",
+ "ConditioningConcat",
+ "ConditioningSetArea",
+ "ConditioningSetAreaPercentage",
+ "ConditioningSetMask",
+ "ConditioningSetTimestepRange",
+ "ConditioningZeroOut",
+ "ControlNetApply",
+ "ControlNetApplyAdvanced",
+ "ControlNetLoader",
+ "CropMask",
+ "DiffControlNetLoader",
+ "DiffusersLoader",
+ "DualCLIPLoader",
+ "EmptyImage",
+ "EmptyLatentImage",
+ "ExponentialScheduler",
+ "FeatherMask",
+ "FlipSigmas",
+ "Fooocus Controlnet",
+ "Fooocus Hirefix",
+ "Fooocus KSampler",
+ "Fooocus Loader",
+ "Fooocus LoraStack",
+ "Fooocus PreKSampler",
+ "Fooocus negative",
+ "Fooocus positive",
+ "Fooocus stylesSelector",
+ "FreeU",
+ "FreeU_V2",
+ "GLIGENLoader",
+ "GLIGENTextBoxApply",
+ "GrowMask",
+ "HyperTile",
+ "HypernetworkLoader",
+ "ImageBatch",
+ "ImageBlend",
+ "ImageBlur",
+ "ImageColorToMask",
+ "ImageCompositeMasked",
+ "ImageCrop",
+ "ImageInvert",
+ "ImageOnlyCheckpointLoader",
+ "ImagePadForOutpaint",
+ "ImageQuantize",
+ "ImageScale",
+ "ImageScaleBy",
+ "ImageScaleToTotalPixels",
+ "ImageSharpen",
+ "ImageToMask",
+ "ImageUpscaleWithModel",
+ "InvertMask",
+ "JoinImageWithAlpha",
+ "KSampler",
+ "KSamplerAdvanced",
+ "KSamplerSelect",
+ "KarrasScheduler",
+ "LatentAdd",
+ "LatentBatch",
+ "LatentBlend",
+ "LatentComposite",
+ "LatentCompositeMasked",
+ "LatentCrop",
+ "LatentFlip",
+ "LatentFromBatch",
+ "LatentInterpolate",
+ "LatentMultiply",
+ "LatentRotate",
+ "LatentSubtract",
+ "LatentUpscale",
+ "LatentUpscaleBy",
+ "LoadImage",
+ "LoadImageMask",
+ "LoadLatent",
+ "LoraLoader",
+ "LoraLoaderModelOnly",
+ "MaskComposite",
+ "MaskToImage",
+ "ModelMergeAdd",
+ "ModelMergeBlocks",
+ "ModelMergeSimple",
+ "ModelMergeSubtract",
+ "ModelSamplingContinuousEDM",
+ "ModelSamplingDiscrete",
+ "PatchModelAddDownscale",
+ "PerpNeg",
+ "PolyexponentialScheduler",
+ "PorterDuffImageComposite",
+ "PreviewImage",
+ "RebatchImages",
+ "RebatchLatents",
+ "RepeatImageBatch",
+ "RepeatLatentBatch",
+ "RescaleCFG",
+ "SDTurboScheduler",
+ "SVD_img2vid_Conditioning",
+ "SamplerCustom",
+ "SamplerDPMPP_2M_SDE",
+ "SamplerDPMPP_SDE",
+ "SaveAnimatedPNG",
+ "SaveAnimatedWEBP",
+ "SaveImage",
+ "SaveLatent",
+ "SelfAttentionGuidance",
+ "SetLatentNoiseMask",
+ "SolidMask",
+ "SplitImageWithAlpha",
+ "SplitSigmas",
+ "StableZero123_Conditioning",
+ "StyleModelApply",
+ "StyleModelLoader",
+ "TomePatchModel",
+ "UNETLoader",
+ "UpscaleModelLoader",
+ "VAEDecode",
+ "VAEDecodeTiled",
+ "VAEEncode",
+ "VAEEncodeForInpaint",
+ "VAEEncodeTiled",
+ "VAELoader",
+ "VAESave",
+ "VPScheduler",
+ "VideoLinearCFGGuidance",
+ "unCLIPCheckpointLoader",
+ "unCLIPConditioning"
+ ],
+ {
+ "title_aux": "ComfyUI_Fooocus"
+ }
+ ],
+ "https://github.com/1H-hobit/ComfyUI_InternVL3": [
+ [
+ "BBOXES_XYXY_Converter",
+ "DynamicPreprocess",
+ "Florence2toCoordinates_hb",
+ "InternVLHFInference",
+ "InternVLModelLoader",
+ "hb_Number_Counter"
+ ],
+ {
+ "title_aux": "ComfyComfyUI_InternVL3 [WIP]"
+ }
+ ],
+ "https://github.com/206811/ComfyUI_ZhipuAIO": [
+ [
+ "ZhipuAIOConfigNode",
+ "ZhipuAIO_VisionNode",
+ "ZhipuTranslateNode"
+ ],
+ {
+ "title_aux": "ComfyUI_ZhipuAIO"
+ }
+ ],
+ "https://github.com/3dmindscapper/ComfyUI-PartField": [
+ [
+ "PartFieldClustering",
+ "PartFieldExportParts",
+ "PartFieldInference",
+ "PartFieldModelDownLoader",
+ "PartFieldSplitter",
+ "PartFieldViewer"
+ ],
+ {
+ "title_aux": "ComfyUI-PartField [WIP]"
+ }
+ ],
+ "https://github.com/3dmindscapper/ComfyUI-Sam-Mesh": [
+ [
+ "SamMeshExporter",
+ "SamMeshExporter+SamMesh",
+ "SamMeshLoader",
+ "SamMeshLoader+SamMesh",
+ "SamMeshRenderer",
+ "SamMeshRenderer+SamMesh",
+ "SamMeshSegmenter",
+ "SamMeshSegmenter+SamMesh",
+ "SamModelDownloader",
+ "SamModelDownloader+SamMesh"
+ ],
+ {
+ "title_aux": "ComfyUI-Sam-Mesh [WIP]"
+ }
+ ],
+ "https://github.com/438443467/ComfyUI-SanMian-Nodes": [
+ [
+ "FaceAlignPro",
+ "FaceAlignProRestore",
+ "SANMIN Adapt Coordinates",
+ "SanmiKSampler",
+ "sanmi AddTextToImage",
+ "sanmi Adjust Transparency By Mask",
+ "sanmi AdjustHexBrightness",
+ "sanmi Align Images with Mask",
+ "sanmi BinarizeMask",
+ "sanmi BlendICLight",
+ "sanmi Chinese To Character",
+ "sanmi ColorOverlayOnMask",
+ "sanmi Compare",
+ "sanmi CompareV2",
+ "sanmi Counter",
+ "sanmi CreateTxtForImages",
+ "sanmi Filter Prompt Words",
+ "sanmi Float",
+ "sanmi Florence2toCoordinates",
+ "sanmi Get Content From Excel",
+ "sanmi Get LastPathComponent",
+ "sanmi Get Mask White Region Size",
+ "sanmi GetFilePath",
+ "sanmi GetMostCommonColor",
+ "sanmi ImageBatchSplitter",
+ "sanmi Image_Rotate",
+ "sanmi Int90",
+ "sanmi IntToBOOLEAN",
+ "sanmi Load Image Batch",
+ "sanmi LoadImageFromPath",
+ "sanmi LoadImagesanmi",
+ "sanmi Mask To Box",
+ "sanmi MaskToBboxes",
+ "sanmi MaskWhiteRatioAnalyzer",
+ "sanmi Path Captioner",
+ "sanmi Path Change",
+ "sanmi Read Image Prompt",
+ "sanmi RectMaskAnalyzer",
+ "sanmi Reduce Mask",
+ "sanmi RestoreJson",
+ "sanmi Sanmi_Text_Concatenate",
+ "sanmi Save Image To Local",
+ "sanmi SimpleWildcards",
+ "sanmi SortTheMasksLeftRight",
+ "sanmi SortTheMasksSize",
+ "sanmi Special Counter",
+ "sanmi StrToPinYin",
+ "sanmi String Counter",
+ "sanmi String Counter V2",
+ "sanmi StringToBox",
+ "sanmi Time",
+ "sanmi Upscale And Keep Original Size"
+ ],
+ {
+ "title_aux": "ComfyUI-SanMian-Nodes"
+ }
+ ],
+ "https://github.com/543872524/ComfyUI_crdong": [
+ [
+ "CRDAudioLengthNode",
+ "CRDNodesImageSelector",
+ "INTConstant",
+ "PromptBatchMulti",
+ "PromptExampleNode",
+ "PromptJoinOrList",
+ "PromptList",
+ "PromptSelectorList",
+ "PromptSelectorStr",
+ "PromptSelectorStrV2",
+ "SelectImageSize",
+ "SimpleIntMathHandle",
+ "SimpleJsonArrayHandle",
+ "SimpleJsonObjectHandle",
+ "TestExtendComfyNode",
+ "VideoFrameSize",
+ "VideoSizeAndFps",
+ "VideoTimeAndFPS",
+ "Wan22StepHandle"
+ ],
+ {
+ "title_aux": "ComfyUI_crdong"
+ }
+ ],
+ "https://github.com/5x00/ComfyUI-Prompt-Plus": [
+ [
+ "LoadAPI",
+ "LoadCustomModel",
+ "LoadFlorenceModel",
+ "Prompt",
+ "RunAPIVLM",
+ "RunCustomVLM",
+ "TriggerToPromptAPI",
+ "TriggerToPromptCustom",
+ "TriggerToPromptSimple"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Plus [WIP]"
+ }
+ ],
+ "https://github.com/77oussam/Aio77-Comfyui": [
+ [
+ "LoadImages-77",
+ "LoadImages-77-Simple",
+ "Outline-77"
+ ],
+ {
+ "title_aux": "Alo77 - ComfyUI Custom Nodes Collection [WIP]"
+ }
+ ],
+ "https://github.com/78Ventures/ComfyUI-Tortu": [
+ [
+ "BC_DETECT_FACE_ORIENTATION",
+ "BC_EXIF_WRITER",
+ "BC_IMAGE_LORA_CONFORM",
+ "BC_LOAD_IMAGES",
+ "BC_LORA_DEFINE",
+ "BC_LORA_METADATA",
+ "BC_LORA_TRAIN",
+ "BC_SAVE_IMAGES",
+ "IF_LoadImagesS",
+ "TORTU_DETECT_DUPLICATES",
+ "TORTU_DETECT_EMOTION",
+ "TORTU_DIRECTORY_ORGANIZER",
+ "TORTU_EMOTION_DETECTION",
+ "TORTU_METADATA_WRITER",
+ "TORTU_ORGANIZE_IMAGES",
+ "TORTU_WRITE_EXIF"
+ ],
+ {
+ "title_aux": "ComfyUI-Tortu [WIP/UNSAFE]"
+ }
+ ],
+ "https://github.com/7BEII/Comfyui_PDuse": [
+ [
+ "CustomAddLabel",
+ "Empty_Line",
+ "ImageBlendAndWhite",
+ "ImageBlendText",
+ "ImageBlendV1",
+ "ImageRatioCrop",
+ "PD Image Resize_V1",
+ "PDEmptyRatioLatent",
+ "PDIMAGE_ImageCombine",
+ "PDIMAGE_LongerSize",
+ "PDImageConcante",
+ "PDImageCropLocation_V2",
+ "PDImageResize",
+ "PDImageResizeV2",
+ "PDImageResizeV3",
+ "PDImageToRatioV1",
+ "PDJSON_BatchJsonIncremental",
+ "PDJSON_Group",
+ "PDStringConcate",
+ "PDStringInput",
+ "PDTEXT_SAVE_PATH",
+ "PD_AitoolkitTrainingRedux",
+ "PD_BatchCropBlackBorder",
+ "PD_CaptionJSONEditor",
+ "PD_CaptionJSONParser",
+ "PD_CropBorder",
+ "PD_Extract_Image",
+ "PD_GetImageRatio",
+ "PD_GetImageSize",
+ "PD_ImageFileTraining",
+ "PD_ImageGroupComposite",
+ "PD_ImageListForSort",
+ "PD_ImageListForSortWithMetadata",
+ "PD_ImageSearch",
+ "PD_ImageSize34Compose",
+ "PD_Image_Crop_Location",
+ "PD_Image_Rotate_v1",
+ "PD_Image_centerCrop",
+ "PD_JoinStringMultiLine",
+ "PD_LoadImageMetadata",
+ "PD_LoadImageWithMeta",
+ "PD_LoadImagesFromZip",
+ "PD_LoadTextsFromDir",
+ "PD_LoadTextsFromZip",
+ "PD_MASK_SELECTION",
+ "PD_Mask Selector",
+ "PD_Mask Selector By Area Left",
+ "PD_MaskFillHoles",
+ "PD_MaskRemoveSmallObjects",
+ "PD_ModelLoraLoader",
+ "PD_RemoveBlackBackground",
+ "PD_RemoveColorWords",
+ "PD_RemoveWhiteBorder",
+ "PD_RenameV2",
+ "PD_SAVE_PATH2",
+ "PD_SaveTextPathAndName",
+ "PD_ShowText",
+ "PD_StringLineCount",
+ "PD_StringToCaptionJSON",
+ "PD_TensorTraining",
+ "PD_Text Overlay Node",
+ "PD_TextListPack",
+ "PD_TextListSort",
+ "PD_TextListStringAddWord",
+ "PD_TextListUnpack",
+ "PD_TxtBatchRename",
+ "PD_Zip_Simple",
+ "PD_del_word",
+ "PD_empty_word",
+ "PD_if",
+ "PD_image_coversaver",
+ "PD_image_ratio_size",
+ "PD_image_to_text_v1",
+ "PD_imagesave_path",
+ "PD_load_image_v1",
+ "PD_loadimage_path",
+ "PD_loadimage_path advance",
+ "PD_name_replacewordorder",
+ "PD_number_star",
+ "PD_number_start",
+ "PD_random_prompt",
+ "PD_rename_image",
+ "PDbananaImagesizeByRatio",
+ "PDimage_corp_v1",
+ "PDimage_corp_v2",
+ "PDimage_dual_batch_by_list",
+ "PDimage_dual_batch_v1",
+ "SimpleResolutionNode",
+ "mask_edge_selector"
+ ],
+ {
+ "title_aux": "comfyui-promptbymood [WIP]"
+ }
+ ],
+ "https://github.com/861289009/comfyui_video_node": [
+ [
+ "VideoAddAudio",
+ "VideoFadeHex2In",
+ "VideoFirstFrame",
+ "VideoForceFpsCfr",
+ "VideoMerge30FpsAudio",
+ "VideoMerge30FpsNoAudio",
+ "VideoProbe",
+ "VideoTrimEndFrames",
+ "VideoTrimStartFrames",
+ "VideoUrlLastFrame",
+ "VideoUrlSplitCfr"
+ ],
+ {
+ "title_aux": "comfyui_video_node [WIP]"
+ }
+ ],
+ "https://github.com/A1rCHAN/ComfyUI_A1rSpace": [
+ [
+ "A1r Boolean A B",
+ "A1r Boolean AB",
+ "A1r CLIP Input Switch",
+ "A1r Checkpoint Input Switch",
+ "A1r Checkpoint Loader",
+ "A1r Checkpoint Picker",
+ "A1r Conditioning Input Switch",
+ "A1r ControlNet Config",
+ "A1r ControlNet Loader",
+ "A1r Custom Boolean",
+ "A1r Custom Slider",
+ "A1r Double CheckpointLoader",
+ "A1r Draggable List",
+ "A1r Image Filter",
+ "A1r Image Input Switch",
+ "A1r Image Saver",
+ "A1r Image Upscale Transform",
+ "A1r Int Input Switch",
+ "A1r Int to Boolean",
+ "A1r KSampler Config",
+ "A1r KSampler Config Values",
+ "A1r Latent Encode Transform",
+ "A1r Latent Observer",
+ "A1r Latent Upscale Transform",
+ "A1r LoRA Config",
+ "A1r LoRA Config Advance",
+ "A1r Load Image",
+ "A1r Math Int",
+ "A1r Math Logic Gate",
+ "A1r Mode Inverter",
+ "A1r Mode Relay",
+ "A1r Model Input Switch",
+ "A1r Node Mode Collector",
+ "A1r Node Mode Console",
+ "A1r Sampler Picker",
+ "A1r Save Image",
+ "A1r Seed Control",
+ "A1r Separate CheckpointLoader",
+ "A1r Simple Boolean",
+ "A1r Six LoRA Loader",
+ "A1r Six LoRA Loader 2P",
+ "A1r Six LoRA Loader Separate",
+ "A1r Size Canvas",
+ "A1r Size Picker",
+ "A1r Stack LoRA Loader",
+ "A1r Stack LoRA Loader 2P",
+ "A1r Stack LoRA Loader Separate",
+ "A1r Text Box",
+ "A1r Text Input Switch",
+ "A1r Text Merge",
+ "A1r Text Save File Name",
+ "A1r Text Show",
+ "A1r Text Tag Box",
+ "A1r Text Translate",
+ "A1r Text Translate Merge with Clip Encode",
+ "A1r Unity KSampler",
+ "A1r Upscale Method Picker",
+ "A1r VAE Decode Transform",
+ "A1r VAE Input Switch",
+ "A1r Widget Collector"
+ ],
+ {
+ "title_aux": "Eric's Prompt Enhancers for ComfyUI# Eric's Prompt Enhancers for ComfyUI"
+ }
+ ],
+ "https://github.com/A4P7J1N7M05OT/ComfyUI-ManualSigma": [
+ [
+ "ManualSigma"
+ ],
+ {
+ "title_aux": "ComfyUI-ManualSigma"
+ }
+ ],
+ "https://github.com/A4P7J1N7M05OT/ComfyUI-VAELoaderSDXLmod": [
+ [
+ "EmptyLatentImageVariable",
+ "ModifiedSDXLVAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-VAELoaderSDXLmod"
+ }
+ ],
+ "https://github.com/A719689614/ComfyUI_AC_FUNV7-FLUX-": [
+ [
+ "AC_Super_CLIP(FLUX)",
+ "AC_Super_UNET(FLUX)"
+ ],
+ {
+ "title_aux": "ComfyUI_AC_FUNV7-FLUX- [WIP]"
+ }
+ ],
+ "https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1": [
+ [
+ "AC_FUN_SUPER_DESIGN_LARGE",
+ "AC_FUN_SUPER_LARGE",
+ "AC_Super_CKPT&LCM",
+ "AC_Super_CLIPEN",
+ "AC_Super_Checkpoint",
+ "AC_Super_Controlnet",
+ "AC_Super_EmptLatent",
+ "AC_Super_KSampler",
+ "AC_Super_Lora&LCM",
+ "AC_Super_Loras",
+ "AC_Super_MaskScale",
+ "AC_Super_MaskScaleBy",
+ "AC_Super_PreviewImage",
+ "AC_Super_PreviewMask",
+ "AC_Super_SaveImage",
+ "AC_Super_UpKSampler"
+ ],
+ {
+ "title_aux": "ComfyUI_AC_FUNV8Beta1"
+ }
+ ],
+ "https://github.com/AICodeFactory/ComfyUI-Viva": [
+ [
+ "HttpTrigger_Common",
+ "HttpTrigger_Image",
+ "HttpTrigger_Viva"
+ ],
+ {
+ "title_aux": "ComfyUI-Viva"
+ }
+ ],
+ "https://github.com/AIExplorer25/ComfyUI_HuggingfaceHelper": [
+ [
+ "GPTOSSHelper",
+ "GoogleSearchFromList",
+ "HuggingFaceModelCardReader",
+ "HuggingFacePromptBuilder",
+ "HuggingFaceTrendingModels",
+ "JinaPageScraper",
+ "PTagExtractor",
+ "QwenResponseExtract"
+ ],
+ {
+ "title_aux": "ComfyUI_HuggingfaceHelper"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-OpenDIT": [
+ [
+ "DITModelLoader",
+ "DITPromptNode",
+ "DiffVAELoader",
+ "LattePipeLineNode",
+ "OpenSoraNode",
+ "OpenSoraPlanPipeLineNode",
+ "PABConfigNode",
+ "PreViewVideo",
+ "SchedulerLoader",
+ "T5EncoderLoader",
+ "T5TokenizerLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-OpenDIT [WIP]"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-ViViD": [
+ [
+ "LoadImagePath",
+ "LoadVideo",
+ "PreViewVideo",
+ "ViViD_Node"
+ ],
+ {
+ "title_aux": "ComfyUI-ViViD"
+ }
+ ],
+ "https://github.com/AIFSH/UltralightDigitalHuman-ComfyUI": [
+ [
+ "InferUltralightDigitalHumanNode",
+ "TrainUltralightDigitalHumanNode"
+ ],
+ {
+ "title_aux": "UltralightDigitalHuman-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/UtilNodes-ComfyUI": [
+ [
+ "GetRGBEmptyImgae",
+ "LoadVideo",
+ "PreViewVideo",
+ "PromptTextNode"
+ ],
+ {
+ "title_aux": "UtilNodes-ComfyUI [WIP]"
+ }
+ ],
+ "https://github.com/AIGCZero/AIGCZero-comfyui-Qwen_edit-zero": [
+ [
+ "TextEncodeQwenImageEdit_zero"
+ ],
+ {
+ "title_aux": "AIGCZero-comfyui-Qwen_edit-zero"
+ }
+ ],
+ "https://github.com/AMTPorn/comfyui_amt": [
+ [
+ "AMTCountTagsInDirectory",
+ "AMTEmbedTagFrequencySafetensors",
+ "AMTMultiConditionRegexReplace",
+ "AMTReplaceAndMaybeDropString",
+ "AMTStringDeduplication"
+ ],
+ {
+ "title_aux": "comfyui_amt"
+ }
+ ],
+ "https://github.com/APZmedia/ComfyUI-folder-parser": [
+ [
+ "APZFolderParser"
+ ],
+ {
+ "author": "Pablo Apiolazza",
+ "description": "A ComfyUI custom node for parsing and filtering files from a folder with sorting capabilities.",
+ "nickname": "ComfyUI Folder Parser",
+ "title": "ComfyUI Folder Parser",
+ "title_aux": "ComfyUI Folder Parser [UNSAFE]"
+ }
+ ],
+ "https://github.com/APZmedia/Joshua-brand-assets-loader": [
+ [
+ "APZmediaBrandAssetLoader",
+ "APZmediaBrandAssetReader",
+ "APZmediaColorPalette",
+ "APZmediaColorPaletteSelector",
+ "APZmediaFontSelector",
+ "APZmediaGlobalBrandAccess",
+ "APZmediaGlobalBrandStatus",
+ "APZmediaGradientOverlay",
+ "APZmediaLogoOverlay",
+ "APZmediaLogoPlacement",
+ "APZmediaSolidColor",
+ "APZmediaURLImageLoader",
+ "POISmartCrop"
+ ],
+ {
+ "title_aux": "Joshua Brand Assets Loader [private]"
+ }
+ ],
+ "https://github.com/APZmedia/comfyui-textools": [
+ [
+ "APZ/MarkdownTextOverlay",
+ "APZmediaBrandMarkdownTextOverlay",
+ "APZmediaBrandRichTextOverlay",
+ "APZmediaBrandRichTextOverlayV2",
+ "APZmediaImageMarkdownTextOverlay",
+ "APZmediaImageRichTextOverlay",
+ "APZmediaImageRichTextOverlayV2"
+ ],
+ {
+ "author": "Pablo Apiolazza",
+ "description": "This extension provides rich text overlay functionalities, color management, and text parsing utilities for ComfyUI.",
+ "nickname": "ComfyUI Text Tools",
+ "title": "ComfyUI APZmedia Text Tools",
+ "title_aux": "comfyui-textools [WIP]"
+ }
+ ],
+ "https://github.com/Aero-Ex/comfyui_diffswap": [
+ [
+ "DiffSwapNode"
+ ],
+ {
+ "title_aux": "comfyui_diffswap"
+ }
+ ],
+ "https://github.com/AhBumm/ComfyUI-Upscayl": [
+ [
+ "Upscayl Upscaler"
+ ],
+ {
+ "nodename_pattern": "\\(BillBum\\)$",
+ "title_aux": "ComfyUI-Upscayl"
+ }
+ ],
+ "https://github.com/AkiEvansDev/ComfyUI-Tools": [
+ [
+ "AE.AnySwitch",
+ "AE.AnyTypeSwitch",
+ "AE.BRIARemBG",
+ "AE.BRIARemBGAdvanced",
+ "AE.ChangeSamplerConfig",
+ "AE.CheckpointList",
+ "AE.CheckpointLoader",
+ "AE.CompareFloat",
+ "AE.CompareInt",
+ "AE.ControlNetApplyWithConfig",
+ "AE.ControlNetConfig",
+ "AE.DisplayAny",
+ "AE.ExtractControlNetConfig",
+ "AE.ExtractHiresFixConfig",
+ "AE.ExtractImg2ImgConfig",
+ "AE.ExtractOutpaintConfig",
+ "AE.ExtractSamplerConfig",
+ "AE.Float",
+ "AE.FloatList",
+ "AE.FloatSwitch",
+ "AE.FloatToInt",
+ "AE.GaussianBlurMask",
+ "AE.GetImageSize",
+ "AE.GetLatentSize",
+ "AE.GroupsMuter",
+ "AE.HiresFixConfig",
+ "AE.ImageAdjustment",
+ "AE.ImageBlank",
+ "AE.ImageBlendMask",
+ "AE.ImageBlendMode",
+ "AE.ImageCannyFilter",
+ "AE.ImageDragonFilter",
+ "AE.ImageHighPassFilter",
+ "AE.ImageLevels",
+ "AE.ImageLucySharpen",
+ "AE.ImagePixelate",
+ "AE.ImagePowerNoise",
+ "AE.ImageStyleFilter",
+ "AE.Img2ImgConfig",
+ "AE.InpaintWithModel",
+ "AE.Int",
+ "AE.IntList",
+ "AE.IntSwitch",
+ "AE.IntToFloat",
+ "AE.KSamplerHiresFixWithConfig",
+ "AE.KSamplerImg2ImgWithConfig",
+ "AE.KSamplerInpaintWithConfig",
+ "AE.KSamplerInpaintWithConfigAndImage",
+ "AE.KSamplerOutpaintWithConfig",
+ "AE.KSamplerOutpaintWithConfigAndImage",
+ "AE.KSamplerWithConfig",
+ "AE.LoadImageFromPath",
+ "AE.LoadInpaintModel",
+ "AE.LoraLoader",
+ "AE.LorasList",
+ "AE.LorasLoader",
+ "AE.MathFloat",
+ "AE.MathInt",
+ "AE.OutpaintConfig",
+ "AE.OutpaintWithModel",
+ "AE.OutpaintWithModelAndConfig",
+ "AE.Range",
+ "AE.RangeList",
+ "AE.SDXLConfig",
+ "AE.SDXLPrompt",
+ "AE.SDXLPromptWithHires",
+ "AE.SDXLRegionalPrompt",
+ "AE.SDXLRegionalPromptWithHires",
+ "AE.SamplerConfig",
+ "AE.SamplerList",
+ "AE.SaveImage",
+ "AE.SchedulerList",
+ "AE.Seed",
+ "AE.String",
+ "AE.StringConcat",
+ "AE.StringEquals",
+ "AE.StringLength",
+ "AE.StringList",
+ "AE.StringReplace",
+ "AE.StringSwitch",
+ "AE.Text",
+ "AE.ToString",
+ "AE.ToStringConcat",
+ "AE.UpscaleLatentBy",
+ "AE.VAEEncodeInpaintConditioning",
+ "AE.XYRange"
+ ],
+ {
+ "title_aux": "ComfyUI-Tools"
+ }
+ ],
+ "https://github.com/Alazuaka/comfyui-lora-stack-node": [
+ [
+ "AlazukaCheckpoint",
+ "EsLoraSet"
+ ],
+ {
+ "title_aux": "ES_nodes for ComfyUI by Alazuka [WIP]"
+ }
+ ],
+ "https://github.com/AlejandroTuzzi/TUZZI-ByPass": [
+ [
+ "LinkSuppressor",
+ "SequentialTextReaderAuto",
+ "TUZZI-AppendToMasterVideo",
+ "TUZZI-Bypasser",
+ "TUZZI-DataloungeScraper",
+ "TUZZI-DirectoryImagePromptReader",
+ "TUZZI-ElevenLabsTTS",
+ "TUZZI-GeminiNode",
+ "TUZZI-GroqNode",
+ "TUZZI-ImageAudioToVideo",
+ "TUZZI-ImageExtractorSaver",
+ "TUZZI-LineCounter",
+ "TUZZI-LinkSuppressor",
+ "TUZZI-NumberLines",
+ "TUZZI-PlosArticleScraper",
+ "TUZZI-RangedSelectorText5",
+ "TUZZI-RangedSelectorTitleURL10",
+ "TUZZI-RangedSelectorTitleURL5",
+ "TUZZI-RedditPostExtractor",
+ "TUZZI-SaveVideo",
+ "TUZZI-SequentialTextReader",
+ "TUZZI-SequentialTextReaderAuto",
+ "TUZZI-SmartAudioVisualComposer",
+ "TUZZI-TVTropesScraper",
+ "TUZZI-TextFormatter",
+ "TUZZI-TextFormatterPlus",
+ "TUZZI-TextTranslatorExporter",
+ "TUZZI-TextTruncatorPlus",
+ "TUZZI-YouTubeCommentExtractor",
+ "TUZZI-YouTubeSubtitleExtractor"
+ ],
+ {
+ "title_aux": "TUZZI-ByPass [WIP]"
+ }
+ ],
+ "https://github.com/AlexXi19/ComfyUI-OpenAINode": [
+ [
+ "ImageWithPrompt",
+ "TextWithPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-OpenAINode"
+ }
+ ],
+ "https://github.com/AlexYez/comfyui-timesaver": [
+ [
+ "ModelScanner",
+ "TS Cube to Equirectangular",
+ "TS Equirectangular to Cube",
+ "TS Files Downloader",
+ "TS Youtube Chapters",
+ "TSAutoTileSize",
+ "TSCropToMask",
+ "TSRestoreFromCrop",
+ "TSWhisper",
+ "TS_BGRM_BiRefNet",
+ "TS_BatchPromptLoader",
+ "TS_Color_Grade",
+ "TS_DeflickerNode",
+ "TS_FilePathLoader",
+ "TS_FilmGrain",
+ "TS_Film_Emulation",
+ "TS_FloatSlider",
+ "TS_Free_Video_Memory",
+ "TS_ImageResize",
+ "TS_Int_Slider",
+ "TS_LTX_FirstLastFrame",
+ "TS_ModelConverter",
+ "TS_ModelConverterAdvanced",
+ "TS_Qwen3",
+ "TS_Qwen3_VL",
+ "TS_QwenCanvas",
+ "TS_QwenSafeResize",
+ "TS_Qwen_3VL_GGUF",
+ "TS_Qwen_3VL_V2",
+ "TS_SmartImageBatch",
+ "TS_Smart_Image_Switch",
+ "TS_Smart_Switch",
+ "TS_VideoDepthNode",
+ "TS_Video_Upscale_With_Model",
+ "TS_WAN_SafeResize"
+ ],
+ {
+ "title_aux": "ComfyUI Timesaver Nodes"
+ }
+ ],
+ "https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes": [
+ [
+ "Add Human Styler",
+ "ConcaveHullImage",
+ "Convert Monochrome",
+ "ImageBWPostprocessor",
+ "ImageBWPreprocessor",
+ "Inpaint Crop Xo",
+ "LoadData",
+ "Mask Aligned bbox for ConcaveHull",
+ "Mask Aligned bbox for Inpainting",
+ "Mask Aligned bbox for Inpainting2",
+ "Mask Square bbox for Inpainting",
+ "One Image Compare",
+ "RT4KSR Loader",
+ "RandomPromptStyler",
+ "Save Log Info",
+ "Save log info",
+ "Three Image Compare",
+ "Upscale RT4SR"
+ ],
+ {
+ "title_aux": "ComfyUI-Xorbis-nodes [WIP]"
+ }
+ ],
+ "https://github.com/Alvaroeai/ComfyUI-SunoAI-Mds": [
+ [
+ "Mideas_SunoAI_AudioManager",
+ "Mideas_SunoAI_Generator",
+ "Mideas_SunoAI_ProxyDownloadNode",
+ "Mideas_SunoAI_ProxyNode"
+ ],
+ {
+ "title_aux": "ComfyUI-SunoAI-Mds"
+ }
+ ],
+ "https://github.com/Amor718/AmorForge": [
+ [
+ "CogViewImageGenerator",
+ "ImageToWebpSaver",
+ "SimpleImageResizer",
+ "SimpleImageResizerNode",
+ "TextTranslator",
+ "TextTranslatorNode"
+ ],
+ {
+ "title_aux": "AmorForge"
+ }
+ ],
+ "https://github.com/Anonymzx/ComfyUI-Indonesia-TTS": [
+ [
+ "Facebook MMS-TTS-IND Variants FX"
+ ],
+ {
+ "title_aux": "ComfyUI-Indonesia-TTS [WIP]"
+ }
+ ],
+ "https://github.com/Anze-/ComfyUI-OIDN": [
+ [
+ "OIDN Denoise",
+ "denoiseOIDN"
+ ],
+ {
+ "title_aux": "ComfyUI-OIDN [WIP]"
+ }
+ ],
+ "https://github.com/Anze-/ComfyUI_deepDeband": [
+ [
+ "deepDeband Inference",
+ "deepDebandInference"
+ ],
+ {
+ "title_aux": "ComfyUI_deepDeband [WIP]"
+ }
+ ],
+ "https://github.com/AprEcho/ComfyUI-RandomSeed": [
+ [
+ "RandomSeed"
+ ],
+ {
+ "title_aux": "ComfyUI-RandomSeed"
+ }
+ ],
+ "https://github.com/ArmandAlbert/Kwai_font_comfyui": [
+ [
+ "Kwaifont_Image_Cropper",
+ "Kwaifont_Resnet101_Loader",
+ "Kwaifont_Resnet101_Runner",
+ "Kwaifont_Resnet50_Loader",
+ "Kwaifont_Resnet50_Runner"
+ ],
+ {
+ "title_aux": "Kwai_font_comfyui"
+ }
+ ],
+ "https://github.com/ArthusLiang/comfyui-face-remap": [
+ [
+ "FaceRemap"
+ ],
+ {
+ "title_aux": "comfyui-face-remap [WIP]"
+ }
+ ],
+ "https://github.com/Aruntd008/ComfyUI_SeamlessPattern": [
+ [
+ "SeamlessPatternNode"
+ ],
+ {
+ "title_aux": "[WIP] ComfyUI_SeamlessPattern"
+ }
+ ],
+ "https://github.com/Aruntd008/ComfyUI_blender_render": [
+ [
+ "Blender Render Node",
+ "BlenderRenderNode"
+ ],
+ {
+ "title_aux": "ComfyUI_blender_render"
+ }
+ ],
+ "https://github.com/BARKEM-JC/ComfyUI-Dynamic-Lora-Loader": [
+ [
+ "DynamicLoraBlockWeights",
+ "DynamicLoraConfig",
+ "DynamicLoraConfigCombiner",
+ "DynamicLoraEmbedding",
+ "DynamicLoraKeyword",
+ "DynamicLoraLoader",
+ "DynamicLoraOffset"
+ ],
+ {
+ "title_aux": "ComfyUI-Dynamic-Lora-Loader"
+ }
+ ],
+ "https://github.com/Babiduba/ivan_knows": [
+ [
+ "RoleSelector",
+ "SaveImageToAbsolutePath"
+ ],
+ {
+ "title_aux": "ivan_knows [UNSAFE]"
+ }
+ ],
+ "https://github.com/BadCafeCode/execution-inversion-demo-comfyui": [
+ [
+ "AccumulateNode",
+ "AccumulationGetItemNode",
+ "AccumulationGetLengthNode",
+ "AccumulationHeadNode",
+ "AccumulationSetItemNode",
+ "AccumulationTailNode",
+ "AccumulationToListNode",
+ "BoolOperationNode",
+ "ComponentInput",
+ "ComponentMetadata",
+ "ComponentOutput",
+ "DebugPrint",
+ "ExecutionBlocker",
+ "FloatConditions",
+ "ForLoopClose",
+ "ForLoopOpen",
+ "IntConditions",
+ "IntMathOperation",
+ "InversionDemoAdvancedPromptNode",
+ "InversionDemoLazyConditional",
+ "InversionDemoLazyIndexSwitch",
+ "InversionDemoLazyMixImages",
+ "InversionDemoLazySwitch",
+ "ListToAccumulationNode",
+ "MakeListNode",
+ "StringConditions",
+ "ToBoolNode",
+ "WhileLoopClose",
+ "WhileLoopOpen"
+ ],
+ {
+ "title_aux": "execution-inversion-demo-comfyui"
+ }
+ ],
+ "https://github.com/BaronVonBoolean/ComfyUI-FileOps": [
+ [
+ "File Mv",
+ "File Path",
+ "FileMv",
+ "Make Dir"
+ ],
+ {
+ "title_aux": "ComfyUI-FileOps [UNSAFE]"
+ }
+ ],
+ "https://github.com/Beinsezii/DEET": [
+ [
+ "DEET"
+ ],
+ {
+ "title_aux": "DEET: Diffusion Entropy Equalization Transform [WIP]"
+ }
+ ],
+ "https://github.com/BenjaMITM/ComfyUI_On_The_Fly_Wildcards": [
+ [
+ "Display String",
+ "Wildcard Creator",
+ "Wildcard Loader",
+ "Wildcard Selector"
+ ],
+ {
+ "title_aux": "ComfyUI_On_The_Fly_Wildcards [WIP]"
+ }
+ ],
+ "https://github.com/BetaDoggo/ComfyUI-LogicGates": [
+ [
+ "AND",
+ "BitMemory",
+ "BoolToString",
+ "ByteMemory",
+ "ByteToBits",
+ "CreateBYTE",
+ "CreateByte",
+ "NAND",
+ "NOR",
+ "NOT",
+ "ON",
+ "OR",
+ "SWITCH",
+ "XNOR",
+ "XOR"
+ ],
+ {
+ "title_aux": "ComfyUI-LogicGates"
+ }
+ ],
+ "https://github.com/Big-Idea-Technology/ComfyUI-Movie-Tools": [
+ [
+ "LoadImagesFromSubdirsBatch",
+ "SaveImagesWithSubfolder"
+ ],
+ {
+ "title_aux": "ComfyUI-Movie-Tools [WIP]"
+ }
+ ],
+ "https://github.com/BigStationW/flowmatch_scheduler-comfyui": [
+ [
+ "FlowMatchSigmas"
+ ],
+ {
+ "title_aux": "flowmatch_scheduler-comfyui"
+ }
+ ],
+ "https://github.com/BinglongLi/ComfyUI_ToolsForAutomask": [
+ [
+ "Closing Mask",
+ "Conditional Mask Selector",
+ "Directional Mask Expansion",
+ "Mask Fill Gaps Convex Hull",
+ "Opening Mask",
+ "Precise Add Mask",
+ "Precise Subtract Mask",
+ "Prune Thin Branches Mask",
+ "Remove Small Regions Mask"
+ ],
+ {
+ "title_aux": "ComfyUI_ToolsForAutomask"
+ }
+ ],
+ "https://github.com/BiodigitalJaz/ComfyUI-Dafaja-Nodes": [
+ [
+ "DafajaBackgroundRemover",
+ "DafajaExportSTL",
+ "DafajaMeshGenerator",
+ "DafajaMeshInfo",
+ "DafajaMeshNormalizer",
+ "DafajaMeshProcessor",
+ "DafajaSTLValidator",
+ "DafajaStemsMidiSeparator",
+ "DafajaVAEDecoder"
+ ],
+ {
+ "title_aux": "ComfyUI-Dafaja-Nodes [WIP]"
+ }
+ ],
+ "https://github.com/BizaNator/BrainDead_QwenCharacterEditor": [
+ [
+ "TextEncodeQwenImageEditEnhanced",
+ "TextEncodeQwenImageEditIdentity",
+ "TextEncodeQwenImageEditMulti",
+ "TextEncodeQwenImageEditWeighted",
+ "TextEncodeQwenImageT2ICustom"
+ ],
+ {
+ "title_aux": "BrainDead_QwenCharacterEditor [WIP]"
+ }
+ ],
+ "https://github.com/BlueDangerX/ComfyUI-BDXNodes": [
+ [
+ "BDXTestInt"
+ ],
+ {
+ "author": "BlueDangerX",
+ "title": "BDXNodes",
+ "title_aux": "ComfyUI-BDXNodes [WIP]"
+ }
+ ],
+ "https://github.com/Brandelan/ComfyUI_bd_customNodes": [
+ [
+ "BD Float to String",
+ "BD Int to String",
+ "BD Random Range",
+ "BD Random Settings",
+ "BD Sequencer",
+ "BD Settings",
+ "bd_FloatRangeSlider",
+ "bd_FloatToString",
+ "bd_IntToString",
+ "bd_RandomizeSettings",
+ "bd_Sequencer"
+ ],
+ {
+ "title_aux": "ComfyUI_bd_customNodes"
+ }
+ ],
+ "https://github.com/BrettMedia/comfyui-bhtools": [
+ [
+ "CinematicSceneDirectorTools",
+ "EndOfWorkflowClearingBHTools",
+ "PromptInferenceBHTools",
+ "SaveImageVideoBHTools"
+ ],
+ {
+ "title_aux": "comfyui-bhtools [WIP]"
+ }
+ ],
+ "https://github.com/BuffMcBigHuge/ComfyUI-Buff-Nodes": [
+ [
+ "ConsoleOutput",
+ "FilePathSelectorFromDirectory",
+ "FrameRateModulator",
+ "MostRecentFileSelector",
+ "RaftOpticalFlowNode",
+ "StringProcessor",
+ "TwoImageConcatenator"
+ ],
+ {
+ "title_aux": "ComfyUI-Buff-Nodes [WIP]"
+ }
+ ],
+ "https://github.com/Burgstall-labs/ComfyUI-BS_FalAi-API-Video": [
+ [
+ "FalAILipSyncNode",
+ "FalAPIOmniProNode",
+ "FalAPIVideoGeneratorI2V",
+ "FalAPIVideoGeneratorT2V",
+ "FalI2V",
+ "FalLipSync",
+ "FalOmniPro",
+ "FalOmniProV2",
+ "FalT2V"
+ ],
+ {
+ "title_aux": "ComfyUI-BS_FalAi-API-Video [WIP]"
+ }
+ ],
+ "https://github.com/Bwebbfx/ComfyUI_FaceParsing": [
+ [
+ "FaceParsingInfer",
+ "FaceParsingLoader",
+ "FacePartMask"
+ ],
+ {
+ "title_aux": "ComfyUI Face Parsing Nodes [WIP]"
+ }
+ ],
+ "https://github.com/COcisuts/CObot-ComfyUI-WhisperToTranscription": [
+ [
+ "CobotWhisperToTransciption"
+ ],
+ {
+ "title_aux": "CObot-ComfyUI-WhisperToTranscription [WIP]"
+ }
+ ],
+ "https://github.com/CeeVeeR/ComfyUi-Text-Tiler": [
+ [
+ "Text Tiler"
+ ],
+ {
+ "title_aux": "ComfyUi-Text-Tiler"
+ }
+ ],
+ "https://github.com/Chang-Jin-Lee/ComfyUI-PromptMixer-AI": [
+ [
+ "FavoritePromptMixer",
+ "FreeAIPrompt",
+ "FreeAIPromptGenerate",
+ "Load_Text_Batch_Simple"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptMixer-AI [WIP]"
+ }
+ ],
+ "https://github.com/Chargeuk/ComfyUI-vts-nodes": [
+ [
+ "VTS Add Text To list",
+ "VTS Calculate Upscale Amount",
+ "VTS Clean Text",
+ "VTS Clean Text List",
+ "VTS Clear Ram",
+ "VTS Clip Text Encode",
+ "VTS Color Mask To Mask",
+ "VTS Colour Match",
+ "VTS Colour Match Advanced",
+ "VTS Colour Match First Frames",
+ "VTS Colour Match First Frames Bad Highlights",
+ "VTS Compare Latents",
+ "VTS Conditioning Set Batch Mask",
+ "VTS Convert Latents",
+ "VTS Count Characters",
+ "VTS Create Character Mask",
+ "VTS Delete Saved Images",
+ "VTS Fix Image Tags",
+ "VTS Image Composite Masked",
+ "VTS Image Composite Masked Old",
+ "VTS Image To Disk",
+ "VTS Image Upscale With Model",
+ "VTS Images Crop From Masks",
+ "VTS Images Scale",
+ "VTS Images Scale To Min",
+ "VTS Looping K Sampler",
+ "VTS Math",
+ "VTS Merge Delimited Text",
+ "VTS Merge Text",
+ "VTS Merge Text Lists",
+ "VTS Reduce Batch Size",
+ "VTS Render People Kps",
+ "VTS Repeat Text As List",
+ "VTS Replace Text In List",
+ "VTS Sharpen",
+ "VTS TAE Video Decode",
+ "VTS TAE Video Encode",
+ "VTS To Boolean",
+ "VTS To List",
+ "VTS To Text",
+ "VTS To Text List",
+ "VTS VAE Decode Tiled",
+ "VTS_Load_Pose_Keypoints",
+ "Vts Text To Batch Prompt"
+ ],
+ {
+ "title_aux": "ComfyUI-vts-nodes [WIP]"
+ }
+ ],
+ "https://github.com/Charonartist/ComfyUI-send-eagle-pro_2": [
+ [
+ "Batch Send Media to Eagle",
+ "Send Audio to Eagle",
+ "Send Eagle with text",
+ "Send Media to Eagle",
+ "Send Media to Eagle (Advanced)",
+ "Send Video to Eagle",
+ "Send Webp Image to Eagle"
+ ],
+ {
+ "title_aux": "ComfyUI-send-eagle-pro"
+ }
+ ],
+ "https://github.com/Charonartist/comfyui-lora-random-selector": [
+ [
+ "LoRARandomSelector"
+ ],
+ {
+ "title_aux": "ComfyUI LoRA Random Selector [WIP]"
+ }
+ ],
+ "https://github.com/ChrisColeTech/ComfyUI-Get-Random-File": [
+ [
+ "Get Image File By Index",
+ "Get Video File By Index",
+ "Random File Path",
+ "Random Image Path",
+ "Random Video Path"
+ ],
+ {
+ "title_aux": "ComfyUI-Get-Random-File [UNSAFE]"
+ }
+ ],
+ "https://github.com/Clelstyn/ComfyUI-Inpaint_with_Detailer": [
+ [
+ "FilterAndBlurMask",
+ "MaskedResizeImage",
+ "PasteMaskedImage"
+ ],
+ {
+ "title_aux": "ComfyUI-Inpaint_with_Detailer"
+ }
+ ],
+ "https://github.com/Clivey1234/ComfyUI_FBX_Import": [
+ [
+ "BatchListResize",
+ "FBX_CameraDirector",
+ "FBX_Canny_Blender",
+ "FBX_Depth_Blender",
+ "FBX_Extraction",
+ "FBX_ImageBatchNumberOverlay",
+ "FBX_ImageResInfo",
+ "FBX_Info"
+ ],
+ {
+ "title_aux": "ComfyUI_FBX_Import [UNSAFE]"
+ }
+ ],
+ "https://github.com/Clybius/ComfyUI-FluxDeCLIP": [
+ [
+ "FluxDeCLIPCheckpointLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-FluxDeCLIP"
+ }
+ ],
+ "https://github.com/Comfy-Org/ComfyUI_devtools": [
+ [
+ "DevToolsButtonWidget",
+ "DevToolsChartWidget",
+ "DevToolsColorPickerWidget",
+ "DevToolsDeprecatedNode",
+ "DevToolsDisabledWidgets",
+ "DevToolsErrorRaiseNode",
+ "DevToolsErrorRaiseNodeWithMessage",
+ "DevToolsExperimentalNode",
+ "DevToolsFileUploadSingleWidget",
+ "DevToolsFileUploadWidget",
+ "DevToolsGalleriaWidget",
+ "DevToolsImageCompareSideBySideWidget",
+ "DevToolsImageCompareWidget",
+ "DevToolsImageWidget",
+ "DevToolsInputTextWidget",
+ "DevToolsIntSliderWidget",
+ "DevToolsLoadAnimatedImageTest",
+ "DevToolsLongComboDropdown",
+ "DevToolsMultiSelectNode",
+ "DevToolsMultiSelectWidget",
+ "DevToolsNodeWithBooleanInput",
+ "DevToolsNodeWithDefaultInput",
+ "DevToolsNodeWithForceInput",
+ "DevToolsNodeWithOnlyOptionalInput",
+ "DevToolsNodeWithOptionalComboInput",
+ "DevToolsNodeWithOptionalInput",
+ "DevToolsNodeWithOutputCombo",
+ "DevToolsNodeWithOutputList",
+ "DevToolsNodeWithSeedInput",
+ "DevToolsNodeWithStringInput",
+ "DevToolsNodeWithUnionInput",
+ "DevToolsNodeWithV2ComboInput",
+ "DevToolsNodeWithValidation",
+ "DevToolsObjectPatchNode",
+ "DevToolsRemoteWidgetNode",
+ "DevToolsRemoteWidgetNodeWithControlAfterRefresh",
+ "DevToolsRemoteWidgetNodeWithParams",
+ "DevToolsRemoteWidgetNodeWithRefresh",
+ "DevToolsRemoteWidgetNodeWithRefreshButton",
+ "DevToolsSelectButtonWidget",
+ "DevToolsSelectWidget",
+ "DevToolsSimpleSlider",
+ "DevToolsSliderWidget",
+ "DevToolsTextareaWidget",
+ "DevToolsToggleSwitchWidget",
+ "DevToolsTreeSelectMultiWidget",
+ "DevToolsTreeSelectWidget"
+ ],
+ {
+ "title_aux": "ComfyUI_devtools [WIP]"
+ }
+ ],
+ "https://github.com/ComfyUI/Accessories": [
+ [
+ "ACC_AnyCast",
+ "AccMakeListNode",
+ "GetMaskDimensions",
+ "GetRandomDimensions",
+ "isImageEmpty",
+ "isMaskEmpty"
+ ],
+ {}
+ ],
+ "https://github.com/ComfyUI/DiffsynthPause": [
+ [
+ "nynxz.Patch.ZImageDiffsynthControlnetPause"
+ ],
+ {}
+ ],
+ "https://github.com/ComfyUI/Text_Processor": [
+ [
+ "AddTextToImage",
+ "AdvancedTextFilter",
+ "TextInput",
+ "TextScraper",
+ "TextStorage",
+ "Wildcards",
+ "WildcardsAdv"
+ ],
+ {}
+ ],
+ "https://github.com/CypherNaught-0x/ComfyUI-StarVector": [
+ [
+ "LoadSVG",
+ "SVGPreview",
+ "SVGPreviewFromString",
+ "SVGToString",
+ "SaveSVG",
+ "StarVectorImage2SVG",
+ "StarVectorModelLoader",
+ "StringToSVG"
+ ],
+ {
+ "title_aux": "ComfyUI-StarVector [WIP]"
+ }
+ ],
+ "https://github.com/D1-3105/ComfyUI-VideoStream": [
+ [
+ "FloWWeaverExportSingleFrameGRPC",
+ "FloWWeaverFrameNoBroker"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoStream"
+ }
+ ],
+ "https://github.com/DailyMok/ComfyUI-PromptMixerNode": [
+ [
+ "PromptMixerDaily"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptMixerNode"
+ }
+ ],
+ "https://github.com/DataCTE/ComfyUI-DataVoid-nodes": [
+ [
+ "IPAAdapterFaceIDBatch",
+ "IPAdapter",
+ "IPAdapterAdvanced",
+ "IPAdapterBatch",
+ "IPAdapterClipVisionEnhancer",
+ "IPAdapterClipVisionEnhancerBatch",
+ "IPAdapterCombineEmbeds",
+ "IPAdapterCombineParams",
+ "IPAdapterCombineWeights",
+ "IPAdapterEmbeds",
+ "IPAdapterEmbedsBatch",
+ "IPAdapterEncoder",
+ "IPAdapterFaceID",
+ "IPAdapterFaceIDKolors",
+ "IPAdapterFromParams",
+ "IPAdapterInsightFaceLoader",
+ "IPAdapterLoadEmbeds",
+ "IPAdapterMS",
+ "IPAdapterModelLoader",
+ "IPAdapterNoise",
+ "IPAdapterPreciseComposition",
+ "IPAdapterPreciseCompositionBatch",
+ "IPAdapterPreciseStyleTransfer",
+ "IPAdapterPreciseStyleTransferBatch",
+ "IPAdapterPromptScheduleFromWeightsStrategy",
+ "IPAdapterRegionalConditioning",
+ "IPAdapterSameEnergy",
+ "IPAdapterSaveEmbeds",
+ "IPAdapterStyleComposition",
+ "IPAdapterStyleCompositionBatch",
+ "IPAdapterTiled",
+ "IPAdapterTiledBatch",
+ "IPAdapterUnifiedLoader",
+ "IPAdapterUnifiedLoaderCommunity",
+ "IPAdapterUnifiedLoaderFaceID",
+ "IPAdapterWeights",
+ "IPAdapterWeightsFromStrategy",
+ "MegaMergeSDXL",
+ "PrepImageForClipVision"
+ ],
+ {
+ "title_aux": "ComfyUI-DataVoid-nodes [WIP]"
+ }
+ ],
+ "https://github.com/DavidJBarnes/comfyui-djb-utils": [
+ [
+ "DirectImageFilenameInput",
+ "ResolutionDetectorFromFilename",
+ "WAN21ModelTracker",
+ "WorkingFilenameExtractor"
+ ],
+ {
+ "title_aux": "comfyui-djb-utils"
+ }
+ ],
+ "https://github.com/DeTK/ComfyUI-Switch": [
+ [
+ "NodeSwitch"
+ ],
+ {
+ "title_aux": "ComfyUI Node Switcher"
+ }
+ ],
+ "https://github.com/Dehypnotic/comfyui-save-mp3": [
+ [
+ "SaveAudioMP3Dehypnotic",
+ "SaveImagesDehypnotic",
+ "SaveVideoDehypnotic"
+ ],
+ {
+ "title_aux": "Save MP3 node for ComfyUI [UNSAFE]"
+ }
+ ],
+ "https://github.com/DenRakEiw/Comfyui-Aspect-Ratio-Processor": [
+ [
+ "AspectRatioProcessor"
+ ],
+ {
+ "title_aux": "Comfyui-Aspect-Ratio-Processor [WIP]"
+ }
+ ],
+ "https://github.com/DenRakEiw/DenRakEiw_Nodes": [
+ [
+ "ColorGeneratorNode",
+ "ConditioningInspector",
+ "FluxLayerDiffuseConditioningFix",
+ "FluxLayerDiffuseDecoderSimple",
+ "FluxLayerDiffuseEmptyConditioning",
+ "FluxLayerDiffuseInfo",
+ "FluxLayerDiffuseStandaloneLoader",
+ "LatentColorMatch",
+ "LatentColorMatchSimple",
+ "LatentImageAdjust",
+ "LoadImageSequence",
+ "LoadImageSequenceInfo",
+ "MultiImageAspectRatioComposer",
+ "OptimizedWanVAEUpscaler",
+ "PreviewTransparentImage",
+ "SaveTransparentImage",
+ "TransparentImageInfo",
+ "WanNNLatentUpscaler"
+ ],
+ {
+ "title_aux": "Denrakeiw Nodes [WIP]"
+ }
+ ],
+ "https://github.com/DeyanShahov/ComfyUI_RedFox": [
+ [
+ "DynamicPromptSelector"
+ ],
+ {
+ "title_aux": "Dynamic Prompt Selector for ComfyUI [WIP]"
+ }
+ ],
+ "https://github.com/DiffusionWave-YT/DiffusionWave_PickResolution": [
+ [
+ "Blacklist_String_DiffusionWave \ud83c\udf0a",
+ "ImageBatchMulti_DiffusionWave",
+ "ImageSimpleSaver_DiffusionWave",
+ "Int_PickResolution_DiffusionWave \ud83c\udf0a",
+ "LoadImagesFromFolder_DiffusionWave",
+ "MergeImages_DiffusionWave",
+ "Order_String_Tags_DiffusionWave \ud83c\udf0a",
+ "OverlayImages_DiffusionWave",
+ "PickResolution_DiffusionWave \ud83c\udf0a",
+ "PromptExpression_DiffusionWave \ud83c\udf0a",
+ "RemoveBackgroundByColor_DiffusionWave",
+ "ResizeLongestSide_DiffusionWave",
+ "Seed__DiffusionWave \ud83c\udf0a"
+ ],
+ {
+ "title_aux": "DiffusionWave_PickResolution [WIP]"
+ }
+ ],
+ "https://github.com/DoctorDiffusion/ComfyUI-Flashback": [
+ [
+ "LatentExport",
+ "LatentImport",
+ "LatentLoop"
+ ],
+ {
+ "title_aux": "ComfyUI-Flashback"
+ }
+ ],
+ "https://github.com/DonutsDelivery/ComfyUI-DonutNodes": [
+ [
+ "ApplyLBW //Inspire",
+ "Donut Block Calibration",
+ "Donut Detailer",
+ "Donut Detailer 2",
+ "Donut Detailer 4",
+ "Donut Detailer LoRA 5",
+ "Donut Detailer XL Blocks",
+ "Donut Frequency Analysis",
+ "Donut Sharpener",
+ "Donut Sharpener (from reference)",
+ "Donut Simple Calibration",
+ "DonutApplyLoRAStack",
+ "DonutAutoGamma",
+ "DonutAutoWhiteBalance",
+ "DonutCAS",
+ "DonutCacheDebug",
+ "DonutCheckpointSave",
+ "DonutClipEncode",
+ "DonutDetailerZIT",
+ "DonutFaceDetailer",
+ "DonutFillerClip",
+ "DonutFillerModel",
+ "DonutGammaCorrection",
+ "DonutHiRaLoAm",
+ "DonutHistogramStretch",
+ "DonutHotReload",
+ "DonutImageReporter",
+ "DonutLoRACivitAIInfo",
+ "DonutLoRAHashLookup",
+ "DonutLoRALibrary",
+ "DonutLoRAStack",
+ "DonutLoRAStackCivitAI",
+ "DonutLoraStackCombine",
+ "DonutManualCleanup",
+ "DonutModelSave",
+ "DonutMultiModelSampler",
+ "DonutOpenCivitAI",
+ "DonutPromptInjection",
+ "DonutPromptReceiver",
+ "DonutSDXLTeaCache",
+ "DonutSDXLTeaCacheStats",
+ "DonutSampler",
+ "DonutSampler (Advanced)",
+ "DonutTiledUpscale",
+ "DonutUniversalDetailer",
+ "DonutWidenMergeCLIP",
+ "DonutWidenMergeUNet",
+ "LoadLBW //Inspire",
+ "LoraBlockInfo //Inspire",
+ "LoraLoaderBlockWeight //Inspire",
+ "MakeLBW //Inspire",
+ "ModelMergeZIT",
+ "ModelMergeZITBlocks",
+ "SaveLBW //Inspire",
+ "XY Input: Lora Block Weight //Inspire"
+ ],
+ {
+ "title_aux": "ComfyUI-DonutDetailer"
+ }
+ ],
+ "https://github.com/DrMWeigand/ComfyUI_LineBreakInserter": [
+ [
+ "LineBreakInserter"
+ ],
+ {
+ "title_aux": "ComfyUI_LineBreakInserter"
+ }
+ ],
+ "https://github.com/DraconicDragon/ComfyUI_e621_booru_toolkit": [
+ [
+ "BTK_PixAITaggerNode",
+ "GetAIBooruPost",
+ "GetAnyBooruPostAdv",
+ "GetBooruPost",
+ "GetDanbooruPost",
+ "GetE621Post",
+ "GetGelbooruPost",
+ "TagWikiFetch"
+ ],
+ {
+ "title_aux": "ComfyUI e621 booru Toolkit"
+ }
+ ],
+ "https://github.com/Dream-Pixels-Forge/ComfyUI-Mzikart-Player": [
+ [
+ "MzikartPlayerNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Mzikart-Player [WIP]"
+ }
+ ],
+ "https://github.com/Dream-Pixels-Forge/ComfyUI-Mzikart-Vocal": [
+ [
+ "MasteringCombinerNode",
+ "MzikartNoiseCutter",
+ "MzikartPlayerNode",
+ "VocalCompressorNode",
+ "VocalDeesserNode",
+ "VocalDoublerNode",
+ "VocalEQNode",
+ "VocalLimiterNode",
+ "VocalProcessorNode",
+ "VocalReverbNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Mzikart-Vocal [WIP]"
+ }
+ ],
+ "https://github.com/Dream-Pixels-Forge/ComfyUI-RendArt-Nodes": [
+ [
+ "RendArtNode",
+ "RendArtUltimateNode"
+ ],
+ {
+ "title_aux": "ComfyUI-RendArt-Nodes"
+ }
+ ],
+ "https://github.com/DreamsInAutumn/ComfyUI-Autumn-LLM-Nodes": [
+ [
+ "GeminiImageToPrompt",
+ "GeminiPromptBuilder",
+ "LLMPromptBuilder"
+ ],
+ {
+ "title_aux": "ComfyUI-Autumn-LLM-Nodes"
+ }
+ ],
+ "https://github.com/Dreamshot-io/ComfyUI-Extend-Resolution": [
+ [
+ "ResolutionPadding"
+ ],
+ {
+ "title_aux": "ComfyUI-Extend-Resolution"
+ }
+ ],
+ "https://github.com/ELiZswe/ComfyUI-ELiZTools": [
+ [
+ "ELiZMeshUVWrap"
+ ],
+ {
+ "title_aux": "ComfyUI-ELiZTools"
+ }
+ ],
+ "https://github.com/ElyZeng/ComfyUI-Translator": [
+ [
+ "TextTranslatorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Translator [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/Elypha/ComfyUI-Prompt-Helper": [
+ [
+ "PromptHelper_CombineConditioning",
+ "PromptHelper_ConcatConditioning",
+ "PromptHelper_ConcatString",
+ "PromptHelper_EncodeMultiStringCombine",
+ "PromptHelper_FormatString",
+ "PromptHelper_LoadImageBatchFromDir",
+ "PromptHelper_LoadImageListFromDir",
+ "PromptHelper_LoadPreset",
+ "PromptHelper_LoadPresetAdvanced",
+ "PromptHelper_SaveImageToDir",
+ "PromptHelper_String",
+ "PromptHelper_StringMultiLine",
+ "PromptHelper_WeightedPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Helper [WIP]"
+ }
+ ],
+ "https://github.com/EmanueleUniroma2/ComfyUI-FLAC-to-WAV": [
+ [
+ "AudioToWavConverter"
+ ],
+ {
+ "title_aux": "ComfyUI-FLAC-to-WAV [WIP]"
+ }
+ ],
+ "https://github.com/EmilioPlumed/ComfyUI-Math": [
+ [
+ "GreatestCommonDenominator",
+ "LowestCommonMultiple"
+ ],
+ {
+ "title_aux": "ComfyUI-Math [WIP]"
+ }
+ ],
+ "https://github.com/Enferlain/ComfyUI-Model-Comparison": [
+ [
+ "ModelComparisoner"
+ ],
+ {
+ "title_aux": "ComfyUI-Model-Comparison [WIP]"
+ }
+ ],
+ "https://github.com/Enferlain/ComfyUI-SamplerCustom-3Decimals": [
+ [
+ "SamplerCustom3Decimals"
+ ],
+ {
+ "title_aux": "ComfyUI-SamplerCustom-3Decimals"
+ }
+ ],
+ "https://github.com/Enferlain/ComfyUI-extra-schedulers": [
+ [
+ "BetaSchedulerV2C",
+ "BetaSchedulerV2CRaw"
+ ],
+ {
+ "title_aux": "ComfyUI-extra-schedulers [WIP]"
+ }
+ ],
+ "https://github.com/Eric7758/ComfyUI-IAT": [
+ [
+ "Base64ToImageNode by IAT",
+ "FloatInputNode by IAT",
+ "ImageMatchSize by IAT",
+ "ImageResizeLongestSide by IAT",
+ "ImageResizeToSDXL by IAT",
+ "ImageSize by IAT",
+ "IntInputNode by IAT",
+ "QwenKontextTranslator by IAT",
+ "QwenTranslator by IAT",
+ "SeedGeneratorNode by IAT",
+ "SmartPathBuilderNode by IAT",
+ "TextInputNode by IAT"
+ ],
+ {
+ "title_aux": "ComfyUI-IAT [WIP]"
+ }
+ ],
+ "https://github.com/EricRollei/Comfy-Metadata-System": [
+ [
+ "EnhancedMetadataFilterNode_V2",
+ "Eric_Duplicate_Image_Finder_v021",
+ "Eric_Image_Sorter_V13",
+ "Eric_Keyword_Sorter_V6",
+ "Eric_Metadata_Debugger_V2",
+ "Eric_Metadata_Entry_V2",
+ "Eric_Metadata_Filter_V2",
+ "Eric_Metadata_Query_V3",
+ "MetadataAwareSaveImage_v099",
+ "MetadataConsolidatorNode_V2",
+ "PngInfoDiagnosticV3",
+ "PngMetadataExtractorV3",
+ "TextOverlayNode_v04"
+ ],
+ {
+ "title_aux": "Comfy-Metadata-System [WIP]"
+ }
+ ],
+ "https://github.com/EricRorich/ComfyUI-MegaTran-cutom-node": [
+ [
+ "Mega tran",
+ "Megatran"
+ ],
+ {
+ "title_aux": "[WIP] ComfyUI-MegaTran-cutom-node"
+ }
+ ],
+ "https://github.com/Estanislao-Oviedo/ComfyUI-CustomNodes": [
+ [
+ "Attention couple",
+ "AttentionCouple",
+ "CombineVideoClips",
+ "LoadImageFolder",
+ "MakeBatchFromSingleImage",
+ "RegionConditionMerge",
+ "RegionConditionSpecPct",
+ "RegionConditionSpecPx",
+ "WanVideoVaceSeamlessJoin"
+ ],
+ {
+ "title_aux": "ComfyUI-CustomNodes [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/ExponentialML/ComfyUI_LiveDirector": [
+ [
+ "LiveDirector"
+ ],
+ {
+ "title_aux": "ComfyUI_LiveDirector (WIP)"
+ }
+ ],
+ "https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI": [
+ [
+ "Automatic wildcards",
+ "Conditioning (Cosine similarities)",
+ "Conditioning (Maximum absolute)",
+ "Conditioning (Maximum absolute) text inputs",
+ "Conditioning (Scale by absolute sum)",
+ "Conditioning merge clip g/l",
+ "Conditioning similar tokens recombine",
+ "Conditioning to text",
+ "Quick and dirty text encode",
+ "encode_all_tokens_SDXL"
+ ],
+ {
+ "title_aux": "Conditioning-token-experiments-for-ComfyUI"
+ }
+ ],
+ "https://github.com/Fannovel16/ComfyUI-AppIO": [
+ [
+ "AppIO_FitResizeImage",
+ "AppIO_ImageInput",
+ "AppIO_ImageInputFromID",
+ "AppIO_ImageOutput",
+ "AppIO_IntegerInput",
+ "AppIO_ResizeInstanceAndPaste",
+ "AppIO_ResizeInstanceImageMask",
+ "AppIO_StringInput",
+ "AppIO_StringOutput"
+ ],
+ {
+ "title_aux": "ComfyUI-AppIO"
+ }
+ ],
+ "https://github.com/Filexor/File_x_dynamic_prompt2": [
+ [
+ "File_x_DynamicPrompt2",
+ "File_x_DynamicPrompt2 with States IO"
+ ],
+ {
+ "title_aux": "File_x_dynamic_prompt2"
+ }
+ ],
+ "https://github.com/FinetunersAI/comfyui-fast-group-link": [
+ [
+ "FastGroupLink"
+ ],
+ {
+ "title_aux": "Fast Group Link [WIP]"
+ }
+ ],
+ "https://github.com/FinetunersAI/finetuners": [
+ [
+ "AutoImageResize",
+ "GroupLink",
+ "VariablesInjector"
+ ],
+ {
+ "title_aux": "ComfyUI Finetuners [WIP]"
+ }
+ ],
+ "https://github.com/Firetheft/ComfyUI_Local_Media_Manager": [
+ [
+ "LocalMediaManagerNode",
+ "SelectOriginalAudioNode",
+ "SelectOriginalImageNode",
+ "SelectOriginalVideoNode"
+ ],
+ {
+ "title_aux": "ComfyUI Local Media Manager [UNSAFE]"
+ }
+ ],
+ "https://github.com/FoundD-oka/ComfyUI-kisekae-OOTD": [
+ [
+ "LoadOOTDPipeline",
+ "LoadOOTDPipelineHub",
+ "OOTDGenerate"
+ ],
+ {
+ "title_aux": "ComfyUI KISEKAE-OOTD"
+ }
+ ],
+ "https://github.com/Fucci-Mateo/ComfyUI-Airtable": [
+ [
+ "Push pose to Airtable"
+ ],
+ {
+ "title_aux": "ComfyUI-Airtable [WIP]"
+ }
+ ],
+ "https://github.com/Fuhze73/ComfyUI-PainterI2V-StartEndImage-Tiled": [
+ [
+ "PainterI2V",
+ "PainterI2VTiled"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterI2V-StartEndImage-Tiled [WIP]"
+ }
+ ],
+ "https://github.com/GalactusX31/ComfyUI-FileBrowserAPI": [
+ [
+ "PathSelectorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-FileBrowserAPI [UNSAFE]"
+ }
+ ],
+ "https://github.com/GeekatplayStudio/ComfyUI_Toolbox": [
+ [
+ "ModelAspectRatioSelector"
+ ],
+ {
+ "title_aux": "PMSnodes [WIP]"
+ }
+ ],
+ "https://github.com/GentlemanHu/ComfyUI-Notifier": [
+ [
+ "GentlemanHu_Notifier"
+ ],
+ {
+ "title_aux": "ComfyUI-Notifier"
+ }
+ ],
+ "https://github.com/George0726/ComfyUI-video-accessory": [
+ [
+ "VideoAcc_CameraTrajectoryAdvance",
+ "VideoAcc_CameraTrajectoryRecam",
+ "VideoAcc_ImageResizeAdvanced",
+ "VideoAcc_ImageUpscaleVideo",
+ "VideoAcc_Kontext_removal",
+ "VideoAcc_LoadImage",
+ "VideoAcc_LoadVideo",
+ "VideoAcc_SaveMP4",
+ "VideoAcc_imageSize"
+ ],
+ {
+ "title_aux": "ComfyUI-video-accessory [WIP]"
+ }
+ ],
+ "https://github.com/Gergzilla/Slim-Comfy-Pack": [
+ [
+ "SC Apply LoRA Stack",
+ "SC Aspect Ratio",
+ "SC LoRA Stack",
+ "SC Load LoRA",
+ "SC SD1.5 Aspect Ratio",
+ "SC SDXL Aspect Ratio",
+ "SC Seed"
+ ],
+ {
+ "author": "Gergz",
+ "description": "Custom collection of nodes and custom nodes for ComfyUI v0.6.38+",
+ "nickname": "Slim Comfy Pack",
+ "title": "Slim Comfy Pack",
+ "title_aux": "Slim-Comfy-Pack [private]"
+ }
+ ],
+ "https://github.com/Ginolazy/ComfyUI-FluxKontextImageCompensate": [
+ [
+ "FluxKontextImageCompensate",
+ "FluxKontextImageRestore"
+ ],
+ {
+ "title_aux": "ComfyUI-FluxKontextImageCompensate [WIP]"
+ }
+ ],
+ "https://github.com/GoddessLabs/ComfyUI-GoddessLabs-NodePack": [
+ [
+ "GoddessLabsDestroyAndRecreate",
+ "GoddessLabsFolderSelector",
+ "GoddessLabsNodeStateManager"
+ ],
+ {
+ "author": "GoddessLabs",
+ "description": "Custom nodes to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more.",
+ "nickname": "GoddessLabs",
+ "title": "\u2764\ufe0f\u200d\ud83d\udd25\ud83d\udc8a GoddessLabs Toolset",
+ "title_aux": "ComfyUI-GoddessLabs-NodePack"
+ }
+ ],
+ "https://github.com/GokuHiki/ComfyUI-Goku-Tools": [
+ [
+ "FirstNonFalse"
+ ],
+ {
+ "title_aux": "ComfyUI-Goku-Tools"
+ }
+ ],
+ "https://github.com/Goldlionren/ComfyUI-CleanSlate": [
+ [
+ "CleanSlateCleanup"
+ ],
+ {
+ "title_aux": "ComfyUI-CleanSlate [WIP]"
+ }
+ ],
+ "https://github.com/Goldlionren/ComfyUI_Bridge_fabric": [
+ [
+ "LocalCLIPClient",
+ "RemoteCLIPHostSaver"
+ ],
+ {
+ "title_aux": "ComfyUI_Bridge_fabric [UNSAFE]"
+ }
+ ],
+ "https://github.com/Grant-CP/ComfyUI-LivePortraitKJ-MPS": [
+ [
+ "DownloadAndLoadLivePortraitModels",
+ "LivePortraitProcess"
+ ],
+ {
+ "title_aux": "ComfyUI-LivePortraitKJ-MPS"
+ }
+ ],
+ "https://github.com/Grey3016/Save2Icon": [
+ [
+ "ConvertToIconNode"
+ ],
+ {
+ "title_aux": "Save2Icon"
+ }
+ ],
+ "https://github.com/GrindHouse66/ComfyUI-GH_Tools": [
+ [
+ "GHImg_Sizer",
+ "GHSimple_Scale"
+ ],
+ {
+ "title_aux": "GH Tools for ComfyUI"
+ }
+ ],
+ "https://github.com/GuardSkill/ComfyUI-AffineImage": [
+ [
+ "CanvasFourPointSelector",
+ "PerspectiveScreenMapper"
+ ],
+ {
+ "title_aux": "ComfyUI Affine Transform Mapper [WIP]"
+ }
+ ],
+ "https://github.com/GuusF/Comfyui_CrazyMaths": [
+ [
+ "AttractorAlphaMask",
+ "EquationAlphaMask",
+ "FractalNoiseAlphaMask",
+ "HarmonographAlphaMask",
+ "MathAlphaMask",
+ "QuasicrystalAlphaMask",
+ "SierpinskiAlphaMask",
+ "VoronoiAlphaMask"
+ ],
+ {
+ "title_aux": "Comfyui_CrazyMaths [WIP]"
+ }
+ ],
+ "https://github.com/HWDigi/Camera_Factory_Station_comfyui": [
+ [
+ "FactoryCameraOperator",
+ "FactoryColorHarmonist",
+ "FactoryLightingStudio",
+ "FactoryProductPhotographer",
+ "FactorySizeOptimizer"
+ ],
+ {
+ "title_aux": "Camera Factory Station [WIP]"
+ }
+ ],
+ "https://github.com/HailXD/comfyui-random-artist": [
+ [
+ "RandomArtist"
+ ],
+ {
+ "title_aux": "comfyui-random-artist"
+ }
+ ],
+ "https://github.com/HalfADog/ComfyUI-Mask2JSON": [
+ [
+ "ContourVisualizer",
+ "MaskToContourJSON"
+ ],
+ {
+ "title_aux": "ComfyUI-Mask2JSON"
+ }
+ ],
+ "https://github.com/Hapseleg/ComfyUI-This-n-That": [
+ [
+ "Show Prompt (Hapse)",
+ "Show Prompt TnT",
+ "Simple Ratio Selector (Hapse)",
+ "Simple Ratio Selector TnT",
+ "Simple Seed Selector TnT"
+ ],
+ {
+ "title_aux": "This n that (Hapse)"
+ }
+ ],
+ "https://github.com/Hifunyo/comfyui_google_ai": [
+ [
+ "GoogleAIGenerateImage"
+ ],
+ {
+ "title_aux": "comfyui_google_ai"
+ }
+ ],
+ "https://github.com/HuangYuChuh/ComfyUI-LLMs-Toolkit": [
+ [
+ "ImagePreprocessor",
+ "LLM_Loader",
+ "OpenAICompatibleLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-LLMs-Toolkit [WIP]"
+ }
+ ],
+ "https://github.com/IAFFeng/Comfyui_XF_Custom_Actual-Node": [
+ [
+ "GeminiMattingNode"
+ ],
+ {
+ "title_aux": "Comfyui_XF_Custom_Actual-Node"
+ }
+ ],
+ "https://github.com/IIEleven11/ComfyUI-Dataset_Maker": [
+ [
+ "ConceptList",
+ "DatasetGenerator",
+ "DatasetLoraLoader",
+ "DatasetPromptBuilder",
+ "LoraList"
+ ],
+ {
+ "title_aux": "[WIP] ComfyUI-Dataset_Maker"
+ }
+ ],
+ "https://github.com/IO-AtelierTech/comfyui-genai-connectors": [
+ [
+ "BooleanInput_fal",
+ "FloatInput_fal",
+ "IntegerInput_fal",
+ "LoadImageFromURL_fal",
+ "RemoteCheckpointLoader_fal",
+ "RemoteLoraLoader_fal",
+ "SaveImage_fal",
+ "StringInput_fal"
+ ],
+ {
+ "title_aux": "comfyui-genai-connectors [WIP]"
+ }
+ ],
+ "https://github.com/IO-AtelierTech/comfyui-video-utils": [
+ [
+ "GetVideoPath",
+ "SaveVideoGetPath"
+ ],
+ {
+ "title_aux": "comfyui-video-utils [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/IXIWORKS-KIMJUNGHO/comfyui-ixiworks": [
+ [
+ "BuildCharacterPromptNode",
+ "BuildPromptNode",
+ "JsonParserNode",
+ "MergeStringsNode",
+ "SelectIndexNode"
+ ],
+ {
+ "title_aux": "IxiWorks StoryBoard Nodes [WIP]"
+ }
+ ],
+ "https://github.com/IfnotFr/ComfyUI-Ifnot-Pack": [
+ [
+ "Face Crop",
+ "Face Crop Mouth",
+ "Get Beard Mask"
+ ],
+ {
+ "title_aux": "ComfyUI-Ifnot-Pack"
+ }
+ ],
+ "https://github.com/IgPoly/ComfyUI-igTools": [
+ [
+ "IGT_AspectRatioResizer",
+ "IGT_FloatMinMax",
+ "IGT_ImageResizer",
+ "IGT_ImageTilesCalc",
+ "IGT_IntMinMax",
+ "IGT_SimpleTilesCalc",
+ "IGT_TelegramSender"
+ ],
+ {
+ "title_aux": "ComfyUI-igTools"
+ }
+ ],
+ "https://github.com/Immac/ComfyUI-ImmacTools": [
+ [
+ "ConcatenateSigmasImmacTools",
+ "ForwardAnyImmacTools",
+ "ForwardConditioningImmacTools",
+ "ForwardModelImmacTools",
+ "ResampleSigmasImmacTools",
+ "SpliceSigmasAtImmacTools"
+ ],
+ {
+ "title_aux": "Immac's Tools"
+ }
+ ],
+ "https://github.com/Inoriac/comfyui-HandDetect": [
+ [
+ "HandMaskGenerator"
+ ],
+ {
+ "title_aux": "comfyui-HandDetect"
+ }
+ ],
+ "https://github.com/Isi-dev/ComfyUI_DeleteModelPassthrough_ExecutionFlowControl": [
+ [
+ "ControlledCLIPTextEncode",
+ "ControlledControlNetLoader",
+ "ControlledModelPatchLoader",
+ "ControlledUNETLoader",
+ "ControlledUnetLoaderGGUF",
+ "ControlledVAELoader",
+ "DeleteModelPassthrough",
+ "DeleteModelPassthroughLight",
+ "SmartClipDeleter"
+ ],
+ {
+ "title_aux": "ComfyUI_DeleteModelPassthrough_ExecutionFlowControl [WIP]"
+ }
+ ],
+ "https://github.com/IvanZhd/comfyui-codeformer": [
+ [
+ "RedBeanie_CustomImageInverter"
+ ],
+ {
+ "title_aux": "comfyui-codeformer [WIP]"
+ }
+ ],
+ "https://github.com/JBKing514/map_comfyui": [
+ [
+ "MAP_Pro_Suite"
+ ],
+ {
+ "title_aux": "[WIP] map_comfyui"
+ }
+ ],
+ "https://github.com/JHBOY-ha/ComfyUI-jh-essential": [
+ [
+ "EndTimer",
+ "StartTimer"
+ ],
+ {
+ "title_aux": "ComfyUI-jh-essential"
+ }
+ ],
+ "https://github.com/Jairodaniel-17/ComfyUI-traductor-offline": [
+ [
+ "CLIPTextTranslateNode",
+ "PromptTextTranslateNode"
+ ],
+ {
+ "title_aux": "ComfyUI-traductor-offline"
+ }
+ ],
+ "https://github.com/Jaxkr/comfyui-terminal-command": [
+ [
+ "Terminal"
+ ],
+ {
+ "title_aux": "comfyui-terminal-command [UNSAFE]"
+ }
+ ],
+ "https://github.com/JayLyu/ComfyUI_BaiKong_Node": [
+ [
+ "BK_ColorContrast",
+ "BK_ColorLimit",
+ "BK_ColorLuminance",
+ "BK_ColorSelector",
+ "BK_GradientImage",
+ "BK_ImageAspectFilter",
+ "BK_ImageList",
+ "BK_ImageRandomLayout",
+ "BK_ImageRectLayout",
+ "BK_Img2Color",
+ "BK_PrintImage"
+ ],
+ {
+ "title_aux": "ComfyUI_BaiKong_Node"
+ }
+ ],
+ "https://github.com/JiSenHua/ComfyUI-yolov5-face": [
+ [
+ "FaceDetect"
+ ],
+ {
+ "title_aux": "ComfyUI-yolov5-face [WIP]"
+ }
+ ],
+ "https://github.com/JiangAogo/ComfyUI-Gemini-API": [
+ [
+ "GeminiImageGenerator",
+ "GeminiLLM"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemini-API [WIP]"
+ }
+ ],
+ "https://github.com/Jiffies-64/ComfyUI-SaveImagePlus": [
+ [
+ "SaveImagePlus"
+ ],
+ {
+ "title_aux": "ComfyUI-SaveImagePlus"
+ }
+ ],
+ "https://github.com/Jingwen-genies/comfyui-genies-nodes": [
+ [
+ "GeniesPoseEstimation",
+ "GeniesRGBToHSV",
+ "GeniesScaleFaceByKeypoints",
+ "GeniesSelectRGBByMask"
+ ],
+ {
+ "title_aux": "comfyui-genies-nodes"
+ }
+ ],
+ "https://github.com/JioJe/comfyui_video_BC": [
+ [
+ "TextBatchIndexer",
+ "TextBatchLoader",
+ "TextBatchReplace",
+ "TextBatchSaver",
+ "VideoCombine",
+ "VideoSequenceProcessor"
+ ],
+ {
+ "title_aux": "comfyui_video_BC [WIP]"
+ }
+ ],
+ "https://github.com/JissiChoi/ComfyUI-Jissi-List": [
+ [
+ "JissiFloatList",
+ "JissiList",
+ "JissiMatching",
+ "JissiMultiplePrompts",
+ "JissiText",
+ "JissiTextFileToListDisplay",
+ "JissiTextTemplate",
+ "JissiView"
+ ],
+ {
+ "title_aux": "ComfyUI-Jissi-List [WIP]"
+ }
+ ],
+ "https://github.com/Jordach/comfy-consistency-vae": [
+ [
+ "Comfy_ConsistencyVAE"
+ ],
+ {
+ "title_aux": "comfy-consistency-vae"
+ }
+ ],
+ "https://github.com/JosDigby/ComfyUI-DigbyWan": [
+ [
+ "DigbyLoopClose",
+ "DigbyLoopOpen",
+ "DigbyLoopRetrieveImages",
+ "DigbyLoopStoreImages",
+ "DigbyLoopVariables",
+ "DigbyLoopVariablesInit",
+ "DigbyWan22MiddleFrameToVideo",
+ "DigbyWan22SmoothVideoTransition",
+ "DigbyWanMoeKSampler",
+ "DigbyWanMoeKSamplerBasic",
+ "DigbyWanVACEVideoBridge",
+ "DigbyWanVACEVideoExtend",
+ "DigbyWanVACEVideoSmooth",
+ "LTX2_AVLatent"
+ ],
+ {
+ "title_aux": "ComfyUI-DigbyWan"
+ }
+ ],
+ "https://github.com/Junst/ComfyUI-PNG2SVG2PNG": [
+ [
+ "PNG2SVG2PNG"
+ ],
+ {
+ "title_aux": "ComfyUI-PNG2SVG2PNG"
+ }
+ ],
+ "https://github.com/Juste-Leo2/ComfyUI-Arduino": [
+ [
+ "ArduinoAnalogWrite",
+ "ArduinoCompileUpload",
+ "ArduinoCreateVariable",
+ "ArduinoDelay",
+ "ArduinoDigitalWrite",
+ "ArduinoReceiver",
+ "ArduinoSender",
+ "ArduinoTarget",
+ "ArduinoVariableInfo"
+ ],
+ {
+ "title_aux": "ComfyUI-Arduino [WIP]"
+ }
+ ],
+ "https://github.com/K1maran/ComfyUI-Kimaran": [
+ [
+ "EmptyLatentImagePresetsAIO",
+ "EmptyLatentImagePresetsFLUX",
+ "EmptyLatentImagePresetsQWEN",
+ "EmptyLatentImagePresetsSD15",
+ "KSamplerSetup"
+ ],
+ {
+ "title_aux": "ComfyUI-Kimaran"
+ }
+ ],
+ "https://github.com/KERRY-YUAN/ComfyUI_Python_Executor": [
+ [
+ "NodePython"
+ ],
+ {
+ "title_aux": "Python_Executor [UNSAFE]"
+ }
+ ],
+ "https://github.com/KXSR/ComfyUI-Easy-s3": [
+ [
+ "LoadFromUrl",
+ "S3UploadPresigned",
+ "SaveImageToDisk",
+ "WeaverAnimator"
+ ],
+ {
+ "title_aux": "ComfyUI-Easy-s3"
+ }
+ ],
+ "https://github.com/Karlmeister/comfyui-karlmeister-nodes-suit": [
+ [
+ "A_IfNotNone",
+ "KSamplerConfigSelector",
+ "KSamplerConfigSelector_Tuple",
+ "KSamplerConfigUnpack",
+ "SeedFilenameGenerator",
+ "SplitString",
+ "TextConcatenator"
+ ],
+ {
+ "title_aux": "comfyui-karlmeister-nodes-suit"
+ }
+ ],
+ "https://github.com/Karniverse/ComfyUI-Randomselector": [
+ [
+ "DynamicMultiSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-Randomselector"
+ }
+ ],
+ "https://github.com/Kayarte/Time-Series-Nodes-for-ComfyUI": [
+ [
+ "DomainTimeSeriesPrep",
+ "TimeSeriesLoader",
+ "TimeSeriesPredictor"
+ ],
+ {
+ "title_aux": "Time Series Nodes for ComfyUI [Experimental]"
+ }
+ ],
+ "https://github.com/KihongK/comfyui-roysnodes": [
+ [
+ "CLIPMultiTextEncode",
+ "Create_ConditionLoRA",
+ "Create_ConditionLoRA_MainPrompt",
+ "Load_ConditionLoRA",
+ "OpenAI_Summarize",
+ "Unzip_ConditionLoRA"
+ ],
+ {
+ "title_aux": "ComfyUI-RoysNodes [WIP]"
+ }
+ ],
+ "https://github.com/KoinnAI/ComfyUI-DynPromptSimplified": [
+ [
+ "DynPromptExpand"
+ ],
+ {
+ "title_aux": "ComfyUI Dynamic Prompting Simplified [WIP]"
+ }
+ ],
+ "https://github.com/Kraven1109/ComfyUI-Llama": [
+ [
+ "ComfyLLamaPreviewText",
+ "ComfyLLamaPromptBuilder",
+ "ComfyLLamaSaveText",
+ "ComfyLLamaServer",
+ "ComfyLLamaServerConfig",
+ "ComfyLLamaTextConcat",
+ "ComfyLLamaTextInput",
+ "GGUFLoader",
+ "HFModelLoader",
+ "HFModelUnloader",
+ "HFTextInference",
+ "HFVLInference",
+ "MediaPathsLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Llama [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/Krish-701/RK_Comfyui": [
+ [
+ "RK_Accumulate_Text_Multiline",
+ "RK_Accumulate_Text_Multiline_Numbered",
+ "RK_Advanced_Script_Finder",
+ "RK_CSV_File_State_Looper_v01",
+ "RK_CSV_File_State_Looper_v02",
+ "RK_Calc",
+ "RK_Concatenate_Text",
+ "RK_Excel_File_State_Looper",
+ "RK_ImageViewer",
+ "RK_Read_Excel_Row",
+ "RK_Ultra",
+ "RK_Write_Text",
+ "RK_seed",
+ "rk_save_image",
+ "rk_save_image_v01"
+ ],
+ {
+ "title_aux": "RK_Comfyui"
+ }
+ ],
+ "https://github.com/Kur0butiMegane/Comfyui-StringUtils2": [
+ [
+ "AddXMLTag",
+ "CLIPPassThrough",
+ "ClipRegionPassThrough",
+ "CondPassThrough",
+ "ElapsedTime",
+ "GetBeginTime",
+ "GetEndTime",
+ "IsStringEmpty",
+ "MakeProperty",
+ "Normalize",
+ "SaveText",
+ "SchedulerSelectorImpact",
+ "SchedulerSelectorInspire",
+ "Selector",
+ "Split",
+ "XMLParser",
+ "XMLtoCutoff"
+ ],
+ {
+ "title_aux": "Comfyui-StringUtils"
+ }
+ ],
+ "https://github.com/KurtHokke/ComfyUI_KurtHokke_Nodes": [
+ [
+ "AIO_Tuner_Pipe",
+ "ApplyCondsExtraOpts",
+ "BooleanFromPipe",
+ "BooleanToPipe",
+ "COND_ExtraOpts",
+ "COND_ExtraOpts_2",
+ "COND_SET_STRENGTH_ExtraOpts",
+ "ChainTextEncode",
+ "CkptPipe",
+ "EmptyLatentSize",
+ "EmptyLatentSize64",
+ "ExpMath",
+ "ExpMathDual",
+ "ExpMathQuad",
+ "LoadUnetAndClip",
+ "MergeExtraOpts",
+ "ModelPipe1",
+ "ModelPipe2",
+ "NoModel_CkptLoader",
+ "NoNegExtraOpts",
+ "Node_BOOL",
+ "Node_Float",
+ "Node_INT",
+ "Node_RandomRange",
+ "Node_String",
+ "Node_StringMultiline",
+ "SEED_ExtraOpts",
+ "SamplerCustomAdvanced_Pipe",
+ "SamplerSel",
+ "SchedulerSel",
+ "SedOnString",
+ "UnetClipLoraLoader",
+ "UnetClipLoraLoaderBasic",
+ "VAE_ExtraOpts",
+ "ViewExtraOpts",
+ "batchsize_ExtraOpts",
+ "get_lora_metadata",
+ "re_sub_str",
+ "str_str",
+ "str_str_str_str"
+ ],
+ {
+ "title_aux": "ComfyUI-VLMStudio"
+ }
+ ],
+ "https://github.com/LK-168/comfyui_LK_selfuse": [
+ [
+ "Adv Scheduler",
+ "Artist Add Prefix",
+ "CaompareDebug",
+ "EasyUse_XYPlot_Lora_Folder",
+ "Efficient_XYplot_LoRA_Batch",
+ "InspectModelArchitecture",
+ "LK_MaskToSEGS",
+ "LK_SegsAdjust",
+ "Mask Connected Remove",
+ "Mask Diff",
+ "Mask Filter with Rate",
+ "Mask Get Max",
+ "Pick From String",
+ "Print Sigma",
+ "Random Choice",
+ "Read Text File",
+ "SaveImageTensor",
+ "SaveMaskTensor",
+ "String Filter",
+ "String Filter v2",
+ "String Modify",
+ "String Modify Simple",
+ "String Remove Duplicate",
+ "String Replace 10",
+ "String Switch",
+ "String To Save"
+ ],
+ {
+ "title_aux": "comfyui_LK_selfuse"
+ }
+ ],
+ "https://github.com/LMietkiewicz/HiggsfieldAPI_Node": [
+ [
+ "HiggsfieldAPI"
+ ],
+ {
+ "title_aux": "HiggsfieldAPI_Node"
+ }
+ ],
+ "https://github.com/LZpenguin/ComfyUI-Text": [
+ [
+ "Add_text_by_mask"
+ ],
+ {
+ "title_aux": "ComfyUI-Text"
+ }
+ ],
+ "https://github.com/Laolilzp/Laoli3D": [
+ [
+ "Laoli_3DPoseEditor"
+ ],
+ {
+ "title_aux": "Laoli3D [UNSAFE]"
+ }
+ ],
+ "https://github.com/LarryJane491/ComfyUI-ModelUnloader": [
+ [
+ "Model Unloader"
+ ],
+ {
+ "title_aux": "ComfyUI-ModelUnloader"
+ }
+ ],
+ "https://github.com/Leecoahs/ComfyUI_LeeNodes": [
+ [
+ "CombineGrayscalePak",
+ "ImageOverlaySimple",
+ "TextureInpaintingPrep",
+ "TextureInpaintingRestore"
+ ],
+ {
+ "title_aux": "ComfyUI_LeeNodes"
+ }
+ ],
+ "https://github.com/Letz-AI/ComfyUI-LetzAI": [
+ [
+ "LetzAI Generator"
+ ],
+ {
+ "title_aux": "ComfyUI-LetzAI [UNSAFE]"
+ }
+ ],
+ "https://github.com/Lilien86/Comfyui_Latent_Interpolation": [
+ [
+ "Latent Interpolator Multi"
+ ],
+ {
+ "title_aux": "Comfyui_Latent_Interpolation [WIP]"
+ }
+ ],
+ "https://github.com/LittleTechPomp/comfyui-pixxio": [
+ [
+ "AutoUploadImageToPixxioCollection",
+ "LoadImageFromPixxioAPI"
+ ],
+ {
+ "title_aux": "comfyui-pixxio"
+ }
+ ],
+ "https://github.com/Long-form-AI-video-generation/ComfyUI_vaceFramepack": [
+ [
+ "DownloadAndLoadWav2VecModel",
+ "FantasyTalkingModelLoader",
+ "FantasyTalkingWav2VecEmbeds",
+ "MultiTalkModelLoader",
+ "MultiTalkWav2VecEmbeds",
+ "ReCamMasterPoseVisualizer",
+ "WanVACEVideoFramepackSampler2",
+ "WanVideoATITracks",
+ "WanVideoATITracksVisualize",
+ "WanVideoATI_comfy",
+ "WanVideoControlnet",
+ "WanVideoControlnetLoader",
+ "WanVideoDiffusionForcingSampler",
+ "WanVideoFunCameraEmbeds",
+ "WanVideoImageToVideoMultiTalk",
+ "WanVideoReCamMasterCameraEmbed",
+ "WanVideoReCamMasterDefaultCamera",
+ "WanVideoReCamMasterGenerateOrbitCamera",
+ "WanVideoUni3C_ControlnetLoader",
+ "WanVideoUni3C_embeds",
+ "WanVideoUniAnimateDWPoseDetector",
+ "WanVideoUniAnimatePoseInput"
+ ],
+ {
+ "title_aux": "ComfyUI_vaceFramepack"
+ }
+ ],
+ "https://github.com/Looking-Glass/LKG-ComfyUI": [
+ [
+ "BridgePreview",
+ "LoadFolder",
+ "ScaleAndMaintainAspect",
+ "SideBySide"
+ ],
+ {
+ "title_aux": "LKG-ComfyUI"
+ }
+ ],
+ "https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion": [
+ [
+ "AzureChatGptCompletion",
+ "ChatGPTCompletion"
+ ],
+ {
+ "title_aux": "ComfyUI simple ChatGPT completion [UNSAFE]"
+ }
+ ],
+ "https://github.com/LucianGnn/ComfyUI-Lucian": [
+ [
+ "AudioDurationCalculator"
+ ],
+ {
+ "title_aux": "ComfyUI-Lucian [WIP]"
+ }
+ ],
+ "https://github.com/LucianoCirino/ComfyUI-invAIder-Nodes": [
+ [
+ "\ud83d\udc7e Any Switch",
+ "\ud83d\udc7e Any Switch Large",
+ "\ud83d\udc7e Any Switch Medium",
+ "\ud83d\udc7e Any to Any",
+ "\ud83d\udc7e Debug Tensor Structure",
+ "\ud83d\udc7e Evaluate Anything",
+ "\ud83d\udc7e Image Crop",
+ "\ud83d\udc7e Image Grid",
+ "\ud83d\udc7e Image Overlay",
+ "\ud83d\udc7e Img to Gif",
+ "\ud83d\udc7e Int to Bits",
+ "\ud83d\udc7e Is Image Fully Transparent",
+ "\ud83d\udc7e Load Any",
+ "\ud83d\udc7e Load Image Batch",
+ "\ud83d\udc7e Number Counter",
+ "\ud83d\udc7e Preview Image if True",
+ "\ud83d\udc7e Save AnimPNG If True",
+ "\ud83d\udc7e Save Any",
+ "\ud83d\udc7e Save Image If True",
+ "\ud83d\udc7e Seed Controller",
+ "\ud83d\udc7e Signed Integer"
+ ],
+ {
+ "title_aux": "ComfyUI-invAIder-Nodes"
+ }
+ ],
+ "https://github.com/LvyuanW/ComfyUI-6yuan": [
+ [
+ "6yuan_DrawTextNode",
+ "ColorKMeans",
+ "CropAlpha",
+ "PosterColorEngine",
+ "PosterLogoPlacer",
+ "PosterMaskGenerator",
+ "PosterTemplateLoader",
+ "PosterTextRenderer",
+ "RemoveBackground",
+ "RemoveBackgroundAdvanced",
+ "ShapeLanguageSummary",
+ "ShrinkImage",
+ "SimpleTextLayout",
+ "StringPreview"
+ ],
+ {
+ "title_aux": "ComfyUI-6yuan [WIP]"
+ }
+ ],
+ "https://github.com/LyazS/ComfyUI-aznodes": [
+ [
+ "CrossFadeImageSequence",
+ "ImageGrayscaleAZ",
+ "SaveImageAZ"
+ ],
+ {
+ "title_aux": "ComfyUI-aznodes"
+ }
+ ],
+ "https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes": [
+ [
+ "AIO_Preprocessor",
+ "AnimalPosePreprocessor",
+ "AnimeFace_SemSegPreprocessor",
+ "AnimeLineArtPreprocessor",
+ "AnyLineArtPreprocessor_aux",
+ "BAE-NormalMapPreprocessor",
+ "BinaryPreprocessor",
+ "CannyEdgePreprocessor",
+ "ColorPreprocessor",
+ "ControlNetAuxSimpleAddText",
+ "ControlNetPreprocessorSelector",
+ "DSINE-NormalMapPreprocessor",
+ "DWPreprocessor",
+ "DensePosePreprocessor",
+ "DepthAnythingPreprocessor",
+ "DepthAnythingV2Preprocessor",
+ "DiffusionEdge_Preprocessor",
+ "ExecuteAllControlNetPreprocessors",
+ "FacialPartColoringFromPoseKps",
+ "FakeScribblePreprocessor",
+ "HEDPreprocessor",
+ "HintImageEnchance",
+ "ImageGenResolutionFromImage",
+ "ImageGenResolutionFromLatent",
+ "ImageIntensityDetector",
+ "ImageLuminanceDetector",
+ "InpaintPreprocessor",
+ "LayeredDiffusionApply",
+ "LayeredDiffusionCondApply",
+ "LayeredDiffusionCondJointApply",
+ "LayeredDiffusionDecode",
+ "LayeredDiffusionDecodeRGBA",
+ "LayeredDiffusionDecodeSplit",
+ "LayeredDiffusionDiffApply",
+ "LayeredDiffusionJointApply",
+ "LeReS-DepthMapPreprocessor",
+ "LineArtPreprocessor",
+ "LineartStandardPreprocessor",
+ "M-LSDPreprocessor",
+ "Manga2Anime_LineArt_Preprocessor",
+ "MaskOptFlow",
+ "MediaPipe-FaceMeshPreprocessor",
+ "MeshGraphormer+ImpactDetector-DepthMapPreprocessor",
+ "MeshGraphormer-DepthMapPreprocessor",
+ "Metric3D-DepthMapPreprocessor",
+ "Metric3D-NormalMapPreprocessor",
+ "MiDaS-DepthMapPreprocessor",
+ "MiDaS-NormalMapPreprocessor",
+ "ModelMergeBlockNumber",
+ "ModelMergeSDXL",
+ "ModelMergeSDXLDetailedTransformers",
+ "ModelMergeSDXLTransformers",
+ "ModelSamplerTonemapNoiseTest",
+ "OneFormer-ADE20K-SemSegPreprocessor",
+ "OneFormer-COCO-SemSegPreprocessor",
+ "OpenposePreprocessor",
+ "PiDiNetPreprocessor",
+ "PixelPerfectResolution",
+ "PromptExpansion",
+ "PyraCannyPreprocessor",
+ "ReferenceOnlySimple",
+ "RenderAnimalKps",
+ "RenderPeopleKps",
+ "RescaleClassifierFreeGuidanceTest",
+ "SAMPreprocessor",
+ "SavePoseKpsAsJsonFile",
+ "ScribblePreprocessor",
+ "Scribble_PiDiNet_Preprocessor",
+ "Scribble_XDoG_Preprocessor",
+ "SemSegPreprocessor",
+ "ShufflePreprocessor",
+ "TEEDPreprocessor",
+ "TEED_Preprocessor",
+ "TTPlanet_TileGF_Preprocessor",
+ "TTPlanet_TileSimple_Preprocessor",
+ "TilePreprocessor",
+ "TonemapNoiseWithRescaleCFG",
+ "UniFormer-SemSegPreprocessor",
+ "Unimatch_OptFlowPreprocessor",
+ "UpperBodyTrackingFromPoseKps",
+ "Zoe-DepthMapPreprocessor",
+ "Zoe_DepthAnythingPreprocessor"
+ ],
+ {
+ "author": "tstandley",
+ "title_aux": "ComfyUI Nodes for Inference.Core"
+ }
+ ],
+ "https://github.com/M4lF3s/comfy-tif-support": [
+ [
+ "Load TIFF",
+ "Save TIFF"
+ ],
+ {
+ "title_aux": "comfy-tif-support"
+ }
+ ],
+ "https://github.com/MadPonyInteractive/ComfyUi-MpiNodes": [
+ [
+ "MpiAddImageToList",
+ "MpiAnyInvSwitch",
+ "MpiAnySwitch",
+ "MpiAspectRatio",
+ "MpiBatchTextReplace",
+ "MpiBboxToMask",
+ "MpiBoolean",
+ "MpiBooleanCompare",
+ "MpiChoiceSelector",
+ "MpiCombo",
+ "MpiCombo1",
+ "MpiCombo10",
+ "MpiCombo2",
+ "MpiCombo3",
+ "MpiCombo4",
+ "MpiCombo5",
+ "MpiCombo6",
+ "MpiCombo7",
+ "MpiCombo8",
+ "MpiCombo9",
+ "MpiComboMaker",
+ "MpiCompare",
+ "MpiConvert",
+ "MpiDisplayPrompt",
+ "MpiDoubleLora",
+ "MpiFloat",
+ "MpiFromCheckpoint",
+ "MpiGetImageAtIndex",
+ "MpiGridDimensions",
+ "MpiHasOptions",
+ "MpiIfElse",
+ "MpiIfElseInverted",
+ "MpiIfElseProbability",
+ "MpiIfElseProbabilityInverted",
+ "MpiInt",
+ "MpiJsonLoad",
+ "MpiJsonSave",
+ "MpiLoraModel",
+ "MpiLoraSwitch",
+ "MpiMaskDebugInfo",
+ "MpiMultiTextX2",
+ "MpiMultiTextX3",
+ "MpiMultiTextX4",
+ "MpiMultiTextX5",
+ "MpiNormalizeValue",
+ "MpiPresetSelector",
+ "MpiPromptBridge",
+ "MpiPromptChainSelector",
+ "MpiPromptList",
+ "MpiPromptListJoin",
+ "MpiPromptListSelector",
+ "MpiPromptOverride",
+ "MpiPromptOverrideSeed",
+ "MpiPromptProcessor",
+ "MpiRandPromptGen",
+ "MpiRandPromptGenOrder",
+ "MpiRandPromptGenOverrideList",
+ "MpiRandPromptGenOverrideSection",
+ "MpiRandPromptGenSave",
+ "MpiRoundToMultiple",
+ "MpiRoundToMultipleRes",
+ "MpiScaledDimensions",
+ "MpiSimpleBoolean",
+ "MpiString",
+ "MpiStringInvSwitch",
+ "MpiText",
+ "MpiTextListJoin",
+ "MpiTextListReplace",
+ "MpiToChekPoint",
+ "MpiWanFrames",
+ "MpiWanSeconds"
+ ],
+ {
+ "title_aux": "ComfyUi-MpiNodes [WIP]"
+ }
+ ],
+ "https://github.com/Madygnomo/ComfyUI-NanoBanana-ImageGenerator": [
+ [
+ "Google-Gemini"
+ ],
+ {
+ "title_aux": "ComfyUI-NanoBanana-ImageGenerator"
+ }
+ ],
+ "https://github.com/Malloc-pix/comfyui-QwenVL": [
+ [
+ "Qwen2.5",
+ "Qwen2.5VL"
+ ],
+ {
+ "title_aux": "comfyui-QwenVL"
+ }
+ ],
+ "https://github.com/ManuShamil/ComfyUI_BodyEstimation_Nodes": [
+ [
+ "CogitareLabsPoseIDExtractor"
+ ],
+ {
+ "title_aux": "ComfyUI_BodyEstimation_Nodes"
+ }
+ ],
+ "https://github.com/MarkFreeDom168/ComfyUI-image-load-url": [
+ [
+ "LoadImageAndMaskFromURLOrBase64",
+ "LoadImageFromURLOrBase64",
+ "LoadMaskFromURLOrBase64"
+ ],
+ {
+ "title_aux": "ComfyUI-image-load-url [WIP]"
+ }
+ ],
+ "https://github.com/Matrix-King-Studio/ComfyUI-MoviePy": [
+ [
+ "AudioDurationNode",
+ "ImageClipNode",
+ "SaveVideoNode"
+ ],
+ {
+ "title_aux": "ComfyUI-MoviePy"
+ }
+ ],
+ "https://github.com/MatthewClayHarrison/ComfyUI-MetaMan": [
+ [
+ "MetaManEmbedAndSave",
+ "MetaManExtractComponents",
+ "MetaManLoadImage"
+ ],
+ {
+ "title_aux": "MetaMan - Universal AI Image Metadata Manager [UNSAFE]"
+ }
+ ],
+ "https://github.com/Maxim-Dey/ComfyUI-MaksiTools": [
+ [
+ "\ud83d\udd22 Return Boolean",
+ "\ud83d\udd22 Return Float",
+ "\ud83d\udd22 Return Integer",
+ "\ud83d\udd22 Return Multiline String",
+ "\ud83d\udd27 Time Measure Node"
+ ],
+ {
+ "title_aux": "ComfyUI-MS_Tools [WIP]"
+ }
+ ],
+ "https://github.com/Mervent/comfyui-telegram-send": [
+ [
+ "TelegramReply",
+ "TelegramSend"
+ ],
+ {
+ "title_aux": "comfyui-telegram-send"
+ }
+ ],
+ "https://github.com/Mervent/comfyui-yaml-prompt": [
+ [
+ "YAMLPromptParser"
+ ],
+ {
+ "title_aux": "comfyui-yaml-prompt"
+ }
+ ],
+ "https://github.com/Mets3D/mets-nodes": [
+ [
+ "AdjustImageNode",
+ "AutoExtractTags",
+ "DownloadCivitaiModel",
+ "ExtraCheckpointData",
+ "ExtractTagFromString",
+ "PrepareCheckpoint",
+ "PrepareLoRA",
+ "PromptTidy",
+ "RegexNode",
+ "RenderPass",
+ "RenderPass_Face",
+ "RenderPass_Prepare",
+ "SplitData",
+ "StableRandomChoiceNode",
+ "TagStacker",
+ "TagTweaker"
+ ],
+ {
+ "title_aux": "Mets-Nodes"
+ }
+ ],
+ "https://github.com/Mexes1978/film_prompt_styler": [
+ [
+ "FilmPromptStyler"
+ ],
+ {
+ "title_aux": "Film Photography Prompt Styler [WIP]"
+ }
+ ],
+ "https://github.com/MickeyJ/ComfyUI_mickster_nodes": [
+ [
+ "Image Size Scaled",
+ "ImageSwitchSelect"
+ ],
+ {
+ "title_aux": "ComfyUI_mickster_nodes [WIP]"
+ }
+ ],
+ "https://github.com/Mohamed-Sakr/ComfyUI-SimpleMarkdown": [
+ [
+ "SimpleMarkdownPreview"
+ ],
+ {
+ "title_aux": "ComfyUI-SimpleMarkdown [UNSAFE]"
+ }
+ ],
+ "https://github.com/MrAdamBlack/CheckProgress": [
+ [
+ "CHECK_PROGRESS",
+ "Example"
+ ],
+ {
+ "title_aux": "CheckProgress [WIP]"
+ }
+ ],
+ "https://github.com/MuAIGC/ComfyUI-DMXAPI_mmx": [
+ [
+ "Qwen3_TTS_Design_MMX",
+ "Qwen3_TTS_MultiChar_MMX",
+ "Qwen3_TTS_MultiChar_Preset_MMX",
+ "Qwen3_TTS_Preset_MMX",
+ "QwenTTSDesignPreset_MMX"
+ ],
+ {
+ "title_aux": "DMXAPI Nodes [WIP]"
+ }
+ ],
+ "https://github.com/MushroomFleet/ComfyUI-SCP-nodes": [
+ [
+ "SaveImageSCP"
+ ],
+ {
+ "title_aux": "ComfyUI-SCP-nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/MushroomFleet/DJZ-Nodes": [
+ [
+ "AnamorphicEffect",
+ "AspectSize",
+ "AspectSizeV2",
+ "BatchAlphaComposite",
+ "BatchOffset",
+ "BatchRangeInsert",
+ "BatchRangeSwap",
+ "BatchThief",
+ "BlackBarsV1",
+ "BlackBarsV2",
+ "BlackBarsV3",
+ "BorderCompositeAlpha",
+ "BracketCleaner",
+ "CRT_Effect_v1",
+ "CaptionsToPromptList",
+ "CathodeRayEffect",
+ "ClassicFilmEffect",
+ "CombineAudio",
+ "DJZ-LoadLatent",
+ "DJZ-LoadLatentV2",
+ "DJZColorWheel",
+ "DJZDatamosh",
+ "DJZDatamoshV2",
+ "DJZImageScaleToMegabytes",
+ "DJZImageScaleToTotalPixels",
+ "DJZ_ParallaxV1",
+ "DatasetWordcloud",
+ "DeadPixelEffect",
+ "DepthBasedPixelization",
+ "DinskyPlus",
+ "DinskyPlusV2",
+ "DjzDatabendingV1",
+ "DjzDatamoshV3",
+ "DjzDatamoshV4",
+ "DjzDatamoshV5",
+ "DjzDatamoshV6",
+ "DjzDatamoshV7",
+ "DjzDatamoshV8",
+ "FFXFADEORAMA",
+ "FilmGateWeave",
+ "FilmGrainEffect",
+ "FilmGrainEffect_v2",
+ "FishEyeEffect",
+ "FishEyeV2",
+ "FractalGenerator",
+ "FractalGeneratorV2",
+ "FractalGeneratorV3",
+ "GSL_Filter_V1",
+ "HalationBloom",
+ "ImageInterleavedUpscaler",
+ "ImageInterleavedUpscalerV2",
+ "ImageSizeAdjuster",
+ "ImageSizeAdjusterV2",
+ "ImageSizeAdjusterV3",
+ "JitterEffect",
+ "KeyframeBasedUpscalerV1",
+ "KinescopeEffectV1",
+ "LensLeaks",
+ "LoadTextDirectory",
+ "LoadVideoBatchFrame",
+ "LoadVideoDirectory",
+ "LoadVideoDirectoryV2",
+ "MotionBlending",
+ "NoiseFactory",
+ "NoiseFactoryV2",
+ "NoiseFactoryV3",
+ "NonSquarePixelsV1",
+ "PanavisionLensV2",
+ "ParametricMeshGen",
+ "ParametricMeshGenV2",
+ "PartTimer",
+ "ProjectFilePathNode",
+ "ProjectFolderPathNode",
+ "PromptCleaner",
+ "PromptCleanerV2",
+ "PromptDupeRemover",
+ "PromptDupeRemoverV2",
+ "PromptInject",
+ "PromptInjectV2",
+ "PromptSwap",
+ "RetroVideoText",
+ "SaveText",
+ "ScreensaverGenerator",
+ "ScreensaverGeneratorV2",
+ "ScreensaverGeneratorV3",
+ "SequentialNumberGenerator",
+ "StringChaos",
+ "StringMatch",
+ "StringPainter",
+ "StringPainterV2",
+ "StringWeights",
+ "Technicolor3Strip_v1",
+ "Technicolor3Strip_v2",
+ "ThinkSeeker",
+ "ThreeToneStyler",
+ "TrianglesPlus",
+ "TrianglesPlusV2",
+ "UncleanSpeech",
+ "VGA_Effect_v1",
+ "VHS_Effect_V3",
+ "VHS_Effect_v1",
+ "VHS_Effect_v2",
+ "VideoBitClamp",
+ "VideoChromaticAberration",
+ "VideoCorridorV1",
+ "VideoCubeV1",
+ "VideoFilmDamage",
+ "VideoInterlaceFastV4",
+ "VideoInterlaceGANV3",
+ "VideoInterlaced",
+ "VideoInterlacedV2",
+ "VideoMazeV1",
+ "VideoMazeV2",
+ "VideoNoiseFactory",
+ "VideoPyramidV1",
+ "VideoRingPainter",
+ "VideoTemperatureV1",
+ "VideoText",
+ "VideoTextV2",
+ "VideoTimecode",
+ "VideoTrails",
+ "VideoTrailsV2",
+ "VideoVignettingV1",
+ "VoiceEffects",
+ "VoiceEffects2",
+ "WaveletCompose",
+ "WaveletDecompose",
+ "WinampViz",
+ "WinampVizV2",
+ "ZenakiVideoPromptV1",
+ "ZenkaiAmbienceAudioV1",
+ "ZenkaiControlPromptV1",
+ "ZenkaiControlPromptV2",
+ "ZenkaiDepthPrompt",
+ "ZenkaiImagePromptV1",
+ "ZenkaiImagePromptV2",
+ "ZenkaiPoseMap",
+ "ZenkaiPrompt",
+ "ZenkaiPromptV2",
+ "ZenkaiPromptV3",
+ "ZenkaiPromptV4",
+ "ZenkaiPromptV5",
+ "ZenkaiSceneVideoV1",
+ "ZenkaiVideoPose",
+ "ZenkaiWildcard",
+ "ZenkaiWildcardV2",
+ "Zenkai_IMPv1",
+ "djzTiling",
+ "djzTilingV2"
+ ],
+ {
+ "author": "DJZ-Nodes",
+ "title_aux": "DaimalyadNodes [WIP]"
+ }
+ ],
+ "https://github.com/MythicalChu/ComfyUI-APG_ImYourCFGNow": [
+ [
+ "APG_ImYourCFGNow"
+ ],
+ {
+ "title_aux": "ComfyUI-APG_ImYourCFGNow"
+ }
+ ],
+ "https://github.com/N3uR0TiCV0iD/ComfyUI-ModelListTools": [
+ [
+ "CLIPModelSelectionNode",
+ "CLIPVisionModelSelectionNode",
+ "CheckpointSelectionNode",
+ "DiffusionModelSelectionNode",
+ "FilteredCLIPModelsNode",
+ "FilteredCLIPVisionModelsNode",
+ "FilteredCheckpointsNode",
+ "FilteredDiffusionModelsNode",
+ "FilteredLoRAModelsNode",
+ "FilteredTextEncodersNode",
+ "LoRAModelSelectionNode",
+ "LoadLoRAListNode",
+ "TextEncoderSelectionNode"
+ ],
+ {
+ "title_aux": "ComfyUI-ModelListTools"
+ }
+ ],
+ "https://github.com/NEZHA625/ComfyUI-tools-by-dong": [
+ [
+ "Banana\u8282\u70b9",
+ "DeepSeek\u8282\u70b9",
+ "JSON\u5355\u952e\u503c\u6784\u5efa\u8282\u70b9",
+ "JSON\u53d6\u503c\u8282\u70b9",
+ "JSON\u5408\u5e76\u8282\u70b9",
+ "JSON\u591a\u952e\u503c\u6784\u5efa\u8282\u70b9",
+ "QwenVL\u8282\u70b9",
+ "Sora2\u8282\u70b9",
+ "\u4ece\u6587\u672c\u5217\u8868\u83b7\u53d6\u6587\u672c\u8282\u70b9",
+ "\u4ed9\u5bab\u4e91\u73af\u5883\u53d8\u91cf\u8282\u70b9",
+ "\u4fdd\u5b58\u56fe\u50cf\u8282\u70b9",
+ "\u4fdd\u5b58\u6587\u672c\u8282\u70b9",
+ "\u5206\u8fa8\u7387\u8282\u70b9",
+ "\u5220\u9664\u6587\u4ef6\u8282\u70b9",
+ "\u538b\u7f29\u8282\u70b9",
+ "\u53d6\u6574\u51fd\u6570\u8282\u70b9",
+ "\u56fe\u50cf\u8fed\u4ee3\u8282\u70b9",
+ "\u5916\u8865\u753b\u677f\u8282\u70b9",
+ "\u5b57\u7b26\u5904\u7406\u8282\u70b9",
+ "\u5b57\u7b26\u5b58\u5728\u6027\u68c0\u6d4b\u8282\u70b9",
+ "\u5bab\u683c\u56fe\u5207\u5206\u8282\u70b9",
+ "\u5c0f\u663e\u5b58\u68c0\u6d4b\u8282\u70b9",
+ "\u6570\u636e\u5b58\u5728\u6027\u68c0\u6d4b\u8282\u70b9",
+ "\u6587\u4ef6\u4e0b\u8f7d\u8282\u70b9",
+ "\u6587\u4ef6\u5939\u8fed\u4ee3\u8282\u70b9",
+ "\u6587\u672c\u8f93\u5165\u8282\u70b9",
+ "\u6a21\u578b\u4e0b\u8f7d\u8282\u70b9",
+ "\u6bb5\u843d\u6570\u8ba1\u7b97\u8282\u70b9",
+ "\u79fb\u52a8\u6587\u4ef6\u8282\u70b9",
+ "\u7ffb\u8bd1\u8282\u70b9",
+ "\u83b7\u53d6\u56fe\u50cf\u5217\u8868\u8282\u70b9",
+ "\u83b7\u53d6\u89c6\u9891\u8def\u5f84\u8282\u70b9",
+ "\u8ba1\u7b97\u6587\u4ef6\u6570\u91cf\u8282\u70b9",
+ "\u8def\u5f84\u52a0\u5165\u8282\u70b9",
+ "\u901a\u7528API\u8282\u70b9",
+ "\u903b\u8f91\u8282\u70b9",
+ "\u91cd\u547d\u540d\u8282\u70b9",
+ "\u968f\u673a\u6570\u8282\u70b9",
+ "\u97f3\u9891\u65f6\u957f\u8ba1\u7b97\u8282\u70b9"
+ ],
+ {
+ "title_aux": "ComfyUI-tools-by-dong [UNSAFE]"
+ }
+ ],
+ "https://github.com/NSFW-API/ComfyUI-Embedding-Delta-Adapter": [
+ [
+ "ApplyEmbDeltaWANTextEmbeds",
+ "LoadEmbDeltaAdapter"
+ ],
+ {
+ "title_aux": "ComfyUI-Embedding-Delta-Adapter"
+ }
+ ],
+ "https://github.com/NSFW-API/ComfyUI-WanSoftPrefix": [
+ [
+ "WanVideoT5ApplySoftPrefix"
+ ],
+ {
+ "title_aux": "ComfyUI-WanSoftPrefix"
+ }
+ ],
+ "https://github.com/Nambi24/ComfyUI-Save_Image": [
+ [
+ "ExtractLastPathComponent",
+ "ListSubfoldersNode",
+ "SaveImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Save_Image"
+ }
+ ],
+ "https://github.com/NeoTech/comfyui-laserprep": [
+ [
+ "LaserPrep"
+ ],
+ {
+ "title_aux": "comfyui-laserprep"
+ }
+ ],
+ "https://github.com/NeuroWaifu/ComfyUI.Node.MediaSuite": [
+ [
+ "BooleanLogic",
+ "Clamp",
+ "ColorGrading",
+ "ColorPalette",
+ "CompareNumbers",
+ "CompareVideoSize",
+ "Constants",
+ "ConvertNumber",
+ "DominantColor",
+ "GetVideoInfo",
+ "GetVideoSize",
+ "ImageResize",
+ "MaskBlur",
+ "MaskOperations",
+ "MaskThreshold",
+ "MathFunction",
+ "MathOperation",
+ "RandomNumber",
+ "Remap",
+ "ResizeCalculator",
+ "ShadowsHighlightsMidtones",
+ "Smooth",
+ "ToneCurve",
+ "VideoResize",
+ "VideoUpscaleWithModel"
+ ],
+ {
+ "title_aux": "ComfyUI.Node.MediaSuite"
+ }
+ ],
+ "https://github.com/Nienai666/comfyui-encrypt-image-main": [
+ [
+ "DecryptImageFromFile",
+ "EncryptImage",
+ "\u89e3\u5bc6\u56fe\u7247"
+ ],
+ {
+ "title_aux": "ComfyUI-NanoBanana-ImageGenerator"
+ }
+ ],
+ "https://github.com/NimbleWing/ComfyUI-NW": [
+ [
+ "ResolutionSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-NW"
+ }
+ ],
+ "https://github.com/No-22-Github/ComfyUI_SaveImageCustom": [
+ [
+ "SaveUtility: SaveImageCustom"
+ ],
+ {
+ "title_aux": "ComfyUI_SaveImageCustom"
+ }
+ ],
+ "https://github.com/Norsnow/comfyui-image-ratio-preset": [
+ [
+ "ImageRatioPreset"
+ ],
+ {
+ "title_aux": "comfyui-image-ratio-preset [WIP]"
+ }
+ ],
+ "https://github.com/Northerner1/ComfyUI_North_Noise": [
+ [
+ "North_Noise"
+ ],
+ {
+ "title_aux": "ComfyUI_North_Noise [WIP]"
+ }
+ ],
+ "https://github.com/Novavision0313/ComfyUI-NVVS": [
+ [
+ "AllBlackMaskValidator",
+ "DirectionSelector",
+ "FullBodyDetection",
+ "HighlightIndexSelector",
+ "MaskCoverageAnalysis",
+ "RegexTextExtractor",
+ "StringSplit",
+ "StringStrip"
+ ],
+ {
+ "title_aux": "ComfyUI-NVVS [WIP]"
+ }
+ ],
+ "https://github.com/OSAnimate/ComfyUI-SpriteSheetMaker": [
+ [
+ "ImageGridNode",
+ "SpriteSheetMaker"
+ ],
+ {
+ "title_aux": "ComfyUI-SpriteSheetMaker [WIP]"
+ }
+ ],
+ "https://github.com/Oct7/ComfyUI-LaplaMask": [
+ [
+ "BlurMask"
+ ],
+ {
+ "title_aux": "ComfyUI-LaplaMask"
+ }
+ ],
+ "https://github.com/OhSeongHyeon/comfyui-random-image-size": [
+ [
+ "BFParameters",
+ "BFParametersSimple",
+ "CheckpointComboParameter",
+ "CheckpointLoaderWithOuputDirByModelName",
+ "CyclicInteger",
+ "DetailerSchedulerComboParameter",
+ "KsamplerSamplersComboParameter",
+ "KsamplerSchedulersComboParameter",
+ "OuputDirByModelName",
+ "RandomImageSizeAdvanced",
+ "RandomImageSizeAdvancedYAML",
+ "RandomInteger",
+ "UnetComboParameter",
+ "UniqueStringList",
+ "UniqueStringListAdvanced",
+ "VAEComboParameter"
+ ],
+ {
+ "title_aux": "comfyui-random-image-size"
+ }
+ ],
+ "https://github.com/Omario92/ComfyUI-OmarioNodes": [
+ [
+ "DualEndpointColorBlendScheduler",
+ "GemmaAPITextEncode",
+ "MaskClampedCrop",
+ "MaskClampedCropSticky"
+ ],
+ {
+ "title_aux": "ComfyUI-OmarioNodes"
+ }
+ ],
+ "https://github.com/Omega-L/comfyUI-prompts": [
+ [
+ "comfyUI-prompt"
+ ],
+ {
+ "title_aux": "comfyUI-prompts"
+ }
+ ],
+ "https://github.com/OtwakO/ComfyUI-UsefulTools": [
+ [
+ "TagExtractor"
+ ],
+ {
+ "title_aux": "ComfyUI-UsefulTools"
+ }
+ ],
+ "https://github.com/PATATAJEC/ComfyUI-PatatajecNodes": [
+ [
+ "ColorMatchFalloff",
+ "ColorPicker",
+ "ImageDifferenceToAplpha",
+ "PathTool",
+ "SequenceBlend",
+ "SequenceContentZoom"
+ ],
+ {
+ "title_aux": "Patatajec-Nodes [WIP]"
+ }
+ ],
+ "https://github.com/Pablerdo/ComfyUI-Sa2VAWrapper": [
+ [
+ "GetCaptionFromImages"
+ ],
+ {
+ "title_aux": "ComfyUI-Sa2VAWrapper [WIP]"
+ }
+ ],
+ "https://github.com/PabloGrant/comfyui-giraffe-test-panel": [
+ [
+ "DebugHelloNode",
+ "GiraffeTestPanel"
+ ],
+ {
+ "title_aux": "comfyui-giraffe-test-panel"
+ }
+ ],
+ "https://github.com/PaleBloodq/ComfyUI-HFTransformers": [
+ [
+ "HFTCaptioner",
+ "HFTClassificationSelector",
+ "HFTClassifier",
+ "HFTDepthEstimator",
+ "HFTLoader",
+ "HFTObjectDetector"
+ ],
+ {
+ "title_aux": "ComfyUI-HFTransformers"
+ }
+ ],
+ "https://github.com/PauldeLavallaz/comfyui_morpheus_NanoBanana_Mask": [
+ [
+ "MorpheusBatchImagesCropV25Fix",
+ "MorpheusImageEditingPrompt",
+ "MorpheusNanoBananaMaskGeminiV25Fix"
+ ],
+ {
+ "title_aux": "comfyui_morpheus_NanoBanana_Mask [WIP]"
+ }
+ ],
+ "https://github.com/PeterMikhai/Doom_Flux_NodePack": [
+ [
+ "DoomFluxInpaintSampler",
+ "DoomFluxLoader",
+ "DoomFluxLoader_GGUF",
+ "DoomFluxSampler",
+ "DoomFluxSamplerAdvanced",
+ "DoomFluxSuperLoader"
+ ],
+ {
+ "title_aux": "DoomFLUX Nodes [WIP]"
+ }
+ ],
+ "https://github.com/PladsElsker/comfyui-krita": [
+ [
+ "KritaSaveImage"
+ ],
+ {
+ "title_aux": "comfyui-krita [WIP]"
+ }
+ ],
+ "https://github.com/Polygoningenieur/ComfyUI-Diffusion-SDXL-Video": [
+ [
+ "DiffusionSDXLFrameByFrame"
+ ],
+ {
+ "title_aux": "ComfyUI-Diffusion-SDXL-Video"
+ }
+ ],
+ "https://github.com/PopeyesBiscuit/ComfyUI-DeleteFolder": [
+ [
+ "DeleteInputFolder",
+ "DeleteOutputFolder"
+ ],
+ {
+ "title_aux": "ComfyUI Delete Folder Nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/PopeyesBiscuit/ComfyUI-WebSocketLoRAExporter": [
+ [
+ "SimpleLoRALoader",
+ "WebSocket_LoRA_Exporter"
+ ],
+ {
+ "title_aux": "ComfyUI-WebSocketLoRAExporter"
+ }
+ ],
+ "https://github.com/Poseidon-fan/ComfyUI-fileCleaner": [
+ [
+ "Clean input and output file"
+ ],
+ {
+ "title_aux": "ComfyUI-fileCleaner [UNSAFE]"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-CADabra": [
+ [
+ "BGPSegSegmentation",
+ "BrepGeneration",
+ "CADAnalysisViewer",
+ "CADBoundingBox",
+ "CADCheckOverlappingFaces",
+ "CADCurvature",
+ "CADCurvePlotter",
+ "CADEdgeAnalysis",
+ "CADEdgeDetailAnalyzer",
+ "CADEdgeViewer",
+ "CADEdgeViewerVTK",
+ "CADExtractFaces",
+ "CADFaceAnalysis",
+ "CADFixDegenerateFaces",
+ "CADGetFilename",
+ "CADHealShape",
+ "CADHierarchyTree",
+ "CADMergeVertices",
+ "CADPrimitiveReconstruction",
+ "CADProjectFacesXY",
+ "CADROISelector",
+ "CADRaytracerBVH",
+ "CADRecodeInference",
+ "CADSave",
+ "CADSewFaces",
+ "CADSplineViewer",
+ "CADSplitComponents",
+ "CADTransform",
+ "CAD_Convert_Format",
+ "CAD_Load",
+ "CAD_Load_From_Folder",
+ "CAD_Mesh_Gmsh",
+ "CAD_Mesh_Gmsh_Advanced",
+ "CAD_Quality_Metrics",
+ "CAD_Remesh_OCC",
+ "CAD_Remesh_OCC_Advanced",
+ "CadQueryExecute",
+ "CadrilleImageInference",
+ "CadrilleInference",
+ "CadrilleTextInference",
+ "FloatMath",
+ "LoadBGPSegModels",
+ "LoadCADRecodeModel",
+ "LoadCadrilleModel",
+ "LoadNeurCADReconModel",
+ "LoadPoint2CADModel",
+ "LoadPointCloudXYZ",
+ "LoadSECADNetModel",
+ "LoadSurfaceParams",
+ "ML_FeatureDetection",
+ "ML_SurfaceRecon",
+ "MaskAnalyzer",
+ "MaskNormalizer",
+ "MasksToRGB",
+ "MeshFaceSegmentation",
+ "MeshSegmentToPointCloud",
+ "MeshToVoxel",
+ "NeurCADReconInference",
+ "NeurCADReconLoadCheckpoint",
+ "NeurCADReconTrain",
+ "Point2CADExportBrep",
+ "Point2CADSegmentation",
+ "Point2CADSurfaceFitting",
+ "Point2CADSurfaceFittingOCC",
+ "Point2CADToWireframeInfo",
+ "Point2CADTopologyExtraction",
+ "PointCloudSegmentation",
+ "PreviewCADBatch",
+ "PreviewCADOCC",
+ "PrimitiveFitting",
+ "QuadRemesh",
+ "SECADNetFinetune",
+ "SECADNetInference",
+ "SECADNetLatentToMesh",
+ "SaveSurfaceParams",
+ "ScrambleFaceIDMask"
+ ],
+ {
+ "title_aux": "CADabra [WIP]"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-Hunyuan3D-Part": [
+ [
+ "ClearAllModelCaches",
+ "ComputeMeshFeatures",
+ "ExplodedMeshViewer",
+ "Hunyuan3DLoadMesh",
+ "Hunyuan3DPreviewBoundingBoxes",
+ "Hunyuan3DSaveMesh",
+ "LoadBoundingBoxes",
+ "LoadP3SAMSegmentor",
+ "LoadXPartModels",
+ "OffloadModelToCPU",
+ "P3SAMSegmentMesh",
+ "ReloadModelToGPU",
+ "SaveBoundingBoxes",
+ "XPartGenerateParts"
+ ],
+ {
+ "title_aux": "Hunyuan3D-Part [WIP]"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-MVDUST3R": [
+ [
+ "BlurDetection",
+ "ExportMesh",
+ "ExportPointCloud",
+ "LoadMVDUST3RModel",
+ "MVDUST3DVisualizer",
+ "MVDUST3RGridMesh",
+ "MVDUST3RInference",
+ "PrepareImages"
+ ],
+ {
+ "title_aux": "ComfyUI-MVDUST3R [UNSAFE]"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-MotionCapture": [
+ [
+ "BVHViewer",
+ "BVHtoFBX",
+ "CompareSMPLtoBVH",
+ "FBXAnimationViewer",
+ "FBXPreview",
+ "GVHMRInference",
+ "LoadBVHFromFolder",
+ "LoadFBXCharacter",
+ "LoadGVHMRModels",
+ "LoadSAM3DBodyModels",
+ "LoadSMPL",
+ "MHRViewer",
+ "SAM3DVideoInference",
+ "SMPLRetargetToSMPL",
+ "SMPLToFBX",
+ "SMPLViewer",
+ "SMPLtoBVH",
+ "SaveMHR",
+ "SaveSMPL"
+ ],
+ {
+ "author": "gpastal",
+ "title_aux": "MotionCapture [UNSAFE]"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-SAM3DObjects": [
+ [
+ "LoadSAM3DModel",
+ "SAM3DExportPLY",
+ "SAM3DExportPLYBatch",
+ "SAM3DGaussianDecode",
+ "SAM3DGenerateSLAT",
+ "SAM3DMeshDecode",
+ "SAM3DSceneGenerate",
+ "SAM3DTextureBake",
+ "SAM3D_DepthEstimate",
+ "SAM3D_PoseOptimization",
+ "SAM3D_PreviewPointCloud",
+ "SAM3D_ScenePoseOptimize",
+ "SAM3D_UnloadModel"
+ ],
+ {
+ "title_aux": "SAM3DObjects [UNSAFE]"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-TRELLIS2": [
+ [
+ "LoadTrellis2Models",
+ "Trellis2ExportGLB",
+ "Trellis2ExportTrimesh",
+ "Trellis2GetConditioning",
+ "Trellis2ImageToShape",
+ "Trellis2RasterizePBR",
+ "Trellis2RemoveBackground",
+ "Trellis2RenderPreview",
+ "Trellis2RenderVideo",
+ "Trellis2ShapeToTexturedMesh",
+ "Trellis2Simplify",
+ "Trellis2UVUnwrap"
+ ],
+ {
+ "title_aux": "ComfyUI-TRELLIS2 [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-UniRig": [
+ [
+ "MIAAutoRig",
+ "MIALoadModel",
+ "UniRigApplyAnimation",
+ "UniRigApplySkinningMLNew",
+ "UniRigAutoRig",
+ "UniRigCompareSkeletons",
+ "UniRigDebugSkeleton",
+ "UniRigExportPosedFBX",
+ "UniRigExtractRestPose",
+ "UniRigExtractSkeletonNew",
+ "UniRigLoadMesh",
+ "UniRigLoadModel",
+ "UniRigLoadRiggedMesh",
+ "UniRigOrientationCheck",
+ "UniRigPreviewRiggedMesh",
+ "UniRigSaveMesh",
+ "UniRigViewRigging"
+ ],
+ {
+ "title_aux": "ComfyUI-UniRig [WIP]"
+ }
+ ],
+ "https://github.com/ProjectAtlantis-dev/comfyui-atlantis-json": [
+ [
+ "SRTToJson",
+ "SaveJSON",
+ "TextToJsonInput"
+ ],
+ {
+ "title_aux": "comfyui-atlantis-json [UNSAFE]"
+ }
+ ],
+ "https://github.com/QingLuanWithoutHeart/comfyui-file-image-utils": [
+ [
+ "FileManagerV2",
+ "IfTextEquals",
+ "LoadImageFromPath"
+ ],
+ {
+ "title_aux": "ComfyUI File/Image Utils Nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": [
+ [
+ "CPPN Generator",
+ "Color Match",
+ "Coordinates From Mask",
+ "Custom Shader",
+ "Distance Map",
+ "Folder Queue Manager",
+ "Image Blend by Mask (Batch)",
+ "Image Noise Generator",
+ "Image to Optical Flow",
+ "Perlin Noise Generator",
+ "Preview Mask",
+ "Random Image Generator",
+ "Shift Mask",
+ "Slit Scan",
+ "Spring Mesh",
+ "Temporal Blur",
+ "Video Queue Manager"
+ ],
+ {
+ "title_aux": "ComfyUI-QuasimondoNodes [WIP]"
+ }
+ ],
+ "https://github.com/QuietNoise/ComfyUI-Queue-Manager": [
+ [
+ "Workflow Name"
+ ],
+ {
+ "title_aux": "ComfyUI Queue Manager [WIP]"
+ }
+ ],
+ "https://github.com/RLW-Chars/comfyui-promptbymood": [
+ [
+ "Prompt By Mood"
+ ],
+ {
+ "title_aux": "comfyui-promptbymood [WIP]"
+ }
+ ],
+ "https://github.com/RM2-0/ComfyUI-Upscale": [
+ [
+ "BatchImageUpscaleWithModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Upscale"
+ }
+ ],
+ "https://github.com/RUFFY-369/ComfyUI-FeatureBank": [
+ [
+ "FeatureBankAttentionProcessor"
+ ],
+ {
+ "title_aux": "ComfyUI-FeatureBank"
+ }
+ ],
+ "https://github.com/RaeZhLiu/comfy_ark": [
+ [
+ "ArkSeedreamNode"
+ ],
+ {
+ "title_aux": "comfy_ark"
+ }
+ ],
+ "https://github.com/Raidez/comfyui-kuniklo-collection": [
+ [
+ "ApplySVG2Image",
+ "Properties"
+ ],
+ {
+ "title_aux": "Kuniklo Collection"
+ }
+ ],
+ "https://github.com/RamonGuthrie/ComfyUI-RBG-LoraConverter": [
+ [
+ "RBGLoraKeyConverterNode"
+ ],
+ {
+ "title_aux": "ComfyUI-RBG-LoRA-Converter [UNSAFE]"
+ }
+ ],
+ "https://github.com/Randomwalkforest/Comfyui-Koi-Toolkit": [
+ [
+ "AliyunChat",
+ "AliyunConcurrentVLChat",
+ "AliyunVLChat",
+ "AnyToBoolean",
+ "CropImageByJson",
+ "DownloadImagesFromUrls",
+ "Florence2CoordinateExtractor",
+ "Florence2JsonShow",
+ "FreepikIconSearch",
+ "IdealabAPINode",
+ "ImageDesaturateEdgeBinarize",
+ "ImageSubtraction",
+ "ImageSubtractionAdvanced",
+ "ImageToSVG_Potracer",
+ "JsonExtractTextList",
+ "MaskBatchCombine",
+ "MaskExternalRectangle",
+ "MaskFilterByInclusion",
+ "MaskThresholdToWhite",
+ "PreviewSVG",
+ "QwenVLBboxVisualizer",
+ "QwenVLPointVisualizer",
+ "SVGToImage",
+ "SaveSVG",
+ "SimpleImageStitch",
+ "StringContainsKeyword",
+ "StringToBoolean",
+ "TextSplitLines",
+ "imageStitchForICImproved",
+ "imageStitchForICImproved_CropBack"
+ ],
+ {
+ "author": "chflame",
+ "description": "A set of nodes for ComfyUI that can composite layer and mask to achieve Photoshop like functionality.",
+ "nickname": "LayerStyle",
+ "title": "LayerStyle",
+ "title_aux": "Comfyui-Koi-Toolkit"
+ }
+ ],
+ "https://github.com/Rayen21/ComfyUI-PromptLinePlus": [
+ [
+ "PromptLinePlus"
+ ],
+ {
+ "title_aux": "[WIP] ComfyUI-PromptLinePlus"
+ }
+ ],
+ "https://github.com/RicherdLee/comfyui-oss-image-save": [
+ [
+ "SaveImageOSS"
+ ],
+ {
+ "title_aux": "comfyui-oss-image-save [WIP]"
+ }
+ ],
+ "https://github.com/RicoMeng/CartoonGenComfyui-PromtGenerator": [
+ [
+ "Istanbul80sPromptGenerator"
+ ],
+ {
+ "title_aux": "CartoonGenComfyui-PromtGenerator"
+ }
+ ],
+ "https://github.com/Rizzlord/ComfyUI-SeqTex": [
+ [
+ "SeqTex_DisplaceMesh",
+ "SeqTex_Load_Mesh",
+ "SeqTex_Loader",
+ "SeqTex_ProjectTexture",
+ "SeqTex_Step1_ProcessMesh",
+ "SeqTex_Step2_GenerateCondition",
+ "SeqTex_Step3_GenerateTexture",
+ "SeqTex_Step4_SaveMesh",
+ "SeqTex_TensorsToImages"
+ ],
+ {
+ "title_aux": "ComfyUI-SeqTex"
+ }
+ ],
+ "https://github.com/RobbertB80/ComfyUI-SharePoint-Upload": [
+ [
+ "SharePointUploadNode"
+ ],
+ {
+ "title_aux": "ComfyUI SharePoint/OneDrive Upload Node [UNSAFE]"
+ }
+ ],
+ "https://github.com/RobeSantoro/ComfyUI-RobeNodes": [
+ [
+ "AudioWeights to FadeMask \ud83d\udc24",
+ "Boolean Primitive \ud83d\udc24",
+ "GeminiBanana \ud83c\udf4c",
+ "Image Input Switch \ud83d\udc24",
+ "Indices Generator \ud83d\udc24",
+ "List Image Path \ud83d\udc24",
+ "List Model Path \ud83d\udc24",
+ "List Video Path \ud83d\udc24",
+ "Peaks Weights Generator \ud83d\udc24",
+ "Save Image (JPEG) \ud83d\udc24",
+ "easy loadImageBase64"
+ ],
+ {
+ "title_aux": "Comfy UI Robe Nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/Rocky-Lee-001/ComfyUI_SZtools": [
+ [
+ "RSZImageTaggerSave",
+ "ShanZhuDepthVAEEncode",
+ "ShanZhuLoadImagesFromDirList",
+ "ShanZhuTextJoin",
+ "ShanZhuTextSaver",
+ "ShanzhuDepthVAEDecoder",
+ "ShanzhuLujingTIFSaver",
+ "ShanzhuTifSaver",
+ "ShanzhuVAEDecodeSmooth",
+ "TSZImageTaggerSave"
+ ],
+ {
+ "title_aux": "ComfyUI_SZtools"
+ }
+ ],
+ "https://github.com/RomanticQq/ComfyUI-Groudingdino-Sam": [
+ [
+ "grounded_sam2_cut",
+ "grounded_sam2_cut_gaussian",
+ "groundingdino",
+ "groundingdino_clip",
+ "groundingdino_clip_2",
+ "groundingdino_draw_bbox"
+ ],
+ {
+ "title_aux": "ComfyUI-Groudingdino-Sam"
+ }
+ ],
+ "https://github.com/Rosegun007/ComfyUI-Pandora": [
+ [
+ "Image Fill Color | Pandora",
+ "Image From File | Pandora",
+ "Mask to Image | Pandora",
+ "Preview Image | Pandora",
+ "Preview Mask | Pandora",
+ "Text On Image | Pandora"
+ ],
+ {
+ "title_aux": "ComfyUI-Pandora"
+ }
+ ],
+ "https://github.com/RoyKillington/miscomfy-nodes": [
+ [
+ "VeniceUpscale"
+ ],
+ {
+ "title_aux": "Miscomfy Nodes [WIP]"
+ }
+ ],
+ "https://github.com/SKBv0/ComfyUI-RetroEngine": [
+ [
+ "RetroEngineNode"
+ ],
+ {
+ "title_aux": "Retro Engine Node for ComfyUI"
+ }
+ ],
+ "https://github.com/SSYCloud/comfyui-ssy-syncapi": [
+ [
+ "SSYBytedanceProcessor",
+ "SSYDoubaoGenerator",
+ "SSYGoogleGenerator",
+ "SSYOpenAIGenerator"
+ ],
+ {
+ "title_aux": "comfyui-ssy-syncapi [WIP]"
+ }
+ ],
+ "https://github.com/SXQBW/ComfyUI-Qwen3": [
+ [
+ "QwenVisionParser"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen-VLM [WIP]"
+ }
+ ],
+ "https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt": [
+ [
+ "CLIPTextEncodePromptToPrompt",
+ "KSamplerPromptToPrompt",
+ "KSamplerPromptToPromptAttentionMapLogger",
+ "LocalBlendLayerPresetPromptToPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI Port for Google's Prompt-to-Prompt"
+ }
+ ],
+ "https://github.com/Saganaki22/ComfyUI-NovaSR": [
+ [
+ "NovaSR"
+ ],
+ {
+ "title_aux": "ComfyUI-NovaSR"
+ }
+ ],
+ "https://github.com/Saganaki22/ComfyUI-ytdl_nodes": [
+ [
+ "YTDLDownloader",
+ "YTDLLinksInput",
+ "YTDLPreview",
+ "YTDLPreviewAudio"
+ ],
+ {
+ "title_aux": "ComfyUI YTDL Nodes [WIP]"
+ }
+ ],
+ "https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes": [
+ [
+ "FloatMath",
+ "MS_Boolean",
+ "MS_Float",
+ "MS_GenerateSeed",
+ "MS_NP_Vector3",
+ "PowerFractalCrossHatchNode",
+ "PowerFractalNoiseNode",
+ "VectorMath"
+ ],
+ {
+ "title_aux": "ComfyUI-MS-Nodes [WIP]"
+ }
+ ],
+ "https://github.com/Sakura-nee/ComfyUI_Save2Discord": [
+ [
+ "SendToWebhook"
+ ],
+ {
+ "title_aux": "ComfyUI_Save2Discord"
+ }
+ ],
+ "https://github.com/SanDiegoDude/ComfyUI-HiDream-Sampler": [
+ [
+ "HiDreamImg2Img",
+ "HiDreamResolutionSelect",
+ "HiDreamSampler",
+ "HiDreamSamplerAdvanced"
+ ],
+ {
+ "title_aux": "HiDreamSampler for ComfyUI [WIP]"
+ }
+ ],
+ "https://github.com/Scaryplasmon/ComfTrellis": [
+ [
+ "LoadTrellisModel",
+ "RembgSquare",
+ "SaveGLBFile",
+ "TrellisGrid",
+ "TrellisInference"
+ ],
+ {
+ "title_aux": "ComfTrellis [WIP]"
+ }
+ ],
+ "https://github.com/Seb-Lis/comfyui-seed-selector": [
+ [
+ "MySeedSelectorInt",
+ "SeedSelectorInt",
+ "SeedSelectorIntWithDisplay"
+ ],
+ {
+ "title_aux": "comfyui-seed-selector"
+ }
+ ],
+ "https://github.com/SeedV/ComfyUI-SeedV-Nodes": [
+ [
+ "ALL_Model_UnLoader(SEEDV)",
+ "AdvancedScript",
+ "CheckpointLoaderSimpleShared //SeedV",
+ "ControlNetLoaderAdvancedShared",
+ "HandleImage(SEEDV)",
+ "LoraLoader //SeedV",
+ "Script",
+ "Switch_Any(SEEDV)",
+ "TCD_Sampler(SEEDV)",
+ "nunchakuLoraAdapter(SEEDV)"
+ ],
+ {
+ "title_aux": "ComfyUI-SeedV-Nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/Sephrael/comfyui_caption-around-image": [
+ [
+ "CaptionAroundImageSmart",
+ "PrintPromptValues",
+ "PromptProvider",
+ "TextboxReferenceNode"
+ ],
+ {
+ "title_aux": "comfyui_caption-around-image"
+ }
+ ],
+ "https://github.com/SergeyKarleev/comfyui-textutils": [
+ [
+ "TextLinesBatch"
+ ],
+ {
+ "title_aux": "[WIP] comfyui-textutils"
+ }
+ ],
+ "https://github.com/ShahFaisalWani/ComfyUI-Mojen-Nodeset": [
+ [
+ "MojenAnalyzeProcessor",
+ "MojenAspectRatio",
+ "MojenImageLoader",
+ "MojenNSFWClassifier",
+ "MojenNSFWClassifierSave",
+ "MojenStringLength",
+ "MojenStyleExtractor",
+ "MojenTagProcessor",
+ "MojenTransparentBg"
+ ],
+ {
+ "title_aux": "ComfyUI-Mojen-Nodeset"
+ }
+ ],
+ "https://github.com/ShammiG/ComfyUI_Text_Tools_SG": [
+ [
+ "Text Tools Editor-SG",
+ "Text Tools Load Text FilePath-SG",
+ "Text Tools Load Text-SG",
+ "Text Tools Merge Text Multi-SG",
+ "Text Tools Merge Text-SG",
+ "Text Tools Save Text File-SG",
+ "Text Tools Viewer-SG"
+ ],
+ {
+ "title_aux": "ComfyUI_Text_Tools_SG [UNSAFE]"
+ }
+ ],
+ "https://github.com/Shinsplat/ComfyUI-Shinsplat": [
+ [
+ "Clip Text Encode (Shinsplat)",
+ "Clip Text Encode ALT (Shinsplat)",
+ "Clip Text Encode SD3 (Shinsplat)",
+ "Clip Text Encode SDXL (Shinsplat)",
+ "Clip Text Encode T5 (Shinsplat)",
+ "Clip Tokens Encode (Shinsplat)",
+ "Green Box (Shinsplat)",
+ "Hex To Other (Shinsplat)",
+ "KSampler (Shinsplat)",
+ "Lora Loader (Shinsplat)",
+ "Nupoma (Shinsplat)",
+ "Seed (Shinsplat)",
+ "Shinsplat_CLIPTextEncodeFlux",
+ "String Interpolated (Shinsplat)",
+ "Sum Wrap (Shinsplat)",
+ "Tensor Toys (Shinsplat)",
+ "Test Node (Shinsplat)",
+ "Text To Tokens (Shinsplat)",
+ "Text To Tokens SD3 (Shinsplat)",
+ "Variables (Shinsplat)"
+ ],
+ {
+ "author": "Shinsplat",
+ "description": "",
+ "nickname": "shinsplat",
+ "title": "Shinsplat",
+ "title_aux": "ComfyUI-Shinsplat [UNSAFE]"
+ }
+ ],
+ "https://github.com/SilentLuxRay/ComfyUI-Furrey-Super-Prompt": [
+ [
+ "FurreySimplePrompt",
+ "FurreySuperPrompt"
+ ],
+ {
+ "title_aux": "[WIP] ComfyUI-Furrey-Super-Prompt"
+ }
+ ],
+ "https://github.com/SirVeggie/comfyui-sv-nodes": [
+ [
+ "SV-AccumulateNode",
+ "SV-AccumulationGetItemNode",
+ "SV-AccumulationGetLengthNode",
+ "SV-AccumulationHeadNode",
+ "SV-AccumulationSetItemNode",
+ "SV-AccumulationTailNode",
+ "SV-AccumulationToListNode",
+ "SV-AnyToAny",
+ "SV-ApplyCurve",
+ "SV-ApplyCurveFromStep",
+ "SV-AssertNotNone",
+ "SV-BasicParams",
+ "SV-BasicParamsCustom",
+ "SV-BasicParamsOutput",
+ "SV-BasicParamsPlus",
+ "SV-BasicParamsStartEnd",
+ "SV-BooleanNot",
+ "SV-CacheObject",
+ "SV-CheckNone",
+ "SV-CheckNoneNot",
+ "SV-ClearCustomCaches",
+ "SV-CompressConds",
+ "SV-ConditioningReroute",
+ "SV-ConsolePrint",
+ "SV-ConsolePrintLoop",
+ "SV-ConsolePrintMulti",
+ "SV-CurveFromEquation",
+ "SV-DefaultBoolean",
+ "SV-DefaultFloat",
+ "SV-DefaultInt",
+ "SV-DefaultString",
+ "SV-DefaultValue",
+ "SV-EquationCompare",
+ "SV-FloatRerouteForSubnodes",
+ "SV-FlowBlocker",
+ "SV-FlowGate",
+ "SV-FlowGateMulti",
+ "SV-FlowNode",
+ "SV-FlowPipeCombine",
+ "SV-FlowPipeInput",
+ "SV-FlowPipeInputIndex",
+ "SV-FlowPipeInputKey",
+ "SV-FlowPipeInputKeyTuple",
+ "SV-FlowPipeInputLarge",
+ "SV-FlowPipeInputModel",
+ "SV-FlowPipeInputParams",
+ "SV-FlowPipeOutput",
+ "SV-FlowPipeOutputIndex",
+ "SV-FlowPipeOutputKey",
+ "SV-FlowPipeOutputKeyTuple",
+ "SV-FlowPipeOutputLarge",
+ "SV-FlowPipeOutputModel",
+ "SV-FlowPipeOutputParams",
+ "SV-ForLoopClose",
+ "SV-ForLoopOpen",
+ "SV-HashItems",
+ "SV-HashModel",
+ "SV-HashObject",
+ "SV-IfBranch",
+ "SV-ImageReroute",
+ "SV-InputSelect",
+ "SV-InputSelectBoolean",
+ "SV-InputSelectCompare",
+ "SV-IntMathOperation",
+ "SV-ListToAccumulationNode",
+ "SV-LoadTextFile",
+ "SV-LoraSeparator",
+ "SV-ManualCache",
+ "SV-MathAddInt",
+ "SV-MathCompare",
+ "SV-MathOperation",
+ "SV-MetadataJson",
+ "SV-ModelName",
+ "SV-ModelReroute",
+ "SV-NormalizeImageSize",
+ "SV-NormalizeImageSize64",
+ "SV-NormalizeSamples",
+ "SV-PadImage",
+ "SV-PromptPlusModel",
+ "SV-PromptPlusModelOutput",
+ "SV-PromptProcessing",
+ "SV-PromptProcessingAdvanced",
+ "SV-PromptProcessingEncode",
+ "SV-PromptProcessingEncodeList",
+ "SV-PromptProcessingGetCond",
+ "SV-PromptProcessingPromptControl",
+ "SV-PromptProcessingRecursive",
+ "SV-PromptProcessingSimple",
+ "SV-PromptProcessingVars",
+ "SV-ResolutionSelector",
+ "SV-ResolutionSelector2",
+ "SV-ResolutionSelector2Output",
+ "SV-SamplerNameToSampler",
+ "SV-SaveTextFile",
+ "SV-SigmaAsFloat",
+ "SV-SigmaConcat",
+ "SV-SigmaContinue",
+ "SV-SigmaContinueLinear",
+ "SV-SigmaEmpty",
+ "SV-SigmaLength",
+ "SV-SigmaOneStep",
+ "SV-SigmaRange",
+ "SV-SigmaRemap",
+ "SV-SigmaReroute",
+ "SV-SigmaReverse",
+ "SV-SigmaStartEnd",
+ "SV-SigmaStrength",
+ "SV-SimpleText",
+ "SV-StringCombine",
+ "SV-StringSeparator",
+ "SV-SwapValues",
+ "SV-TimerEnd",
+ "SV-TimerStart",
+ "SV-ToBoolNode",
+ "SV-UnitFloat",
+ "SV-ValueRepeater",
+ "SV-VariableClear",
+ "SV-VariableGet",
+ "SV-VariableSet",
+ "SV-WhileLoopClose",
+ "SV-WhileLoopOpen",
+ "SV-WildcardLoader",
+ "SV-WildcardProcessing",
+ "SV-WildcardString"
+ ],
+ {
+ "title_aux": "SirVeggie/Custom nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/SlackinJack/multigpu_diffusion_comfyui": [
+ [
+ "AdvancedFMSchedulerSelector",
+ "AdvancedSchedulerSelector",
+ "ApplyPipeline",
+ "AsyncDiffConfig",
+ "BNBQuantizationConfig",
+ "BalancedConfig",
+ "CheckpointSelector",
+ "CloseHost",
+ "CompileConfig",
+ "CreateHost",
+ "EncodePromptWithCompel",
+ "GroupOffloadConfig",
+ "LoraSelector",
+ "ModelSelector",
+ "MultiLoraJoiner",
+ "OffloadConfig",
+ "OffloadPipeline",
+ "QTOQuantizationConfig",
+ "QuantizationConfig",
+ "SDSampler",
+ "SDSamplerPrompt",
+ "SDUpscaleSampler",
+ "SNQQuantizationConfig",
+ "SVDSampler",
+ "SchedulerSelector",
+ "TAOQuantizationConfig",
+ "TorchConfig",
+ "UnsafeModelSelector",
+ "WanSampler",
+ "ZImageSampler"
+ ],
+ {
+ "title_aux": "multigpu_diffusion_comfyui"
+ }
+ ],
+ "https://github.com/SleazySleaze/aesthetic-persona-comfyui-node": [
+ [
+ "AestheticPersonaParser"
+ ],
+ {
+ "title_aux": "aesthetic-persona-comfyui-node"
+ }
+ ],
+ "https://github.com/Slix-M-Lestragg/comfyui-enhanced": [
+ [
+ "Range Iterator"
+ ],
+ {
+ "title_aux": "comfyui-enhanced [WIP]"
+ }
+ ],
+ "https://github.com/Smyshnikof/ComfyUI-PresetDownloadManager": [
+ [
+ "PresetDownloadManager"
+ ],
+ {
+ "title_aux": "ComfyUI-PresetDownloadManager [UNSAFE]"
+ }
+ ],
+ "https://github.com/Solankimayursinh/PMSnodes": [
+ [
+ "InputAnalyzer",
+ "LoadBase64Audio",
+ "LoadImageBase64",
+ "LoadMaskBase64",
+ "PMSLoadText",
+ "PMSSendAudio",
+ "PMSSendImage"
+ ],
+ {
+ "title_aux": "PMSnodes [WIP]"
+ }
+ ],
+ "https://github.com/Solarish/ComfyUI-MidnightLook": [
+ [
+ "MidnightLook_AnyToString",
+ "MidnightLook_CropDATAToBBOX",
+ "MidnightLook_CropForInpaint",
+ "MidnightLook_LatentSizePresets",
+ "MidnightLook_LoadImageByURL",
+ "MidnightLook_PasteAfterInpaint",
+ "MidnightLook_StringToBBOX",
+ "MidnightLook_UploadToR2"
+ ],
+ {
+ "title_aux": "fyUI-MidnightLook [WIP]"
+ }
+ ],
+ "https://github.com/Soliton80/ComfyUI-Watermark-Detection-YOLO": [
+ [
+ "WatermarkDetector",
+ "WatermarkDetectorLoader"
+ ],
+ {
+ "title_aux": "Watermark Detection YOLO Custom Node [WIP]"
+ }
+ ],
+ "https://github.com/Sophylax/ComfyUI-ReferenceMerge": [
+ [
+ "InpaintRegionRestitcher",
+ "ReferenceInpaintComposite"
+ ],
+ {
+ "title_aux": "ComfyUI-ReferenceMerge"
+ }
+ ],
+ "https://github.com/Soppatorsk/comfyui_img_to_ascii": [
+ [
+ "FirstNode",
+ "Img_to_ASCII"
+ ],
+ {
+ "title_aux": "comfyui_img_to_ascii [WIP]"
+ }
+ ],
+ "https://github.com/SpaceWarpStudio/ComfyUI_Remaker_FaceSwap": [
+ [
+ "RemakerFaceSwap"
+ ],
+ {
+ "title_aux": "ComfyUI_Remaker_FaceSwap"
+ }
+ ],
+ "https://github.com/Spicely/ComfyUI-Luma": [
+ [
+ "AddVideoTextWatermark",
+ "GetDeviceType",
+ "LoadAudioByUrl",
+ "LoadImageByUrl",
+ "LoadVideoByUrl",
+ "SeparateVideoAudio",
+ "Wav2Srt"
+ ],
+ {
+ "title_aux": "[WIP] ComfyUI-Luma"
+ }
+ ],
+ "https://github.com/Stable-X/ComfyUI-Hi3DGen": [
+ [
+ "DifferenceExtractorNode",
+ "DownloadAndLoadStableXModel",
+ "IF_TrellisCheckpointLoader",
+ "IF_TrellisImageTo3D",
+ "StableXProcessImage"
+ ],
+ {
+ "title_aux": "ComfyUI-Hi3DGen"
+ }
+ ],
+ "https://github.com/StableDiffusionVN/SDVN_Comfy_node": [
+ [
+ "SDVM Image List Repeat",
+ "SDVN API chatbot",
+ "SDVN Any From List",
+ "SDVN Any Input Type",
+ "SDVN Any List",
+ "SDVN Any Repeat",
+ "SDVN Any Show",
+ "SDVN AnyDownload List",
+ "SDVN Apply Kontext Reference",
+ "SDVN Apply Style Model",
+ "SDVN Auto Generate",
+ "SDVN AutoSwitch",
+ "SDVN Boolean",
+ "SDVN CLIP Download",
+ "SDVN CLIP Text Encode",
+ "SDVN CLIP Text Encode Simple",
+ "SDVN CLIPVision Download",
+ "SDVN Checkpoint Download",
+ "SDVN Checkpoint Download List",
+ "SDVN ControlNet Download",
+ "SDVN Controlnet Apply",
+ "SDVN Crop By Ratio",
+ "SDVN DALL-E Generate Image",
+ "SDVN Dic Convert",
+ "SDVN DiffsynthControlNet Apply",
+ "SDVN DiffsynthUnionLora Apply",
+ "SDVN DualCLIP Download",
+ "SDVN Easy IPAdapter weight",
+ "SDVN Empty Latent Ratio",
+ "SDVN Exif check",
+ "SDVN Fill Background",
+ "SDVN Filter List",
+ "SDVN Flip Image",
+ "SDVN Float Slider",
+ "SDVN GPT Image",
+ "SDVN Gemini 3 Pro Image",
+ "SDVN Gemini Flash 2 Image",
+ "SDVN Get Mask Size",
+ "SDVN Google Imagen",
+ "SDVN IC Lora Layout",
+ "SDVN IC Lora Layout Crop",
+ "SDVN IPAdapterModel Download",
+ "SDVN Image Adjust",
+ "SDVN Image Film Grain",
+ "SDVN Image HSL",
+ "SDVN Image Info",
+ "SDVN Image Layout",
+ "SDVN Image Repeat",
+ "SDVN Image Scraper",
+ "SDVN Image Size",
+ "SDVN Image White Balance",
+ "SDVN ImageGallery",
+ "SDVN Inpaint",
+ "SDVN Inpaint Crop",
+ "SDVN InstantIDModel Download",
+ "SDVN Int Slider",
+ "SDVN Join Parameter",
+ "SDVN KSampler",
+ "SDVN Load Checkpoint",
+ "SDVN Load Checkpoint Filter",
+ "SDVN Load Google Sheet",
+ "SDVN Load Image",
+ "SDVN Load Image Folder",
+ "SDVN Load Image From List",
+ "SDVN Load Image Ultimate",
+ "SDVN Load Image Url",
+ "SDVN Load Lora",
+ "SDVN Load Lora Filter",
+ "SDVN Load Text",
+ "SDVN LoadPinterest",
+ "SDVN Logic",
+ "SDVN Loop Inpaint Stitch",
+ "SDVN Lora Download",
+ "SDVN Lora info",
+ "SDVN Mask Regions",
+ "SDVN Mask To Transparent Color",
+ "SDVN Menu Option",
+ "SDVN Menu Option Extra",
+ "SDVN Merge Flux",
+ "SDVN Merge SD1",
+ "SDVN Merge SDXL",
+ "SDVN Metadata Check",
+ "SDVN Model Export",
+ "SDVN Model Merge",
+ "SDVN Model info editor",
+ "SDVN ModelPatch Download",
+ "SDVN Overlay Images",
+ "SDVN Overlay Mask Color Image",
+ "SDVN Pipe In",
+ "SDVN Pipe Out",
+ "SDVN Pipe Out All",
+ "SDVN QuadrupleCLIP Download",
+ "SDVN QwenEdit TextEncoder",
+ "SDVN QwenEdit TextEncoder Plus",
+ "SDVN RGBA to RGB",
+ "SDVN Random Prompt",
+ "SDVN Run Python Code",
+ "SDVN Run Test",
+ "SDVN Save Image",
+ "SDVN Save Text",
+ "SDVN Seed",
+ "SDVN Simple Any Input",
+ "SDVN Slider 1",
+ "SDVN Slider 100",
+ "SDVN Split Tile",
+ "SDVN Stitch Tile",
+ "SDVN StyleModel Download",
+ "SDVN Styles",
+ "SDVN Switch",
+ "SDVN Translate",
+ "SDVN UNET Download",
+ "SDVN UPscale Latent",
+ "SDVN Upscale Image",
+ "SDVN UpscaleModel Download",
+ "SDVN VAE Download",
+ "SDVN Yolo8 Seg"
+ ],
+ {
+ "title_aux": "SDVN Comfy node [UNSAFE]"
+ }
+ ],
+ "https://github.com/StaffsGull/comfyui_scene_builder": [
+ [
+ "CharacterBuilderNode",
+ "ClothingItemNode",
+ "ClothingMergerNode",
+ "EnvironmentBuilderNode",
+ "MergeCharactersNode",
+ "PhotoStyleBuilderNode",
+ "SceneCombinerNode"
+ ],
+ {
+ "title_aux": "comfyui_scene_builder [WIP]"
+ }
+ ],
+ "https://github.com/StartHua/Comfyui_CSDMT_CXH": [
+ [
+ "CSD"
+ ],
+ {
+ "title_aux": "Comfyui_CXH_CRM"
+ }
+ ],
+ "https://github.com/StartHua/Comfyui_CXH_CRM": [
+ [
+ "CRM"
+ ],
+ {
+ "title_aux": "Comfyui_CXH_CRM"
+ }
+ ],
+ "https://github.com/StartHua/Comfyui_CXH_joy_caption": [
+ [
+ "CXH_DownloadAndLoadFlorence2Model",
+ "CXH_Florence2Run",
+ "CXH_HG_Model_Load",
+ "CXH_IC_Lora_Florence2Run",
+ "CXH_IC_lora_reversal",
+ "CXH_Ic_lora_Joy_batch",
+ "CXH_Min2_6_classifiy",
+ "CXH_Min2_6_prompt_Run",
+ "CXH_MinCP3_4B_Chat",
+ "CXH_MinCP3_4B_Load",
+ "CXH_SmolVlm_Load",
+ "CXH_SmolVlm_Run",
+ "Joy_caption",
+ "Joy_caption_alpha_batch",
+ "Joy_caption_alpha_batch_Dirs",
+ "Joy_caption_alpha_load",
+ "Joy_caption_alpha_prompt",
+ "Joy_caption_alpha_run",
+ "Joy_caption_load"
+ ],
+ {
+ "title_aux": "Comfyui_CXH_joy_caption [SECURITY SCREENING]"
+ }
+ ],
+ "https://github.com/StartHua/Comfyui_Flux_Style_Ctr": [
+ [
+ "CXH_StyleModelApply"
+ ],
+ {
+ "title_aux": "Comfyui_Flux_Style_Ctr [WIP]"
+ }
+ ],
+ "https://github.com/StartHua/Comfyui_leffa": [
+ [
+ "CXH_Leffa_Viton_Load",
+ "CXH_Leffa_Viton_Run"
+ ],
+ {
+ "title_aux": "Comfyui_leffa"
+ }
+ ],
+ "https://github.com/StevenBaby/comfyui-tools": [
+ [
+ "IntParameterNode"
+ ],
+ {
+ "title_aux": "comfyui-tools"
+ }
+ ],
+ "https://github.com/StoryWalker/comfyui_flux_collection_advanced": [
+ [
+ "Example",
+ "FluxControlNetApply",
+ "FluxControlNetApplyPreview",
+ "FluxControlNetLoader",
+ "FluxImagePreview",
+ "FluxImageUpscaler",
+ "FluxLoader",
+ "FluxSamplerParameters",
+ "FluxTextPrompt"
+ ],
+ {
+ "title_aux": "comfyui_flux_collection_advanced [WIP]"
+ }
+ ],
+ "https://github.com/SushantSingh-23-01/comfyui_flowrider_nodes": [
+ [
+ "FilmGrainVFX",
+ "SaveCustomResolutions",
+ "SaveImageCustom",
+ "SelectCustomResolutions"
+ ],
+ {
+ "title_aux": "comfyui_flowrider_nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/Suzu008/ComfyUI-ImageCritic": [
+ [
+ "DetailEncoder"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageCritic"
+ }
+ ],
+ "https://github.com/Symbiomatrix/Comfyui-Sort-Files": [
+ [
+ "ImageSaverSBM",
+ "SortControlSBM",
+ "StringToFloatSBM",
+ "VideoSeriesMergerSBM"
+ ],
+ {
+ "author": "SBM",
+ "title_aux": "Comfyui-Sort-Files"
+ }
+ ],
+ "https://github.com/TSFSean/ComfyUI-TSFNodes": [
+ [
+ "GyroOSC"
+ ],
+ {
+ "title_aux": "ComfyUI-TSFNodes"
+ }
+ ],
+ "https://github.com/Tawbaware/ComfyUI-Tawbaware": [
+ [
+ "LatentBlendGradient",
+ "ReverseLatentBatch",
+ "WanVideoReCamMasterGenerateOrbitCameraEx"
+ ],
+ {
+ "title_aux": "ComfyUI-Tawbaware [WIP]"
+ }
+ ],
+ "https://github.com/Temult/TWanSigmaSampler": [
+ [
+ "TWanVideoSigmaSampler"
+ ],
+ {
+ "title_aux": "TWanVideoSigmaSampler: EXPERIMENTAL [WIP]"
+ }
+ ],
+ "https://github.com/ThatGlennD/ComfyUI-Image-Analysis-Tools": [
+ [
+ "Blur Detection",
+ "BlurDetection",
+ "Clipping Analysis",
+ "ClippingAnalysis",
+ "Color Cast Detector",
+ "Color Harmony Analyzer",
+ "Color Temperature Estimator",
+ "ColorCastDetector",
+ "ColorHarmonyAnalyzer",
+ "ColorTemperatureEstimator",
+ "Contrast Analysis",
+ "ContrastAnalysis",
+ "Defocus Analysis",
+ "DefocusAnalysis",
+ "Edge Density Analysis",
+ "EdgeDensityAnalysis",
+ "Entropy Analysis",
+ "EntropyAnalysis",
+ "Noise Estimation",
+ "NoiseEstimation",
+ "RGB Histogram Renderer",
+ "RGBHistogramRenderer",
+ "Sharpness / Focus Score",
+ "SharpnessFocusScore"
+ ],
+ {
+ "title_aux": "ComfyUI Image Analysis Toolkit [WIP]"
+ }
+ ],
+ "https://github.com/TheJorseman/IntrinsicCompositingClean-ComfyUI": [
+ [
+ "AlbedoHarmonizer",
+ "AlbedoModelLoader",
+ "CompleteRelighting",
+ "CompositeNormalsCalculator",
+ "DepthEstimator",
+ "DepthModelLoader",
+ "ExtractInvShading",
+ "ExtractSmallBgShd",
+ "HarmonizedImageCreator",
+ "ImageResizer",
+ "ImageResizerNP",
+ "ImageResizerNPMASK",
+ "IntrinsicDecomposer",
+ "IntrinsicModelLoader",
+ "LightCoeffExtractor",
+ "LoadImagePIL",
+ "MaskApplier",
+ "MaskGenerator",
+ "MaskPreprocessor",
+ "NormalsExtractor",
+ "NormalsModelLoader",
+ "ReshadingModelLoader",
+ "ReshadingProcessor"
+ ],
+ {
+ "title_aux": "IntrinsicCompositingClean-ComfyUI"
+ }
+ ],
+ "https://github.com/TheLocalLab/ComfyUI-Kandinsky-GGUF": [
+ [
+ "EmptyKandinskyV5_Latent",
+ "KandinskyV5_ImageToVideoLatent",
+ "KandinskyV5_Loader",
+ "KandinskyV5_PruneFrames",
+ "KandinskyV5_Sampler",
+ "KandinskyV5_TextEncode",
+ "KandinskyV5_VAEDecode",
+ "KandinskyV5_VAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Kandinsky-GGUF [WIP]"
+ }
+ ],
+ "https://github.com/ThisModernDay/ComfyUI-InstructorOllama": [
+ [
+ "OllamaInstructorNode"
+ ],
+ {
+ "title_aux": "ComfyUI Instructor Ollama"
+ }
+ ],
+ "https://github.com/ThuckMaBaws/TMB-Camera-Modifier": [
+ [
+ "Camera Modifier Selector"
+ ],
+ {
+ "title_aux": "TMB Camera Modifier for ComfyUI [WIP]"
+ }
+ ],
+ "https://github.com/TimothyCMeehan/comfyui-ck3-presets": [
+ [
+ "CK3 Resize Image",
+ "CK3ResizeImage",
+ "CK3SizePreset"
+ ],
+ {
+ "title_aux": "ComfyUI CK3 Presets"
+ }
+ ],
+ "https://github.com/TobiasGlaubach/ComfyUI-TG_PyCode": [
+ [
+ "TG_PyCall",
+ "TG_PyCallKey",
+ "TG_PyEditor",
+ "TG_PyEval",
+ "TG_PyEvalNamespace",
+ "TG_PyGetInstalledLibs",
+ "TG_PyImportLibs"
+ ],
+ {
+ "title_aux": "ComfyUI-TG_PyCode [UNSAFE]"
+ }
+ ],
+ "https://github.com/Toxic1228/Eleven-labs-comfyui-sts": [
+ [
+ "ElevenLabs_SpeechToSpeech"
+ ],
+ {
+ "title_aux": "Eleven-labs-comfyui-sts"
+ }
+ ],
+ "https://github.com/Tr1dae/ComfyUI-CustomNodes-MVM": [
+ [
+ "LoadImageFromFolderMVM",
+ "LoadImagesFromFolderRandomMVM",
+ "LoadImagesFromRelativePathRandomMVM",
+ "LoadTextFromFolderMVM"
+ ],
+ {
+ "title_aux": "ComfyUI-CustomNodes-MVM"
+ }
+ ],
+ "https://github.com/Tr1dae/ComfyUI-MobileSAM": [
+ [
+ "EasyMobileSAM"
+ ],
+ {
+ "title_aux": "[WIP] ComfyUI-MobileSAM"
+ }
+ ],
+ "https://github.com/UltraNoob-NazoGiken/ComfyUI-TOML-Tools": [
+ [
+ "CreateTomlData",
+ "GetTomlValue",
+ "LoadToml",
+ "MergeTomlData",
+ "SaveToml"
+ ],
+ {
+ "title_aux": "ComfyUI-TOML-Tools [WIP]"
+ }
+ ],
+ "https://github.com/UmutGuzel/tryvariantai-comfyui": [
+ [
+ "DebugMaskNode",
+ "FillTransparencyNode",
+ "MaskExpandBorder",
+ "MaskExpandBorderAdvanced",
+ "MaskFromContoursOpenCV",
+ "MaskToTransparentNode",
+ "SimpleWhiteDetectorNode",
+ "WhiteToTransparentNode"
+ ],
+ {
+ "title_aux": "ComfyUI-yolov5-face [WIP]"
+ }
+ ],
+ "https://github.com/VectorASD/ComfyUI-VectorASD": [
+ [
+ "ASD_CLIPLoader",
+ "ASD_CLIPSplitter",
+ "ASD_CLIPTextEncode",
+ "ASD_CompareAnything",
+ "ASD_JoinString",
+ "ASD_JoinStringMulti",
+ "ASD_JoinStringMultiPrefix",
+ "ASD_JoinStringPrefix"
+ ],
+ {
+ "title_aux": "ComfyUI-VectorASD"
+ }
+ ],
+ "https://github.com/Velour-Fog/comfy-latent-nodes": [
+ [
+ "CustomLoadLatent",
+ "CustomSaveLatent"
+ ],
+ {
+ "title_aux": "comfy-latent-nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/VictorLopes643/ComfyUI-Video-Dataset-Tools": [
+ [
+ "VideoFrameExtractor",
+ "VideoFrameSaver"
+ ],
+ {
+ "title_aux": "ComfyUI-Video-Dataset-Tools [WIP]"
+ }
+ ],
+ "https://github.com/Video3DGenResearch/comfyui-batch-input-node": [
+ [
+ "BatchImageAndPrompt",
+ "BatchInputCSV",
+ "BatchInputText"
+ ],
+ {
+ "title_aux": "ComfyUI Batch Input Node"
+ }
+ ],
+ "https://github.com/VisionExp/ve_custom_comfyui_nodes": [
+ [
+ "Asset Image",
+ "LoadImgFromInputUrl",
+ "Render3d",
+ "assets/Asset Image",
+ "render3d/Render Node"
+ ],
+ {
+ "title_aux": "ve_custom_comfyui_nodes"
+ }
+ ],
+ "https://github.com/Vkabuto23/comfyui_openrouter_ollama": [
+ [
+ "OllamaNode",
+ "OllamaNodeExperimental",
+ "OllamaVisionNode",
+ "OllamaVisionNodeExperimental",
+ "OpenRouterNode",
+ "OpenRouterNodeExperimental",
+ "OpenRouterVisionNode",
+ "OpenRouterVisionNodeExperimental"
+ ],
+ {
+ "title_aux": "ComfyUI Custom Nodes: OpenRouter & Ollama [UNSAFE]"
+ }
+ ],
+ "https://github.com/Vollond/ComfyUI-LatentCutPlus": [
+ [
+ "DebugAny",
+ "LTXVEmptyLatentAudioDebug",
+ "LTXVSpatioTemporalTiledVAEDecode_DirectEncode",
+ "LTXVTiledVAEDecode",
+ "LatentCutPlus",
+ "LatentDebugInfo"
+ ],
+ {
+ "title_aux": "ComfyUI-LatentCutPlus"
+ }
+ ],
+ "https://github.com/Vov1ch/ComfyUI_GLMImage": [
+ [
+ "GLMImageGenerate",
+ "GLMImageImageToImage",
+ "GLMImageSDNQ_FlexibleInput",
+ "GLMImageSDNQ_Generate",
+ "GLMImageSDNQ_I2I_Standalone",
+ "GLMImageSDNQ_ImageToImage",
+ "GLMImageSDNQ_LoadPipe",
+ "GLMImageSDNQ_MultiI2I_Standalone",
+ "GLMImageSDNQ_MultiImageToImage",
+ "GLMImageSDNQ_T2I_Standalone"
+ ],
+ {
+ "title_aux": "ComfyUI_GLMImage"
+ }
+ ],
+ "https://github.com/Vsolon/ComfyUI-CBZ-Pack": [
+ [
+ "CBZ Preview Any",
+ "CBZCollector",
+ "CBZCollectorPassthrough",
+ "CBZUnpacker",
+ "CBZUnpackerPassthrough",
+ "DirToCBZ",
+ "DirToCBZPassthrough",
+ "ExportCBZ",
+ "ExportCBZPassthrough"
+ ],
+ {
+ "title_aux": "ComfyUI-CBZ-Pack [UNSAFE]"
+ }
+ ],
+ "https://github.com/WASasquatch/ASTERR": [
+ [
+ "ASTERR",
+ "SaveASTERR"
+ ],
+ {
+ "title_aux": "ASTERR [UNSAFE]"
+ }
+ ],
+ "https://github.com/WSJUSA/Comfyui-StableSR": [
+ [
+ "ColorFix",
+ "StableSRUpscalerPipe"
+ ],
+ {
+ "author": "WSJUSA",
+ "description": "This module enables StableSR in Comgfyui. Ported work of sd-webui-stablesr. Original work for Auotmaatic1111 version of this module and StableSR credit to LIightChaser and Jianyi Wang.",
+ "nickname": "StableSR",
+ "title": "StableSR",
+ "title_aux": "pre-comfyui-stablsr"
+ }
+ ],
+ "https://github.com/WaiyanLing/ComfyUI-Tracking": [
+ [
+ "WorkflowStats"
+ ],
+ {
+ "title_aux": "ComfyUI-Tracking [WIP]"
+ }
+ ],
+ "https://github.com/WenerSantos3/ComfyUI-BlueeUtils": [
+ [
+ "BlueeCombineImagesAudioH264",
+ "BlueeFileExists",
+ "BlueeTemplateString",
+ "BlueeUtilsDelete",
+ "BlueeUtilsDownloadTemp",
+ "BlueeUtilsReadTempAudio",
+ "BlueeUtilsReadTempImage",
+ "blueeInput"
+ ],
+ {
+ "title_aux": "ComfyUI-BlueeUtils [UNSAFE]"
+ }
+ ],
+ "https://github.com/WilliamStanford/ComfyUI-VisualLabs": [
+ [
+ "CreateFadeMaskAdvancedVL",
+ "PointStringFromFloatArray",
+ "RescaleFloatArray",
+ "StringFromFloatArray"
+ ],
+ {
+ "title_aux": "visuallabs_comfyui_nodes"
+ }
+ ],
+ "https://github.com/WozStudios/ComfyUI-WozNodes": [
+ [
+ "CreateImageBatch",
+ "ImageBatchSelectByMask",
+ "ImageBatchTrim",
+ "ImageBatcherByIndexProV2"
+ ],
+ {
+ "title_aux": "ComfyUI-WozNodes"
+ }
+ ],
+ "https://github.com/XiaoHeiziGGG/ComfyUI-Gemini-Kontext": [
+ [
+ "GeminiBatchTranslator",
+ "GeminiImageAnalyzer",
+ "GeminiKontextOptimizer",
+ "GeminiTranslator"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemini-Kontext [WIP]"
+ }
+ ],
+ "https://github.com/XiaoHeiziGGG/ComfyUI-GeminiTranslator": [
+ [
+ "GeminiBatchTranslator",
+ "GeminiTranslator"
+ ],
+ {
+ "title_aux": "ComfyUI Gemini Translator [WIP]"
+ }
+ ],
+ "https://github.com/Yeonri/ComfyUI_LLM_Are_You_Listening": [
+ [
+ "AYL_API_Node",
+ "AYL_GGUF_Node",
+ "AYL_Node"
+ ],
+ {
+ "title_aux": "ComfyUI_LLM_Are_You_Listening [WIP]"
+ }
+ ],
+ "https://github.com/YokoYokoTEC/comfyui-batch-sequence": [
+ [
+ "BatchCounter|YokoYokoTEC",
+ "LineRead|YokoYokoTEC"
+ ],
+ {
+ "title_aux": "ComfyUI Batch Sequence Node [UNSAFE]"
+ }
+ ],
+ "https://github.com/YokoYokoTEC/comfyui-sequential-prompt-file": [
+ [
+ "File",
+ "Find"
+ ],
+ {
+ "title_aux": "comfyui-sequential-prompt-file [UNSAFE]"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Step1X-Edit": [
+ [
+ "GenerateEditedImage",
+ "LoadAEModel",
+ "LoadDITModel",
+ "LoadImagePath",
+ "LoadQwenVLModel",
+ "Prompt",
+ "SaveEditedImage"
+ ],
+ {
+ "title_aux": "ComfyUI-Step1X-Edit [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/Yukinoshita-Yukinoe/ComfyUI-KontextOfficialNode": [
+ [
+ "KontextImageEditingOfficialAPI_Max",
+ "KontextTextToImageOfficialAPI_Max"
+ ],
+ {
+ "title_aux": "ComfyUI-KontextOfficialNode"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AuraSR-ZHO": [
+ [
+ "AuraSR_Lterative_Zho",
+ "AuraSR_ModelLoader_Zho",
+ "AuraSR_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-AuraSR-ZHO"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO": [
+ [
+ "BiRefNet_ModelLoader_Zho",
+ "BiRefNet_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-BiRefNet-ZHO [BROKEN]"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini": [
+ [
+ "ConcatText_Zho",
+ "DisplayText_Zho",
+ "Gemini_15P_API_S_Advance_Zho",
+ "Gemini_15P_API_S_Chat_Advance_Zho",
+ "Gemini_API_Chat_Zho",
+ "Gemini_API_S_Chat_Zho",
+ "Gemini_API_S_Vsion_ImgURL_Zho",
+ "Gemini_API_S_Zho",
+ "Gemini_API_Vsion_ImgURL_Zho",
+ "Gemini_API_Zho",
+ "Gemini_FileUpload_API_S_Zho",
+ "Gemini_File_API_S_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemini [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO": [
+ [
+ "PuLID_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-PuLID-ZHO [WIP]"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Wan-ZHO": [
+ [
+ "WANMODELS_Generation_Zho",
+ "WANMODELS_ModelLoader_Zho",
+ "WanT2V_Generation_Zho",
+ "WanT2V_ModelLoader_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI Wan2.1 [WIP]"
+ }
+ ],
+ "https://github.com/ZenAI-Vietnam/ComfyUI-gemini-IG": [
+ [
+ "Gemini Image Generation",
+ "Gemini Text Generation"
+ ],
+ {
+ "title_aux": "ComfyUI-gemini-IG"
+ }
+ ],
+ "https://github.com/ZenAI-Vietnam/ComfyUI_InfiniteYou": [
+ [
+ "FaceCombine",
+ "FaceSwap_InfiniteYou",
+ "InfiniteYouApply"
+ ],
+ {
+ "title_aux": "ComfyUI_InfiniteYou [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/a-One-Fan/ComfyUI-Blenderesque-Nodes": [
+ [
+ "BlenderBlackbody",
+ "BlenderBrickTexture",
+ "BlenderBrightnessContrast",
+ "BlenderCheckerTexture",
+ "BlenderClamp",
+ "BlenderCombineColor",
+ "BlenderCombineXYZ",
+ "BlenderCrop",
+ "BlenderGamma",
+ "BlenderHueSaturationValue",
+ "BlenderInvertColor",
+ "BlenderLensDistortion",
+ "BlenderMapRange",
+ "BlenderMapUV",
+ "BlenderMath",
+ "BlenderMix",
+ "BlenderNoiseTexture",
+ "BlenderRGB",
+ "BlenderRGBtoBW",
+ "BlenderRotate",
+ "BlenderScale",
+ "BlenderSeparateColor",
+ "BlenderSeparateXYZ",
+ "BlenderSetAlpha",
+ "BlenderTransform",
+ "BlenderTranslate",
+ "BlenderUV",
+ "BlenderValue",
+ "BlenderVectorMath",
+ "BlenderVoronoiTexture",
+ "BlenderWavelength"
+ ],
+ {
+ "title_aux": "ComfyUI-Blenderesque-Nodes [WIP]"
+ }
+ ],
+ "https://github.com/a-und-b/ComfyUI_Output_as_Input": [
+ [
+ "OutputAsInput"
+ ],
+ {
+ "title_aux": "ComfyUI_Output_as_Input"
+ }
+ ],
+ "https://github.com/aa-parky/pipemind-comfyui": [
+ [
+ "BatchImageLoadInput",
+ "BatchImageLoadOutput",
+ "BooleanSwitchAny",
+ "EnhancedKeywordPromptComposer",
+ "KeywordPromptComposer",
+ "LoadTxtFile",
+ "PipemindDisplayAny",
+ "PipemindFlux2MAspectRatio",
+ "PipemindLoraLoader",
+ "PipemindMultilineTextInput",
+ "PipemindQwenAspectRatio",
+ "PipemindSDXL15AspectRatio",
+ "PipemindSaveImageWTxt",
+ "PipemindShowText",
+ "PipemindShowTextFind",
+ "PipemindTokenCounter",
+ "RandomLineFromDropdown",
+ "SelectLineFromDropdown",
+ "SimplePromptCombiner"
+ ],
+ {
+ "title_aux": "pipemind-comfyui"
+ }
+ ],
+ "https://github.com/abuzreq/ComfyUI-Model-Bending": [
+ [
+ "Add Noise Module (Bending)",
+ "Add Scalar Module (Bending)",
+ "Compute PCA",
+ "ConditioningApplyOperation",
+ "Custom Code Module",
+ "Dilation Module (Bending)",
+ "Erosion Module (Bending)",
+ "Gradient Module (Bending)",
+ "HSpace Bending",
+ "Latent Operation (Add Noise)",
+ "Latent Operation (Add Scalar)",
+ "Latent Operation (Custom)",
+ "Latent Operation (Multiply Scalar)",
+ "Latent Operation (Rotate)",
+ "Latent Operation (Threshold)",
+ "Latent Operation To Module",
+ "LatentApplyOperationCFGToStep",
+ "LoRA Bending",
+ "Model Bending",
+ "Model Bending (SD Layers)",
+ "Model Inspector",
+ "Model VAE Bending",
+ "Model VAE Inspector",
+ "Multiply Scalar Module (Bending)",
+ "NoiseVariations",
+ "Rotate Module (Bending)",
+ "Scale Module (Bending)",
+ "Sobel Module (Bending)",
+ "Threshold Module (Bending)",
+ "Visualize Feature Map"
+ ],
+ {
+ "title_aux": "ComfyUI Model Bending [UNSAFE]"
+ }
+ ],
+ "https://github.com/adamdavidcole/comfyui-video-xy-plot": [
+ [
+ "XYPlotCollectVideo",
+ "XYPlotDirectorySetup",
+ "XYPlotGetValues",
+ "XYPlotSetup",
+ "XYPlotVideoGrid"
+ ],
+ {
+ "title_aux": "ComfyUI XY Video Plot Suite [WIP]"
+ }
+ ],
+ "https://github.com/addddd2/AI_Generated_nodes": [
+ [
+ "ExtractImageChannel",
+ "ImageBlendLighter",
+ "ImageCropBorders",
+ "ImageMirrorPad",
+ "ImageOffset",
+ "ImageScaleToQwen",
+ "ImageScaleToTotalPixelsRound64",
+ "ImageStitcher",
+ "LABtoRGB",
+ "MatchRYGCBMColors",
+ "RGBtoLAB",
+ "RGBtoRYGCBM",
+ "RYGCBMtoRGB",
+ "TextCommaToRandomWeighted",
+ "TextCommaToWeighted"
+ ],
+ {
+ "title_aux": "AI_Generated_nodes"
+ }
+ ],
+ "https://github.com/adigayung/comfyui_PlutoNode": [
+ [
+ "CompositeImageNode",
+ "FloatArithmeticNode",
+ "FloatToIntNode",
+ "IntArithmeticNode",
+ "PlutoAutoCropFaces",
+ "PlutoAutoSaveImage",
+ "PlutoEmptyLatentByInput",
+ "PlutoGetSizeFromImage",
+ "PreviewImageXX",
+ "TextAppendNode",
+ "TextReplaceNode",
+ "TextToImageNode"
+ ],
+ {
+ "title_aux": "comfyui_PlutoNode"
+ }
+ ],
+ "https://github.com/adithis197/ComfyUI-Caption_to_audio": [
+ [
+ "TextToMusicGenAudio"
+ ],
+ {
+ "title_aux": "ComfyUI-Caption_to_audio [WIP]"
+ }
+ ],
+ "https://github.com/adithis197/ComfyUI-multimodal-CaptionToVideoGen": [
+ [
+ "CaptionToMusicPromptLLM"
+ ],
+ {
+ "title_aux": "ComfyUI-multimodal-CaptionToVideoGen [WIP]"
+ }
+ ],
+ "https://github.com/aesethtics/ComfyUI-OpenPoser": [
+ [
+ "OpenPoser"
+ ],
+ {
+ "title_aux": "ComfyUI-OpenPoser [WIP]"
+ }
+ ],
+ "https://github.com/agavesunset/ComfyUI_LoRA_Tracker": [
+ [
+ "LoRAParameterOverlay"
+ ],
+ {
+ "title_aux": "ComfyUI_LoRA_Tracker"
+ }
+ ],
+ "https://github.com/agavesunset/Comfyui_SiliconFlow_AgaveSunset": [
+ [
+ "SiliconFlowLoader_AS",
+ "SiliconFlowSampler_AS"
+ ],
+ {
+ "title_aux": "Comfyui_SiliconFlow_AgaveSunset"
+ }
+ ],
+ "https://github.com/ahkimkoo/ComfyUI-OSS-Upload": [
+ [
+ "OSSAudioUploader",
+ "OSSFileUploader",
+ "OSSImageUploader",
+ "OSSVideoUploader"
+ ],
+ {
+ "title_aux": "ComfyUI-OSS-Upload [UNSAFE]"
+ }
+ ],
+ "https://github.com/ahmedbana/File-Rename": [
+ [
+ "AdvancedFileRenameNode",
+ "FileRenameNode"
+ ],
+ {
+ "title_aux": "File-Rename [UNSAFE]"
+ }
+ ],
+ "https://github.com/ahmedbana/json-creator": [
+ [
+ "JsonCreator"
+ ],
+ {
+ "title_aux": "json-creator [WIP]"
+ }
+ ],
+ "https://github.com/ahmedbana/upload-to-azure": [
+ [
+ "AzureBlobUploader"
+ ],
+ {
+ "title_aux": "upload-to-azure"
+ }
+ ],
+ "https://github.com/ai-joe-git/ComfyUI-Chatterbox": [
+ [
+ "ChatterboxLoadReferenceAudio",
+ "ChatterboxPresets",
+ "ChatterboxSaveAudio",
+ "ChatterboxTTSNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Chatterbox [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/aiden1020/ComfyUI_Artcoder": [
+ [
+ "ArtCoder"
+ ],
+ {
+ "title_aux": "ComfyUI_Artcoder [WIP]"
+ }
+ ],
+ "https://github.com/ainanoha/etm_comfyui_nodes": [
+ [
+ "ETM_LoadImageFromLocal",
+ "ETM_SaveImage"
+ ],
+ {
+ "title_aux": "etm_comfyui_nodes"
+ }
+ ],
+ "https://github.com/ajcampbell1333/BudgetGuard_Artists": [
+ [
+ "BudgetGuardNode"
+ ],
+ {
+ "title_aux": "BudgetGuard for Artists [WIP]"
+ }
+ ],
+ "https://github.com/akashch1512/ComfyUI_UguuUploader": [
+ [
+ "UguuUploader"
+ ],
+ {
+ "title_aux": "ComfyUI_UguuUploader"
+ }
+ ],
+ "https://github.com/aklevecz/ComfyUI-AutoPrompt": [
+ [
+ "OllamaChat",
+ "OllamaModelLister",
+ "OllamaPromptGenerator",
+ "TextDisplay"
+ ],
+ {
+ "title_aux": "ComfyUI-AutoPrompt [WIP]"
+ }
+ ],
+ "https://github.com/alchemist-novaro/ComfyUI-Affine-Transform": [
+ [
+ "AffineTransform"
+ ],
+ {
+ "title_aux": "Affine Transform ComfyUI Node [WIP]"
+ }
+ ],
+ "https://github.com/alchemist-novaro/ComfyUI-Simple-Image-Tools": [
+ [
+ "GetMaskFromAlpha",
+ "GetQuadrilateralOutfit"
+ ],
+ {
+ "title_aux": "ComfyUI-Simple-Image-Tools [WIP]"
+ }
+ ],
+ "https://github.com/alexgenovese/ComfyUI-Diffusion-4k": [
+ [
+ "FluxImageGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-Diffusion-4k [WIP]"
+ }
+ ],
+ "https://github.com/alexgenovese/ComfyUI-Reica": [
+ [
+ "ReicaGCPReadImageNode",
+ "ReicaGCPWriteImageNode",
+ "ReicaHTTPCustomRequest",
+ "ReicaHTTPNotification",
+ "ReicaInsertAnythingNode",
+ "ReicaLoadLoopImagesFromURLs",
+ "ReicaLoadLoopImagesFromURLsSkipErrors",
+ "ReicaReadImageUrl",
+ "ReicaSmartResizer",
+ "ReicaTextImageDisplay",
+ "ReicaTryOffDiffGenerator",
+ "ReicaTryOffDiffLoader",
+ "ReicaURLImageLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Reica"
+ }
+ ],
+ "https://github.com/alexisrolland/ComfyUI-AuraSR": [
+ [
+ "LoadAuraSR",
+ "RunAuraSR"
+ ],
+ {
+ "title_aux": "alexisrolland/ComfyUI-AuraSR"
+ }
+ ],
+ "https://github.com/alisson-anjos/ComfyUI-Workarounds": [
+ [
+ "FlowMatchAutoConfig",
+ "FlowMatchGuide",
+ "FlowMatchScheduler",
+ "FlowMatchSchedulerPresets",
+ "SkinToneColorMatch",
+ "SkinToneDetector",
+ "WA_Face3DProjection",
+ "WA_FaceLandmarkDetector",
+ "WA_FaceMaskCreator",
+ "WA_FaceRegionOptions",
+ "WA_GeometricFaceAlign",
+ "WA_ImageComposite",
+ "WA_ImageTransform",
+ "WA_PlanarFaceOverlay",
+ "WA_SkinToneColorMatch",
+ "WA_SkinToneDetector"
+ ],
+ {
+ "title_aux": "ComfyUI-Workarounds [WIP]"
+ }
+ ],
+ "https://github.com/alistairallan/ComfyUI-skin-retouch": [
+ [
+ "SkinRetouching"
+ ],
+ {
+ "title_aux": "ComfyUI-skin-retouch"
+ }
+ ],
+ "https://github.com/alt-key-project/comfyui-dream-painter": [
+ [
+ "Bitmap AND [DPaint]",
+ "Bitmap Crop Center [DPaint]",
+ "Bitmap Dimensions [DPaint]",
+ "Bitmap Edge Detect [DPaint]",
+ "Bitmap Expand Canvas [DPaint]",
+ "Bitmap Invert [DPaint]",
+ "Bitmap OR [DPaint]",
+ "Bitmap Resize [DPaint]",
+ "Bitmap Rotate [DPaint]",
+ "Bitmap To Image & Mask [DPaint]",
+ "Bitmap XOR [DPaint]",
+ "Draw Shape As Bitmap [DPaint]",
+ "Image To Bitmap [DPaint]",
+ "Random Number Generator [DPaint]",
+ "Shape Center & Fit [DPaint]",
+ "Shape Combiner [DPaint]",
+ "Shape Copycat Tool [DPaint]",
+ "Shape Find Bounds [DPaint]",
+ "Shape Flip [DPaint]",
+ "Shape Grid [DPaint]",
+ "Shape Resize [DPaint]",
+ "Shape Rotate [DPaint]",
+ "Shape of Circular Rays [DPaint]",
+ "Shape of N-Polygon [DPaint]",
+ "Shape of Rectangle [DPaint]",
+ "Shape of Star [DPaint]"
+ ],
+ {
+ "title_aux": "Dream Painter [WIP]"
+ }
+ ],
+ "https://github.com/ammahmoudi/ComfyUI-Legendary-Nodes": [
+ [
+ "Legendary Dataset Saver",
+ "Legendary Image URL Loader",
+ "Legendary Lora URL Loader"
+ ],
+ {
+ "title_aux": "ComfyUI-Legendary-Nodes"
+ }
+ ],
+ "https://github.com/anilstream/ComfyUI-NanoBananaPro": [
+ [
+ "NanoBananaBasicNode"
+ ],
+ {
+ "title_aux": "ComfyUI-NanoBananaPro"
+ }
+ ],
+ "https://github.com/animEEEmpire/ComfyUI-Animemory-Loader": [
+ [
+ "AnimemoryNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Animemory-Loader"
+ }
+ ],
+ "https://github.com/apeirography/ModelCopyNode": [
+ [
+ "ModelCopyNode"
+ ],
+ {
+ "title_aux": "Model Copy Node for ComfyUI [UNSAFE]"
+ }
+ ],
+ "https://github.com/apetitbois/nova_utils": [
+ [
+ "jsonParser"
+ ],
+ {
+ "title_aux": "nova_utils"
+ }
+ ],
+ "https://github.com/aria1th/ComfyUI-SkipCFGSigmas": [
+ [
+ "CFGControl_SKIPCFG"
+ ],
+ {
+ "title_aux": "ComfyUI-SkipCFGSigmas"
+ }
+ ],
+ "https://github.com/aria1th/ComfyUI-camietagger-onnx": [
+ [
+ "CamieTagger"
+ ],
+ {
+ "title_aux": "ComfyUI-camietagger-onnx"
+ }
+ ],
+ "https://github.com/artem-konevskikh/comfyui-split-merge-video": [
+ [
+ "VideoMerger",
+ "VideoSplitter"
+ ],
+ {
+ "title_aux": "ComfyUI Video Processing Nodes [WIP]"
+ }
+ ],
+ "https://github.com/artifyfun/ComfyUI-JS": [
+ [
+ "JavascriptExecutor",
+ "JavascriptExecutorMultiOutput"
+ ],
+ {
+ "title_aux": "ComfyUI-JS [UNSAFE]"
+ }
+ ],
+ "https://github.com/artisanalcomputing/ComfyUI-Custom-Nodes": [
+ [
+ "RandomVideoMixer",
+ "SpotifyCanvasGenerator",
+ "VideoWriter"
+ ],
+ {
+ "title_aux": "artcpu-custom-nodes"
+ }
+ ],
+ "https://github.com/asaddi/allans-comfy-nodes": [
+ [
+ "BatchImageLoader",
+ "ControlBus",
+ "DepthAnythingV2",
+ "DepthAnythingV2Model",
+ "DumpToConsole",
+ "EmptyLatentImageSelector",
+ "FlattenImageAlpha",
+ "FloatLatch",
+ "FloatList",
+ "FloatListStepSize",
+ "ImageBuffer",
+ "ImageCropSquare",
+ "ImageDimensions",
+ "ImageMaskSwitch2",
+ "ImageMaskSwitch4",
+ "ImageRouter",
+ "ImageSequenceList5",
+ "ImageSwitch2",
+ "IntegerLatch",
+ "JSONExtractNumber",
+ "JSONExtractString",
+ "LPIPSModel",
+ "LPIPSRun",
+ "ListCounter",
+ "MakeImageGrid",
+ "MaskBlur",
+ "MixNoise",
+ "ModelSwitch2",
+ "PathJoin",
+ "PathRelativeTo",
+ "PathSplit",
+ "PresetText",
+ "PrivateLoraStack",
+ "PrivateSeed",
+ "RandomCombo2",
+ "RepeatFloatList",
+ "RepeatIntList",
+ "RepeatStringList",
+ "ReproducibleWildcards",
+ "ResolutionChooser",
+ "SaveComicBookArchive",
+ "SaveTabular",
+ "SeedList",
+ "SimpleBus",
+ "StringSequenceList2",
+ "StringSequenceList5",
+ "TabularJoin",
+ "VAESwitch2",
+ "VersatileTextEncode",
+ "WDv3Model",
+ "WDv3Tagger",
+ "WriteTextImage"
+ ],
+ {
+ "title_aux": "Allan's ComfyUI nodes"
+ }
+ ],
+ "https://github.com/ashishsaini/comfyui-segment-clothing-sleeves": [
+ [
+ "segformer_b2_sleeves"
+ ],
+ {
+ "title_aux": "comfyui_segformer_b2_sleeves"
+ }
+ ],
+ "https://github.com/ashllay/ComfyUI_MoreComfy": [
+ [
+ "MC Alter Seed",
+ "MC Get Image Min Max",
+ "MC Get Image Size",
+ "MC Multi Concat",
+ "MC Multi Concat(Advanced)",
+ "MC Noise",
+ "MC Set Tile Size",
+ "MC Switch Image",
+ "MC Switch Latent",
+ "MC Switch Model",
+ "MC Switch Noise",
+ "MC Switch Seed",
+ "MC Switch String",
+ "MC Swtich Latent(Multi)",
+ "MC Swtich Sampler(Multi)",
+ "MC Swtich Sigmas(Multi)"
+ ],
+ {
+ "title_aux": "ComfyUI_MoreComfy"
+ }
+ ],
+ "https://github.com/avocadori/ComfyUI-AudioAmplitudeConverter": [
+ [
+ "NormalizeAmpToFloatNode"
+ ],
+ {
+ "title_aux": "ComfyUI Audio Amplitude Converter [WIP]"
+ }
+ ],
+ "https://github.com/ayaoayaoayaoaya/ComfyUI-KLUT-DeepSeek-API": [
+ [
+ "KLUTDeepSeekAPI"
+ ],
+ {
+ "title_aux": "ComfyUI-KLUT-DeepSeek-API [WIP]"
+ }
+ ],
+ "https://github.com/babydjac/comfyui-grok-ponyxl": [
+ [
+ "GrokPonyXLPrompter"
+ ],
+ {
+ "title_aux": "comfyui-grok-ponyxl [WIP]"
+ }
+ ],
+ "https://github.com/backearth1/Comfyui-MiniMax-Video": [
+ [
+ "ImageToPrompt",
+ "MiniMaxAIAPIClient",
+ "MiniMaxImage2Video",
+ "MiniMaxImageGenerator",
+ "MiniMaxPreviewVideo"
+ ],
+ {
+ "title_aux": "Comfyui-MiniMax-Video [WIP]"
+ }
+ ],
+ "https://github.com/bakker/BK_Utils": [
+ [
+ "DynamicGroupSwitchMulti",
+ "FileNameDefinition",
+ "FluxPromptSaver",
+ "FluxTextSampler",
+ "IsOneOfGroupsActive",
+ "ModelName",
+ "SamePixelResolutionCalculator",
+ "ZImageTurboResolutions"
+ ],
+ {
+ "title_aux": "BK_Utils [WIP]"
+ }
+ ],
+ "https://github.com/bananasss00/Comfyui-PyExec": [
+ [
+ "PyExec",
+ "PyExec_Output",
+ "PyExec_OutputIsList",
+ "PyExec_OutputIsValue"
+ ],
+ {
+ "author": "SeniorPioner",
+ "description": "Comfyui runtime python code execution",
+ "nickname": "PyExec",
+ "title": "PyExec",
+ "title_aux": "Comfyui-PyExec [UNSAFE]"
+ }
+ ],
+ "https://github.com/bandido37/comfyui-kaggle-local-save": [
+ [
+ "KaggleLocalSaveNode"
+ ],
+ {
+ "title_aux": "Kaggle ComfyUI Local Save Node [WIP]"
+ }
+ ],
+ "https://github.com/banini1841/BigModelPipe": [
+ [
+ "BigModelPipeIn",
+ "BigModelPipeOut"
+ ],
+ {
+ "title_aux": "BigModelPipe [WIP]"
+ }
+ ],
+ "https://github.com/baoanhng/ComfyUI-utils": [
+ [
+ "TextJoiner",
+ "TextSplitter"
+ ],
+ {
+ "title_aux": "ComfyUI-utils"
+ }
+ ],
+ "https://github.com/barakapa/barakapa-nodes": [
+ [
+ "brkp_ConcatenateString",
+ "brkp_ConvertToString",
+ "brkp_CountTokens",
+ "brkp_DirectoryImageCounter",
+ "brkp_SaveImage",
+ "brkp_SaveWorkflow"
+ ],
+ {
+ "title_aux": "barakapa-nodes"
+ }
+ ],
+ "https://github.com/basenc/Comfyui-EnvVarNode": [
+ [
+ "EnvVarNode"
+ ],
+ {
+ "title_aux": "ComfyUI Environment Variable Node [UNSAFE]"
+ }
+ ],
+ "https://github.com/basenc/Comfyui-Nodes-basenc": [
+ [
+ "ChatMessagesCreate",
+ "CustomOpenAIChatCompletion",
+ "EnvVarNode",
+ "Eval",
+ "JMESPathSelect",
+ "RescaleToDimensions",
+ "WanVideoSize"
+ ],
+ {
+ "title_aux": "Comfyui-Nodes-basenc [UNSAFE]"
+ }
+ ],
+ "https://github.com/benda1989/WaterMarkRemover_ComfyUI": [
+ [
+ "Remover",
+ "VideoRemover"
+ ],
+ {
+ "title_aux": "Comfyui lama remover [WIP]"
+ }
+ ],
+ "https://github.com/benmizrahi/ComfyGCS": [
+ [
+ "LoadImageGCS",
+ "SaveImageGCS"
+ ],
+ {
+ "title_aux": "ComfyGCS [WIP]"
+ }
+ ],
+ "https://github.com/beyastard/ComfyUI_BeySoft": [
+ [
+ "BeySoft"
+ ],
+ {
+ "title_aux": "ComfyUI_BeySoft"
+ }
+ ],
+ "https://github.com/bhaveek424/ComfyUI-HMNodes": [
+ [
+ "Analogizer",
+ "FFTSurgeon",
+ "HearmemanAI_Prompter",
+ "Realism_AdaptiveGrain",
+ "Realism_AutoWB",
+ "Realism_LensEffects",
+ "Realism_MicroContrast",
+ "Realism_SpectrumMatch"
+ ],
+ {
+ "title_aux": "ComfyUI-HMNodes"
+ }
+ ],
+ "https://github.com/bheins/ComfyUI-glb-to-stl": [
+ [
+ "GLBToSTLNode"
+ ],
+ {
+ "title_aux": "ComfyUI-glb-to-stl [WIP]"
+ }
+ ],
+ "https://github.com/bikiam/ComfyUi_WhisperGTranslate": [
+ [
+ "GoogleTranslateNode",
+ "WhisperAudioTranslateNode"
+ ],
+ {
+ "title_aux": "ComfyUi_WhisperGTranslate"
+ }
+ ],
+ "https://github.com/bikiam/Comfyui_AudioRecoder": [
+ [
+ "BikiAudioRecorderNode"
+ ],
+ {
+ "title_aux": "Comfyui_AudioRecoder"
+ }
+ ],
+ "https://github.com/binarystatic/ComfyUI-BinarystaticMasterSeed": [
+ [
+ "BinarystaticMasterSeed"
+ ],
+ {
+ "title_aux": "ComfyUI-BinarystaticMasterSeed"
+ }
+ ],
+ "https://github.com/birnam/ComfyUI-GenData-Pack": [
+ [
+ "Checkpoint From String \ud83d\udc69\u200d\ud83d\udcbb",
+ "Checkpoint Rerouter \ud83d\udc69\u200d\ud83d\udcbb",
+ "Checkpoint Selector Stacker \ud83d\udc69\u200d\ud83d\udcbb",
+ "Checkpoint Selector \ud83d\udc69\u200d\ud83d\udcbb",
+ "Checkpoint to String \ud83d\udc69\u200d\ud83d\udcbb",
+ "Crop Recombine \ud83d\udc69\u200d\ud83d\udcbb",
+ "Crop|IP|Inpaint|SDXL \ud83d\udc69\u200d\ud83d\udcbb",
+ "Decode GenData \ud83d\udc69\u200d\ud83d\udcbb",
+ "Encode GenData \ud83d\udc69\u200d\ud83d\udcbb",
+ "GenData Stacker \ud83d\udc69\u200d\ud83d\udcbb",
+ "IPAdapterApply",
+ "IPAdapterApplyEncoded",
+ "IPAdapterApplyFaceID",
+ "IPAdapterBatchEmbeds",
+ "IPAdapterEncoder",
+ "IPAdapterLoadEmbeds",
+ "IPAdapterModelLoader",
+ "IPAdapterSaveEmbeds",
+ "IPAdapterTilesMasked",
+ "InsightFaceLoader",
+ "LoRA Stack to String \ud83d\udc69\u200d\ud83d\udcbb",
+ "LoRA Stacker From Prompt \ud83d\udc69\u200d\ud83d\udcbb",
+ "Load Checkpoints From File \ud83d\udc69\u200d\ud83d\udcbb",
+ "Load GenData From Dir \ud83d\udc69\u200d\ud83d\udcbb",
+ "Parse GenData \ud83d\udc69\u200d\ud83d\udcbb",
+ "PrepImageForClipVision",
+ "PrepImageForInsightFace",
+ "Provide GenData \ud83d\udc69\u200d\ud83d\udcbb",
+ "Save Image From GenData \ud83d\udc69\u200d\ud83d\udcbb",
+ "VAE From String \ud83d\udc69\u200d\ud83d\udcbb",
+ "VAE to String \ud83d\udc69\u200d\ud83d\udcbb",
+ "\u00d7 Product CheckpointXGenDatas \ud83d\udc69\u200d\ud83d\udcbb"
+ ],
+ {
+ "title_aux": "Gen Data Tester [WIP]"
+ }
+ ],
+ "https://github.com/bleash-dev/Comfyui-FileSytem-Manager": [
+ [
+ "custom_nodes",
+ "web_extensions"
+ ],
+ {
+ "title_aux": "Comfyui-FileSytem-Manager"
+ }
+ ],
+ "https://github.com/blepping/comfyui_dum_samplers": [
+ [
+ "BatchMergeSampler",
+ "ButcherTableauSampler",
+ "CacheAwareEulerSampler",
+ "CyclePaddingSampler",
+ "HistorySampler",
+ "LetMeHelpYouSampler",
+ "PingPongSampler",
+ "RestlessScheduler",
+ "SimilarityAncestralEulerSampler",
+ "SimilarityClampEulerSampler"
+ ],
+ {
+ "title_aux": "ComfyUI 'dum' samplers [WIP]"
+ }
+ ],
+ "https://github.com/blueraincoatli/ComfyUI-Model-Cleaner": [
+ [
+ "InteractiveModelCleanerNode",
+ "ModelScannerNode"
+ ],
+ {
+ "title_aux": "ComfyModelCleaner [WIP]"
+ }
+ ],
+ "https://github.com/bmad4ever/comfyui_bmad_nodes": [
+ [
+ "AdaptiveThresholding",
+ "Add String To Many",
+ "AddAlpha",
+ "AdjustRect",
+ "AnyToAny",
+ "BoundingRect (contours)",
+ "BuildColorRangeAdvanced (hsv)",
+ "BuildColorRangeHSV (hsv)",
+ "CLAHE",
+ "CLIPEncodeMultiple",
+ "CLIPEncodeMultipleAdvanced",
+ "ChameleonMask",
+ "CheckpointLoader (dirty)",
+ "CheckpointLoaderSimple (dirty)",
+ "Color (RGB)",
+ "Color (hexadecimal)",
+ "Color Clip",
+ "Color Clip (advanced)",
+ "Color Clip ADE20k",
+ "ColorDictionary",
+ "ColorDictionary (custom)",
+ "Conditioning Grid (cond)",
+ "Conditioning Grid (string)",
+ "Conditioning Grid (string) Advanced",
+ "Contour To Mask",
+ "Contours",
+ "ControlNetHadamard",
+ "ControlNetHadamard (manual)",
+ "ConvertImg",
+ "CopyMakeBorder",
+ "CreateRequestMetadata",
+ "DistanceTransform",
+ "Draw Contour(s)",
+ "EqualizeHistogram",
+ "ExtendColorList",
+ "ExtendCondList",
+ "ExtendFloatList",
+ "ExtendImageList",
+ "ExtendIntList",
+ "ExtendLatentList",
+ "ExtendMaskList",
+ "ExtendModelList",
+ "ExtendStringList",
+ "FadeMaskEdges",
+ "Filter Contour",
+ "FindComplementaryColor",
+ "FindThreshold",
+ "FlatLatentsIntoSingleGrid",
+ "Framed Mask Grab Cut",
+ "Framed Mask Grab Cut 2",
+ "FromListGet1Color",
+ "FromListGet1Cond",
+ "FromListGet1Float",
+ "FromListGet1Image",
+ "FromListGet1Int",
+ "FromListGet1Latent",
+ "FromListGet1Mask",
+ "FromListGet1Model",
+ "FromListGet1String",
+ "FromListGetColors",
+ "FromListGetConds",
+ "FromListGetFloats",
+ "FromListGetImages",
+ "FromListGetInts",
+ "FromListGetLatents",
+ "FromListGetMasks",
+ "FromListGetModels",
+ "FromListGetStrings",
+ "Get Contour from list",
+ "Get Models",
+ "Get Prompt",
+ "Hue Mode (InRange hsv)",
+ "HypernetworkLoader (dirty)",
+ "ImageBatchToList",
+ "InRange (hsv)",
+ "Inpaint",
+ "Input/String to Int Array",
+ "KMeansColor",
+ "Load 64 Encoded Image",
+ "LoraLoader (dirty)",
+ "MaskGrid N KSamplers Advanced",
+ "MaskOuterBlur",
+ "Merge Latent Batch Gridwise",
+ "MonoMerge",
+ "MorphologicOperation",
+ "MorphologicSkeletoning",
+ "NaiveAutoKMeansColor",
+ "OtsuThreshold",
+ "RGB to HSV",
+ "Rect Grab Cut",
+ "Remap",
+ "RemapBarrelDistortion",
+ "RemapFromInsideParabolas",
+ "RemapFromQuadrilateral (homography)",
+ "RemapInsideParabolas",
+ "RemapInsideParabolasAdvanced",
+ "RemapPinch",
+ "RemapReverseBarrelDistortion",
+ "RemapStretch",
+ "RemapToInnerCylinder",
+ "RemapToOuterCylinder",
+ "RemapToQuadrilateral",
+ "RemapWarpPolar",
+ "Repeat Into Grid (image)",
+ "Repeat Into Grid (latent)",
+ "RequestInputs",
+ "SampleColorHSV",
+ "Save Image (api)",
+ "SeamlessClone",
+ "SeamlessClone (simple)",
+ "SetRequestStateToComplete",
+ "String",
+ "String to Float",
+ "String to Integer",
+ "ToColorList",
+ "ToCondList",
+ "ToFloatList",
+ "ToImageList",
+ "ToIntList",
+ "ToLatentList",
+ "ToMaskList",
+ "ToModelList",
+ "ToStringList",
+ "UnGridify (image)",
+ "VAEEncodeBatch"
+ ],
+ {
+ "title_aux": "Bmad Nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/bmgjet/comfyui-powerlimit": [
+ [
+ "SetPowerLimitNode"
+ ],
+ {
+ "title_aux": "ComfyUI GPU Power Limit Node"
+ }
+ ],
+ "https://github.com/boricuapab/ComfyUI-Bori-KontextPresets": [
+ [
+ "Bori Kontext Presets"
+ ],
+ {
+ "title_aux": "ComfyUI-Bori-KontextPresets [WIP]"
+ }
+ ],
+ "https://github.com/borisfaley/ComfyUI-ACES-EXR-OCIO": [
+ [
+ "ACESEXRSaveOCIO"
+ ],
+ {
+ "title_aux": "ComfyUI-ACES-EXR-OCIOr [UNSAFE]"
+ }
+ ],
+ "https://github.com/bozkut/ComfyUI-Prompt-Expander": [
+ [
+ "PromptExpanderNode",
+ "PromptExpanderSimple"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Expander [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/brace-great/comfyui-eim": [
+ [
+ "EncryptImage"
+ ],
+ {
+ "title_aux": "comfyui-eim"
+ }
+ ],
+ "https://github.com/brace-great/comfyui-mc": [
+ [
+ "IncrementCounterOnMatch"
+ ],
+ {
+ "title_aux": "comfyui-mc [WIP]"
+ }
+ ],
+ "https://github.com/brandonkish/comfyUI-extractable-text": [
+ [
+ "BK AI Text Cleaner",
+ "BK AI Text Parser",
+ "BK Add Mask Box",
+ "BK Add To JSON",
+ "BK Add To Path",
+ "BK Body Ratios",
+ "BK Bool Not",
+ "BK Bool Operation",
+ "BK Caption File Reader",
+ "BK Caption FileParser",
+ "BK Combo Tag",
+ "BK Create Mask For Image",
+ "BK Crop And Pad",
+ "BK Dynamic Checkpoints",
+ "BK Dynamic Checkpoints List",
+ "BK File Select Next Missing",
+ "BK File Select Next Unprocessed",
+ "BK File Selector",
+ "BK Get From JSON",
+ "BK Get Last Folder Name",
+ "BK Get Matching Mask",
+ "BK Get Next Caption File",
+ "BK Get Next Img Without Caption",
+ "BK Get Next Missing Caption Image",
+ "BK Get Next Missing Checkpoint",
+ "BK Image Size Test",
+ "BK Image Sync",
+ "BK Is A Greater Than B INT",
+ "BK Is A Greater Than Or Equal To B INT",
+ "BK Is A Less Than B INT",
+ "BK Is A Less Than Or Equal To B INT",
+ "BK Is Vertical Image",
+ "BK Line Counter",
+ "BK LoRA Auto Switcher",
+ "BK LoRA Test",
+ "BK LoRA Test (Advanced)",
+ "BK LoRA Test Save (Advanced)",
+ "BK Load Image",
+ "BK Load Image By Path",
+ "BK Loop Path Builder",
+ "BK Loop Status Text",
+ "BK Mask Square And Pad",
+ "BK Mask Test",
+ "BK Max Size",
+ "BK Move Or Copy File",
+ "BK Multi Read Text File",
+ "BK Next Unprocessed File In Folder",
+ "BK Next Unprocessed Image In Folder",
+ "BK Path Builder",
+ "BK Path Formatter",
+ "BK Print To Console",
+ "BK Print To Console With Boarder",
+ "BK Prompt Sync",
+ "BK Read Text File",
+ "BK Remove Any Sentences With Text",
+ "BK Remove Last Folder",
+ "BK Remove Mask At Idx",
+ "BK Remove Mask At Idx SAM3",
+ "BK Replace All Tags",
+ "BK Replace Each Tag Random",
+ "BK Sampler Options Selector",
+ "BK Save Caption Image",
+ "BK Save Image",
+ "BK Save Text File",
+ "BK String Splitter",
+ "BK TSV Header Formatter",
+ "BK TSV Loader",
+ "BK TSV Prompt Reader",
+ "BK TSV Random Prompt",
+ "BK TSV String Parser",
+ "BK TSV Tag Replacer",
+ "BK Write Text File",
+ "Convert To UTF8",
+ "Get Larger Value",
+ "Ollama Connectivity Data"
+ ],
+ {
+ "title_aux": "comfyUI-extractable-text [WIP]"
+ }
+ ],
+ "https://github.com/broumbroum/comfyui-time-system": [
+ [
+ "DayTimeNode",
+ "HourTimeNode",
+ "MinuteTimeNode",
+ "MonthTimeNode",
+ "SecondTimeNode",
+ "YearTimeNode"
+ ],
+ {
+ "title_aux": "comfyui-time-system [WIP]"
+ }
+ ],
+ "https://github.com/bruce007lee/comfyui-cleaner": [
+ [
+ "cleaner"
+ ],
+ {
+ "title_aux": "comfyui-cleaner"
+ }
+ ],
+ "https://github.com/bruce007lee/comfyui-tiny-utils": [
+ [
+ "CropImageByMask",
+ "FaceAlign",
+ "FaceAlignImageProcess",
+ "FaceAlignMaskProcess",
+ "ImageFillColorByMask",
+ "ImageSAMMask",
+ "ImageTransposeAdvance",
+ "LoadImageAdvance"
+ ],
+ {
+ "title_aux": "comfyui-tiny-utils"
+ }
+ ],
+ "https://github.com/bryanlholland1/comfyui-app-bridge": [
+ [
+ "SendToApp"
+ ],
+ {
+ "title_aux": "comfyui-app-bridge [WIP]"
+ }
+ ],
+ "https://github.com/brycegoh/comfyui-custom-nodes": [
+ [
+ "CombineTwoImageIntoOne",
+ "FillMaskedArea",
+ "MaskAreaComparisonSegment",
+ "OCRAndMask"
+ ],
+ {
+ "title_aux": "brycegoh/comfyui-custom-nodes"
+ }
+ ],
+ "https://github.com/bulldog68/ComfyUI_FMJ": [
+ [
+ "FMJCreaPrompt",
+ "FMJKontext"
+ ],
+ {
+ "title_aux": "ComfyUI_FMJ [WIP]"
+ }
+ ],
+ "https://github.com/c1660181647-hash/ComfyUI-MM-Visual-Encryption": [
+ [
+ "MM_Image_Decrypt",
+ "MM_Image_Encrypt",
+ "MM_Video_Decrypt",
+ "MM_Video_Encrypt"
+ ],
+ {
+ "title_aux": "ComfyUI-MM-Visual-Encryption"
+ }
+ ],
+ "https://github.com/casterpollux/ComfyUI-USO": [
+ [
+ "USOImageEncoder",
+ "USOLatentToImage",
+ "USOModelLoader",
+ "USOSampler"
+ ],
+ {
+ "title_aux": "ComfyUI USO Custom Node [WIP]"
+ }
+ ],
+ "https://github.com/catboxanon/ComfyUI-Pixelsmith": [
+ [
+ "Pixelsmith"
+ ],
+ {
+ "title_aux": "ComfyUI-Pixelsmith [WIP]"
+ }
+ ],
+ "https://github.com/cedarconnor/ComfyUI-DAP": [
+ [
+ "DAP_BatchFromFolder",
+ "DAP_Inference",
+ "DAP_SaveDepthBatch",
+ "DAP_Setup"
+ ],
+ {
+ "title_aux": "ComfyUI-DAP [UNSAFE/NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/cedarconnor/ComfyUI-HunyuanWorld-Mirror": [
+ [
+ "HWMInference",
+ "LoadHunyuanWorldMirrorModel",
+ "PreprocessImagesForHWM",
+ "Save3DGaussians",
+ "SaveCOLMAPReconstruction",
+ "SaveCameraParams",
+ "SaveDepthMap",
+ "SavePointCloud",
+ "View3DInBrowser",
+ "VisualizeDepth",
+ "VisualizeNormals"
+ ],
+ {
+ "title_aux": "HunyuanWorld-Mirror ComfyUI Node Pack [WIP]"
+ }
+ ],
+ "https://github.com/cedarconnor/ComfyUI_MotionTransfer": [
+ [
+ "AdaptiveTessellate",
+ "BarycentricWarp",
+ "BidirectionalFlowExtractor",
+ "DepthEstimator",
+ "FlowSRRefine",
+ "FlowToSTMap",
+ "HiResWriter",
+ "MeshBuilder2D",
+ "MeshFromCoTracker",
+ "ProxyReprojector",
+ "RAFTFlowExtractor",
+ "SequentialMotionTransfer",
+ "TemporalConsistency",
+ "TileWarp16K"
+ ],
+ {
+ "title_aux": "ComfyUI Motion Transfer Pack [WIP]"
+ }
+ ],
+ "https://github.com/celll1/cel_sampler": [
+ [
+ "latent_tracker"
+ ],
+ {
+ "title_aux": "cel_sampler [WIP]"
+ }
+ ],
+ "https://github.com/cesilk10/cesilk-comfyui-nodes": [
+ [
+ "CESILK_OpenAIChat",
+ "CESILK_OpenAIImageBatchGenerator",
+ "CESILK_OpenAIImageDescriptionToTextfile",
+ "CESILK_SaveAndUploadToGoogleDrive",
+ "CESILK_SaveAndUploadToS3",
+ "CESILK_SdxlImageSizes"
+ ],
+ {
+ "title_aux": "cesilk-comfyui-nodes"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-mobvoi-openapi": [
+ [
+ "HtmlViewer",
+ "MobvoiOpenapiMetamanAudio",
+ "MobvoiOpenapiMetamanText",
+ "MobvoiOpenapiTts",
+ "OssUploadAudio",
+ "OssUploadImage"
+ ],
+ {
+ "title_aux": "ComfyUI-mobvoi-openapi"
+ }
+ ],
+ "https://github.com/charlierz/comfyui-charlierz": [
+ [
+ "BackgroundColor",
+ "ScaleDimensions"
+ ],
+ {
+ "title_aux": "comfyui-charlierz"
+ }
+ ],
+ "https://github.com/chengzeyi/Comfy-WaveSpeed": [
+ [
+ "ApplyFBCacheOnModel",
+ "EnhancedCompileModel",
+ "EnhancedLoadDiffusionModel",
+ "VelocatorCompileModel",
+ "VelocatorLoadAndQuantizeClip",
+ "VelocatorLoadAndQuantizeDiffusionModel",
+ "VelocatorQuantizeModel"
+ ],
+ {
+ "title_aux": "Comfy-WaveSpeed [WIP]"
+ }
+ ],
+ "https://github.com/chenpipi0807/ComfyUI-InstantCharacterFlux": [
+ [
+ "EncodeRefImageIC",
+ "ICFluxOneKnob",
+ "ICStrengthController",
+ "LoadDINOv2Vision",
+ "LoadICWeights",
+ "LoadSigLIPVision"
+ ],
+ {
+ "title_aux": "ComfyUI-InstantCharacterFlux [WIP]"
+ }
+ ],
+ "https://github.com/ches2010/comfyui_aliyundrive_uploader": [
+ [
+ "AliyunDriveCloudUploadNode",
+ "AliyunDriveOptimizedUploadNode",
+ "AliyunDriveUploadNode",
+ "SimpleUploadToAliyunDrive",
+ "UploadTo115",
+ "UploadToAliyunDrive",
+ "UploadToOSSNode"
+ ],
+ {
+ "title_aux": "comfyui_aliyundrive_uploader"
+ }
+ ],
+ "https://github.com/chetusangolgi/Comfyui-supabase": [
+ [
+ "SupabaseAudioUploader",
+ "SupabaseGLBUploader",
+ "SupabaseImageUploader",
+ "SupabaseTableWatcherNode"
+ ],
+ {
+ "title_aux": "Comfyui-supabase"
+ }
+ ],
+ "https://github.com/christian-byrne/infinite-zoom-parallax-nodes": [
+ [
+ "Create Parallax Video",
+ "Layer Shifter for Parallax Outpainting",
+ "Load Parallax Frame",
+ "Parallax Config",
+ "Save Parallax Frame",
+ "Shrink and Pad for Outpainting"
+ ],
+ {
+ "title_aux": "\ud83c\udf0c Infinite Parallax Nodes [WIP]"
+ }
+ ],
+ "https://github.com/christian-byrne/python-interpreter-node": [
+ [
+ "Exec Python Code Script"
+ ],
+ {
+ "title_aux": "Python Interpreter ComfyUI Node [UNSAFE]"
+ }
+ ],
+ "https://github.com/chuge26/ComfyUI_seal_migration": [
+ [
+ "PDFLoader",
+ "PDFSaver",
+ "SealMigration"
+ ],
+ {
+ "title_aux": "ComfyUI_seal_migration [WIP]"
+ }
+ ],
+ "https://github.com/cidiro/cid-node-pack": [
+ [
+ "CidAnyBuffer",
+ "CidAnySync",
+ "CidLoadImageFromDir",
+ "CidSaveImage",
+ "CidWildcardProcessor"
+ ],
+ {
+ "title_aux": "cid-node-pack"
+ }
+ ],
+ "https://github.com/ciga2011/ComfyUI-AppGen": [
+ [
+ "AG_APP_EDIT",
+ "AG_APP_GEN",
+ "AG_APP_SANDBOX",
+ "AG_CODER_LLM"
+ ],
+ {
+ "title_aux": "ComfyUI-AppGen [UNSAFE]"
+ }
+ ],
+ "https://github.com/clcimir/FileTo64": [
+ [
+ "FileToBase641"
+ ],
+ {
+ "title_aux": "FileTo64"
+ }
+ ],
+ "https://github.com/clubmate/comfyui-boll-nodes": [
+ [
+ "GetLastImage",
+ "RemoveLastImage",
+ "WANConfig"
+ ],
+ {
+ "title_aux": "comfyui-boll-nodes"
+ }
+ ],
+ "https://github.com/colorAi/comfyui-prompt-manager": [
+ [
+ "PromptManagerNode"
+ ],
+ {
+ "title_aux": "comfyui-prompt-manager [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/comfyanonymous/ComfyUI": [
+ [
+ "APG",
+ "AddNoise",
+ "AlignYourStepsScheduler",
+ "AudioAdjustVolume",
+ "AudioConcat",
+ "AudioEncoderEncode",
+ "AudioEncoderLoader",
+ "AudioMerge",
+ "AutogrowNamesTestNode",
+ "AutogrowPrefixTestNode",
+ "BasicGuider",
+ "BasicScheduler",
+ "BatchImagesMasksLatentsNode",
+ "BatchImagesNode",
+ "BatchLatentsNode",
+ "BatchMasksNode",
+ "BetaSamplingScheduler",
+ "BriaImageEditNode",
+ "ByteDanceFirstLastFrameNode",
+ "ByteDanceImageNode",
+ "ByteDanceImageReferenceNode",
+ "ByteDanceImageToVideoNode",
+ "ByteDanceSeedreamNode",
+ "ByteDanceTextToVideoNode",
+ "CFGGuider",
+ "CFGNorm",
+ "CFGZeroStar",
+ "CLIPAttentionMultiply",
+ "CLIPLoader",
+ "CLIPMergeAdd",
+ "CLIPMergeSimple",
+ "CLIPMergeSubtract",
+ "CLIPSave",
+ "CLIPSetLastLayer",
+ "CLIPTextEncode",
+ "CLIPTextEncodeControlnet",
+ "CLIPTextEncodeFlux",
+ "CLIPTextEncodeHiDream",
+ "CLIPTextEncodeHunyuanDiT",
+ "CLIPTextEncodeKandinsky5",
+ "CLIPTextEncodeLumina2",
+ "CLIPTextEncodePixArtAlpha",
+ "CLIPTextEncodeSD3",
+ "CLIPTextEncodeSDXL",
+ "CLIPTextEncodeSDXLRefiner",
+ "CLIPVisionEncode",
+ "CLIPVisionLoader",
+ "Canny",
+ "CaseConverter",
+ "CheckpointLoader",
+ "CheckpointLoaderSimple",
+ "CheckpointSave",
+ "ChromaRadianceOptions",
+ "ColorToRGBInt",
+ "ComboOptionTestNode",
+ "ComfySoftSwitchNode",
+ "ComfySwitchNode",
+ "ConditioningAverage",
+ "ConditioningCombine",
+ "ConditioningConcat",
+ "ConditioningSetArea",
+ "ConditioningSetAreaPercentage",
+ "ConditioningSetAreaPercentageVideo",
+ "ConditioningSetAreaStrength",
+ "ConditioningSetMask",
+ "ConditioningSetTimestepRange",
+ "ConditioningStableAudio",
+ "ConditioningZeroOut",
+ "ContextWindowsManual",
+ "ControlNetApply",
+ "ControlNetApplyAdvanced",
+ "ControlNetApplySD3",
+ "ControlNetInpaintingAliMamaApply",
+ "ControlNetLoader",
+ "ConvertStringToComboNode",
+ "CosmosImageToVideoLatent",
+ "CosmosPredict2ImageToVideoLatent",
+ "CreateList",
+ "CreateVideo",
+ "CropMask",
+ "CustomCombo",
+ "DCTestNode",
+ "DiffControlNetLoader",
+ "DifferentialDiffusion",
+ "DiffusersLoader",
+ "DisableNoise",
+ "DualCFGGuider",
+ "DualCLIPLoader",
+ "EasyCache",
+ "EmptyAceStep1.5LatentAudio",
+ "EmptyAceStepLatentAudio",
+ "EmptyAudio",
+ "EmptyChromaRadianceLatentImage",
+ "EmptyCosmosLatentVideo",
+ "EmptyFlux2LatentImage",
+ "EmptyHunyuanImageLatent",
+ "EmptyHunyuanLatentVideo",
+ "EmptyImage",
+ "EmptyLTXVLatentVideo",
+ "EmptyLatentAudio",
+ "EmptyLatentHunyuan3Dv2",
+ "EmptyLatentImage",
+ "EmptyMochiLatentVideo",
+ "EmptyQwenImageLayeredLatentImage",
+ "EmptySD3LatentImage",
+ "Epsilon Scaling",
+ "ExponentialScheduler",
+ "ExtendIntermediateSigmas",
+ "FeatherMask",
+ "FlipSigmas",
+ "Flux2ProImageNode",
+ "Flux2Scheduler",
+ "FluxDisableGuidance",
+ "FluxGuidance",
+ "FluxKontextImageScale",
+ "FluxKontextMultiReferenceLatentMethod",
+ "FluxKontextProImageNode",
+ "FluxProExpandNode",
+ "FluxProFillNode",
+ "FluxProUltraImageNode",
+ "FreSca",
+ "FreeU",
+ "FreeU_V2",
+ "GITSScheduler",
+ "GLIGENLoader",
+ "GLIGENTextBoxApply",
+ "GeminiImage2Node",
+ "GeminiImageNode",
+ "GeminiInputFiles",
+ "GeminiNode",
+ "GenerateTracks",
+ "GetImageSize",
+ "GetVideoComponents",
+ "GrokImageEditNode",
+ "GrokImageNode",
+ "GrokVideoEditNode",
+ "GrokVideoNode",
+ "GrowMask",
+ "HitPawGeneralImageEnhance",
+ "HitPawVideoEnhance",
+ "Hunyuan3Dv2Conditioning",
+ "Hunyuan3Dv2ConditioningMultiView",
+ "HunyuanImageToVideo",
+ "HunyuanRefinerLatent",
+ "HunyuanVideo15ImageToVideo",
+ "HunyuanVideo15LatentUpscaleWithModel",
+ "HunyuanVideo15SuperResolution",
+ "HyperTile",
+ "HypernetworkLoader",
+ "IdeogramV1",
+ "IdeogramV2",
+ "IdeogramV3",
+ "ImageAddNoise",
+ "ImageBatch",
+ "ImageBlend",
+ "ImageBlur",
+ "ImageColorToMask",
+ "ImageCompare",
+ "ImageCompositeMasked",
+ "ImageCrop",
+ "ImageFlip",
+ "ImageFromBatch",
+ "ImageInvert",
+ "ImageOnlyCheckpointLoader",
+ "ImageOnlyCheckpointSave",
+ "ImagePadForOutpaint",
+ "ImageProcessingNode",
+ "ImageQuantize",
+ "ImageRGBToYUV",
+ "ImageRotate",
+ "ImageScale",
+ "ImageScaleBy",
+ "ImageScaleToMaxDimension",
+ "ImageScaleToTotalPixels",
+ "ImageSharpen",
+ "ImageStitch",
+ "ImageToMask",
+ "ImageUpscaleWithModel",
+ "ImageYUVToRGB",
+ "InpaintModelConditioning",
+ "InstructPixToPixConditioning",
+ "InvertBooleanNode",
+ "InvertMask",
+ "JoinAudioChannels",
+ "JoinImageWithAlpha",
+ "KSampler",
+ "KSamplerAdvanced",
+ "KSamplerSelect",
+ "Kandinsky5ImageToVideo",
+ "KarrasScheduler",
+ "KlingCameraControlI2VNode",
+ "KlingCameraControlT2VNode",
+ "KlingCameraControls",
+ "KlingDualCharacterVideoEffectNode",
+ "KlingImage2VideoNode",
+ "KlingImageGenerationNode",
+ "KlingImageToVideoWithAudio",
+ "KlingLipSyncAudioToVideoNode",
+ "KlingLipSyncTextToVideoNode",
+ "KlingMotionControl",
+ "KlingOmniProEditVideoNode",
+ "KlingOmniProFirstLastFrameNode",
+ "KlingOmniProImageNode",
+ "KlingOmniProImageToVideoNode",
+ "KlingOmniProTextToVideoNode",
+ "KlingOmniProVideoToVideoNode",
+ "KlingSingleImageVideoEffectNode",
+ "KlingStartEndFrameNode",
+ "KlingTextToVideoNode",
+ "KlingTextToVideoWithAudio",
+ "KlingVideoExtendNode",
+ "KlingVirtualTryOnNode",
+ "LTXAVTextEncoderLoader",
+ "LTXVAddGuide",
+ "LTXVAudioVAEDecode",
+ "LTXVAudioVAEEncode",
+ "LTXVAudioVAELoader",
+ "LTXVConcatAVLatent",
+ "LTXVConditioning",
+ "LTXVCropGuides",
+ "LTXVEmptyLatentAudio",
+ "LTXVImgToVideo",
+ "LTXVImgToVideoInplace",
+ "LTXVLatentUpsampler",
+ "LTXVPreprocess",
+ "LTXVScheduler",
+ "LTXVSeparateAVLatent",
+ "LaplaceScheduler",
+ "LatentAdd",
+ "LatentApplyOperation",
+ "LatentApplyOperationCFG",
+ "LatentBatch",
+ "LatentBatchSeedBehavior",
+ "LatentBlend",
+ "LatentComposite",
+ "LatentCompositeMasked",
+ "LatentConcat",
+ "LatentCrop",
+ "LatentCut",
+ "LatentCutToBatch",
+ "LatentFlip",
+ "LatentFromBatch",
+ "LatentInterpolate",
+ "LatentMultiply",
+ "LatentOperationSharpen",
+ "LatentOperationTonemapReinhard",
+ "LatentRotate",
+ "LatentSubtract",
+ "LatentUpscale",
+ "LatentUpscaleBy",
+ "LatentUpscaleModelLoader",
+ "LazyCache",
+ "Load3D",
+ "LoadAudio",
+ "LoadImage",
+ "LoadImageDataSetFromFolder",
+ "LoadImageMask",
+ "LoadImageOutput",
+ "LoadImageTextDataSetFromFolder",
+ "LoadLatent",
+ "LoadTrainingDataset",
+ "LoadVideo",
+ "LoraLoader",
+ "LoraLoaderBypass",
+ "LoraLoaderBypassModelOnly",
+ "LoraLoaderModelOnly",
+ "LoraModelLoader",
+ "LoraSave",
+ "LossGraphNode",
+ "LotusConditioning",
+ "LtxvApiImageToVideo",
+ "LtxvApiTextToVideo",
+ "LumaConceptsNode",
+ "LumaImageModifyNode",
+ "LumaImageNode",
+ "LumaImageToVideoNode",
+ "LumaReferenceNode",
+ "LumaVideoNode",
+ "MagnificImageRelightNode",
+ "MagnificImageSkinEnhancerNode",
+ "MagnificImageStyleTransferNode",
+ "MagnificImageUpscalerCreativeNode",
+ "MagnificImageUpscalerPreciseV2Node",
+ "Mahiro",
+ "MakeTrainingDataset",
+ "ManualSigmas",
+ "MaskComposite",
+ "MaskPreview",
+ "MaskToImage",
+ "MeshyAnimateModelNode",
+ "MeshyImageToModelNode",
+ "MeshyMultiImageToModelNode",
+ "MeshyRefineNode",
+ "MeshyRigModelNode",
+ "MeshyTextToModelNode",
+ "MeshyTextureNode",
+ "MinimaxHailuoVideoNode",
+ "MinimaxImageToVideoNode",
+ "MinimaxSubjectToVideoNode",
+ "MinimaxTextToVideoNode",
+ "ModelComputeDtype",
+ "ModelMergeAdd",
+ "ModelMergeAuraflow",
+ "ModelMergeBlocks",
+ "ModelMergeCosmos14B",
+ "ModelMergeCosmos7B",
+ "ModelMergeCosmosPredict2_14B",
+ "ModelMergeCosmosPredict2_2B",
+ "ModelMergeFlux1",
+ "ModelMergeLTXV",
+ "ModelMergeMochiPreview",
+ "ModelMergeQwenImage",
+ "ModelMergeSD1",
+ "ModelMergeSD2",
+ "ModelMergeSD35_Large",
+ "ModelMergeSD3_2B",
+ "ModelMergeSDXL",
+ "ModelMergeSimple",
+ "ModelMergeSubtract",
+ "ModelMergeWAN2_1",
+ "ModelPatchLoader",
+ "ModelSamplingAuraFlow",
+ "ModelSamplingContinuousEDM",
+ "ModelSamplingContinuousV",
+ "ModelSamplingDiscrete",
+ "ModelSamplingFlux",
+ "ModelSamplingLTXV",
+ "ModelSamplingSD3",
+ "ModelSamplingStableCascade",
+ "ModelSave",
+ "MoonvalleyImg2VideoNode",
+ "MoonvalleyTxt2VideoNode",
+ "MoonvalleyVideo2VideoNode",
+ "Morphology",
+ "NormalizeVideoLatentStart",
+ "OpenAIChatConfig",
+ "OpenAIChatNode",
+ "OpenAIDalle2",
+ "OpenAIDalle3",
+ "OpenAIGPTImage1",
+ "OpenAIInputFiles",
+ "OpenAIVideoSora2",
+ "OptimalStepsScheduler",
+ "PatchModelAddDownscale",
+ "PerpNeg",
+ "PerpNegGuider",
+ "PerturbedAttentionGuidance",
+ "PhotoMakerEncode",
+ "PhotoMakerLoader",
+ "PixverseImageToVideoNode",
+ "PixverseTemplateNode",
+ "PixverseTextToVideoNode",
+ "PixverseTransitionVideoNode",
+ "PolyexponentialScheduler",
+ "PorterDuffImageComposite",
+ "Preview3D",
+ "PreviewAny",
+ "PreviewAudio",
+ "PreviewImage",
+ "PrimitiveBoolean",
+ "PrimitiveFloat",
+ "PrimitiveInt",
+ "PrimitiveString",
+ "PrimitiveStringMultiline",
+ "QuadrupleCLIPLoader",
+ "QwenImageDiffsynthControlnet",
+ "RandomNoise",
+ "RebatchImages",
+ "RebatchLatents",
+ "RecordAudio",
+ "RecraftColorRGB",
+ "RecraftControls",
+ "RecraftCreateStyleNode",
+ "RecraftCrispUpscaleNode",
+ "RecraftImageInpaintingNode",
+ "RecraftImageToImageNode",
+ "RecraftRemoveBackgroundNode",
+ "RecraftReplaceBackgroundNode",
+ "RecraftStyleV3InfiniteStyleLibrary",
+ "RecraftStyleV3RealisticImage",
+ "RecraftTextToImageNode",
+ "RecraftTextToVectorNode",
+ "RecraftVectorizeImageNode",
+ "ReferenceLatent",
+ "ReferenceTimbreAudio",
+ "RegexExtract",
+ "RegexMatch",
+ "RegexReplace",
+ "RenormCFG",
+ "RepeatImageBatch",
+ "RepeatLatentBatch",
+ "ReplaceVideoLatentFrames",
+ "RescaleCFG",
+ "ResizeAndPadImage",
+ "ResizeImageMaskNode",
+ "ResolutionBucket",
+ "Rodin3D_Detail",
+ "Rodin3D_Gen2",
+ "Rodin3D_Regular",
+ "Rodin3D_Sketch",
+ "Rodin3D_Smooth",
+ "RunwayFirstLastFrameNode",
+ "RunwayImageToVideoNodeGen3a",
+ "RunwayImageToVideoNodeGen4",
+ "RunwayTextToImageNode",
+ "SDTurboScheduler",
+ "SD_4XUpscale_Conditioning",
+ "SV3D_Conditioning",
+ "SVD_img2vid_Conditioning",
+ "SamplerCustom",
+ "SamplerCustomAdvanced",
+ "SamplerDPMAdaptative",
+ "SamplerDPMPP_2M_SDE",
+ "SamplerDPMPP_2S_Ancestral",
+ "SamplerDPMPP_3M_SDE",
+ "SamplerDPMPP_SDE",
+ "SamplerER_SDE",
+ "SamplerEulerAncestral",
+ "SamplerEulerAncestralCFGPP",
+ "SamplerEulerCFGpp",
+ "SamplerLCMUpscale",
+ "SamplerLMS",
+ "SamplerSASolver",
+ "SamplerSEEDS2",
+ "SamplingPercentToSigma",
+ "SaveAnimatedPNG",
+ "SaveAnimatedWEBP",
+ "SaveAudio",
+ "SaveAudioMP3",
+ "SaveAudioOpus",
+ "SaveGLB",
+ "SaveImage",
+ "SaveImageDataSetToFolder",
+ "SaveImageTextDataSetToFolder",
+ "SaveImageWebsocket",
+ "SaveLatent",
+ "SaveLoRA",
+ "SaveSVGNode",
+ "SaveTrainingDataset",
+ "SaveVideo",
+ "SaveWEBM",
+ "ScaleROPE",
+ "SelfAttentionGuidance",
+ "SetFirstSigma",
+ "SetLatentNoiseMask",
+ "SetUnionControlNetType",
+ "ShuffleImageTextDataset",
+ "SkipLayerGuidanceDiT",
+ "SkipLayerGuidanceDiTSimple",
+ "SkipLayerGuidanceSD3",
+ "SolidMask",
+ "SplitAudioChannels",
+ "SplitImageWithAlpha",
+ "SplitSigmas",
+ "SplitSigmasDenoise",
+ "StabilityAudioInpaint",
+ "StabilityAudioToAudio",
+ "StabilityStableImageSD_3_5Node",
+ "StabilityStableImageUltraNode",
+ "StabilityTextToAudio",
+ "StabilityUpscaleConservativeNode",
+ "StabilityUpscaleCreativeNode",
+ "StabilityUpscaleFastNode",
+ "StableCascade_EmptyLatentImage",
+ "StableCascade_StageB_Conditioning",
+ "StableCascade_StageC_VAEEncode",
+ "StableCascade_SuperResolutionControlnet",
+ "StableZero123_Conditioning",
+ "StableZero123_Conditioning_Batched",
+ "StringCompare",
+ "StringConcatenate",
+ "StringContains",
+ "StringLength",
+ "StringReplace",
+ "StringSubstring",
+ "StringTrim",
+ "StubConstantImage",
+ "StubFloat",
+ "StubImage",
+ "StubInt",
+ "StubMask",
+ "StyleModelApply",
+ "StyleModelLoader",
+ "T5TokenizerOptions",
+ "TCFG",
+ "TemporalScoreRescaling",
+ "TencentImageToModelNode",
+ "TencentTextToModelNode",
+ "TestAccumulateNode",
+ "TestAccumulationGetItemNode",
+ "TestAccumulationGetLengthNode",
+ "TestAccumulationHeadNode",
+ "TestAccumulationSetItemNode",
+ "TestAccumulationTailNode",
+ "TestAccumulationToListNode",
+ "TestAsyncBatchProcessing",
+ "TestAsyncConcurrentLimit",
+ "TestAsyncError",
+ "TestAsyncLazyCheck",
+ "TestAsyncProgressUpdate",
+ "TestAsyncResourceUser",
+ "TestAsyncTimeout",
+ "TestAsyncValidation",
+ "TestAsyncValidationError",
+ "TestBoolOperationNode",
+ "TestCustomIsChanged",
+ "TestCustomValidation1",
+ "TestCustomValidation2",
+ "TestCustomValidation3",
+ "TestCustomValidation4",
+ "TestCustomValidation5",
+ "TestDynamicAsyncGeneration",
+ "TestDynamicDependencyCycle",
+ "TestExecutionBlocker",
+ "TestFloatConditions",
+ "TestForLoopClose",
+ "TestForLoopOpen",
+ "TestIntConditions",
+ "TestIntMathOperation",
+ "TestIsChangedWithConstants",
+ "TestLazyMixImages",
+ "TestListToAccumulationNode",
+ "TestMakeListNode",
+ "TestMixedExpansionReturns",
+ "TestOutputNodeWithSocketOutput",
+ "TestParallelSleep",
+ "TestSamplingInExpansion",
+ "TestSleep",
+ "TestStringConditions",
+ "TestSyncError",
+ "TestSyncProgressUpdate",
+ "TestToBoolNode",
+ "TestVariadicAverage",
+ "TestWhileLoopClose",
+ "TestWhileLoopOpen",
+ "TextEncodeAceStepAudio",
+ "TextEncodeAceStepAudio1.5",
+ "TextEncodeHunyuanVideo_ImageToVideo",
+ "TextEncodeQwenImageEdit",
+ "TextEncodeQwenImageEditPlus",
+ "TextEncodeZImageOmni",
+ "TextProcessingNode",
+ "ThresholdMask",
+ "TomePatchModel",
+ "TopazImageEnhance",
+ "TopazVideoEnhance",
+ "TorchCompileModel",
+ "TrainLoraNode",
+ "TrimAudioDuration",
+ "TrimVideoLatent",
+ "TripleCLIPLoader",
+ "TripoConversionNode",
+ "TripoImageToModelNode",
+ "TripoMultiviewToModelNode",
+ "TripoRefineNode",
+ "TripoRetargetNode",
+ "TripoRigNode",
+ "TripoTextToModelNode",
+ "TripoTextureNode",
+ "UNETLoader",
+ "UNetCrossAttentionMultiply",
+ "UNetSelfAttentionMultiply",
+ "UNetTemporalAttentionMultiply",
+ "USOStyleReference",
+ "UpscaleModelLoader",
+ "VAEDecode",
+ "VAEDecodeAudio",
+ "VAEDecodeAudioTiled",
+ "VAEDecodeHunyuan3D",
+ "VAEDecodeTiled",
+ "VAEEncode",
+ "VAEEncodeAudio",
+ "VAEEncodeForInpaint",
+ "VAEEncodeTiled",
+ "VAELoader",
+ "VAESave",
+ "VPScheduler",
+ "Veo3FirstLastFrameNode",
+ "VeoVideoGenerationNode",
+ "VideoLinearCFGGuidance",
+ "VideoTriangleCFGGuidance",
+ "Vidu2ImageToVideoNode",
+ "Vidu2ReferenceVideoNode",
+ "Vidu2StartEndToVideoNode",
+ "Vidu2TextToVideoNode",
+ "Vidu3ImageToVideoNode",
+ "Vidu3TextToVideoNode",
+ "ViduExtendVideoNode",
+ "ViduImageToVideoNode",
+ "ViduMultiFrameVideoNode",
+ "ViduReferenceVideoNode",
+ "ViduStartEndToVideoNode",
+ "ViduTextToVideoNode",
+ "VoxelToMesh",
+ "VoxelToMeshBasic",
+ "Wan22FunControlToVideo",
+ "Wan22ImageToVideoLatent",
+ "WanAnimateToVideo",
+ "WanCameraEmbedding",
+ "WanCameraImageToVideo",
+ "WanFirstLastFrameToVideo",
+ "WanFunControlToVideo",
+ "WanFunInpaintToVideo",
+ "WanHuMoImageToVideo",
+ "WanImageToImageApi",
+ "WanImageToVideo",
+ "WanImageToVideoApi",
+ "WanInfiniteTalkToVideo",
+ "WanMoveConcatTrack",
+ "WanMoveTrackToVideo",
+ "WanMoveTracksFromCoords",
+ "WanMoveVisualizeTracks",
+ "WanPhantomSubjectToVideo",
+ "WanReferenceVideoApi",
+ "WanSoundImageToVideo",
+ "WanSoundImageToVideoExtend",
+ "WanTextToImageApi",
+ "WanTextToVideoApi",
+ "WanTrackToVideo",
+ "WanVaceToVideo",
+ "WavespeedFlashVSRNode",
+ "WavespeedImageUpscaleNode",
+ "WebcamCapture",
+ "ZImageFunControlnet",
+ "unCLIPCheckpointLoader",
+ "unCLIPConditioning",
+ "wanBlockSwap"
+ ],
+ {
+ "title_aux": "ComfyUI"
+ }
+ ],
+ "https://github.com/comfyanonymous/ComfyUI_bitsandbytes_NF4": [
+ [
+ "CheckpointLoaderNF4"
+ ],
+ {
+ "title_aux": "ComfyUI_bitsandbytes_NF4 [EXPERIMENTAL]"
+ }
+ ],
+ "https://github.com/comfypod/ComfyUI-Comflow": [
+ [
+ "ComflowInputBoolean",
+ "ComflowInputCheckpoint",
+ "ComflowInputImage",
+ "ComflowInputImageAlpha",
+ "ComflowInputImageBatch",
+ "ComflowInputLora",
+ "ComflowInputNumber",
+ "ComflowInputNumberInt",
+ "ComflowInputNumberSlider",
+ "ComflowInputText",
+ "ComflowInputVid",
+ "ComflowInputVideo",
+ "ComflowWebsocketImageInput",
+ "ComflowWebsocketImageOutput"
+ ],
+ {
+ "description": "",
+ "nickname": "Comflow",
+ "title": "comflow",
+ "title_aux": "ComfyUI-Comflow"
+ }
+ ],
+ "https://github.com/comfyscript/ComfyUI-CloudClient": [
+ [
+ "ClientImageCompressorNode",
+ "ClientImageDownloadNode",
+ "ClientVideoDownloadNode",
+ "ServerMemoryImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI-CloudClient"
+ }
+ ],
+ "https://github.com/comfyuiblog/deepseek_prompt_generator_comfyui": [
+ [
+ "DeepSeek_Prompt_Generator"
+ ],
+ {
+ "title_aux": "deepseek_prompt_generator_comfyui [WIP]"
+ }
+ ],
+ "https://github.com/content-and-code/ComfyUI-SimpleCSVParse": [
+ [
+ "SimpleCSVParser"
+ ],
+ {
+ "title_aux": "Simple CSV Parser [UNSAFE]"
+ }
+ ],
+ "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions": [
+ [
+ "BetterImageDimensions",
+ "PureRatio",
+ "SDXLDimensions"
+ ],
+ {
+ "title_aux": "ComfyUI-Better-Dimensions"
+ }
+ ],
+ "https://github.com/crimro-se/ComfyUI-CascadedGaze": [
+ [
+ "CGDenoiseImage",
+ "CGDenoiseModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-CascadedGaze"
+ }
+ ],
+ "https://github.com/ctf05/ComfyUI-AudioDuration": [
+ [
+ "SimpleAudioDuration",
+ "SimpleAudioOverlay"
+ ],
+ {
+ "title_aux": "ComfyUI-AudioDuration"
+ }
+ ],
+ "https://github.com/danieljanata/ComfyUI-phone_compression_ultimate": [
+ [
+ "PhoneCompressionUltimate"
+ ],
+ {
+ "title_aux": "ComfyUI-phone_compression_ultimate [WIP]"
+ }
+ ],
+ "https://github.com/daracazamea/comfyUI-DCNodes": [
+ [
+ "FluxResolutionPicker",
+ "GetGenerationTime",
+ "ManualTrigger",
+ "SDXLResolutionPicker",
+ "StartTimerPassThrough"
+ ],
+ {
+ "title_aux": "DCNodess [WIP]"
+ }
+ ],
+ "https://github.com/dcduanchao/comfyui_video_http": [
+ [
+ "Translator Node",
+ "Video Upload Node"
+ ],
+ {
+ "title_aux": "comfyui_video_http"
+ }
+ ],
+ "https://github.com/dead-matrix/ComfyUI-RMBG-Custom": [
+ [
+ "RMBG_Custom"
+ ],
+ {
+ "title_aux": "ComfyUI-RMBG-Custom"
+ }
+ ],
+ "https://github.com/denislov/Comfyui_AutoSurvey": [
+ [
+ "AddDoc2Knowledge",
+ "AutoSurvey",
+ "ChatModel",
+ "ComfyMilvus",
+ "ComfyWeaviate",
+ "ManageDatabase",
+ "MilvusScheme",
+ "MsField",
+ "QueryKnowledge",
+ "WcProperty",
+ "WcPropertyComb",
+ "WriteOutline",
+ "WriteSection"
+ ],
+ {
+ "title_aux": "Comfyui_AutoSurvey"
+ }
+ ],
+ "https://github.com/devzeroLL/comfyui-lxj-Node": [
+ [
+ "lxj_ImageBatch14",
+ "lxj_TextBatch14"
+ ],
+ {
+ "title_aux": "comfyui-lxj-Node"
+ }
+ ],
+ "https://github.com/dexintenebri/comfyui_voxel_nodes": [
+ [
+ "AutoVoxelScaler",
+ "DepthEstimationNode",
+ "DepthToVox",
+ "MultiViewVoxelFusion",
+ "OptimizedVoxelizationNode",
+ "ProceduralChunkedWFC3DTerrain",
+ "ShapeCompletionNode",
+ "VoxelExportNode",
+ "VoxelModelLoader",
+ "VoxelPreview",
+ "VoxelPreviewNode",
+ "VoxelToGLB",
+ "WFC3DTerrainGenerator"
+ ],
+ {
+ "title_aux": "comfyui_voxel_nodes [WIP]"
+ }
+ ],
+ "https://github.com/dfl/comfyui-stylegan": [
+ [
+ "BatchAverageStyleGANLatents",
+ "BlendStyleGANLatents",
+ "GenerateStyleGANLatent",
+ "LoadStyleGAN",
+ "LoadStyleGANLatentImg",
+ "SaveStyleGANLatentImg",
+ "StyleGANInversion",
+ "StyleGANLatentFromBatch",
+ "StyleGANSampler"
+ ],
+ {
+ "title_aux": "comfyui-stylegan"
+ }
+ ],
+ "https://github.com/dhpdong/ComfyUI-IPAdapter-Flux-Repair": [
+ [
+ "SamplerCustomAdvancedPlus",
+ "SeedPlus",
+ "UnetLoaderGGUFPlus"
+ ],
+ {
+ "title_aux": "ComfyUI-IPAdapter-Flux-Repair"
+ }
+ ],
+ "https://github.com/dibowei1980/Comfyui-QwenEditUtilsFromRapid": [
+ [
+ "TextEncodeQwenImageEditPlus_FromRapid",
+ "TextEncodeQwenImageEdit_FromRapid"
+ ],
+ {
+ "title_aux": "Comfyui-QwenEditUtilsFromRapid"
+ }
+ ],
+ "https://github.com/dihan/comfyui-random-kps": [
+ [
+ "RandomFaceKeypoints"
+ ],
+ {
+ "title_aux": "ComfyUI Random Keypoints for InstantID [WIP]"
+ }
+ ],
+ "https://github.com/dmitry-guskov/ComfyUI_light_image_ops": [
+ [
+ "LightBatchToList",
+ "LightListToBatch",
+ "LightScaleToSide",
+ "LightWanEmbedsResizeSpatialPacked",
+ "LightWanLatentsResizeNormalizeNoise",
+ "LightWanLatentsResizeToSize"
+ ],
+ {
+ "title_aux": "ComfyUI_light_image_ops"
+ }
+ ],
+ "https://github.com/doc-packages/comfyui-doc-utils": [
+ [
+ "DOC_RandomPromptChoice",
+ "DOC_SaveImageAndAddToHistory"
+ ],
+ {
+ "title_aux": "doc-utils"
+ }
+ ],
+ "https://github.com/dogcomplex/ComfyUI-LOKI": [
+ [
+ "EvaluateRelevanceLLM",
+ "FilterNodesLLM",
+ "LLMQueryAPI",
+ "LLMQueryAPIBatch",
+ "LokiGlamour",
+ "LokiListAvailableNodes",
+ "LokiListInstalledNodes",
+ "LokiTweetScraper",
+ "LokiTweetThreadScraper",
+ "LokiTweetUserScraper",
+ "TwitterScraper",
+ "TwitterThreadScraper",
+ "TwitterUserScraper",
+ "\u270d\ufe0fScribe (LOKI)"
+ ],
+ {
+ "title_aux": "ComfyUI-LOKI [WIP]"
+ }
+ ],
+ "https://github.com/doucx/ComfyUI_WcpD_Utility_Kit": [
+ [
+ "BlackImage",
+ "CopyImage(Wayland)",
+ "ExecStrAsCode",
+ "MergeStrings",
+ "YamlToPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI_WcpD_Utility_Kit"
+ }
+ ],
+ "https://github.com/dougbtv/comfyui-vllm-omni": [
+ [
+ "VLLMImageEdit",
+ "VLLMTextToImage"
+ ],
+ {
+ "title_aux": "comfyui-vllm-omni"
+ }
+ ],
+ "https://github.com/dowands/ComfyUI-AddMaskForICLora": [
+ [
+ "AddMaskForICLora"
+ ],
+ {
+ "title_aux": "AddMaskForICLora"
+ }
+ ],
+ "https://github.com/downlifted/ComfyUI_BWiZ_Nodes": [
+ [
+ "BWIZInteractiveLogMonitor",
+ "BWIZ_AdvancedLoadImageBatch",
+ "BWIZ_CaptainWebhook",
+ "BWIZ_CaptainWebhook-Email",
+ "BWIZ_ComfyEmail",
+ "BWIZ_ErrorDetector",
+ "BWIZ_HFRepoBatchLoader",
+ "BWIZ_NotificationSound"
+ ],
+ {
+ "title_aux": "ComfyUI_BWiZ_Nodes [WIP]"
+ }
+ ],
+ "https://github.com/downlifted/ComfyUI_GroqPrompt": [
+ [
+ "GroqAPIKeyManager",
+ "GroqAPIKeyProvider",
+ "GroqArtPromptEnhancer",
+ "GroqArtPromptGenerator",
+ "GroqLLMNode",
+ "GroqMusicToArtPrompter",
+ "GroqStyleTransferPrompter",
+ "GroqWorkflowHelper"
+ ],
+ {
+ "title_aux": "ComfyUI_GroqPrompt [WIP]"
+ }
+ ],
+ "https://github.com/duckmartians/Duck_Nodes": [
+ [
+ "Duck_AddTextOverlay",
+ "Duck_EmptyLatentImage",
+ "Duck_LoadExcelRow",
+ "Duck_LoadGoogleDocLine",
+ "Duck_LoadGoogleSheetOneRow",
+ "Duck_LoadWordLine",
+ "Duck_PromptLoader",
+ "Duck_QwenAspectRatios",
+ "Duck_TextReplacer"
+ ],
+ {
+ "title_aux": "Duck_Nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/eddiehavila/comfyui-nachoman": [
+ [
+ "NACHOMAN_AudioCropTime",
+ "NACHOMAN_AutoQueueController",
+ "NACHOMAN_ChunkIndexController",
+ "NACHOMAN_CombineAllChunks",
+ "NACHOMAN_Extract_Frame_Number",
+ "NACHOMAN_FullSongAnalyzerV4",
+ "NACHOMAN_GetPromptByIndex",
+ "NACHOMAN_GetRunIndexFromJson",
+ "NACHOMAN_IndexedPromptChunker",
+ "NACHOMAN_IndexedPromptChunkerV2",
+ "NACHOMAN_LoadAudioSplitDynamic",
+ "NACHOMAN_LoadAudioSplitUpload",
+ "NACHOMAN_LoadAudioSplit_HUMO",
+ "NACHOMAN_LoadAudioSplit_HUMO_Transcribe",
+ "NACHOMAN_LoadSingleAudioChunk",
+ "NACHOMAN_LoadVideos",
+ "NACHOMAN_PostRunIndexStepper",
+ "NACHOMAN_PromptSplitter",
+ "NACHOMAN_SaveVideoChunkWithIndex",
+ "NACHOMAN_TranscribeText",
+ "NACHOMAN_VideoSplitter"
+ ],
+ {
+ "title_aux": "nachoman Custom Nodes [WIP]"
+ }
+ ],
+ "https://github.com/eddyhhlure1Eddy/ComfyUI-QwenImageWrapper": [
+ [
+ "CLIPLoader",
+ "CLIPSetLastLayer",
+ "CLIPTextEncode",
+ "CLIPVisionEncode",
+ "CLIPVisionLoader",
+ "CheckpointLoader",
+ "CheckpointLoaderSimple",
+ "ConditioningAverage",
+ "ConditioningCombine",
+ "ConditioningConcat",
+ "ConditioningSetArea",
+ "ConditioningSetAreaPercentage",
+ "ConditioningSetAreaStrength",
+ "ConditioningSetMask",
+ "ConditioningSetTimestepRange",
+ "ConditioningZeroOut",
+ "ControlNetApply",
+ "ControlNetApplyAdvanced",
+ "ControlNetLoader",
+ "DiffControlNetLoader",
+ "DiffusersLoader",
+ "DualCLIPLoader",
+ "EmptyImage",
+ "EmptyLatentImage",
+ "GLIGENLoader",
+ "GLIGENTextBoxApply",
+ "GetImageSize",
+ "ImageBatch",
+ "ImageBlend",
+ "ImageBlur",
+ "ImageCrop",
+ "ImageInvert",
+ "ImagePadForOutpaint",
+ "ImageQuantize",
+ "ImageScale",
+ "ImageScaleBy",
+ "ImageScaleToTotalPixels",
+ "ImageSharpen",
+ "ImageStitch",
+ "ImageUpscaleWithModel",
+ "InpaintModelConditioning",
+ "KSampler",
+ "KSamplerAdvanced",
+ "LatentBlend",
+ "LatentComposite",
+ "LatentCrop",
+ "LatentFlip",
+ "LatentFromBatch",
+ "LatentRotate",
+ "LatentUpscale",
+ "LatentUpscaleBy",
+ "LoadImage",
+ "LoadImageMask",
+ "LoadImageOutput",
+ "LoadLatent",
+ "LoraLoader",
+ "LoraLoaderModelOnly",
+ "PreviewImage",
+ "RepeatLatentBatch",
+ "SaveImage",
+ "SaveLatent",
+ "SetLatentNoiseMask",
+ "StyleModelApply",
+ "StyleModelLoader",
+ "UNETLoader",
+ "UpscaleModelLoader",
+ "VAEDecode",
+ "VAEDecodeTiled",
+ "VAEEncode",
+ "VAEEncodeForInpaint",
+ "VAEEncodeTiled",
+ "VAELoader",
+ "eddy_batch_image_generator",
+ "eddy_batch_prompt",
+ "eddy_image_blend",
+ "eddy_qwen_CLIPLoader",
+ "eddy_qwen_CLIPTextEncode",
+ "eddy_qwen_EmptySD3LatentImage",
+ "eddy_qwen_KSampler",
+ "eddy_qwen_LoraLoaderModelOnly",
+ "eddy_qwen_ModelSamplingAuraFlow",
+ "eddy_qwen_SaveImage",
+ "eddy_qwen_UNETLoader",
+ "eddy_qwen_VAEDecode",
+ "eddy_qwen_VAELoader",
+ "eddy_qwen_image_blockswap",
+ "unCLIPCheckpointLoader",
+ "unCLIPConditioning"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenImageWrapper [WIP]"
+ }
+ ],
+ "https://github.com/edisonchan/ComfyUI-Sysinfo": [
+ [
+ "SysInfoDisplay"
+ ],
+ {
+ "title_aux": "ComfyUI-Sysinfo"
+ }
+ ],
+ "https://github.com/edvardtoth/ComfyUI-ETNodes": [
+ [
+ "ETNodes-Color-Selector",
+ "ETNodes-Gemini-API-Image",
+ "ETNodes-Gemini-API-Text",
+ "ETNodes-List-Items",
+ "ETNodes-List-Selector",
+ "ETNodes-Text-Preview"
+ ],
+ {
+ "title_aux": "ComfyUI-ETNodes"
+ }
+ ],
+ "https://github.com/eggsbenedicto/DiffusionRenderer-ComfyUI": [
+ [
+ "Cosmos1ForwardRenderer",
+ "Cosmos1InverseRenderer",
+ "LoadDiffusionRendererModel",
+ "LoadHDRImage",
+ "VAEPassthroughTest"
+ ],
+ {
+ "title_aux": "DiffusionRenderer-ComfyUI [WIP]"
+ }
+ ],
+ "https://github.com/egormly/ComfyUI-EG_Tools": [
+ [
+ "EG_AppendSubfolder",
+ "EG_GetDateTime",
+ "EG_ImageInfo",
+ "EG_IncrementCounter",
+ "EG_ListFiles",
+ "EG_PathExists",
+ "EG_PathIndexFilename",
+ "EG_PathIndexPrefix",
+ "EG_PathParts",
+ "EG_ProjectRoot",
+ "EG_SaveImage",
+ "EG_WithNewExtension"
+ ],
+ {
+ "title_aux": "ComfyUI-EG_Tools [WIP]"
+ }
+ ],
+ "https://github.com/eigenpunk/ComfyUI-audio": [
+ [
+ "ApplyVoiceFixer",
+ "AudioSampleRate",
+ "BatchAudio",
+ "BlendAudio",
+ "ClipAudioRegion",
+ "CombineImageWithAudio",
+ "ConcatAudio",
+ "ConvertAudio",
+ "FilterAudio",
+ "FlattenAudioBatch",
+ "HifiGANApply",
+ "HifiGANLoader",
+ "HifiGANModelParams",
+ "InvertAudioPhase",
+ "MusicgenGenerate",
+ "MusicgenHFGenerate",
+ "MusicgenHFLoader",
+ "MusicgenLoader",
+ "NormalizeAudio",
+ "ResampleAudio",
+ "SpectrogramImage",
+ "Tacotron2Generate",
+ "Tacotron2Loader",
+ "ToMelSpectrogram",
+ "TortoiseTTSGenerate",
+ "TortoiseTTSLoader",
+ "TrimAudio",
+ "TrimAudioSamples",
+ "TrimSilence",
+ "VALLEXGenerator",
+ "VALLEXLoader",
+ "VALLEXVoicePromptFromAudio",
+ "VALLEXVoicePromptLoader",
+ "WaveGlowApply",
+ "WaveGlowLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-audio"
+ }
+ ],
+ "https://github.com/ejektaflex/ComfyUI-Ty": [
+ [
+ "Lora Block Weight Regex Loader // Ty"
+ ],
+ {
+ "title_aux": "ComfyUI-Ty"
+ }
+ ],
+ "https://github.com/elfatherbrown/comfyui-realcugan-node": [
+ [
+ "RealCUGANUpscaler"
+ ],
+ {
+ "title_aux": "Real-CUGAN ComfyUI Custom Node [WIP]"
+ }
+ ],
+ "https://github.com/emranemran/ComfyUI-FasterLivePortrait": [
+ [
+ "FasterLivePortraitProcess",
+ "LoadFasterLivePortraitModels"
+ ],
+ {
+ "title_aux": "ComfyUI-FasterLivePortrait"
+ }
+ ],
+ "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition": [
+ [
+ "Load Contditioning",
+ "LoadContditioning",
+ "Save Conditioning",
+ "SaveConditioning"
+ ],
+ {
+ "title_aux": "ComfyUI Nodes: SaveConditioning and LoadConditioning"
+ }
+ ],
+ "https://github.com/endman100/ComfyUI-augmentation": [
+ [
+ "RamdomFlipImage (endman100)"
+ ],
+ {
+ "title_aux": "ComfyUI-augmentation"
+ }
+ ],
+ "https://github.com/endman100/ComfyUI_tensor_script": [
+ [
+ "DictGetItem",
+ "LatentSqueeze",
+ "LatentUnsqueeze",
+ "ListGetIndex",
+ "TensorEmpty",
+ "TensorGetShape",
+ "TensorShowShape",
+ "TensorSqueeze",
+ "TensorUnsqueeze"
+ ],
+ {
+ "title_aux": "ComfyUI_tensor_script [WIP]"
+ }
+ ],
+ "https://github.com/enlo/ComfyUI-CheckpointSettings": [
+ [
+ "CheckPointSettingsListMerger",
+ "CheckPointSettingsPack",
+ "CheckPointSettingsRandomSelector",
+ "CheckPointSettingsTie",
+ "CheckPointSettingsToFilename",
+ "CheckPointSettingsUnpack",
+ "RandomChoiceNumber"
+ ],
+ {
+ "title_aux": "ComfyUI-CheckpointSettings"
+ }
+ ],
+ "https://github.com/ericbeyer/guidance_interval": [
+ [
+ "Guidance Interval"
+ ],
+ {
+ "title_aux": "guidance_interval"
+ }
+ ],
+ "https://github.com/erosDiffusion/ComfyUI-enricos-json-file-load-and-value-selector": [
+ [
+ "SelectorNode"
+ ],
+ {
+ "title_aux": "Select key from JSON (Alpha) [UNSAFE]"
+ }
+ ],
+ "https://github.com/ervinne13/ComfyUI-Metadata-Hub": [
+ [
+ "Metadata Hub",
+ "Save Image With Metadata"
+ ],
+ {
+ "title_aux": "ComfyUI-Metadata-Hub"
+ }
+ ],
+ "https://github.com/ethanfel/ComfyUI-Mamad8-QwenEdit-fix": [
+ [
+ "CLIPTextEncodeMamad8",
+ "CompiledModelRouter",
+ "ConditioningRouter",
+ "ImageRouter",
+ "LatentRouter",
+ "ModelRouter",
+ "QwenImagePreprocessMamad8",
+ "TextEncodeQwenImageEditPlusMamad8",
+ "WeightSwappingRouter"
+ ],
+ {
+ "title_aux": "ComfyUI-Mamad8 [WIP]"
+ }
+ ],
+ "https://github.com/exectails/comfyui-et_scripting": [
+ [
+ "ETPythonTextScript3Node"
+ ],
+ {
+ "title_aux": "Scripting"
+ }
+ ],
+ "https://github.com/eyekayem/comfyui_runway_gen3": [
+ [
+ "RunwayVideoGenerator",
+ "RunwayVideoPreview"
+ ],
+ {
+ "title_aux": "comfyui_runway_gen3"
+ }
+ ],
+ "https://github.com/fangg2000/ComfyUI-SenseVoice": [
+ [
+ "STTNode",
+ "VoiceRecorderNode"
+ ],
+ {
+ "title_aux": "ComfyUI-SenseVoice [WIP]"
+ }
+ ],
+ "https://github.com/fangg2000/ComfyUI-StableAudioFG": [
+ [
+ "LoadStableAudioModel",
+ "StableAudioFG"
+ ],
+ {
+ "author": "lks-ai",
+ "description": "A Simple integration of Stable Audio Diffusion with knobs and stuff!",
+ "nickname": "stableaudio",
+ "title": "StableAudioSampler",
+ "title_aux": "ComfyUI-StableAudioFG [WIP]"
+ }
+ ],
+ "https://github.com/fangg2000/comfyui_fgtools": [
+ [
+ "InpaintConcat",
+ "InpaintCut",
+ "IsEmptyString",
+ "SwitchString"
+ ],
+ {
+ "author": "lks-ai",
+ "description": "A Simple integration of Stable Audio Diffusion with knobs and stuff!",
+ "nickname": "stableaudio",
+ "title": "StableAudioSampler",
+ "title_aux": "comfyui_fgtools [WIP]"
+ }
+ ],
+ "https://github.com/fangziheng2321/comfyuinode_chopmask": [
+ [
+ "cus_chopmask"
+ ],
+ {
+ "title_aux": "comfyuinode_chopmask [WIP]"
+ }
+ ],
+ "https://github.com/fantaskiss/ComfyUI-Qwen3_VQA_enhanced": [
+ [
+ "ImageLoader",
+ "MultiplePathsInput",
+ "Qwen3_VQA",
+ "Qwen3_VQA_Enhanced",
+ "VideoLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen3_VQA_enhanced [WIP]"
+ }
+ ],
+ "https://github.com/filipemeneses/ComfyUI_html": [
+ [
+ "HtmlDownload",
+ "HtmlPreview",
+ "LoadHtml",
+ "SaveHtml",
+ "SingleImageToBase64",
+ "SingleImageToBase64KeepMetadata"
+ ],
+ {
+ "title_aux": "ComfyUI_html [UNSAFE]"
+ }
+ ],
+ "https://github.com/flowtyone/comfyui-flowty-lcm": [
+ [
+ "LCMSampler"
+ ],
+ {
+ "title_aux": "comfyui-flowty-lcm"
+ }
+ ],
+ "https://github.com/flyingdogsoftware/gyre_for_comfyui": [
+ [
+ "BackgroundRemoval",
+ "GyreIfElse",
+ "GyreLoopEnd",
+ "GyreLoopStart"
+ ],
+ {
+ "title_aux": "Gyre for ComfyUI"
+ }
+ ],
+ "https://github.com/flywhale-666/ComfyUI_pixel_snapping": [
+ [
+ "FaceHandCrop",
+ "PixelSnapping",
+ "PowerfulColorAlignment",
+ "PowerfulMaskCrop",
+ "PowerfulMaskRestore"
+ ],
+ {
+ "title_aux": "ComfyUI_pixel_snapping [WIP]"
+ }
+ ],
+ "https://github.com/foglerek/comfyui-cem-tools": [
+ [
+ "ProcessImageBatch"
+ ],
+ {
+ "title_aux": "comfyui-cem-tools"
+ }
+ ],
+ "https://github.com/fogyisland/Comfy_Show_StringText": [
+ [
+ "ComfyUIShowText"
+ ],
+ {
+ "title_aux": "Comfy_Show_StringText [WIP]"
+ }
+ ],
+ "https://github.com/franklydegenerate/ComfyUI-WAN-Resolution-Helper": [
+ [
+ "WANResolutionHelperV2"
+ ],
+ {
+ "title_aux": "WAN Resolution Helper [WIP]"
+ }
+ ],
+ "https://github.com/franky519/comfyui-redux-style": [
+ [
+ "StyleModelAdvanced",
+ "StyleModelApplySimple",
+ "StyleModelConditioner",
+ "StyleModelGridVisualizer"
+ ],
+ {
+ "title_aux": "comfyui-redux-style"
+ }
+ ],
+ "https://github.com/franky519/comfyui_fnckc_Face_analysis": [
+ [
+ "FaceAnalysisModels",
+ "FaceFourImageMatcher"
+ ],
+ {
+ "title_aux": "ComfyUI Face Four Image Matcher [WIP]"
+ }
+ ],
+ "https://github.com/fritzprix/ComfyUI-LLM-Utils": [
+ [
+ "WeightedDict",
+ "WeightedDictConcat",
+ "WeightedDictInput",
+ "WeightedDictSelect",
+ "WeightedDictSelectGroup",
+ "WeightedDictToPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-LLM-Utils [WIP]"
+ }
+ ],
+ "https://github.com/frost-byte/fbTools": [
+ [
+ "FBTextEncodeQwenImageEditPlus",
+ "LibberApply",
+ "LibberManager",
+ "MaskProcessor",
+ "NodeInputSelect",
+ "OpaqueAlpha",
+ "PromptComposer",
+ "QwenAspectRatio",
+ "SAMPreprocessNHWC",
+ "SceneCreate",
+ "SceneInput",
+ "SceneMaskDefinition",
+ "SceneOutput",
+ "ScenePromptManager",
+ "SceneSave",
+ "SceneSelect",
+ "SceneUpdate",
+ "SceneView",
+ "SceneWanVideoLoraMultiSave",
+ "StoryCreate",
+ "StoryEdit",
+ "StoryLoad",
+ "StorySave",
+ "StorySceneBatch",
+ "StorySceneImageSave",
+ "StoryScenePick",
+ "StoryVideoBatch",
+ "StoryView",
+ "SubdirLister",
+ "TailEnhancePro",
+ "TailSplit"
+ ],
+ {
+ "title_aux": "fb-tools"
+ }
+ ],
+ "https://github.com/ftechmax/ComfyUI-NovaKit-Pack": [
+ [
+ "CountTokens"
+ ],
+ {
+ "title_aux": "ComfyUI-NovaKit-Pack"
+ }
+ ],
+ "https://github.com/ftf001-tech/ComfyUI-ExternalLLMDetector": [
+ [
+ "ExternalLLMDetectorBboxesConvert",
+ "ExternalLLMDetectorMainProcess",
+ "ExternalLLMDetectorSettings"
+ ],
+ {
+ "title_aux": "ComfyUI-Lucian [WIP]"
+ }
+ ],
+ "https://github.com/fuselayer/comfyui-libcom-image-composition": [
+ [
+ "HarmonyScore",
+ "ImageHarmonization",
+ "ImageHarmonizationAuto"
+ ],
+ {
+ "title_aux": "comfyui-libcom-image-composition"
+ }
+ ],
+ "https://github.com/fylrid2/comfyui_lock_previous_value": [
+ [
+ "Lock"
+ ],
+ {
+ "title_aux": "lockValue"
+ }
+ ],
+ "https://github.com/gabe-init/ComfyUI-LM-Studio": [
+ [
+ "LMStudioNode"
+ ],
+ {
+ "title_aux": "ComfyUI LM Studio Node [WIP]"
+ }
+ ],
+ "https://github.com/gabe-init/ComfyUI-Repo-Eater": [
+ [
+ "RepoEaterNode"
+ ],
+ {
+ "title_aux": "gabe-init [WIP]"
+ }
+ ],
+ "https://github.com/gabe-init/comfyui_ui_render": [
+ [
+ "HTMLRendererNode"
+ ],
+ {
+ "title_aux": "comfyui_ui_render [UNSAFE]"
+ }
+ ],
+ "https://github.com/gagaprince/ComfyUI_gaga_utils": [
+ [
+ "GagaAddStringArray",
+ "GagaBatchStringReplace",
+ "GagaGetDirList",
+ "GagaGetFileList",
+ "GagaGetImageInfoByUpload",
+ "GagaGetImageInfoWithUrl",
+ "GagaGetImageWithPath",
+ "GagaGetStringArrayByIndex",
+ "GagaGetStringArraySize",
+ "GagaGetStringListSize",
+ "GagaPythonScript",
+ "GagaSaveImageToPath",
+ "GagaSaveImageWithInfo",
+ "GagaSaveImagesToGif",
+ "GagaSplitStringToList",
+ "GagaStringListToArray",
+ "GagaTest"
+ ],
+ {
+ "title_aux": "ComfyUI_gaga_utils"
+ }
+ ],
+ "https://github.com/gajjar4/ComfyUI-Qwen-Image-i2L": [
+ [
+ "QwenI2L_Apply",
+ "QwenI2L_PipelineLoader",
+ "QwenI2L_Save"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen-Image-i2L [UNSAFE]"
+ }
+ ],
+ "https://github.com/galoreware/ComfyUI-GaloreNodes": [
+ [
+ "GNI_HEX_TO_COLOR",
+ "GNI_RGB_TO_COLOR",
+ "GN_COLOR_TO_INT",
+ "GN_IO_GET_FILENAME",
+ "GN_MASK_TO_IMAGE",
+ "GN_SNAP_RESIZE"
+ ],
+ {
+ "title_aux": "ComfyUI-GaloreNodes [WIP]"
+ }
+ ],
+ "https://github.com/gameltb/ComfyUI_stable_fast": [
+ [
+ "ApplyStableFastUnet",
+ "ApplyTensorRTControlNet",
+ "ApplyTensorRTUnet",
+ "ApplyTensorRTVaeDecoder"
+ ],
+ {
+ "title_aux": "ComfyUI_stable_fast"
+ }
+ ],
+ "https://github.com/gamtruliar/ComfyUI-N_SwapInput": [
+ [
+ "N_SwapInput"
+ ],
+ {
+ "title_aux": "ComfyUI-N_SwapInput [UNSAFE]"
+ }
+ ],
+ "https://github.com/gaonprime-labs/ComfyUI_Nordy": [
+ [
+ "MemoryTest",
+ "SaveImageS3PresignedUrlNordy"
+ ],
+ {
+ "title_aux": "ComfyUI_Nordy"
+ }
+ ],
+ "https://github.com/gaonprime-labs/nordy-custom-node-ComfyUI-NormalOverlapBandBlend": [
+ [
+ "NormalOverlapBandBlend"
+ ],
+ {
+ "title_aux": "nordy-custom-node-ComfyUI-NormalOverlapBandBlend"
+ }
+ ],
+ "https://github.com/gaowei-space/ComfyUI-Doubao-LLM": [
+ [
+ "DoubaoAPI",
+ "DoubaoConfig",
+ "DoubaoTextChat",
+ "DoubaoVisionChat"
+ ],
+ {
+ "title_aux": "ComfyUI Doubao LLM [WIP]"
+ }
+ ],
+ "https://github.com/garciaone/g_one_toolkit": [
+ [
+ "g-one Face Tracking Features",
+ "g-one Face Tracking Masks"
+ ],
+ {
+ "title_aux": "g_one_toolkit"
+ }
+ ],
+ "https://github.com/gilons/ComfyUI-GoogleDrive-Downloader": [
+ [
+ "custom_nodes"
+ ],
+ {
+ "title_aux": "ComfyUI-GoogleDrive-Downloader [UNSAFE]"
+ }
+ ],
+ "https://github.com/gioferreira/ComfyUI-Molde-Utils": [
+ [
+ "BezierMapping"
+ ],
+ {
+ "title_aux": "ComfyUI-Molde-Utils"
+ }
+ ],
+ "https://github.com/githubYiheng/comfyui_median_filter": [
+ [
+ "ImageMedianFilter"
+ ],
+ {
+ "title_aux": "comfyui_median_filter"
+ }
+ ],
+ "https://github.com/gmammolo/comfyui-gmammolo": [
+ [
+ "CheckImageGen",
+ "FilterConditioningPrompt",
+ "FilterTextPrompt",
+ "SimpleTextbox"
+ ],
+ {
+ "title_aux": "comfyui-gmammolo"
+ }
+ ],
+ "https://github.com/go-package-lab/ComfyUI-Tools-Video-Combine": [
+ [
+ "Tools:CopyFile",
+ "Tools:Image2video",
+ "Tools:LoadAudioUrl",
+ "Tools:PreviewVideo",
+ "Tools:SetString",
+ "Tools:SetValue",
+ "Tools:VideoWatermark"
+ ],
+ {
+ "title_aux": "ComfyUI-Tools-Video-Combine [WIP]"
+ }
+ ],
+ "https://github.com/godric8/ComfyUI_Step1X-Edit": [
+ [
+ "Step1XEdit"
+ ],
+ {
+ "title_aux": "ComfyUI_Step1X-Edit [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/gold24park/loki-comfyui-node": [
+ [
+ "Base64ToImage",
+ "DominantColor",
+ "ImageLuminance",
+ "ImageToBase64",
+ "OverlayText"
+ ],
+ {
+ "title_aux": "loki-comfyui-node"
+ }
+ ],
+ "https://github.com/gordon123/ComfyUI_DreamBoard": [
+ [
+ "PromptExtraNode",
+ "StoryboardNode"
+ ],
+ {
+ "title_aux": "ComfyUI_DreamBoard [WIP]"
+ }
+ ],
+ "https://github.com/gordon123/ComfyUI_srt2speech": [
+ [
+ "GetSubtitleByIndex",
+ "MergeAllWave",
+ "SaveWavNode"
+ ],
+ {
+ "title_aux": "ComfyUI_srt2speech [WIP]"
+ }
+ ],
+ "https://github.com/gorillaframeai/GF_pixtral_node": [
+ [
+ "GF_MistralPixtralNode"
+ ],
+ {
+ "title_aux": "GF_pixtral_node [WIP]"
+ }
+ ],
+ "https://github.com/grimli333/ComfyUI_Grim": [
+ [
+ "GenerateFileName",
+ "TwoStringsFormat"
+ ],
+ {
+ "title_aux": "ComfyUI_Grim"
+ }
+ ],
+ "https://github.com/grinlau18/ComfyUI_XISER_Nodes": [
+ [
+ "BaseFromListGetOneV3",
+ "XISER_Canvas",
+ "XIS_BooleanSwitch",
+ "XIS_CanvasConfig",
+ "XIS_CanvasMaskProcessor",
+ "XIS_CompositorProcessor",
+ "XIS_CoordinatePath",
+ "XIS_CropImage",
+ "XIS_CurveEditor",
+ "XIS_DynamicImageInputs",
+ "XIS_DynamicKSampler",
+ "XIS_DynamicPackImages",
+ "XIS_FloatSwitch",
+ "XIS_Float_Slider",
+ "XIS_INT_Slider",
+ "XIS_IPAStyleSettings",
+ "XIS_IfDataIsNone",
+ "XIS_ImageAdjustAndBlend",
+ "XIS_ImageManager",
+ "XIS_ImageMaskMirror",
+ "XIS_ImagePreview",
+ "XIS_ImagePuzzle",
+ "XIS_ImageSwitch",
+ "XIS_IntSwitch",
+ "XIS_InvertMask",
+ "XIS_IsThereAnyData",
+ "XIS_KSamplerSettingsNode",
+ "XIS_KSamplerSettingsUnpackNode",
+ "XIS_LLMOrchestrator",
+ "XIS_Label",
+ "XIS_LatentBlendNode",
+ "XIS_LoadImage",
+ "XIS_MaskBatchProcessor",
+ "XIS_MaskCompositeOperation",
+ "XIS_MaskSwitch",
+ "XIS_MergePackImages",
+ "XIS_MultiPointGradient",
+ "XIS_MultiPromptSwitch",
+ "XIS_MultipleAnglesPrompt",
+ "XIS_PSDLayerExtractor",
+ "XIS_PackImages",
+ "XIS_PromptProcessor",
+ "XIS_PromptsWithSwitches",
+ "XIS_QwenVLInference",
+ "XIS_ReorderImageMaskGroups",
+ "XIS_ResizeImageOrMask",
+ "XIS_ResizeToDivisible",
+ "XIS_ResolutionSelector",
+ "XIS_SetColor",
+ "XIS_ShapeAndText",
+ "XIS_ShapeData",
+ "XIS_StringListMerger",
+ "XIS_StringSwitch",
+ "XIS_UnpackImages",
+ "XIS_VGMOrchestrator"
+ ],
+ {
+ "title_aux": "Xiser_Nodes [WIP]"
+ }
+ ],
+ "https://github.com/grokuku/ComfyUI-Holaf": [
+ [
+ "HolafAutoSelectX2",
+ "HolafBundleCreator",
+ "HolafBundleExtractor",
+ "HolafBypasser",
+ "HolafGroupBypasser",
+ "HolafImageAdjustment",
+ "HolafImageBatchSlice",
+ "HolafImageComparer",
+ "HolafInstagramResize",
+ "HolafKSampler",
+ "HolafLoadImageVideo",
+ "HolafLutGenerator",
+ "HolafLutSaver",
+ "HolafMaskToBoolean",
+ "HolafOverlayNode",
+ "HolafRemote",
+ "HolafRemoteSelector",
+ "HolafResolutionPreset",
+ "HolafSaveImage",
+ "HolafSaveVideo",
+ "HolafTextBox",
+ "HolafTiledKSampler",
+ "HolafToText",
+ "HolafVideoPreview",
+ "UpscaleImageHolaf"
+ ],
+ {
+ "title_aux": "Holaf Custom Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/gulajawalegit/ComfyUI-Telegram-Sender": [
+ [
+ "TelegramSendImage",
+ "TelegramSendVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-Telegram-Sender [UNSAFE]"
+ }
+ ],
+ "https://github.com/haodman/ComfyUI_Rain": [
+ [
+ "Rain_ImageSize",
+ "Rain_IntToFloat",
+ "Rain_Math",
+ "Rain_ValueSwitch"
+ ],
+ {
+ "title_aux": "ComfyUI_Rain"
+ }
+ ],
+ "https://github.com/haofanwang/ComfyUI-InstantStyle": [
+ [
+ "BaseModelLoader",
+ "InstantStyleGenerationNode",
+ "InstantStyleLoader",
+ "PromptLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-InstantStyle"
+ }
+ ],
+ "https://github.com/haomole/Comfyui-SadTalker": [
+ [
+ "LoadRefVideo",
+ "SadTalker",
+ "ShowAudio",
+ "ShowText",
+ "ShowVideo"
+ ],
+ {
+ "title_aux": "Comfyui-SadTalker"
+ }
+ ],
+ "https://github.com/harishcmgit/comfyui_sp": [
+ [
+ "SeamlessPatternNode"
+ ],
+ {
+ "title_aux": "comfyui_sp [WIP]"
+ }
+ ],
+ "https://github.com/hashms0a/ComfyUI-Qwen-Multi-Angle-Camera-Nodes": [
+ [
+ "QwenMultiAngleBatchSelector",
+ "QwenMultiAngleCameraAdvanced",
+ "QwenMultiAngleCameraBasic",
+ "QwenMultiAngleCameraDistanceTransition",
+ "QwenMultiAngleCameraElevationSweep",
+ "QwenMultiAngleCameraFromIndex",
+ "QwenMultiAngleCameraInfo",
+ "QwenMultiAngleCameraOrbit",
+ "QwenMultiAngleCameraPath",
+ "QwenMultiAngleCameraRandom",
+ "QwenMultiAnglePromptCombiner"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen-Multi-Angle-Camera-Nodes [WIP]"
+ }
+ ],
+ "https://github.com/hay86/ComfyUI_AceNodes": [
+ [
+ "ACE_AnyInputSwitchBool",
+ "ACE_AnyInputToAny",
+ "ACE_AudioCrop",
+ "ACE_AudioLoad",
+ "ACE_AudioPlay",
+ "ACE_AudioSave",
+ "ACE_Expression_Eval",
+ "ACE_Float",
+ "ACE_ImageColorFix",
+ "ACE_ImageConstrain",
+ "ACE_ImageFaceCrop",
+ "ACE_ImageGetSize",
+ "ACE_ImageLoadFromCloud",
+ "ACE_ImageMakeSlideshow",
+ "ACE_ImagePixelate",
+ "ACE_ImageQA",
+ "ACE_ImageRemoveBackground",
+ "ACE_ImageSaveToCloud",
+ "ACE_Integer",
+ "ACE_MaskBlur",
+ "ACE_OpenAI_GPT_Chat",
+ "ACE_OpenAI_GPT_IMAGE",
+ "ACE_OpenAI_GPT_TTS",
+ "ACE_Seed",
+ "ACE_Text",
+ "ACE_TextConcatenate",
+ "ACE_TextGoogleTranslate",
+ "ACE_TextInputSwitch2Way",
+ "ACE_TextInputSwitch4Way",
+ "ACE_TextInputSwitch8Way",
+ "ACE_TextList",
+ "ACE_TextLoad",
+ "ACE_TextPreview",
+ "ACE_TextSave",
+ "ACE_TextSelector",
+ "ACE_TextToResolution",
+ "ACE_TextTranslate",
+ "ACE_VideoConcat",
+ "ACE_VideoLoad",
+ "ACE_VideoPreview"
+ ],
+ {
+ "title_aux": "ComfyUI AceNodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/hben35096/ComfyUI-ToolBox": [
+ [
+ "AutoDLDownload",
+ "CreatePaths",
+ "FolderDeleter",
+ "FolderViewe",
+ "PathOutput"
+ ],
+ {
+ "title_aux": "hben35096/ComfyUI-ToolBox [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/hdfhssg/ComfyUI_pxtool": [
+ [
+ "ArtistLoader",
+ "CivitaiHelper",
+ "DanbooruCharacterTag",
+ "E621CharacterTag",
+ "NegativeTag",
+ "PX_Seed",
+ "QualityTag",
+ "RandomArtists",
+ "RandomArtistsAdvanced",
+ "RandomTag"
+ ],
+ {
+ "title_aux": "ComfyUI_pxtool [WIP]"
+ }
+ ],
+ "https://github.com/hdfhssg/comfyui_EvoSearch": [
+ [
+ "EvoSearch_FLUX",
+ "EvoSearch_SD21",
+ "EvoSearch_WAN",
+ "EvolutionScheduleGenerator",
+ "GuidanceRewardsGenerator"
+ ],
+ {
+ "title_aux": "comfyui_EvoSearch [WIP]"
+ }
+ ],
+ "https://github.com/henjicc/ComfyUI-CC-ImageLoader": [
+ [
+ "LoadImage"
+ ],
+ {
+ "title_aux": "ComfyUI-CC-ImageLoader [UNSAFE]"
+ }
+ ],
+ "https://github.com/heyburns/ComfyUI-Logic-Redux": [
+ [
+ "Bool-\ud83d\udd2c",
+ "Compare-\ud83d\udd2c",
+ "DebugPrint-\ud83d\udd2c",
+ "Float-\ud83d\udd2c",
+ "If ANY execute A else B",
+ "If ANY execute A else B-\ud83d\udd2c",
+ "If ANY return A else B-\ud83d\udd2c",
+ "Int-\ud83d\udd2c",
+ "String-\ud83d\udd2c"
+ ],
+ {
+ "title_aux": "ComfyUI-Logic-Redux [WIP]"
+ }
+ ],
+ "https://github.com/hgh086/Comfyui-HghImage": [
+ [
+ "GuanghuanImageComparer"
+ ],
+ {
+ "title_aux": "Comfyui-HghImage"
+ }
+ ],
+ "https://github.com/hhelloe/ComfyuiQuantizerToFp8": [
+ [
+ "FP8QuantizeFormat",
+ "ModelToStateDict",
+ "SaveAsSafeTensor"
+ ],
+ {
+ "title_aux": "ComfyuiQuantizerToFp8 [WIP]"
+ }
+ ],
+ "https://github.com/hhelloe/comfyuiWeightOnlyQuant": [
+ [
+ "WeightOnlyQuantize"
+ ],
+ {
+ "title_aux": "comfyuiWeightOnlyQuant [WIP]"
+ }
+ ],
+ "https://github.com/hiusdev/ComfyUI_Lah_Toffee": [
+ [
+ "LoadVideoRandom"
+ ],
+ {
+ "title_aux": "ComfyUI_Lah_Toffee"
+ }
+ ],
+ "https://github.com/hndrr/Comfyui-SceneDetect": [
+ [
+ "PySceneDetectToImages"
+ ],
+ {
+ "title_aux": "Comfyui-SceneDetect [WIP]"
+ }
+ ],
+ "https://github.com/hnmr293/ComfyUI-SamOne": [
+ [
+ "Latent",
+ "SamplerOne"
+ ],
+ {
+ "title_aux": "ComfyUI-SamOne - one-step sampling"
+ }
+ ],
+ "https://github.com/horidream/ComfyUI-Horidream": [
+ [
+ "PassThroughWithSound"
+ ],
+ {
+ "title_aux": "ComfyUI-Horidream"
+ }
+ ],
+ "https://github.com/hotpizzatactics/ComfyUI-WaterMark-Detector": [
+ [
+ "AdaptiveThresholding",
+ "AdvancedWatermarkEnhancement",
+ "AdvancedWaveletWatermarkEnhancement",
+ "CLAHEEnhancement",
+ "CombineEnhancements",
+ "ComprehensiveImageEnhancement",
+ "DenoisingFilter",
+ "EdgeDetection",
+ "FlexibleCombineEnhancements",
+ "HighPassFilter",
+ "ImprovedGrayColorEnhancement",
+ "MorphologicalOperations",
+ "TextureEnhancement",
+ "WatermarkEnhancement"
+ ],
+ {
+ "title_aux": "ComfyUI-WaterMark-Detector"
+ }
+ ],
+ "https://github.com/hotpot-killer/ComfyUI_AlexNodes": [
+ [
+ "InstructPG"
+ ],
+ {
+ "title_aux": "ComfyUI_AlexNodes"
+ }
+ ],
+ "https://github.com/houdinii/comfy-magick": [
+ [
+ "AdaptiveBlur",
+ "AdaptiveSharpen",
+ "AddNoise",
+ "BlueShift",
+ "Blur",
+ "Charcoal",
+ "Colorize",
+ "CropByAspectRatio",
+ "Despeckle",
+ "Edge",
+ "Emboss",
+ "FX",
+ "GaussianBlur",
+ "Implode",
+ "Kuwahara",
+ "MotionBlur",
+ "RotationalBlur",
+ "SelectiveBlur",
+ "Sepia",
+ "Shade",
+ "Sharpen",
+ "Sketch",
+ "Solarize",
+ "Spread",
+ "Stereogram",
+ "Swirl",
+ "Tint",
+ "UnsharpMask",
+ "Vignette",
+ "WaveletDenoise"
+ ],
+ {
+ "title_aux": "comfy-magick [WIP]"
+ }
+ ],
+ "https://github.com/huhu-tiger/ComfyUI-RemoteDownload": [
+ [
+ "LoadImageFromRemote"
+ ],
+ {
+ "title_aux": "ComfyUI-RemoteDownload"
+ }
+ ],
+ "https://github.com/huhu-tiger/ComfyUI-RemoteResource": [
+ [
+ "LoadImageFromRemote"
+ ],
+ {
+ "title_aux": "ComfyUI-RemoteResource"
+ }
+ ],
+ "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": [
+ [
+ "EasyBgRemover",
+ "EasyBgRemover_ModelLoader",
+ "EasyControlNetApply",
+ "EasyControlNetLoader",
+ "EasyEmptyLatentImage",
+ "EasyLatentToCondition",
+ "EasyLoadImage"
+ ],
+ {
+ "title_aux": "ComfyUI_Easy_Nodes_hui"
+ }
+ ],
+ "https://github.com/hujuying/ComfyUI-QwenVL3-image-Plus": [
+ [
+ "QwenVL3ImagePlus",
+ "QwenVLUnloadModelPlus"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenVL3-image-Plus [WIP]"
+ }
+ ],
+ "https://github.com/hujuying/comfyui_gemini_banana_api": [
+ [
+ "GeminiImageEditNode",
+ "GeminiImageEditV2Node"
+ ],
+ {
+ "title_aux": "comfyui_gemini_banana_api [WIP]"
+ }
+ ],
+ "https://github.com/hulipanpan/Comfyui_tuteng": [
+ [
+ "TutengChatGPTApi",
+ "TutengGeminiAPI",
+ "TutengJimengApi",
+ "TutengJimengVideoApi",
+ "TutengSeededit",
+ "Tuteng_Flux_Kontext",
+ "Tuteng_Flux_Kontext_Edit",
+ "Tuteng_Flux_Kontext_bfl",
+ "Tuteng_Google_Veo3",
+ "Tuteng_Mj",
+ "Tuteng_Mju",
+ "Tuteng_Mjv",
+ "Tuteng_gpt_image_1",
+ "Tuteng_gpt_image_1_edit",
+ "Tuteng_kling_image2video",
+ "Tuteng_kling_text2video",
+ "Tuteng_kling_videoPreview",
+ "Tuteng_lip_sync",
+ "Tuteng_mjstyle",
+ "Tuteng_upload",
+ "Tuteng_video_extend"
+ ],
+ {
+ "title_aux": "Comfyui_tuteng [WIP]"
+ }
+ ],
+ "https://github.com/hunterssl/ComfyUI_SSLNodes": [
+ [
+ "SSLGetJsonKeysCount",
+ "SSLLoadCheckpointByName",
+ "SSLLoadJson",
+ "SSLRandomNumInLoop",
+ "SSLSaveImageOutside"
+ ],
+ {
+ "title_aux": "ComfyUI_SSLNodes"
+ }
+ ],
+ "https://github.com/hunzmusic/ComfyUI-Hunyuan3DTools": [
+ [
+ "Hy3DTools_BackProjectInpaint",
+ "Hy3DTools_RenderSpecificView"
+ ],
+ {
+ "title_aux": "ComfyUI-Hunyuan3DTools [WIP]"
+ }
+ ],
+ "https://github.com/hunzmusic/Comfyui-CraftsMan3DWrapper": [
+ [
+ "CraftsManDoraVAEGenerator",
+ "DecodeCraftsManLatents",
+ "LoadCraftsManPipeline",
+ "PreprocessImageCraftsMan",
+ "SampleCraftsManLatents",
+ "SaveCraftsManMesh"
+ ],
+ {
+ "title_aux": "Comfyui-CraftsMan3DWrapper [WIP]"
+ }
+ ],
+ "https://github.com/hunzmusic/comfyui-hnznodes": [
+ [
+ "CombineChannelsGrayscale",
+ "ImageBatchReorder",
+ "MaleCharacterPromptGenerator"
+ ],
+ {
+ "title_aux": "comfyui-hnznodes"
+ }
+ ],
+ "https://github.com/husw725/comfyui_alta_nodes": [
+ [
+ "Alta:API_LipSync",
+ "Alta:API_ProcessVideo",
+ "Alta:API_TTS",
+ "Alta:API_TranscribeAudio",
+ "Alta:API_Translate",
+ "Alta:Add(Math)",
+ "Alta:AddInt(Math)",
+ "Alta:BuildFilePath",
+ "Alta:ComboWrapper(Logic)",
+ "Alta:CompareFolders(File)",
+ "Alta:DeleteAudioFromMemory",
+ "Alta:DeleteFile(Util)",
+ "Alta:FileDownloader",
+ "Alta:GetFaceMask",
+ "Alta:GetFileFolder",
+ "Alta:GetFilenameNoExt",
+ "Alta:GetFilenameWithExt",
+ "Alta:GetImageAndPath",
+ "Alta:GetImageByIndex",
+ "Alta:GetStringByIndex",
+ "Alta:IfOnly(Logic)",
+ "Alta:Int2Str(Math)",
+ "Alta:JSONKeyExtractor(Util)",
+ "Alta:ListAllFiles",
+ "Alta:ListElement(Util)",
+ "Alta:ListFilesByExt",
+ "Alta:ListLength(Util)",
+ "Alta:LoadAudioByPath",
+ "Alta:LoadAudioFromMemory",
+ "Alta:LoadFilesFromFolder",
+ "Alta:LoadImage",
+ "Alta:LoadImageFromPath",
+ "Alta:LoadImageWithPath",
+ "Alta:LoadImagesPath",
+ "Alta:LoadVideo",
+ "Alta:LoadVideoPath",
+ "Alta:LoadVideosFromFolder",
+ "Alta:MergeNodes",
+ "Alta:MoveFile(File)",
+ "Alta:MultiRoute",
+ "Alta:OpenAIImages2Image",
+ "Alta:ReadImageFromFile",
+ "Alta:ReadStringFromFile",
+ "Alta:RegexMatch(Util)",
+ "Alta:SaveAudioToPath",
+ "Alta:SaveImage",
+ "Alta:SaveImagePlus",
+ "Alta:SaveStringToFile",
+ "Alta:SpeakerDiarization",
+ "Alta:StoreAudioInMemory",
+ "Alta:StrToNum(Math)",
+ "Alta:StringPlus(Util)",
+ "Alta:Sub(Math)",
+ "Alta:SubInt(Math)",
+ "Alta:SyncLipsyncNode(path)",
+ "Alta:SyncLipsyncNode(url)",
+ "Alta:VideoCombine",
+ "Alta:YOLOFaceModelCore",
+ "Alta:writeStringToFile",
+ "Alta:\u5373\u68a6API\u56fe\u751f\u89c6\u9891",
+ "Alta:\u5373\u68a6API\u56fe\u751f\u89c6\u9891\u7ed3\u679c\u67e5\u8be2",
+ "Alta:\u5373\u68a6API\u6587\u751f\u56fe",
+ "Alta:\u5373\u68a6Web\u56fe\u751f\u89c6\u9891"
+ ],
+ {
+ "title_aux": "comfyui_alta_nodes"
+ }
+ ],
+ "https://github.com/hy134300/comfyui-hb-node": [
+ [
+ "generate story",
+ "hy save image",
+ "latent to list",
+ "movie batch",
+ "movie generate",
+ "sound voice",
+ "text concat"
+ ],
+ {
+ "title_aux": "comfyui-hb-node"
+ }
+ ],
+ "https://github.com/hy134300/comfyui-hydit": [
+ [
+ "DiffusersCLIPLoader",
+ "DiffusersCheckpointLoader",
+ "DiffusersClipTextEncode",
+ "DiffusersControlNetLoader",
+ "DiffusersLoraLoader",
+ "DiffusersModelMakeup",
+ "DiffusersPipelineLoader",
+ "DiffusersSampler",
+ "DiffusersSchedulerLoader",
+ "DiffusersVAELoader"
+ ],
+ {
+ "title_aux": "comfyui-hydit"
+ }
+ ],
+ "https://github.com/hylarucoder/comfyui-copilot": [
+ [
+ "EagleImageNode",
+ "SDXLPromptStyler",
+ "SDXLPromptStylerAdvanced",
+ "SDXLResolutionPresets"
+ ],
+ {
+ "title_aux": "comfyui-copilot"
+ }
+ ],
+ "https://github.com/idoru/ComfyUI-SKCFI-NetworkFileIO": [
+ [
+ "FilestashUploadNode",
+ "HttpUploadNode",
+ "MultipartFileHTTPUploadNode"
+ ],
+ {
+ "title_aux": "Filestash Upload Node [UNSAFE]"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-IF_Zonos": [
+ [
+ "IF_ZonosTTS"
+ ],
+ {
+ "title_aux": "ComfyUI-IF_Zonos [WIP]"
+ }
+ ],
+ "https://github.com/ifilipis/ComfyUI-Auto-Prompt-Engineer": [
+ [
+ "DirectorGemini",
+ "ImageRouterSink",
+ "LatestImageSource"
+ ],
+ {
+ "title_aux": "ComfyUI-Auto-Prompt-Engineer"
+ }
+ ],
+ "https://github.com/ilovejohnwhite/Tracer": [
+ [
+ "BillyGoatNode",
+ "EcstaticNode",
+ "HintImageEnchance",
+ "Image Load TTK",
+ "ImageGenResolutionFromImage",
+ "ImageGenResolutionFromLatent",
+ "KillMeNode",
+ "LinkMasterNode",
+ "OkayBuddyNode",
+ "OutlineRealNode",
+ "OutlineStandardNode",
+ "PixelPerfectResolution",
+ "SuckerPunch",
+ "UWU_Preprocessor",
+ "VooDooNode"
+ ],
+ {
+ "title_aux": "Kolors Awesome Prompts [WIP]"
+ }
+ ],
+ "https://github.com/ilslli/Comfyui-IV2Z": [
+ [
+ "IV2Z_VideoCombine"
+ ],
+ {
+ "title_aux": "Comfyui-IV2Z"
+ }
+ ],
+ "https://github.com/immersiveexperience/ie-comfyui-color-nodes": [
+ [
+ "Average Color",
+ "Complementary Color",
+ "Hex Color to Image",
+ "Hex to Color Name",
+ "Random String"
+ ],
+ {
+ "title_aux": "ie-comfyui-color-nodes"
+ }
+ ],
+ "https://github.com/io-club/ComfyUI-LuminaNext": [
+ [
+ "GemmaClipLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-LuminaNext [WIP]"
+ }
+ ],
+ "https://github.com/isurulkh/ComfyUI-Lovis-Node": [
+ [
+ "AudioDurationNode",
+ "LineCountNode",
+ "TextToSingleLineNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Lovis-Node [WIP]"
+ }
+ ],
+ "https://github.com/j-pyxal/ComfyUI-Lattice-Manim": [
+ [
+ "ManimAudioCaptionNode",
+ "ManimDataVisualizationNode",
+ "ManimScriptNode",
+ "ManimTimelineSceneNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Lattice-Manim [WIP]"
+ }
+ ],
+ "https://github.com/jKaarlehto/ComfyUI-GetWorkflowName": [
+ [
+ "GetWorkflowName"
+ ],
+ {
+ "title_aux": "ComfyUI-GetWorkflowName [WIP]"
+ }
+ ],
+ "https://github.com/jax-explorer/ComfyUI-DreamO": [
+ [
+ "BgRmModelLoad",
+ "DreamOGenerate",
+ "DreamOLoadModel",
+ "DreamOLoadModelFromLocal",
+ "FaceModelLoad"
+ ],
+ {
+ "title_aux": "ComfyUI-DreamO"
+ }
+ ],
+ "https://github.com/jceme/Comfy_Extensions": [
+ [
+ "DimensionResize",
+ "FpsHelper",
+ "ImageAspectPresets",
+ "ImageAspectResize",
+ "ImageDim",
+ "ImageSizePresets",
+ "InpaintPrepare",
+ "InpaintRestore",
+ "NegativePromptCustomizer",
+ "PositivePromptCustomizer"
+ ],
+ {
+ "title_aux": "Comfy_Extensions [WIP]"
+ }
+ ],
+ "https://github.com/jchiotaka/ComfyUI-ClarityAI-Upscaler": [
+ [
+ "ClarityCreativeUpscaler",
+ "ClarityCrystalUpscaler",
+ "ClarityFluxUpscaler"
+ ],
+ {
+ "title_aux": "ComfyUI-ClarityAI-Upscaler"
+ }
+ ],
+ "https://github.com/jcomeme/ComfyUI-AsunaroTools": [
+ [
+ "AsunaroAnd",
+ "AsunaroAutomaticSexPrompter",
+ "AsunaroBatchImageLoader",
+ "AsunaroIfBiggerThanZero",
+ "AsunaroIfContain",
+ "AsunaroIfSame",
+ "AsunaroImageLoader",
+ "AsunaroIntToStr",
+ "AsunaroOr",
+ "AsunaroPromptStripper",
+ "AsunaroRandomDice",
+ "AsunaroResolutions",
+ "AsunaroSave",
+ "AsunaroTextConcatenator",
+ "AsunaroWildCard"
+ ],
+ {
+ "title_aux": "AsunaroTools"
+ }
+ ],
+ "https://github.com/jerryname2022/ComfyUI-MegaTTS3": [
+ [
+ "MegaTTS3ModelLoader",
+ "MegaTTS3ZeroShot",
+ "TextEditor"
+ ],
+ {
+ "title_aux": "MegaTTS 3 [WIP]"
+ }
+ ],
+ "https://github.com/jerryname2022/ComfyUI-Real-ESRGAN": [
+ [
+ "GFPGANImageGenerator",
+ "GFPGANModelLoader",
+ "ImageMergeGenerator",
+ "InpaintingLamaImageGenerator",
+ "InpaintingLamaModelLoader",
+ "RealESRGANImageGenerator",
+ "RealESRGANModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Real-ESRGAN [WIP]"
+ }
+ ],
+ "https://github.com/jgbrblmd/ComfyUI-ComfyFluxSize": [
+ [
+ "ComfyFluxSize"
+ ],
+ {
+ "title_aux": "ComfyUI-ComfyFluxSize [WIP]"
+ }
+ ],
+ "https://github.com/jgbyte/ComfyUI-RandomCube": [
+ [
+ "RandomCubeGrid"
+ ],
+ {
+ "title_aux": "ComfyUI-RandomCube [WIP]"
+ }
+ ],
+ "https://github.com/jiafuzeng/comfyui-fishSpeech": [
+ [
+ "FishSpeechAudioDurationNode",
+ "FishSpeechAudioPreview",
+ "FishSpeechLoader",
+ "FishSpeechTTS"
+ ],
+ {
+ "title_aux": "comfyui-fishSpeech"
+ }
+ ],
+ "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node": [
+ [
+ "jimmm.ai.TimelineUI"
+ ],
+ {
+ "title_aux": "TimeUi a ComfyUI Timeline Node System [WIP]"
+ }
+ ],
+ "https://github.com/jimstudt/ComfyUI-Jims-Nodes": [
+ [
+ "ChooseFromStringList",
+ "Cubby",
+ "DefineWord",
+ "DictFromJSON",
+ "DictionaryToJSON",
+ "ImageToSolidBackground",
+ "JSONTODictionary",
+ "JSONToDictionary",
+ "LiftFromBackground",
+ "LoadImageAndInfoFromPath",
+ "LookupWord",
+ "ReplaceWords",
+ "TextToStringList",
+ "ZoomFocus"
+ ],
+ {
+ "title_aux": "Jim's ComfyUI Nodes [WIP]"
+ }
+ ],
+ "https://github.com/jinchanz/ComfyUI-AliCloud-Bailian": [
+ [
+ "BailianAPI",
+ "BailianAPIPoll",
+ "BailianAPISubmit",
+ "MaletteJSONExtractor",
+ "MaletteJSONModifier",
+ "MaletteVirtualTryOn"
+ ],
+ {
+ "title_aux": "ComfyUI-AliCloud-Bailian [WIP]"
+ }
+ ],
+ "https://github.com/jinchanz/ComfyUI-Midjourney": [
+ [
+ "MidjourneyAPI",
+ "MidjourneyAPIPoll",
+ "MidjourneyAPISubmit",
+ "MidjourneyJSONExtractor"
+ ],
+ {
+ "title_aux": "ComfyUI-Midjourney"
+ }
+ ],
+ "https://github.com/jluo-github/comfyui-easy-resize": [
+ [
+ "EasyImageSize",
+ "EasyImageSizeLatent"
+ ],
+ {
+ "title_aux": "comfyui-easy-resize [WIP]"
+ }
+ ],
+ "https://github.com/jn-jairo/jn_node_suite_comfyui": [
+ [
+ "JN_AreaInfo",
+ "JN_AreaNormalize",
+ "JN_AreaWidthHeight",
+ "JN_AreaXY",
+ "JN_Blip",
+ "JN_BlipLoader",
+ "JN_BooleanOperation",
+ "JN_Condition",
+ "JN_CoolDown",
+ "JN_CoolDownOutput",
+ "JN_CropFace",
+ "JN_DatetimeFormat",
+ "JN_DatetimeInfo",
+ "JN_DatetimeNow",
+ "JN_Dump",
+ "JN_DumpOutput",
+ "JN_FaceRestoreModelLoader",
+ "JN_FaceRestoreWithModel",
+ "JN_FirstActive",
+ "JN_ImageAddMask",
+ "JN_ImageBatch",
+ "JN_ImageCenterArea",
+ "JN_ImageCrop",
+ "JN_ImageGrid",
+ "JN_ImageInfo",
+ "JN_ImageSharpness",
+ "JN_ImageSquare",
+ "JN_ImageUncrop",
+ "JN_KSampler",
+ "JN_KSamplerAdvancedParams",
+ "JN_KSamplerFaceRestoreParams",
+ "JN_KSamplerResizeInputParams",
+ "JN_KSamplerResizeMaskAreaParams",
+ "JN_KSamplerResizeOutputParams",
+ "JN_KSamplerSeamlessParams",
+ "JN_KSamplerTileParams",
+ "JN_LoadImageDirectory",
+ "JN_LogicOperation",
+ "JN_MaskInfo",
+ "JN_MathOperation",
+ "JN_MathOperationArray",
+ "JN_PrimitiveArrayInfo",
+ "JN_PrimitiveBatchToArray",
+ "JN_PrimitiveBoolean",
+ "JN_PrimitiveFloat",
+ "JN_PrimitiveInt",
+ "JN_PrimitivePrompt",
+ "JN_PrimitiveString",
+ "JN_PrimitiveStringMultiline",
+ "JN_PrimitiveStringToArray",
+ "JN_PrimitiveToArray",
+ "JN_PrimitiveToBoolean",
+ "JN_PrimitiveToFloat",
+ "JN_PrimitiveToInt",
+ "JN_PrimitiveToString",
+ "JN_RemoveBackground",
+ "JN_Seamless",
+ "JN_SeamlessBorder",
+ "JN_SeamlessBorderCrop",
+ "JN_SelectItem",
+ "JN_Sleep",
+ "JN_SleepOutput",
+ "JN_SliceOperation",
+ "JN_StopIf",
+ "JN_StopIfOutput",
+ "JN_TextConcatenation",
+ "JN_TextReplace",
+ "JN_TimedeltaFormat",
+ "JN_TimedeltaInfo",
+ "JN_VAEPatch"
+ ],
+ {
+ "title_aux": "jn_node_suite_comfyui [WIP]"
+ }
+ ],
+ "https://github.com/joe002/comfyui-rtx-remix": [
+ [
+ "RTXRemixBatchLoader",
+ "RTXRemixGeneratePBR",
+ "RTXRemixHashLookup",
+ "RTXRemixIterateTextures",
+ "RTXRemixLoadCapture",
+ "RTXRemixProjectInfo",
+ "RTXRemixSaveToMod"
+ ],
+ {
+ "title_aux": "comfyui-rtx-remix [UNSAFE]"
+ }
+ ],
+ "https://github.com/jonathan-bryant/ComfyUI-ImageStraightener": [
+ [
+ "AutoStraightenImage"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageStraightener [WIP]"
+ }
+ ],
+ "https://github.com/jonstreeter/comfyui-archive-output": [
+ [
+ "ArchiveOutputWorkflow"
+ ],
+ {
+ "title_aux": "Archive Output [UNSAFE]"
+ }
+ ],
+ "https://github.com/jordancoult/ComfyUI_HelpfulNodes": [
+ [
+ "JCo_CropAroundKPS"
+ ],
+ {
+ "title_aux": "ComfyUI_HelpfulNodes"
+ }
+ ],
+ "https://github.com/jorin91/ComfyUI-JSG-Utils": [
+ [
+ "JSGAddMetadata",
+ "JSGCaptionBuilder",
+ "JSGDeleteFilePassAny",
+ "JSGDeleteFilePassImage",
+ "JSGDeleteFilePassString",
+ "JSGFindImagePathsRecursive",
+ "JSGFindImagesRecursiveList",
+ "JSGLoadImageFromPath",
+ "JSGParsePath",
+ "JSGRandomColorHSVA",
+ "JSGRemoveMetadata",
+ "JSGSaveImage",
+ "JSGSetMetadata"
+ ],
+ {
+ "title_aux": "ComfyUI-JSG-Utils [UNSAFE]"
+ }
+ ],
+ "https://github.com/jpwgad/jpwgad-comfy": [
+ [
+ "AutoSelector",
+ "OutputPath",
+ "SizeInput"
+ ],
+ {
+ "title_aux": "jpwgad"
+ }
+ ],
+ "https://github.com/jschoormans/Comfy-InterestingPixels": [
+ [
+ "Random Palette",
+ "Shareable Image Slider"
+ ],
+ {
+ "title_aux": "ComfyUI-TexturePacker [WIP]"
+ }
+ ],
+ "https://github.com/jtrue/ComfyUI-MaskTools": [
+ [
+ "ColorToMask",
+ "MaskColorRange"
+ ],
+ {
+ "description": "Pixel-selection tools (masks) for ComfyUI \u2014 modular.",
+ "nickname": "Mask",
+ "title": "MaskTools",
+ "title_aux": "MaskTools"
+ }
+ ],
+ "https://github.com/jtscmw01/ComfyUI-DiffBIR": [
+ [
+ "DiffBIR_sample",
+ "DiffBIR_sample_advanced",
+ "Simple_load",
+ "Stage1_load",
+ "Stage2_load"
+ ],
+ {
+ "title_aux": "ComfyUI-DiffBIR"
+ }
+ ],
+ "https://github.com/jtydhr88/ComfyUI-Unique3D": [
+ [
+ "Unique3DLoadPipeline",
+ "Unique3DRun - Geo Reconstruct",
+ "Unique3DRun - MVPrediction"
+ ],
+ {
+ "title_aux": "ComfyUI-Unique3D [WIP]"
+ }
+ ],
+ "https://github.com/jtydhr88/ComfyUI_frontend_vue_basic": [
+ [
+ "vue-basic"
+ ],
+ {
+ "title_aux": "ComfyUI Frontend Vue Basic [WIP]"
+ }
+ ],
+ "https://github.com/judian17/ComfyUI-MIDI-3D": [
+ [
+ "MIDI3DAllPassRenderer",
+ "MIDI3DInstanceCropper",
+ "MIDI3DLoader",
+ "MIDI3DSampler",
+ "MIDI3DTextureBaker"
+ ],
+ {
+ "title_aux": "ComfyUI-MIDI-3D [WIP]"
+ }
+ ],
+ "https://github.com/junhe421/comfyui_batch_image_processor": [
+ [
+ "BatchImageDifferenceToPromptFiles",
+ "custom_nodes"
+ ],
+ {
+ "title_aux": "comfyui_batch_image_processor [WIP]"
+ }
+ ],
+ "https://github.com/kadirnar/ComfyUI-Adapter": [
+ [
+ "GarmentSegLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Adapter [WIP]"
+ }
+ ],
+ "https://github.com/kandy/ComfyUI-KAndy": [
+ [
+ "KAndyTaggerModelLoader",
+ "KAndyWD14Tagger",
+ "KPromtGen",
+ "KandyLoad",
+ "KandySave",
+ "KandySimplePrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-KAndy"
+ }
+ ],
+ "https://github.com/kanttouchthis/ComfyUI-SDNQ": [
+ [
+ "SDNQLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-SDNQ [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/karthikg-09/ComfyUI-3ncrypt": [
+ [
+ "Enhanced Save Image",
+ "Markdown Editor"
+ ],
+ {
+ "title_aux": "ComfyUI-KG09 [WIP]"
+ }
+ ],
+ "https://github.com/kaski23/Kaskis_Comfy_Nodes": [
+ [
+ "AudioResampler",
+ "CollectKeyedVideosNode",
+ "CollectVideosNode",
+ "ConformAudio",
+ "ConformVideo",
+ "ExtendVideoNearestFrame",
+ "ImageDelay",
+ "IntToString",
+ "KlingVideoHandler",
+ "LoadImageWithFilename",
+ "LoadVideoWithFilename",
+ "PairSwitchNode",
+ "PreviewImageLimited",
+ "StringSplitSelect",
+ "Unbroken-Video-Handler",
+ "VideoHandler",
+ "WorkflowLoggerNode"
+ ],
+ {
+ "title_aux": "Kaskis_Comfy_Nodes"
+ }
+ ],
+ "https://github.com/kesslerdev/kesslerdev_comfyui_nodes": [
+ [
+ "KesslerDev_AlwaysSeed",
+ "KesslerDev_EnvironmentVariableGetter",
+ "KesslerDev_LoadImageAndFilename",
+ "KesslerDev_LoadImagesFromFolder",
+ "KesslerDev_MultilineTextChoice"
+ ],
+ {
+ "title_aux": "Comfyui : kesslerdev_comfyui_nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/kevin314/ComfyUI-FastVideo": [
+ [
+ "DITConfig",
+ "InferenceArgs",
+ "LoadImagePath",
+ "TextEncoderConfig",
+ "VAEConfig",
+ "VideoGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-FastVideo"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-CV-VAE": [
+ [
+ "CV_VAE_Decode",
+ "CV_VAE_Encode",
+ "CV_VAE_Load"
+ ],
+ {
+ "title_aux": "ComfyUI-CV-VAE"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-DeepSeek-VL": [
+ [
+ "deepseek_vl_inference",
+ "deepseek_vl_model_loader"
+ ],
+ {
+ "title_aux": "ComfyUI nodes to use DeepSeek-VL"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-DiffSynthWrapper": [
+ [
+ "DiffSynthSampler",
+ "DownloadAndLoadDiffSynthExVideoSVD"
+ ],
+ {
+ "title_aux": "ComfyUI DiffSynth wrapper nodes"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-DiffusersSD3Wrapper": [
+ [
+ "LoadSD3DiffusersPipeline",
+ "SD3ControlNetSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-DiffusersSD3Wrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-EasyAnimateWrapper": [
+ [
+ "DownloadAndLoadEasyAnimateModel",
+ "EasyAnimateDecode",
+ "EasyAnimateImageEncoder",
+ "EasyAnimateResize",
+ "EasyAnimateSampler",
+ "EasyAnimateTextEncode"
+ ],
+ {
+ "title_aux": "ComfyUI-EasyAnimateWrapper [WIP]"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-FollowYourEmojiWrapper": [
+ [
+ "DownloadAndLoadFYEModel",
+ "FYECLIPEncode",
+ "FYEClipEmbedToComfy",
+ "FYELandmarkEncode",
+ "FYELandmarkToComfy",
+ "FYEMediaPipe",
+ "FYESampler",
+ "FYESamplerLong"
+ ],
+ {
+ "title_aux": "ComfyUI-FollowYourEmojiWrapper [WIP]"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-FramePackWrapper": [
+ [
+ "DownloadAndLoadFramePackModel",
+ "FramePackFindNearestBucket",
+ "FramePackLoraSelect",
+ "FramePackSampler",
+ "FramePackSingleFrameSampler",
+ "FramePackTorchCompileSettings",
+ "LoadFramePackModel"
+ ],
+ {
+ "title_aux": "ComfyUI-FramePackWrapper [WIP]"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-Hunyuan3DWrapper": [
+ [
+ "CV2InpaintTexture",
+ "DownloadAndLoadHy3DDelightModel",
+ "DownloadAndLoadHy3DPaintModel",
+ "Hy3DApplyTexture",
+ "Hy3DBPT",
+ "Hy3DBakeFromMultiview",
+ "Hy3DCameraConfig",
+ "Hy3DDelightImage",
+ "Hy3DDiffusersSchedulerConfig",
+ "Hy3DExportMesh",
+ "Hy3DFastSimplifyMesh",
+ "Hy3DGenerateMesh",
+ "Hy3DGenerateMeshMultiView",
+ "Hy3DGetMeshPBRTextures",
+ "Hy3DIMRemesh",
+ "Hy3DLoadMesh",
+ "Hy3DMeshInfo",
+ "Hy3DMeshUVWrap",
+ "Hy3DMeshVerticeInpaintTexture",
+ "Hy3DModelLoader",
+ "Hy3DNvdiffrastRenderer",
+ "Hy3DPostprocessMesh",
+ "Hy3DRenderMultiView",
+ "Hy3DRenderMultiViewDepth",
+ "Hy3DRenderSingleView",
+ "Hy3DSampleMultiView",
+ "Hy3DSetMeshPBRAttributes",
+ "Hy3DSetMeshPBRTextures",
+ "Hy3DTorchCompileSettings",
+ "Hy3DUploadMesh",
+ "Hy3DVAEDecode",
+ "Hy3DVAELoader",
+ "Hy3D_2_1SimpleMeshGen",
+ "MESHToTrimesh",
+ "TrimeshToMESH"
+ ],
+ {
+ "title_aux": "ComfyUI-ComfyUI-Hunyuan3DWrapper [WIP]"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-MMAudio": [
+ [
+ "MMAudioFeatureUtilsLoader",
+ "MMAudioModelLoader",
+ "MMAudioSampler",
+ "MMAudioVoCoderLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-MMAudio [WIP]"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-MochiWrapper": [
+ [
+ "DownloadAndLoadMochiModel",
+ "MochiDecode",
+ "MochiDecodeSpatialTiling",
+ "MochiFasterCache",
+ "MochiImageEncode",
+ "MochiLatentPreview",
+ "MochiModelLoader",
+ "MochiSampler",
+ "MochiSigmaSchedule",
+ "MochiTextEncode",
+ "MochiTorchCompileSettings",
+ "MochiVAEEncoderLoader",
+ "MochiVAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-MochiWrapper [WIP]"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-VEnhancer": [
+ [
+ "DownloadAndLoadVEnhancerModel",
+ "VEnhancerSampler",
+ "VEnhancerUnpad"
+ ],
+ {
+ "title_aux": "ComfyUI nodes for VEnhancer [WIP]"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-VideoNoiseWarp": [
+ [
+ "GetWarpedNoiseFromVideo",
+ "GetWarpedNoiseFromVideoAnimateDiff",
+ "GetWarpedNoiseFromVideoCogVideoX",
+ "GetWarpedNoiseFromVideoHunyuan"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoNoiseWarp [WIP]"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-WanAnimatePreprocess": [
+ [
+ "DrawViTPose",
+ "OnnxDetectionModelLoader",
+ "PoseAndFaceDetection",
+ "PoseDetectionOneToAllAnimation",
+ "PoseRetargetPromptHelper"
+ ],
+ {
+ "title_aux": "ComfyUI-WanAnimatePreprocess [WIP]"
+ }
+ ],
+ "https://github.com/killshotttttt/ComfyUI-killshotttttt": [
+ [
+ "MeshyImageToImage"
+ ],
+ {
+ "title_aux": "ComfyUI-killshotttttt [WIP]"
+ }
+ ],
+ "https://github.com/kimara-ai/ComfyUI-Kimara-AI-Image-From-URL": [
+ [
+ "KimaraAIImageFromURL"
+ ],
+ {
+ "title_aux": "ComfyUI-Kimara-AI-Image-From-URL [WIP]"
+ }
+ ],
+ "https://github.com/kongds1999/ComfyUI_was_image": [
+ [
+ "BBoxToCoco",
+ "BBoxToXYWH",
+ "BBoxVisNode",
+ "Check Person In Text",
+ "CocoToNumber",
+ "ConvertGrayToImage",
+ "ConvertToDict",
+ "CustomUltralyticsModelLoader",
+ "Generate Color Palette",
+ "GetImageSize",
+ "ImageResizeAdvanced",
+ "Replace Color By Palette",
+ "UltralyticsCheckCategory",
+ "UltralyticsInference",
+ "UltralyticsInference_face_detection",
+ "UltralyticsListIndexToNames",
+ "UltralyticsModelLoader",
+ "UltralyticsVisualization",
+ "ViewText"
+ ],
+ {
+ "title_aux": "ComfyUI_was_image"
+ }
+ ],
+ "https://github.com/krakenunbound/kraken-discord-bot": [
+ [
+ "KrakenDiscordBot",
+ "KrakenDiscordBotStatus"
+ ],
+ {
+ "title_aux": "Kraken Discord Bot"
+ }
+ ],
+ "https://github.com/krich-cto/ComfyUI-Flow-Control": [
+ [
+ "CLIPLoaderGGUF",
+ "DualCLIPLoaderGGUF",
+ "FlowCheckpointPresetLoader",
+ "FlowClipCondition",
+ "FlowClipTextEncode",
+ "FlowConditioningAutoSwitch",
+ "FlowFluxPresetLoader",
+ "FlowGate",
+ "FlowImageAutoBatch",
+ "FlowImageCondition",
+ "FlowKSampler",
+ "FlowLatentAutoBatch",
+ "FlowLatentCondition",
+ "FlowLoraLoader",
+ "FlowLoraLoaderModelOnly",
+ "FlowModelManager",
+ "FlowSaveImage",
+ "QuadrupleCLIPLoaderGGUF",
+ "TripleCLIPLoaderGGUF",
+ "UnetLoaderGGUF",
+ "UnetLoaderGGUFAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI Flow Control [UNSTABLE]"
+ }
+ ],
+ "https://github.com/krisshen2021/comfyui_OpenRouterNodes": [
+ [
+ "OpenRouterOAINode_Infer",
+ "OpenRouterOAINode_Models",
+ "OpenRouterOAINode_hunyuanPrompt",
+ "OpenRouterOAINode_txt2imgPrompt"
+ ],
+ {
+ "title_aux": "comfyui_OpenRouterNodes [WIP]"
+ }
+ ],
+ "https://github.com/kuailefengnan2024/Comfyui_Layer": [
+ [
+ "VisionAPIPluginNode"
+ ],
+ {
+ "title_aux": "Comfyui_Layer"
+ }
+ ],
+ "https://github.com/kuschanow/ComfyUI-SD-Slicer": [
+ [
+ "SdSlicer"
+ ],
+ {
+ "title_aux": "ComfyUI-SD-Slicer"
+ }
+ ],
+ "https://github.com/kxh/ComfyUI-ImageUpscaleWithModelMultipleTimes": [
+ [
+ "ImageUpscaleWithModelMultipleTimes"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageUpscaleWithModelMultipleTimes"
+ }
+ ],
+ "https://github.com/kxh/ComfyUI-sam2": [
+ [
+ "Segment"
+ ],
+ {
+ "title_aux": "ComfyUI-sam2"
+ }
+ ],
+ "https://github.com/kycg/comfyui-Kwtoolset": [
+ [
+ "KWImageResizeByLongerSide",
+ "KWNagetiveString",
+ "KWPositiveString",
+ "KWShowAnything",
+ "KWanywhereString",
+ "KwtoolsetChangeOpenpose",
+ "KwtoolsetCheckpointLoaderwithpreview",
+ "KwtoolsetConditioningSelect",
+ "KwtoolsetGetHipMask",
+ "KwtoolsetGetHipMasktest",
+ "KwtoolsetGetImageSize",
+ "KwtoolsetGrowMaskPlus",
+ "KwtoolsetImageSelect",
+ "KwtoolsetLoadCheckpointsBatch",
+ "KwtoolsetLoraLoaderwithpreview",
+ "KwtoolsetMaskAdd",
+ "KwtoolsetModelSelect",
+ "LatentMatch"
+ ],
+ {
+ "title_aux": "comfyui-Kwtoolset"
+ }
+ ],
+ "https://github.com/kylegrover/comfyui-python-cowboy": [
+ [
+ "PythonScript"
+ ],
+ {
+ "title_aux": "comfyui-python-cowboy [UNSAFE]"
+ }
+ ],
+ "https://github.com/laksjdjf/ssd-1b-comfyui": [
+ [
+ "SSD-1B-Loader"
+ ],
+ {
+ "title_aux": "ssd-1b-comfyui"
+ }
+ ],
+ "https://github.com/laobaishu1/ComfyUI-JSON-Upload-Iterator": [
+ [
+ "JSONUploadIterator"
+ ],
+ {
+ "title_aux": "ComfyUI-JSON-Upload-Iterator [UNSAFE]"
+ }
+ ],
+ "https://github.com/laubsauger/comfyui-storyboard": [
+ [
+ "MarkdownRenderer",
+ "NodeInspector",
+ "OpenAIAPIKeyManager",
+ "OpenAIAdvancedConfiguration",
+ "OpenAIChatGPT"
+ ],
+ {
+ "author": "laub",
+ "description": "A ComfyUI node to display markdown text, and other storyboard features.",
+ "nickname": "Storyboard",
+ "title": "ComfyUI Storyboard",
+ "title_aux": "ComfyUI Storyboard [WIP]"
+ }
+ ],
+ "https://github.com/lazybuttalented/ComfyUI_LBT": [
+ [
+ "LBT_CombineImagesFromBatch",
+ "LBT_CombineImagesFromList",
+ "LBT_CropByMask",
+ "LBT_GetFolderInfo",
+ "LBT_ListInfo",
+ "LBT_LoadImagesFromFolder",
+ "LBT_LoadImagesFromList",
+ "LBT_LoadTextFromFolder",
+ "LBT_LoadVideoFromFolder",
+ "LBT_SaveImage",
+ "LBT_StringToList",
+ "LBT_TextImageLibraryComparison"
+ ],
+ {
+ "title_aux": "ComfyUI_LBT [WIP]"
+ }
+ ],
+ "https://github.com/leacvikas0/ComfyUI-Presence": [
+ [
+ "FluxAdaptiveInjector",
+ "GaussianNoisePadding",
+ "PresenceDirector",
+ "PresencePaddingTester",
+ "PresencePreview",
+ "PresenceSaver"
+ ],
+ {
+ "title_aux": "ComfyUI-Presence [WIP]"
+ }
+ ],
+ "https://github.com/leadbreak/comfyui-faceaging": [
+ [
+ "AgeTransformationNode"
+ ],
+ {
+ "title_aux": "Face Aging [WIP]"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_AliControlnetInpainting": [
+ [
+ "AliInpaintingsampler",
+ "EcomXL_AddFG",
+ "EcomXL_Condition",
+ "EcomXL_Controlnet_ModelLoader",
+ "EcomXL_LoadImage",
+ "EcomXL_SDXL_Inpaint_ModelLoader",
+ "Flux_Controlnet_ModelLoader",
+ "Flux_Inpainting_ModelLoader",
+ "SD3_Controlnet_ModelLoader",
+ "SD3_Inpainting_ModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_AliControlnetInpainting [WIP]"
+ }
+ ],
+ "https://github.com/leoleelxh/ComfyUI-MidjourneyNode-leoleexh": [
+ [
+ "MidjourneyGenerateNode",
+ "MidjourneyUpscaleNode"
+ ],
+ {
+ "title_aux": "ComfyUI-MidjourneyNode-leoleexh"
+ }
+ ],
+ "https://github.com/leon-etienne/ComfyUI_Scoring-Nodes": [
+ [
+ "AestheticScore",
+ "ImageSimilarity",
+ "MultiAestheticScore",
+ "MultiImageToTextSimilarity",
+ "MultiTextToImageSimilarity",
+ "TextSimilarity"
+ ],
+ {
+ "title_aux": "ComfyUI_Scoring-Nodes"
+ }
+ ],
+ "https://github.com/lfelipegg/lfgg_custom_nodes_comfyui": [
+ [
+ "LfggImageResolutionByRatio",
+ "LfggLatentSizeByRatio",
+ "LfggPixelBudgetLatentSize"
+ ],
+ {
+ "title_aux": "[WIP] lfgg_custom_nodes_comfyui"
+ }
+ ],
+ "https://github.com/lggcfx2020/ComfyUI-LGGCFX-Tools": [
+ [
+ "LGGCFX_ImagePreview",
+ "LGGCFX_audio",
+ "LGGCFX_prompt",
+ "LGGCFX_resolution",
+ "LGGCFX_time_frame",
+ "VRAMReserver"
+ ],
+ {
+ "title_aux": "ComfyUI-LGGCFX-Tools"
+ }
+ ],
+ "https://github.com/lgldlk/ComfyUI-img-tiler": [
+ [
+ "PC ImageListTileMaker",
+ "PC TileMaker",
+ "PC TilerImage",
+ "PC TilerSelect"
+ ],
+ {
+ "title_aux": "ComfyUI-img-tiler"
+ }
+ ],
+ "https://github.com/lihaoyun6/ComfyUI-lhyNodes": [
+ [
+ "CSVRandomPicker",
+ "CSVRandomPickerAdv",
+ "CudaDevicePatcher",
+ "ImageBatchtoImageList",
+ "ImageBatchtoImages",
+ "KSamplerConfig",
+ "KSamplerSchedulerFallback",
+ "LoadImageBatch",
+ "LoadZipBatch",
+ "MaskToSAMCoords",
+ "MaskToSAMCoordsV2",
+ "MorseCode",
+ "PoseReformer",
+ "SaveImageAsZip",
+ "SaveTextAsZip",
+ "StrFormat",
+ "StrFormatAdv",
+ "YoloFaceReformer",
+ "detailerKSamplerSchedulerFallback",
+ "effKSamplerSchedulerFallback",
+ "noneNode",
+ "queueHandler"
+ ],
+ {
+ "title_aux": "ComfyUI-lhyNodes"
+ }
+ ],
+ "https://github.com/linhusyung/comfyui-Build-and-train-your-network": [
+ [
+ "Conv_layer",
+ "Normalization_layer",
+ "activation_function",
+ "create_dataset",
+ "create_intput",
+ "create_model",
+ "create_training_task",
+ "forward_test",
+ "linear_layer",
+ "pooling_layer",
+ "pre_train_layer",
+ "res_connect",
+ "show_dimensions",
+ "view_layer"
+ ],
+ {
+ "title_aux": "ComfyUI Build and Train Your Network [WIP]"
+ }
+ ],
+ "https://github.com/littleowl/ComfyUI-MV-HECV": [
+ [
+ "CombineSideBySide",
+ "DepthResize",
+ "StereoShift_Fast"
+ ],
+ {
+ "title_aux": "ComfyUI-MV-HECV"
+ }
+ ],
+ "https://github.com/liusida/ComfyUI-Notebook": [
+ [
+ "NotebookCell",
+ "NotebookForceRerun",
+ "PreviewHTML"
+ ],
+ {
+ "title_aux": "ComfyUI-Notebook [UNSAFE]"
+ }
+ ],
+ "https://github.com/locphan201/ComfyUI-Alter-Nodes": [
+ [
+ "AlterMMAudioConfig",
+ "AlterMMAudioFeatureUtils",
+ "AlterMMAudioModelLoader",
+ "AlterMMAudioSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-Alter-Nodes"
+ }
+ ],
+ "https://github.com/locphan201/ComfyUI-Alternatives": [
+ [
+ "Lora Applier",
+ "Lora PreLoader",
+ "LoraApplier",
+ "LoraPreLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Alternatives"
+ }
+ ],
+ "https://github.com/logicalor/comfyui_mv_adapter": [
+ [
+ "MVAdapterBackgroundRemoval",
+ "MVAdapterCameraEmbed",
+ "MVAdapterClearVRAM",
+ "MVAdapterI2MVSampler",
+ "MVAdapterImageGrid",
+ "MVAdapterImagePreprocess",
+ "MVAdapterLoRALoader",
+ "MVAdapterModelSetup",
+ "MVAdapterPipelineLoader",
+ "MVAdapterReferencePreprocess",
+ "MVAdapterSchedulerConfig",
+ "MVAdapterSplitViews",
+ "MVAdapterT2MVSampler",
+ "MVAdapterVAEDecode",
+ "MVAdapterViewSelector"
+ ],
+ {
+ "title_aux": "comfyui_mv_adapter [WIP]"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-HunyuanLoom": [
+ [
+ "ConfigureModifiedHY",
+ "HYApplyRegionalConds",
+ "HYAttnOverride",
+ "HYCreateRegionalCond",
+ "HYFetaEnhance",
+ "HYFlowEditGuider",
+ "HYFlowEditGuiderAdv",
+ "HYFlowEditGuiderCFG",
+ "HYFlowEditGuiderCFGAdv",
+ "HYFlowEditSampler",
+ "HYForwardODESampler",
+ "HYInverseModelSamplingPred",
+ "HYReverseModelSamplingPred",
+ "HYReverseODESampler",
+ "HyVideoFlowEditSamplerWrapper"
+ ],
+ {
+ "title_aux": "ComfyUI-HunyuanLoom [WIP]"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-Veevee": [
+ [
+ "ApplyVVModel",
+ "FlowConfig",
+ "FlowGetFlow",
+ "GetRaftFlow",
+ "InjectionConfig",
+ "PivotConfig",
+ "RaveConfig",
+ "SCAConfig",
+ "TemporalConfig",
+ "VVGetRaftFlow",
+ "VVSamplerSampler",
+ "VVUnsamplerSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-Veevee [WIP]"
+ }
+ ],
+ "https://github.com/longgui0318/comfyui-one-more-step": [
+ [
+ "Calculate More Step Latent",
+ "Load More Step Model"
+ ],
+ {
+ "title_aux": "comfyui-one-more-step [WIP]"
+ }
+ ],
+ "https://github.com/longzoho/ComfyUI-Qdrant-Saver": [
+ [
+ "QDrantSaver"
+ ],
+ {
+ "title_aux": "ComfyUI-Qdrant-Saver"
+ }
+ ],
+ "https://github.com/lordwedggie/xcpNodes": [
+ [
+ "derpBaseAlpha",
+ "derpSlider",
+ "xcpDerpBool",
+ "xcpDerpFloat",
+ "xcpDerpINT",
+ "xcpDerpSeed"
+ ],
+ {
+ "title_aux": "xcpNodes [WIP]"
+ }
+ ],
+ "https://github.com/love2hina-net/ComfyUI-Local-Translator": [
+ [
+ "LocalTranslator"
+ ],
+ {
+ "title_aux": "ComfyUI-Local-Translator"
+ }
+ ],
+ "https://github.com/lrzjason/Comfyui-Condition-Utils": [
+ [
+ "LoadCondition",
+ "LoadConditionFromLoras",
+ "SaveCondition"
+ ],
+ {
+ "title_aux": "Comfyui-Condition-Utils [WIP]"
+ }
+ ],
+ "https://github.com/lrzjason/Comfyui-DiffusersUtils": [
+ [
+ "DiffusersGenPriorTokens",
+ "DiffusersGenPriorTokensDebug",
+ "DiffusersImageEditGenerator",
+ "DiffusersImageGenerator",
+ "DiffusersLoadLoraOnly",
+ "DiffusersLoraLayersOperation",
+ "DiffusersLoraLoader",
+ "DiffusersLoraStatViewer",
+ "DiffusersLoraUnloader",
+ "DiffusersMergeLoraToPipeline",
+ "DiffusersModelLoader",
+ "DiffusersPipeline",
+ "DiffusersPipelineBuilder",
+ "DiffusersPreprocessorLoader",
+ "DiffusersSampling",
+ "DiffusersSaveLora",
+ "DiffusersTextEncode",
+ "DiffusersTextEncoderLoader",
+ "DiffusersTokenizerLoader",
+ "DiffusersTransformerLoader",
+ "DiffusersVAELoader",
+ "LoadLoraOnly",
+ "LoraLayersOperation",
+ "LoraStatViewer",
+ "MergeLoraToTransformer",
+ "SaveLora",
+ "TextEncodeDiffusersLongCat",
+ "TextEncodeDiffusersLongCatCached",
+ "TextEncodeDiffusersLongCatImageEdit"
+ ],
+ {
+ "title_aux": "Comfyui-DiffusersUtils [WIP]"
+ }
+ ],
+ "https://github.com/ltdrdata/ComfyUI-Workflow-Component": [
+ [
+ "ComboToString",
+ "ExecutionBlocker",
+ "ExecutionControlString",
+ "ExecutionOneOf",
+ "ExecutionSwitch",
+ "InputUnzip",
+ "InputZip",
+ "LoopControl",
+ "LoopCounterCondition",
+ "OptionalTest",
+ "TensorToCPU"
+ ],
+ {
+ "title_aux": "ComfyUI-Workflow-Component [WIP]"
+ }
+ ],
+ "https://github.com/lu64k/ks_nodes": [
+ [
+ "KS Json Count",
+ "KS Json To String",
+ "KS JsonKeyExtractor",
+ "KS JsonKeyReplacer",
+ "KS JsonlFolderMatchReader",
+ "KS Load Images From Folder",
+ "KS Random File Name",
+ "KS Save Text",
+ "KS Text_String",
+ "KS get time int",
+ "KS json array constrains filter",
+ "KS json float range filter",
+ "KS json value eliminator",
+ "KS load text",
+ "KS_Json_Extract_Key_And_Value_3ways",
+ "KS_Json_Key_Random_3ways",
+ "KS_Json_Key_Replace_3ways",
+ "KS_Json_loader",
+ "KS_Save_JSON",
+ "KS_any_payload_image",
+ "KS_image_metadata_node",
+ "KS_make_json_node",
+ "KS_merge_json_node"
+ ],
+ {
+ "title_aux": "ks_nodes"
+ }
+ ],
+ "https://github.com/lucafoscili/lf-nodes": [
+ [
+ "LF_BackgroundRemover",
+ "LF_Blend",
+ "LF_BlobToImage",
+ "LF_Bloom",
+ "LF_BlurImages",
+ "LF_Boolean",
+ "LF_Brightness",
+ "LF_CaptionImageWD14",
+ "LF_CharacterImpersonator",
+ "LF_CheckpointSelector",
+ "LF_CivitAIMetadataSetup",
+ "LF_Clarity",
+ "LF_ColorAnalysis",
+ "LF_CompareImages",
+ "LF_Contrast",
+ "LF_ControlPanel",
+ "LF_CreateMask",
+ "LF_Desaturation",
+ "LF_DetectRegions",
+ "LF_DiffusionModelSelector",
+ "LF_DisplayBoolean",
+ "LF_DisplayFloat",
+ "LF_DisplayInteger",
+ "LF_DisplayJSON",
+ "LF_DisplayPrimitiveAsJSON",
+ "LF_DisplayString",
+ "LF_EmbeddingSelector",
+ "LF_EmptyImage",
+ "LF_ExtractPromptFromLoraTag",
+ "LF_ExtractString",
+ "LF_FilmGrain",
+ "LF_Float",
+ "LF_GaussianBlur",
+ "LF_GeminiAPI",
+ "LF_GetRandomKeyFromJSON",
+ "LF_GetValueFromJSON",
+ "LF_ImageClassifier",
+ "LF_ImageHistogram",
+ "LF_ImageListFromJSON",
+ "LF_ImageToSVG",
+ "LF_ImagesEditingBreakpoint",
+ "LF_ImagesSlideshow",
+ "LF_Inpaint",
+ "LF_InpaintAdvanced",
+ "LF_Integer",
+ "LF_IsLandscape",
+ "LF_JSONPromptCombinator",
+ "LF_KeywordCounter",
+ "LF_KeywordToggleFromJSON",
+ "LF_LLMChat",
+ "LF_LLMMessenger",
+ "LF_LUTApplication",
+ "LF_LUTGeneration",
+ "LF_Line",
+ "LF_LoadAndEditImages",
+ "LF_LoadCLIPSegModel",
+ "LF_LoadFileOnce",
+ "LF_LoadImages",
+ "LF_LoadLocalJSON",
+ "LF_LoadLoraTags",
+ "LF_LoadMetadata",
+ "LF_LoadWD14Model",
+ "LF_LoadWD14Onnx",
+ "LF_LoraAndEmbeddingSelector",
+ "LF_LoraSelector",
+ "LF_MarkdownDocGenerator",
+ "LF_MathOperation",
+ "LF_MultipleImageResizeForWeb",
+ "LF_Notify",
+ "LF_ONNXSelector",
+ "LF_OpenAIAPI",
+ "LF_ParsePromptWithLoraTags",
+ "LF_RandomBoolean",
+ "LF_RegexReplace",
+ "LF_RegionExtractor",
+ "LF_RegionMask",
+ "LF_ResizeImageByEdge",
+ "LF_ResizeImageToDimension",
+ "LF_ResizeImageToSquare",
+ "LF_ResolutionSwitcher",
+ "LF_SamplerSelector",
+ "LF_Saturation",
+ "LF_SaveImageForCivitAI",
+ "LF_SaveJSON",
+ "LF_SaveMarkdown",
+ "LF_SaveSVG",
+ "LF_SaveText",
+ "LF_SchedulerSelector",
+ "LF_Sepia",
+ "LF_SequentialSeedsGenerator",
+ "LF_SetValueInJSON",
+ "LF_ShuffleJSONKeys",
+ "LF_Something2Number",
+ "LF_Something2String",
+ "LF_SortJSONKeys",
+ "LF_SortTags",
+ "LF_SplitTone",
+ "LF_StabilityAPI",
+ "LF_String",
+ "LF_StringReplace",
+ "LF_StringTemplate",
+ "LF_StringToJSON",
+ "LF_SwitchFloat",
+ "LF_SwitchImage",
+ "LF_SwitchInteger",
+ "LF_SwitchJSON",
+ "LF_SwitchMask",
+ "LF_SwitchString",
+ "LF_TiledSuperRes",
+ "LF_TiltShift",
+ "LF_UnsharpMask",
+ "LF_UpdateUsageStatistics",
+ "LF_UploadImages",
+ "LF_UpscaleModelSelector",
+ "LF_UrandomSeedGenerator",
+ "LF_UsageStatistics",
+ "LF_VAEDecode",
+ "LF_VAEEncode",
+ "LF_VAESelector",
+ "LF_Vibrance",
+ "LF_ViewImages",
+ "LF_ViewSVGs",
+ "LF_Vignette",
+ "LF_WallOfText",
+ "LF_WriteJSON"
+ ],
+ {
+ "title_aux": "LF Nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/lum3on/comfyui_RollingDepth": [
+ [
+ "RollingDepthNode"
+ ],
+ {
+ "title_aux": "comfyui_RollingDepth [WIP]"
+ }
+ ],
+ "https://github.com/lyra-ai/lyra-nodes": [
+ [
+ "LyraAudioVisualizer",
+ "LyraCdnUploader",
+ "LyraCharacterSearch",
+ "LyraFilenameBuilder",
+ "LyraImageAudioFusion",
+ "LyraLoadAudioFromURL",
+ "LyraLoadImageFromURL",
+ "LyraStringToTypes"
+ ],
+ {
+ "title_aux": "lyra-nodes"
+ }
+ ],
+ "https://github.com/maTORIx/ComfyUI-KeypointsToImage": [
+ [
+ "KeypointsToImage"
+ ],
+ {
+ "title_aux": "ComfyUI-KeypointsToImage"
+ }
+ ],
+ "https://github.com/machinesarenotpeople/comfyui-energycost": [
+ [
+ "TimeCostEndNode",
+ "TimeStartNode"
+ ],
+ {
+ "title_aux": "comfyui-energycost"
+ }
+ ],
+ "https://github.com/maizerrr/comfyui-code-nodes": [
+ [
+ "BBoxDrawNode",
+ "BBoxParseNode",
+ "DummyNode",
+ "ImageBatchNode",
+ "MaskEditorNode",
+ "OpenAIGPTImageNode",
+ "OpenAIQueryNode"
+ ],
+ {
+ "title_aux": "comfyui-code-nodes"
+ }
+ ],
+ "https://github.com/majocola/comfyui-standbybutton": [
+ [
+ "StandbyButton"
+ ],
+ {
+ "title_aux": "Standbybutton"
+ }
+ ],
+ "https://github.com/majorsauce/comfyui_indieTools": [
+ [
+ "IndCutByMask",
+ "IndLocalScale",
+ "IndPastImage",
+ "IndSolidify",
+ "IndYoloDetector"
+ ],
+ {
+ "title_aux": "comfyui_indieTools [WIP]"
+ }
+ ],
+ "https://github.com/mamamia1110/comfyui-boggerrr-nodes": [
+ [
+ "SeedEdit3",
+ "Seedream3"
+ ],
+ {
+ "title_aux": "Boggerrr Nodes [WIP]"
+ }
+ ],
+ "https://github.com/mamorett/ComfyUI-SmolVLM": [
+ [
+ "Smolvlm_Caption_Analyzer",
+ "Smolvlm_Flux_CLIPTextEncode",
+ "Smolvlm_SaveTags",
+ "Smolvlm_Tagger"
+ ],
+ {
+ "title_aux": "ComfyUI-SmolVLM [WIP]"
+ }
+ ],
+ "https://github.com/mamorett/comfyui_minicpm_vision": [
+ [
+ "MiniCPMVisionGGUF"
+ ],
+ {
+ "title_aux": "comfyui_minicpm_vision"
+ }
+ ],
+ "https://github.com/maoper11/comfyui_inteliweb_nodes": [
+ [
+ "InteliwebSystemCheck"
+ ],
+ {
+ "title_aux": "ComfyUI_Inteliweb_nodes"
+ }
+ ],
+ "https://github.com/marcueberall/ComfyUI-BuildPath": [
+ [
+ "Build Path Adv"
+ ],
+ {
+ "title_aux": "ComfyUI-BuildPath"
+ }
+ ],
+ "https://github.com/marduk191/comfyui_cmdtls": [
+ [
+ "DirectoryCreator",
+ "FileBrowser",
+ "FileCopy",
+ "FileDelete",
+ "FileReader",
+ "FileWriter",
+ "ShellExecutor"
+ ],
+ {
+ "title_aux": "comfyui_cmdtls [UNSAFE]"
+ }
+ ],
+ "https://github.com/martinken/ComfyUI-KMNodes": [
+ [
+ "KM_Aspect_Ratio_Selector",
+ "KM_Aspect_Ratio_Selector2",
+ "KM_Color_Correct",
+ "KM_Downscale_Image",
+ "KM_Merge_Images",
+ "KM_Resize_Image",
+ "KM_Resize_Image_With_Model",
+ "KM_Safe_Mask_Bounds",
+ "KM_Safe_SEGS_Bounds",
+ "KM_Video_Image_Color_Match",
+ "KM_WanVideoToVideo",
+ "WanImageToVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-KMNodes"
+ }
+ ],
+ "https://github.com/maruhidd/ComfyUI_Transparent-Background": [
+ [
+ "FillTransparentNode",
+ "RemoveBackgroundNode"
+ ],
+ {
+ "title_aux": "Transparent Background for ComfyUI"
+ }
+ ],
+ "https://github.com/mashb1t/comfyui-nodes-mashb1t": [
+ [
+ "mashb1t: LoadImage"
+ ],
+ {
+ "title_aux": "ComfyUI mashb1t nodes"
+ }
+ ],
+ "https://github.com/masmullin2000/ComfyUI-MMYolo": [
+ [
+ "MMFace_Finder"
+ ],
+ {
+ "title_aux": "ComfyUI-MMYolo"
+ }
+ ],
+ "https://github.com/matDobek/ComfyUI_duck": [
+ [
+ "Combine Images (duck)"
+ ],
+ {
+ "title_aux": "ComfyUI_duck"
+ }
+ ],
+ "https://github.com/maurorilla/ComfyUI-MisterMR-Nodes": [
+ [
+ "AddLogo",
+ "AddSingleObject",
+ "AddSingleText",
+ "ColorNode",
+ "Log",
+ "PromptSelector",
+ "SaveImageAndText"
+ ],
+ {
+ "title_aux": "ComfyUI-glb-to-stl [WIP]"
+ }
+ ],
+ "https://github.com/max-dingsda/ComfyUI-PromptLoop": [
+ [
+ "PromptLoopFromFile",
+ "PromptLoopFromText",
+ "PromptLoopInfo",
+ "PromptLoopSaveImage"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptLoop [WIP]"
+ }
+ ],
+ "https://github.com/mehbebe/ComfyLoraGallery": [
+ [
+ "LoraGallery"
+ ],
+ {
+ "title_aux": "ComfyLoraGallery [WIP]"
+ }
+ ],
+ "https://github.com/melMass/ComfyUI-Lygia": [
+ [
+ "LygiaProgram",
+ "LygiaUniforms"
+ ],
+ {
+ "title_aux": "ComfyUI-Lygia"
+ }
+ ],
+ "https://github.com/mertgoksel/ComfyUI-Noot-Nodes": [
+ [
+ "StagedKSampler",
+ "TagRandomizer"
+ ],
+ {
+ "title_aux": "comfyui-noot-nodes [WIP]"
+ }
+ ],
+ "https://github.com/mico-world/comfyui_mico_node": [
+ [
+ "HFUNETLoader"
+ ],
+ {
+ "title_aux": "comfyui_mico_node"
+ }
+ ],
+ "https://github.com/mikeymcfish/FishTools": [
+ [
+ "AnaglyphCreator",
+ "AnaglyphCreatorPro",
+ "Deptherize",
+ "LaserCutterFull",
+ "ShadowMap"
+ ],
+ {
+ "author": "Fish",
+ "description": "This extension provides tools for generating laser cutter ready files and other fun stuff",
+ "nickname": "FishTools",
+ "title": "FishTools",
+ "title_aux": "LaserCutterFull and Deptherize Nodes"
+ }
+ ],
+ "https://github.com/mikheys/ComfyUI-mikheys": [
+ [
+ "WanImageDimensions",
+ "WanOptimalResolution",
+ "\u0418\u043c\u044f\u0414\u043b\u044fComfyUI"
+ ],
+ {
+ "title_aux": "ComfyUI-mikheys"
+ }
+ ],
+ "https://github.com/minhtuannhn/comfyui-gemini-studio": [
+ [
+ "GetFileNameFromURL"
+ ],
+ {
+ "title_aux": "comfyui-gemini-studio [WIP]"
+ }
+ ],
+ "https://github.com/minujeong/comfyui-oklch-color-picker": [
+ [
+ "OKLCH",
+ "OKLCHPicker"
+ ],
+ {
+ "title_aux": "comfyui-oklch-color-picker"
+ }
+ ],
+ "https://github.com/miragecoa/ComfyUI-LLM-Evaluation": [
+ [
+ "AccuracyNode",
+ "ClearVRAM",
+ "DeleteFile",
+ "DownloadHuggingFaceModel",
+ "F1ScoreNode",
+ "FirstNode",
+ "JSONToListNode",
+ "JsonResultGenerator",
+ "LLMLocalLoader",
+ "LoadFileNode",
+ "MathOperationNode",
+ "MyNode",
+ "PullOllamaModel",
+ "SelectItemByIndexNode",
+ "SelectItemByKeyNode",
+ "StringCombiner",
+ "StringPatternEnforcer",
+ "StringScraper",
+ "UpdateLLMResultToJson",
+ "WriteToJson"
+ ],
+ {
+ "title_aux": "ComfyUI-LLM-Evaluation [WIP]"
+ }
+ ],
+ "https://github.com/mittimi/ComfyUI_mittimiLoadPresetLite": [
+ [
+ "CombineParamDataLiteMittimi",
+ "LoadCheckpointLiteMittimi",
+ "LoadImageParamLiteMittimi",
+ "LoadSetParamLiteMittimi",
+ "LoraLoaderExtractedPromptLiteMittimi",
+ "SaveImageParamLiteMittimi",
+ "SaveParamToPresetLiteMittimi",
+ "TextToConditioningLiteMittimi"
+ ],
+ {
+ "author": "mittimi",
+ "description": "This node can easily switch between models and prompts by saving presets.",
+ "nickname": "mittimiLoadPresetLite",
+ "title": "mittimiLoadPresetLite",
+ "title_aux": "ComfyUI_mittimiLoadPresetLite [UNSAFE]"
+ }
+ ],
+ "https://github.com/mliand/ComfyUI-Calendar-Node": [
+ [
+ "Comfy Calendar Node",
+ "SportyStyleNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Calendar-Node [WIP]"
+ }
+ ],
+ "https://github.com/mm-akhtar/comfyui-mask-selector-node": [
+ [
+ "Mask Selector"
+ ],
+ {
+ "title_aux": "comfyui-mask-selector-node"
+ }
+ ],
+ "https://github.com/mohamedsobhi777/ComfyUI-FramerComfy": [
+ [
+ "FramerComfyBooleanInputNode",
+ "FramerComfyFloatInputNode",
+ "FramerComfyInputImageNode",
+ "FramerComfyInputNumberNode",
+ "FramerComfyInputStringNode",
+ "FramerComfySaveImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI-FramerComfy [WIP]"
+ }
+ ],
+ "https://github.com/molbal/comfy-url-fetcher": [
+ [
+ "URL Fetcher"
+ ],
+ {
+ "title_aux": "comfy-url-fetcher [WIP]"
+ }
+ ],
+ "https://github.com/mr-krak3n/ComfyUI-Qwen": [
+ [
+ "Qwen2_Chat_Zho",
+ "Qwen2_ModelLoader_Zho",
+ "Qwen2_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen [CONFLICT]"
+ }
+ ],
+ "https://github.com/mrCodinghero/ComfyUI-Codinghero": [
+ [
+ "Basic Settings",
+ "Image Size Calculator",
+ "Model Selector",
+ "Settings",
+ "Upscale Settings Calculator"
+ ],
+ {
+ "title_aux": "ComfyUI-Codinghero"
+ }
+ ],
+ "https://github.com/muriellee1x/ComfyUI-Logic-Switch": [
+ [
+ "RandomStringSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-Logic-Switch"
+ }
+ ],
+ "https://github.com/muriellee1x/ComfyUI-Mysterious-node2": [
+ [
+ "Key Edge Args (V2.3.6fixE2_clean)",
+ "Key Matte Math Args (V2.3.6fixE2_clean)",
+ "Key Protect Highlights Args (V2.3.6fixE2_clean)",
+ "Key Sampler Args (V2.3.6fixE2_clean)",
+ "Key Spill/Algo Args (V2.3.6fixE2_clean)",
+ "KeylightCoreHubV3"
+ ],
+ {
+ "title_aux": "ComfyUI-Mysterious-node2 [WIP]"
+ }
+ ],
+ "https://github.com/muriellee1x/ComfyUI-Mysterious-node3": [
+ [
+ "VideoTimeRemapSpeedPresets"
+ ],
+ {
+ "title_aux": "ComfyUI-Mysterious-node3"
+ }
+ ],
+ "https://github.com/muriellee1x/ComfyUI-switch-angles": [
+ [
+ "CameraPromptGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-switch-angles"
+ }
+ ],
+ "https://github.com/mut-ex/comfyui-gligengui-node": [
+ [
+ "GLIGEN_GUI"
+ ],
+ {
+ "title_aux": "ComfyUI GLIGEN GUI Node"
+ }
+ ],
+ "https://github.com/muvich3n/ComfyUI-Claude-I2T": [
+ [
+ "ClaudeImageToPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-Claude-I2T"
+ }
+ ],
+ "https://github.com/muvich3n/ComfyUI-Crop-Border": [
+ [
+ "CropImageBorder"
+ ],
+ {
+ "title_aux": "ComfyUI-Crop-Border"
+ }
+ ],
+ "https://github.com/my-xz-org/comfyui_xz_nodes": [
+ [
+ "XZImageToText",
+ "XZLlmResponse"
+ ],
+ {
+ "title_aux": "comfyui_xz_nodes"
+ }
+ ],
+ "https://github.com/naderzare/comfyui-inodes": [
+ [
+ "IAzureAiApi",
+ "ICutStrings",
+ "IFinalizeProject",
+ "IIfElse",
+ "ILLMExecute",
+ "ILLMExecute2",
+ "ILoadAzureAiApi",
+ "ILoadOllamaApi",
+ "IMergeImages",
+ "IMultilineSplitToStrings",
+ "IPassImage",
+ "IPostProcessLLMResponse",
+ "IPromptGenerator",
+ "IRandomChoiceToStrings",
+ "ISaveImage",
+ "ISaveText",
+ "IStringsCounter",
+ "IStringsToFile",
+ "IStringsToString",
+ "ITimesToStrings",
+ "IUploadToGoogleDrive",
+ "IZipImages"
+ ],
+ {
+ "title_aux": "comfyui-inodes"
+ }
+ ],
+ "https://github.com/nadushu/comfyui-handy-nodes": [
+ [
+ "EmptyRandomLatentImage",
+ "FilenamePromptExtractor",
+ "My Image Save",
+ "QueueBatchFixedSeed",
+ "TextCleaner",
+ "TextSplitter"
+ ],
+ {
+ "title_aux": "comfyui-handy-nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/neeltheninja/ComfyUI-TempFileDeleter": [
+ [
+ "TempCleaner"
+ ],
+ {
+ "title_aux": "ComfyUI-TempFileDeleter [UNSAFE]"
+ }
+ ],
+ "https://github.com/neeltheninja/ComfyUI-TextOverlay": [
+ [
+ "TextOverlay"
+ ],
+ {
+ "title_aux": "ComfyUI-TextOverlay"
+ }
+ ],
+ "https://github.com/neo0801/my-comfy-node": [
+ [
+ "DeepMosaicGetImageMosaicMask",
+ "DeepMosaicGetVideoMosaicMask",
+ "DeepMosaicRemoveImageMosaic",
+ "DeepMosaicRemoveVideoMosaic"
+ ],
+ {
+ "title_aux": "my-comfy-node"
+ }
+ ],
+ "https://github.com/nestflow/ComfyUI-WanPlus": [
+ [
+ "WanImageToVideoKeepFrames",
+ "WanImageToVideoMask"
+ ],
+ {
+ "title_aux": "ComfyUI-WanPlus"
+ }
+ ],
+ "https://github.com/neverbiasu/ComfyUI-DeepSeek": [
+ [
+ "DeepSeekCaller"
+ ],
+ {
+ "title_aux": "ComfyUI-DeepSeek"
+ }
+ ],
+ "https://github.com/neverbiasu/ComfyUI-Show-o": [
+ [
+ "ShowoImageCaptioning",
+ "ShowoImageInpainting",
+ "ShowoModelLoader",
+ "ShowoTextToImage"
+ ],
+ {
+ "title_aux": "ComfyUI-Show-o [WIP]"
+ }
+ ],
+ "https://github.com/neverbiasu/ComfyUI-StereoCrafter": [
+ [
+ "DepthSplattingModelLoader",
+ "DepthSplattingNode",
+ "InpaintingInferenceNode"
+ ],
+ {
+ "title_aux": "ComfyUI-StereoCrafter [WIP]"
+ }
+ ],
+ "https://github.com/newraina/ComfyUI-Remote-Save-Image": [
+ [
+ "RemoteImageSaver"
+ ],
+ {
+ "title_aux": "ComfyUI-Remote-Save-Image [UNSAFE]"
+ }
+ ],
+ "https://github.com/newraina/comfyui-photoshop-v2": [
+ [
+ "ClipPass",
+ "PhotoshopConnection",
+ "PhotoshopToComfyUI",
+ "SendToPhotoshop",
+ "modelPass",
+ "\ud83d\udd39 Photoshop RemoteConnection",
+ "\ud83d\udd39ClipPass",
+ "\ud83d\udd39Floats",
+ "\ud83d\udd39Photoshop ComfyUI Plugin",
+ "\ud83d\udd39Photoshop Images",
+ "\ud83d\udd39Photoshop Strings",
+ "\ud83d\udd39Reroute - Anything Everywhere",
+ "\ud83d\udd39SeedManager",
+ "\ud83d\udd39SendTo Photoshop Plugin",
+ "\ud83d\udd39modelPass"
+ ],
+ {
+ "title_aux": "comfyui-photoshop-v2 [WIP]"
+ }
+ ],
+ "https://github.com/nidefawl/ComfyUI-nidefawl": [
+ [
+ "BlendImagesWithBoundedMasks",
+ "CropImagesWithMasks",
+ "CustomCallback",
+ "DisplayAnyType",
+ "EmptyImageWithColor",
+ "ImageToLatent",
+ "LatentPerlinNoise",
+ "LatentScaledNoise",
+ "LatentToImage",
+ "MaskFromColor",
+ "ModelSamplerTonemapNoiseTest",
+ "PythonScript",
+ "ReferenceOnlySimple",
+ "SamplerCustomCallback",
+ "SamplerDPMPP_2M_SDE_nidefawl",
+ "SetLatentCustomNoise",
+ "SplitCustomSigmas",
+ "VAELoaderDataType",
+ "gcLatentTunnel"
+ ],
+ {
+ "title_aux": "ComfyUI-nidefawl [UNSAFE]"
+ }
+ ],
+ "https://github.com/nikkuexe/ComfyUI-ListDataHelpers": [
+ [
+ "List Difference",
+ "VHS Output Filter",
+ "VHS_VideoOutputFilter"
+ ],
+ {
+ "title_aux": "List Data Helper Nodes"
+ }
+ ],
+ "https://github.com/nobinBB/comfyui-samenodes": [
+ [
+ "A1111PromptSplitter",
+ "BatchImageProcessor",
+ "CivitaiBulkDownloader",
+ "ExtractPromptFromImage",
+ "FloatToString",
+ "FloatToStringWithPrefix",
+ "LoraWildcardGenerator",
+ "RepeatTextLines"
+ ],
+ {
+ "title_aux": "comfyui-samenodes"
+ }
+ ],
+ "https://github.com/nomadop/ComfyUI-Video-Matting": [
+ [
+ "AlphaCombine",
+ "ApplyAlpha",
+ "CutieLoader",
+ "CutieProcess",
+ "FrameSelector",
+ "ImageSequencePackager",
+ "MODNetInference",
+ "MODNetLoader",
+ "PreviewSlider",
+ "RMBGInference",
+ "RMBGLoader",
+ "RVMInference",
+ "RVMLoader",
+ "TrimapVisualize",
+ "TwoPassBlend",
+ "U2NetInference",
+ "U2NetLoader",
+ "ViTMatteLoader",
+ "ViTMatteRefine"
+ ],
+ {
+ "title_aux": "ComfyUI-Video-Matting [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/nomcycle/ComfyUI_Cluster": [
+ [
+ "ClusterBroadcastLoadedImage",
+ "ClusterBroadcastTensor",
+ "ClusterEndSubgraph",
+ "ClusterExecuteCurrentWorkflow",
+ "ClusterExecuteWorkflow",
+ "ClusterFanInImages",
+ "ClusterFanOutImage",
+ "ClusterFanOutLatent",
+ "ClusterFanOutMask",
+ "ClusterFinallyFree",
+ "ClusterFlattenBatchedImageList",
+ "ClusterFreeNow",
+ "ClusterGatherImages",
+ "ClusterGatherLatents",
+ "ClusterGatherMasks",
+ "ClusterGetInstanceWorkItemFromBatch",
+ "ClusterInfo",
+ "ClusterInsertAtIndex",
+ "ClusterListenTensorBroadcast",
+ "ClusterSplitBatchToList",
+ "ClusterStartSubgraph",
+ "ClusterStridedReorder",
+ "ClusterUseSubgraph"
+ ],
+ {
+ "title_aux": "ComfyUI_Cluster [WIP]"
+ }
+ ],
+ "https://github.com/nschpy/ComfyUI_MovisAdapter": [
+ [
+ "MPA Brightness Effect",
+ "MPA Combine Videos",
+ "MPA Contrast Effect",
+ "MPA Speed Effect",
+ "MPA Text Overlay",
+ "MPA Video Transition"
+ ],
+ {
+ "title_aux": "ComfyUI_MovisAdapter [UNSAFE]"
+ }
+ ],
+ "https://github.com/numq/comfyui-camera-capture-node": [
+ [
+ "CameraCapture"
+ ],
+ {
+ "title_aux": "comfyui-camera-capture-node"
+ }
+ ],
+ "https://github.com/obisin/ComfyUI-FSampler": [
+ [
+ "FSampler",
+ "FSamplerAdvanced"
+ ],
+ {
+ "title_aux": "FSampler for ComfyUI \u2014 Fast Skips via Epsilon Extrapolation [WIP]"
+ }
+ ],
+ "https://github.com/octapus8085/OpenAI-comfyui-O": [
+ [
+ "AIImageNode",
+ "APIImageNode"
+ ],
+ {
+ "title_aux": "OpenAI-comfyui-O"
+ }
+ ],
+ "https://github.com/odedgranot/comfyui-ffmpeg-node": [
+ [
+ "FFmpegNode"
+ ],
+ {
+ "title_aux": "ComfyUI FFmpeg Node [UNSAFE]"
+ }
+ ],
+ "https://github.com/odedgranot/comfyui_video_save_node": [
+ [
+ "VideoSaveNode"
+ ],
+ {
+ "title_aux": "ComfyUI Video Save Node [UNSAFE]"
+ }
+ ],
+ "https://github.com/orion4d/ComfyUI_unified_list_selector": [
+ [
+ "UnifiedListSelector"
+ ],
+ {
+ "title_aux": "Unified List Selector for ComfyUI [UNSAFE]"
+ }
+ ],
+ "https://github.com/orion4d/Orion4D_MasterPrompt": [
+ [
+ "list_selector_pro",
+ "mp_file_txt_pro",
+ "mp_folder_merge_lines",
+ "mp_format",
+ "mp_json_format",
+ "mp_json_kv_lines",
+ "mp_json_merge",
+ "mp_json_pick",
+ "mp_list_editor",
+ "mp_replace",
+ "mp_super_show_text",
+ "mp_wrap",
+ "multi_list_mixer",
+ "text_field_mixer",
+ "text_prompt_mixer"
+ ],
+ {
+ "title_aux": "Orion4D MasterPrompt Suite for ComfyUI [UNSAFE]"
+ }
+ ],
+ "https://github.com/orpheus-gaze/comfyui-sundryutils": [
+ [
+ "\u2728 Apply HaldClut",
+ "\u2728 Return DateString",
+ "\u2728 Sharpen, RealGrain & Autocontrast"
+ ],
+ {
+ "title_aux": "comfyui-sundryutils"
+ }
+ ],
+ "https://github.com/osuiso-depot/comfyui-keshigom_custom": [
+ [
+ "KANI_Checkpoint_Loader_From_String",
+ "KANI_MathExpression",
+ "KANI_Multiplexer",
+ "KANI_ShowAnything",
+ "KANI_TextFind",
+ "KANI_TrueorFalse",
+ "RegExTextChopper",
+ "ResolutionSelector",
+ "ResolutionSelectorConst",
+ "StringNodeClass"
+ ],
+ {
+ "title_aux": "comfyui-keshigom_custom"
+ }
+ ],
+ "https://github.com/owengillett/ComfyUI-tilefusion": [
+ [
+ "VideoGridCombine"
+ ],
+ {
+ "title_aux": "ComfyUI-tilefusion"
+ }
+ ],
+ "https://github.com/oxysoft/Comfy-Compel": [
+ [
+ "CLIPEmbedCompel"
+ ],
+ {
+ "title_aux": "Comfy-Compel"
+ }
+ ],
+ "https://github.com/oztrkoguz/ComfyUI_Kosmos2_BBox_Cutter": [
+ [
+ "Kosmos2SamplerSimple",
+ "KosmosLoader",
+ "Write"
+ ],
+ {
+ "title_aux": "Kosmos2_BBox_Cutter Models"
+ }
+ ],
+ "https://github.com/p1atdev/comfyui-aesthetic-predictor": [
+ [
+ "LoadAestheticPredictorNode",
+ "PredictAestheticScore"
+ ],
+ {
+ "title_aux": "comfyui-aesthetic-predictor"
+ }
+ ],
+ "https://github.com/pacchikAI/ImagePromptBatch": [
+ [
+ "LoadImageandPrompt"
+ ],
+ {
+ "title_aux": "ImagePromptBatch [UNSAFE]"
+ }
+ ],
+ "https://github.com/pacchikAI/comfyui_pacchik_window": [
+ [
+ "DynamicSelectionNode",
+ "JsonSelectionNode",
+ "StaticSelectionNode"
+ ],
+ {
+ "title_aux": "comfyui_pacchik_window [UNSAFE]"
+ }
+ ],
+ "https://github.com/panchovial-max/ComfyUI-ListHelper": [
+ [
+ "AudioListCombine",
+ "ListFilter",
+ "ListTransform",
+ "NumberListGenerator",
+ "PromptSplitByDelimiter"
+ ],
+ {
+ "title_aux": "ComfyUI-ListHelper [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/papcorns/ComfyUI-Papcorns-Node-UploadToGCS": [
+ [
+ "UploadImageToGCS"
+ ],
+ {
+ "title_aux": "ComfyUI-Papcorns-Node-UploadToGCS"
+ }
+ ],
+ "https://github.com/parmarjh/ComfyUI-MochiWrapper-I2V": [
+ [
+ "DownloadAndLoadMochiModel",
+ "MochiDecode",
+ "MochiDecodeSpatialTiling",
+ "MochiFasterCache",
+ "MochiImageEncode",
+ "MochiLatentPreview",
+ "MochiModelLoader",
+ "MochiSampler",
+ "MochiSigmaSchedule",
+ "MochiTextEncode",
+ "MochiTorchCompileSettings",
+ "MochiVAEEncoderLoader",
+ "MochiVAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-MochiWrapper-I2V [WIP]"
+ }
+ ],
+ "https://github.com/paulhoux/Smart-Prompting": [
+ [
+ "SaveImageWithPrefix",
+ "TextAppend",
+ "TextCharacterSelector",
+ "TextEncodeReusable",
+ "TextFile",
+ "TextNegatives",
+ "TextSearchReplace",
+ "TextString",
+ "TextStyleSelector"
+ ],
+ {
+ "title_aux": "List Data Helper Nodes"
+ }
+ ],
+ "https://github.com/pfpb/comfyui-badnodes": [
+ [
+ "ReplaceEmptyMasksWithLastMasks"
+ ],
+ {
+ "title_aux": "comfyui-badnodes"
+ }
+ ],
+ "https://github.com/pft-ChenKu/ComfyUI_system-dev": [
+ [
+ "TY_ExecutionTime"
+ ],
+ {
+ "title_aux": "ComfyUI_system-dev [WIP]"
+ }
+ ],
+ "https://github.com/phamngoctukts/ComyUI-Tupham": [
+ [
+ "AreaCondition_v2",
+ "ConditionUpscale",
+ "MultiLatent",
+ "Runnodeselected",
+ "ghepanh"
+ ],
+ {
+ "title_aux": "ComyUI-Tupham"
+ }
+ ],
+ "https://github.com/pickles/ComfyUI-PyPromptGenerator": [
+ [
+ "PyPromptFileGeneratorNode",
+ "PyPromptGeneratorNode"
+ ],
+ {
+ "title_aux": "PyPromptGenerator [UNSAFE]"
+ }
+ ],
+ "https://github.com/pictorialink/ComfyUI-static-resource": [
+ [
+ "StaticResource"
+ ],
+ {
+ "title_aux": "comfyui-static-resource[UNSAFE]"
+ }
+ ],
+ "https://github.com/pinkpixel-dev/comfyui-llm-prompt-enhancer": [
+ [
+ "PromptEnhancer"
+ ],
+ {
+ "title_aux": "ComfyUI LLM Prompt Enhancer [WIP]"
+ }
+ ],
+ "https://github.com/pixuai/ComfyUI-PixuAI": [
+ [
+ "PromptSearch"
+ ],
+ {
+ "title_aux": "ComfyUI-PixuAI"
+ }
+ ],
+ "https://github.com/pizurny/Comfyui-FeedbackSampler": [
+ [
+ "FeedbackSampler"
+ ],
+ {
+ "title_aux": "ComfyUI Feedback Sampler [WIP]"
+ }
+ ],
+ "https://github.com/pmarmotte2/Comfyui-VibeVoiceSelector": [
+ [
+ "VibeVoiceSelector"
+ ],
+ {
+ "title_aux": "VibeVoiceSelector [WIP]"
+ }
+ ],
+ "https://github.com/poisenbery/NudeNet-Detector-Provider": [
+ [
+ "NudeNetDetectorProvider"
+ ],
+ {
+ "title_aux": "NudeNet-Detector-Provider [WIP]"
+ }
+ ],
+ "https://github.com/pomelyu/cy-prompt-tools": [
+ [
+ "CY_LLM",
+ "CY_LoadPrompt",
+ "CY_LoadPrompt4",
+ "CY_LoadPromptPro",
+ "CY_PromptComposer",
+ "CY_TextBox"
+ ],
+ {
+ "title_aux": "cy-prompt-tools"
+ }
+ ],
+ "https://github.com/power88/ComfyUI-PDiD-Nodes": [
+ [
+ "Blend Images",
+ "BlendTwoImages",
+ "Check Character Tag",
+ "CheckAnimeCharacter",
+ "CollectImageSize",
+ "Get Image Colors",
+ "Get image size",
+ "GetImageMainColor",
+ "List Operations",
+ "ListOperation",
+ "Make Image Gray",
+ "Nearest SDXL Resolution divided by 64",
+ "NearestSDXLResolutionby64",
+ "RemoveSaturation"
+ ],
+ {
+ "title_aux": "ComfyUI-PDiD-Nodes [WIP]"
+ }
+ ],
+ "https://github.com/prabinpebam/anyPython": [
+ [
+ "Any Python"
+ ],
+ {
+ "author": "prabinpebam",
+ "description": "This node can execute Python operations with user-confirmed risk management",
+ "nickname": "anyPython",
+ "title": "anyPython v0.0.3",
+ "title_aux": "anyPython [UNSAFE]"
+ }
+ ],
+ "https://github.com/prodogape/ComfyUI-clip-interrogator": [
+ [
+ "ComfyUIClipInterrogator"
+ ],
+ {
+ "title_aux": "ComfyUI-clip-interrogator [WIP]"
+ }
+ ],
+ "https://github.com/przewodo/ComfyUI-Przewodo-Utils": [
+ [
+ "przewodo AppendToAnyList",
+ "przewodo BatchImagesFromPath",
+ "przewodo CompareNumbersToCombo",
+ "przewodo DebugLatentShapes",
+ "przewodo FloatIfElse",
+ "przewodo HasInputvalue",
+ "przewodo ImageScaleFactor",
+ "przewodo ImageSizer",
+ "przewodo IsInputDisabled",
+ "przewodo SwapAnyComparison",
+ "przewodo SwapAnyCondition",
+ "przewodo SwapImageComparison",
+ "przewodo WanFirstLastFirstFrameToVideo",
+ "przewodo WanGetMaxImageResolutionByAspectRatio",
+ "przewodo WanImageToVideoAdvancedSampler",
+ "przewodo WanModelTypeSelector",
+ "przewodo WanPromptChunkStacker",
+ "przewodo WanVideoEnhanceAVideo",
+ "przewodo WanVideoGenerationModeSelector",
+ "przewodo WanVideoLoraStack",
+ "przewodo WanVideoVaeDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-Przewodo-Utils [WIP]"
+ }
+ ],
+ "https://github.com/pschroedl/ComfyUI-StreamDiffusion": [
+ [
+ "StreamDiffusionAdvancedConfig",
+ "StreamDiffusionCheckpointLoader",
+ "StreamDiffusionConfig",
+ "StreamDiffusionLPCheckpointLoader",
+ "StreamDiffusionLoraLoader",
+ "StreamDiffusionPrebuiltConfig",
+ "StreamDiffusionSampler",
+ "StreamDiffusionTensorRTEngineLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-StreamDiffusion"
+ }
+ ],
+ "https://github.com/punicfaith/ComfyUI-GoogleAIStudio": [
+ [
+ "BatchImageNormalizer",
+ "GoogleGeminiPrompt",
+ "NanobananaNode"
+ ],
+ {
+ "title_aux": "ComfyUI-GoogleAIStudio"
+ }
+ ],
+ "https://github.com/pururin777/ComfyUI-Manual-Openpose": [
+ [
+ "Manual Openpose Setter"
+ ],
+ {
+ "title_aux": "JasonW146"
+ }
+ ],
+ "https://github.com/pzzmyc/comfyui-sd3-simple-simpletuner": [
+ [
+ "sd not very simple simpletuner by hhy",
+ "simpletunerpro"
+ ],
+ {
+ "title_aux": "comfyui-sd3-simple-simpletuner"
+ }
+ ],
+ "https://github.com/qimi-dev/ComfyUI-Qimi-Tiler": [
+ [
+ "Qimi-ImageToTiles",
+ "Qimi-TilesImage"
+ ],
+ {
+ "title_aux": "ComfyUI-Qimi-Tiler"
+ }
+ ],
+ "https://github.com/qlikpetersen/ComfyUI-AI_Tools": [
+ [
+ "CreateListJSON",
+ "CreateListString",
+ "DoLogin",
+ "FixLinksAndRevLinks",
+ "HttpRequest",
+ "Image_Attachment",
+ "IncludeInSpiderData",
+ "JSON_Attachment",
+ "Json2String",
+ "LoadSpiderData",
+ "PNGtoImage",
+ "Query_OpenAI",
+ "RemoveCircularReferences",
+ "RunPython",
+ "RunPythonGriptapeTool",
+ "SaveSpiderData",
+ "SpiderCrawl",
+ "SpiderSplit",
+ "String2Json",
+ "String_Attachment",
+ "TextMultiSave"
+ ],
+ {
+ "author": "kierdran",
+ "description": "Tools for agentic testing",
+ "nickname": "ai_tools",
+ "title": "AI_Tools",
+ "title_aux": "ComfyUI-AI_Tools [UNSAFE]"
+ }
+ ],
+ "https://github.com/quinteroac/comfyui_api_executor_nodes": [
+ [
+ "AnyTo",
+ "ImageInputCombiner",
+ "ImageInputPair",
+ "IntInputCombiner",
+ "IntInputPair",
+ "RemoteWorkflowAPIExecutor",
+ "SimpleText",
+ "SimpleWorkflowAPIExecutor",
+ "TextImageToImageWorkflowSelector",
+ "TextImageToVideoWorkflowSelector",
+ "TextInputCombiner",
+ "TextInputPair",
+ "TextToImageWorkflowSelector",
+ "TextToVideoWorkflowSelector",
+ "VideoInputPair",
+ "WorkflowAPIExecutor",
+ "YandereRandomTags"
+ ],
+ {
+ "title_aux": "comfyui_api_executor_nodes"
+ }
+ ],
+ "https://github.com/rafstahelin/ComfyUI_KieNanoBananaPro": [
+ [
+ "KieNanoBananaPro",
+ "KieNanoBananaProBatch"
+ ],
+ {
+ "title_aux": "ComfyUI_KieNanoBananaPro"
+ }
+ ],
+ "https://github.com/rakete/comfyui-rakete": [
+ [
+ "rakete.BuildString",
+ "rakete.GetWidgetValue",
+ "rakete.GpuGarbageCollector",
+ "rakete.JoinStrings",
+ "rakete.SelectSamplerName"
+ ],
+ {
+ "author": "Rakete",
+ "description": "Rakete Comfy Custom Nodes",
+ "nickname": "Rakete Nodes",
+ "title": "Rakete Nodes",
+ "title_aux": "comfyui-rakete"
+ }
+ ],
+ "https://github.com/ralonsobeas/ComfyUI-HDRConversion": [
+ [
+ "HDRConversion"
+ ],
+ {
+ "title_aux": "ComfyUI-HDRConversion [WIP]"
+ }
+ ],
+ "https://github.com/raohammad/ComfyUI-VTUtilNodes": [
+ [
+ "JSONKeyExtractor",
+ "JSONListIterator",
+ "JSONQueue",
+ "JSONQueueOutput",
+ "JSONQueueSignal",
+ "SignalCounter",
+ "SimpleCounter",
+ "TextToJSON"
+ ],
+ {
+ "title_aux": "ComfyUI-VTUtilNodes [WIP]"
+ }
+ ],
+ "https://github.com/realm-weaver/ComfyUI-tile-seamstress-360": [
+ [
+ "RW_EquirectangularMask",
+ "RW_EquirectangularSphericalRotate",
+ "RW_PostSeamlessUpscale",
+ "RW_PreSeamlessUpscale",
+ "RW_ResizeToProperRatio",
+ "RW_SegmentBlend"
+ ],
+ {
+ "author": "realm-weaver",
+ "description": "Tools for touching up seams and poles on 360\u00b0 panoramic images and flat tilings.",
+ "nickname": "ts360",
+ "title": "Tile Seamstress 360",
+ "title_aux": "Tile Seamstress 360\u00b0 [WIP]"
+ }
+ ],
+ "https://github.com/redhottensors/ComfyUI-ODE": [
+ [
+ "ODESamplerSelect"
+ ],
+ {
+ "author": "RedHotTensors",
+ "description": "Adaptive ODE Solvers for ComfyUI",
+ "nickname": "ComfyUI-ODE",
+ "title": "ComfyUI-ODE",
+ "title_aux": "ComfyUI-ODE"
+ }
+ ],
+ "https://github.com/remhesneb/comfyui-remote-media": [
+ [
+ "LoadImageByUrl",
+ "LoadVideoByUrl"
+ ],
+ {
+ "title_aux": "comfyui-remote-media"
+ }
+ ],
+ "https://github.com/retech995/Save_Florence2_Bulk_Prompts": [
+ [
+ "SaveTextFlorence"
+ ],
+ {
+ "title_aux": "ComfyUI_SaveImageBulk [UNSAFE]"
+ }
+ ],
+ "https://github.com/rhinoflavored/comfyui_QT": [
+ [
+ "CSVDataMatcher",
+ "QTAutoCropByNPS",
+ "QTExcelImageReader",
+ "QTExcelReader",
+ "QTRandomSelectString",
+ "QTStringWrappingByNumber",
+ "QT_Alpha_Yaxis_Node",
+ "QT_AntiAliasing_Node",
+ "QT_Batch_Anything_Node",
+ "QT_Center_Rotation",
+ "QT_Character_Height_Difference",
+ "QT_Character_Size_Node",
+ "QT_Color_Image_Loop",
+ "QT_Content_Location_Node",
+ "QT_Crop_Alpha",
+ "QT_Crop_Alpha_V2",
+ "QT_Curves_Node",
+ "QT_Dictionary_Node",
+ "QT_Elements_Into_List_Node",
+ "QT_Float_To_Int",
+ "QT_Image_Array",
+ "QT_Image_Array_Circle",
+ "QT_Image_Array_Rectangle",
+ "QT_Image_Overlay",
+ "QT_Image_Overlay_BOOLEAN",
+ "QT_Image_Overlay_Rotation",
+ "QT_Image_Overlay_V2",
+ "QT_Image_Overlay_V3",
+ "QT_Image_Sorting_Node",
+ "QT_Image_Upscale_And_Crop_Node",
+ "QT_Image_Upscale_And_Crop_Node_V2",
+ "QT_Image_Upscale_And_Crop_Node_V3",
+ "QT_Image_Upscale_Node",
+ "QT_Image_Vision_Center_Node",
+ "QT_Join_Image_List_Node",
+ "QT_Line_Break",
+ "QT_Line_Break_V2",
+ "QT_List_Length",
+ "QT_List_Picker",
+ "QT_List_To_String",
+ "QT_Mask_Mix_Node",
+ "QT_Merge_Into_List_Node",
+ "QT_Pageturn_Node",
+ "QT_Pattern_Fill",
+ "QT_Piecewise_Function_Node",
+ "QT_Polar_Coordinate_Conversion_Node",
+ "QT_Rounded_Corner",
+ "QT_SUPIR_Upscale",
+ "QT_Simple_Text_Image_V2",
+ "QT_Sorting_Node",
+ "QT_Split_List_Node",
+ "QT_Split_List_Node_V2",
+ "QT_Split_Mask_Node",
+ "QT_Split_String",
+ "QT_String_Horizontal_To_Vertical",
+ "QT_String_To_List",
+ "QT_String_Wrapping_By_Number",
+ "QT_Text_Input_Switch_Node",
+ "QT_Text_Overlay_V2",
+ "QT_Text_To_Bool_Node",
+ "QT_Tilt_Transform",
+ "QT_Translucent_Node",
+ "QT_Vertical_Text_Overlay",
+ "QT_Video_Combine_Node"
+ ],
+ {
+ "title_aux": "comfyui_QT"
+ }
+ ],
+ "https://github.com/ric-yu/comfyui-datadog-monitor": [
+ [
+ "DatadogMemoryProfiler"
+ ],
+ {
+ "title_aux": "ComfyUI Datadog Monitor [WIP]"
+ }
+ ],
+ "https://github.com/richardctw/ComfyUI-ImageFillBackgroundColor": [
+ [
+ "ImageFillBackgroundColor"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageFillBackgroundColor"
+ }
+ ],
+ "https://github.com/ricklove/ComfyUI-AutoSeg-SAM2": [
+ [
+ "AutoSegSAM2Node"
+ ],
+ {
+ "title_aux": "ComfyUI-AutoSeg-SAM2"
+ }
+ ],
+ "https://github.com/rickyars/sd-cn-animation": [
+ [
+ "SDCNAnimation",
+ "SDCNAnimationAdvanced"
+ ],
+ {
+ "title_aux": "sd-cn-animation"
+ }
+ ],
+ "https://github.com/rishipandey125/ComfyUI-FramePacking": [
+ [
+ "Batch Keyframes",
+ "Get Image Dimensions",
+ "Image Mix RGB",
+ "Pad Batch to 4n+1",
+ "Resize Frame",
+ "Slot Frame",
+ "Threshold Image",
+ "Trim Padded Batch"
+ ],
+ {
+ "title_aux": "ComfyUI-FramePacking [WIP]"
+ }
+ ],
+ "https://github.com/rishipandey125/ComfyUI-StyleFrame-Nodes": [
+ [
+ "Batch Keyframes",
+ "Canny Edge",
+ "Combine RGB Channels",
+ "Create Empty Frames",
+ "Get Image Dimensions",
+ "Image Grayscale",
+ "Load Image Folder",
+ "Load Images",
+ "Load Images From List",
+ "Pad Batch to 4n+1",
+ "Resize Frame",
+ "Save Image Folder",
+ "Select Image From Batch",
+ "Slot Frame",
+ "Split RGB Channels",
+ "String To Float List",
+ "Threshold Image",
+ "Trim Padded Batch"
+ ],
+ {
+ "title_aux": "ComfyUI-StyleFrame-Nodes"
+ }
+ ],
+ "https://github.com/risunobushi/ComfyUI_FaceMesh_Eyewear_Mask": [
+ [
+ "FaceMeshEyewearMask",
+ "MaskFromFacialKeypoints",
+ "MediaPipeFaceToMask",
+ "OpenPoseEyewearMask"
+ ],
+ {
+ "title_aux": "ComfyUI_FaceMesh_Eyewear_Mask"
+ }
+ ],
+ "https://github.com/risunobushi/ComfyUI_FocusMask": [
+ [
+ "FocusMaskExtractor",
+ "FocusOutlineExtractor"
+ ],
+ {
+ "title_aux": "ComfyUI_FocusMask"
+ }
+ ],
+ "https://github.com/risunobushi/ComfyUI_HEXtoRGB": [
+ [
+ "HexToRGB"
+ ],
+ {
+ "title_aux": "ComfyUI_HEXtoRGB"
+ }
+ ],
+ "https://github.com/ritikvirus/comfyui-terminal-modal-node": [
+ [
+ "terminal_node"
+ ],
+ {
+ "title_aux": "ComfyUI Terminal Command Node [UNSAFE]"
+ }
+ ],
+ "https://github.com/ronalds-eu/comfyui-plus-integrations": [
+ [
+ "ImagePassThrough",
+ "ImageToS3"
+ ],
+ {
+ "title_aux": "comfyui-plus-integrations [WIP]"
+ }
+ ],
+ "https://github.com/rookiestar28/ComfyUI_Security_Audit": [
+ [
+ "ComfyUI_Security_Audit"
+ ],
+ {
+ "title_aux": "ComfyUI_Security_Audit"
+ }
+ ],
+ "https://github.com/rossturk/comfyui-primitive-mesh": [
+ [
+ "PrimitiveMeshNode"
+ ],
+ {
+ "title_aux": "ComfyUI Primitive Mesh Generator [WIP]"
+ }
+ ],
+ "https://github.com/rouxianmantou/comfyui-rxmt-nodes": [
+ [
+ "CheckValueTypeNode",
+ "ConvertStrToIntNode",
+ "TextCombineWithCommaNode",
+ "WhyPromptTextNode"
+ ],
+ {
+ "title_aux": "comfyui-rxmt-nodes"
+ }
+ ],
+ "https://github.com/rphmeier/comfyui-videodepthanything": [
+ [
+ "VideoDepthAnythingLoader",
+ "VideoDepthAnythingProcess"
+ ],
+ {
+ "title_aux": "comfyui-videodepthanything"
+ }
+ ],
+ "https://github.com/ruka-game/rukalib_comfyui": [
+ [
+ "RukaDebugProbe",
+ "RukaPromptEnhancer"
+ ],
+ {
+ "title_aux": "ComfyUI RukaLib [WIP]"
+ }
+ ],
+ "https://github.com/ryanontheinside/ComfyUI-Livepeer": [
+ [
+ "BatchInfo",
+ "BatchIterator",
+ "LivepeerA2T",
+ "LivepeerAudioJobGetter",
+ "LivepeerI2I",
+ "LivepeerI2T",
+ "LivepeerI2V",
+ "LivepeerImageJobGetter",
+ "LivepeerLLM",
+ "LivepeerLive2Video",
+ "LivepeerSegment",
+ "LivepeerT2I",
+ "LivepeerT2S",
+ "LivepeerTextJobGetter",
+ "LivepeerUpscale",
+ "LivepeerVideoJobGetter"
+ ],
+ {
+ "title_aux": "ComfyUI-Livepeer [WIP]"
+ }
+ ],
+ "https://github.com/ryanontheinside/ComfyUI-MineWorld": [
+ [
+ "MineWorldGenerateFrame",
+ "MineWorldGenerateSequence",
+ "MineWorldInitialState",
+ "MineWorldModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI MineWorld Nodes [WIP]"
+ }
+ ],
+ "https://github.com/ryanontheinside/ComfyUI_YoloNasObjectDetection_Tensorrt": [
+ [
+ "YoloNasDetectionTensorrt"
+ ],
+ {
+ "title_aux": "ComfyUI_YoloNasObjectDetection_Tensorrt [WIP]"
+ }
+ ],
+ "https://github.com/sahibalejandro/comfyui-sahib-nodes": [
+ [
+ "ChooseResolution"
+ ],
+ {
+ "title_aux": "ComfyUI Sahib Nodes"
+ }
+ ],
+ "https://github.com/saltchicken/ComfyUI-Identity-Mixer": [
+ [
+ "IdentityLoraMixer",
+ "IdentityLoraMixerDirectory",
+ "IdentityLoraMixerStack",
+ "IdentityLoraMixerStackDirectory"
+ ],
+ {
+ "title_aux": "ComfyUI-Identity-Mixer"
+ }
+ ],
+ "https://github.com/saltchicken/ComfyUI-Interactive-Cropper": [
+ [
+ "InteractiveCropNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Interactive-Cropper"
+ }
+ ],
+ "https://github.com/saltchicken/ComfyUI-Local-Loader": [
+ [
+ "LoadImageFromDir",
+ "LoadImageFromOutput",
+ "LoadImageFromPath",
+ "LoadSingleImageFromPath",
+ "LoadVideoFromOutput"
+ ],
+ {
+ "title_aux": "ComfyUI-Local-Loader"
+ }
+ ],
+ "https://github.com/saltchicken/ComfyUI-Prompter": [
+ [
+ "PromptTemplateManager"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompter"
+ }
+ ],
+ "https://github.com/saltchicken/ComfyUI-Selector": [
+ [
+ "SimpleSelectorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Selector"
+ }
+ ],
+ "https://github.com/saltchicken/ComfyUI-Video-Utils": [
+ [
+ "FinalFrameSelector",
+ "FirstNFramesSelector",
+ "LastNFramesSelector",
+ "NthFirstFrameSelector",
+ "NthLastFrameSelector",
+ "PreviewImageWithCounter",
+ "RemoveFirstAndLastFrame",
+ "RemoveFirstFrame",
+ "VideoMerge"
+ ],
+ {
+ "title_aux": "ComfyUI-Video-Utils"
+ }
+ ],
+ "https://github.com/satyam-fp/ComfyUI-GeminiImage": [
+ [
+ "GeminiImageEnhance",
+ "GeminiTextToImage"
+ ],
+ {
+ "title_aux": "ComfyUI-GeminiImage [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/satyasairazole/ComfyUI-Turbandetection": [
+ [
+ "TurbanDetectorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Turbandetection [WIP]"
+ }
+ ],
+ "https://github.com/saulchiu/comfy_saul_plugin": [
+ [
+ "Blend Images",
+ "Change the camera pose of config file",
+ "Compute Keypoints Similarity",
+ "Cutting Video",
+ "End Node",
+ "Extract .webp from Folder",
+ "Extract the First Frame",
+ "Find the most similar webp",
+ "Fuse People and Cigarette",
+ "Get Pose",
+ "Patch Pose to People",
+ "Saul-Plugin",
+ "Smoking Auto Label"
+ ],
+ {
+ "title_aux": "comfyui-saul-plugin [WIP]"
+ }
+ ],
+ "https://github.com/seancheung/comfyui-creative-nodes": [
+ [
+ "CreativeSkipFromFlow",
+ "CreativeSkipToFlow",
+ "CreativeStopFlow",
+ "ResolutionSelector",
+ "ResolutionXLSelector"
+ ],
+ {
+ "title_aux": "comfyui-creative-nodes"
+ }
+ ],
+ "https://github.com/sh570655308/Comfyui-RayNodes": [
+ [
+ "BorderMask",
+ "BracketedTagIndexMerger",
+ "Florence2TagProcessor",
+ "GrabberTagProcessor",
+ "ImageListConverter",
+ "ImageResizer",
+ "ImageSelector",
+ "MaskApplierAndCombiner",
+ "MaskBlackener",
+ "MaskProcessor",
+ "SaturationAdjuster",
+ "SaveImageWebsocket",
+ "TagArrayToLines",
+ "TagIndexMerger"
+ ],
+ {
+ "title_aux": "Comfyui-RayNodes [WIP]"
+ }
+ ],
+ "https://github.com/shadowcz007/ComfyUI-PuLID-Test": [
+ [
+ "ApplyPulid",
+ "PulidEvaClipLoader",
+ "PulidInsightFaceLoader",
+ "PulidModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-PuLID [TEST]"
+ }
+ ],
+ "https://github.com/shadowcz007/Comfyui-EzAudio": [
+ [
+ "EZGenerateAudioNode",
+ "EZLoadModelNode"
+ ],
+ {
+ "title_aux": "Comfyui-EzAudio [WIP]"
+ }
+ ],
+ "https://github.com/shadowcz007/comfyui-CLIPSeg": [
+ [
+ "CLIPSeg_",
+ "CombineMasks_"
+ ],
+ {
+ "title_aux": "comfyui-CLIPSeg"
+ }
+ ],
+ "https://github.com/shadowcz007/comfyui-hydit-lowvram": [
+ [
+ "DiffusersCLIPLoader",
+ "DiffusersCheckpointLoader",
+ "DiffusersClipTextEncode",
+ "DiffusersControlNetLoader",
+ "DiffusersLoraLoader",
+ "DiffusersModelMakeup",
+ "DiffusersPipelineLoader",
+ "DiffusersSampler",
+ "DiffusersSchedulerLoader"
+ ],
+ {
+ "title_aux": "comfyui-hydit"
+ }
+ ],
+ "https://github.com/shenymce/ComfyUI-JsonViewer": [
+ [
+ "JsonViewer"
+ ],
+ {
+ "title_aux": "ComfyUI-JsonViewer [WIP]"
+ }
+ ],
+ "https://github.com/shin131002/ComfyUI-Prompt-Preset-Selector": [
+ [
+ "PromptPresetSelector",
+ "PromptPresetSelectorWithWildcard"
+ ],
+ {
+ "title_aux": "[WIP] ComfyUI-Prompt-Preset-Selector"
+ }
+ ],
+ "https://github.com/shinich39/comfyui-run-js": [
+ [
+ "RunJS"
+ ],
+ {
+ "author": "shinich39",
+ "description": "Manipulate workflow via javascript on node.",
+ "nickname": "comfyui-run-js",
+ "title": "comfyui-run-js",
+ "title_aux": "comfyui-run-js [UNSAFE]"
+ }
+ ],
+ "https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4": [
+ [
+ "CLIPTextEncodeAndEnhance"
+ ],
+ {
+ "title_aux": "CLIPTextEncodeAndEnhancev4 (shirazdesigner)"
+ }
+ ],
+ "https://github.com/shuanshuan/ComfyUI_CheckPointLoader_Ext": [
+ [
+ "CheckpointLoaderExt"
+ ],
+ {
+ "title_aux": "ComfyUI_CheckPointLoader_Ext [WIP]"
+ }
+ ],
+ "https://github.com/sickbraintwo/WextraX": [
+ [
+ "loraName",
+ "tag"
+ ],
+ {
+ "title_aux": "WextraX [WIP]"
+ }
+ ],
+ "https://github.com/silent-rain/ComfyUI-SilentRain": [
+ [
+ "Example"
+ ],
+ {
+ "title_aux": "ComfyUI-SilentRain"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_CondsUtils": [
+ [
+ "InsertAttnConds",
+ "InsertTEConds",
+ "LoadReduxEmb",
+ "LoadTEConds",
+ "SaveCondsEmb",
+ "SaveReduxEmb"
+ ],
+ {
+ "title_aux": "WIP Conditioning Toolkit [UNSAFE]"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_LoHalo": [
+ [
+ "LohaloHighFidelityScaler",
+ "LohaloKernelScalingNode"
+ ],
+ {
+ "title_aux": "ComfyUI_LoHalo"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_LogicMath": [
+ [
+ "LogicAND",
+ "LogicIF",
+ "LogicNOT",
+ "LogicOR",
+ "LogicXOR",
+ "MathAbs",
+ "MathAdd",
+ "MathCeil",
+ "MathClamp",
+ "MathCompare",
+ "MathCos",
+ "MathDivide",
+ "MathFloor",
+ "MathMax",
+ "MathMin",
+ "MathModulo",
+ "MathMultiply",
+ "MathNumberConvert",
+ "MathOperation",
+ "MathPower",
+ "MathRound",
+ "MathSin",
+ "MathSqrt",
+ "MathSubtract",
+ "MathTan",
+ "NumberToString",
+ "StringToNumber"
+ ],
+ {
+ "title_aux": "ComfyUI_LogicMath"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_PromptAttention": [
+ [
+ "CLIPTextEncodeAttentionBias"
+ ],
+ {
+ "title_aux": "ComfyUI_PromptAttention [WIP]"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_ReduxEmbedToolkit": [
+ [
+ "InsertAttnConds",
+ "InsertTEConds",
+ "LoadReduxEmb",
+ "LoadTEConds",
+ "SaveCondsEmb",
+ "SaveReduxEmb"
+ ],
+ {
+ "title_aux": "ComfyUI_ReduxEmbedToolkit"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_SamplingUtils": [
+ [
+ "AdjustedResolutionParameters",
+ "BonusPromptPresets",
+ "Frakturpad",
+ "GetJsonKeyValue",
+ "IdeographicLinePad",
+ "IdeographicSentencePad",
+ "IdeographicTagPad",
+ "ImageBlendByMask",
+ "Image_Color_Noise",
+ "InstructPromptPresets",
+ "LlTokenizerOptions",
+ "ModifyMask",
+ "SU_LoadImageDirectory",
+ "SU_LoadImagePath",
+ "SamplingParameters",
+ "SystemMessagePresets",
+ "TextEncodeFlux2SystemPrompt",
+ "TextEncodeKleinSystemPrompt",
+ "TextEncodeSystemPrompt",
+ "TextEncodeZITSystemPrompt",
+ "UnFrakturPad"
+ ],
+ {
+ "title_aux": "Sampling Utility Toolkit"
+ }
+ ],
+ "https://github.com/simonjaq/ComfyUI-sjnodes": [
+ [
+ "CrossFadeVideo",
+ "InpaintCropImprovedGPU",
+ "InpaintStitchImprovedGPU",
+ "LoadStitcherFromFile",
+ "LogCRec709Convert",
+ "SaveStitcherToFile",
+ "SmoothTemporalMask",
+ "WanVideoVACEExtend"
+ ],
+ {
+ "title_aux": "ComfyUI-sjnodes"
+ }
+ ],
+ "https://github.com/simonri/ComfyUI-SimonNodes": [
+ [
+ "SR_ImageResize",
+ "SR_RIFE",
+ "SR_Seed",
+ "SR_SeedVR_Upscale",
+ "SR_UltralyticsCrop",
+ "SR_UltralyticsModelLoader",
+ "SR_WanResolution",
+ "SR_WanSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-SimonNodes"
+ }
+ ],
+ "https://github.com/siyonomicon/ComfyUI-Pin": [
+ [
+ "PinGridNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Pin"
+ }
+ ],
+ "https://github.com/sk-palani/ComfyUI_Simpler": [
+ [
+ "Image_Preparations",
+ "InputSelector",
+ "Input_Image"
+ ],
+ {
+ "title_aux": "ComfyUI_Simpler"
+ }
+ ],
+ "https://github.com/slezica/comfyui-personal": [
+ [
+ "GenerateImage",
+ "OwlDetector",
+ "ScaleSigmas",
+ "UpscaleImage",
+ "UseCheckpoint",
+ "UseControlNet",
+ "UseIPAdapter",
+ "UseImage",
+ "UseInfiniteYou",
+ "UseInstantID",
+ "UseLora",
+ "UseStyleModel"
+ ],
+ {
+ "title_aux": "slezica/ComfyUI Personal Nodes"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_GPT_SoVITS_Lite": [
+ [
+ "GPT_SoVITS_LoadModel",
+ "GPT_SoVITS_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_GPT_SoVITS_Lite"
+ }
+ ],
+ "https://github.com/sofakid/dandy": [
+ [
+ "DandyBooleanCollector",
+ "DandyBooleanPreview",
+ "DandyBooleanSplitter",
+ "DandyCss",
+ "DandyCssLoader",
+ "DandyEditorSettings",
+ "DandyFloat",
+ "DandyFloatCollector",
+ "DandyFloatPreview",
+ "DandyFloatSplitter",
+ "DandyGradient",
+ "DandyHtml",
+ "DandyHtmlLoader",
+ "DandyImageCollector",
+ "DandyInt",
+ "DandyIntCollector",
+ "DandyIntPreview",
+ "DandyIntSplitter",
+ "DandyJs",
+ "DandyJsLoader",
+ "DandyJson",
+ "DandyJsonLoader",
+ "DandyLand",
+ "DandyMaskCollector",
+ "DandyP5JsDraw",
+ "DandyP5JsLoader",
+ "DandyP5JsSetup",
+ "DandyPixelsJs",
+ "DandyPixiJs",
+ "DandyPrompt",
+ "DandyString",
+ "DandyStringArrayCollector",
+ "DandyStringArraySplitter",
+ "DandyStringCatCollector",
+ "DandyStringPreview",
+ "DandyUrlLoader",
+ "DandyWasmLoader",
+ "DandyYaml",
+ "DandyYamlLoader"
+ ],
+ {
+ "title_aux": "dandy [UNSAFE]"
+ }
+ ],
+ "https://github.com/songtianhui/ComfyUI-DMM": [
+ [
+ "DMMApply",
+ "DMMLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-DMM [WIP]"
+ }
+ ],
+ "https://github.com/sourceful-official/ComfyUI_InstructPixToPixConditioningLatent": [
+ [
+ "InstructPixToPixConditioningLatent"
+ ],
+ {
+ "title_aux": "ComfyUI_InstructPixToPixConditioningLatent [WIP]"
+ }
+ ],
+ "https://github.com/sourceful-official/comfyui-sourceful-official": [
+ [
+ "FalFluxLoraSourcefulOfficial",
+ "FalIcLightV2SourcefulOfficial",
+ "SourcefulOfficialComfyuiIncontextThreePanels"
+ ],
+ {
+ "title_aux": "comfyui-sourceful-official"
+ }
+ ],
+ "https://github.com/sprited-ai/sprited-comfyui-nodes": [
+ [
+ "BiRefNetBackgroundRemoval",
+ "FlattenImageList",
+ "LoopExtractorNodeV2",
+ "LoopExtractorNodeV3",
+ "MakeGrid",
+ "PixelRGBStats",
+ "SliceBatch",
+ "SliceLatents",
+ "SpriteDXAntiCorruptionV1",
+ "SpriteDX_ParseInt",
+ "SpritedMakeGrid",
+ "URLToVideo",
+ "VideoDownloader",
+ "VideoEvenShotSplitter"
+ ],
+ {
+ "title_aux": "Sprited ComfyUI Nodes [WIP]"
+ }
+ ],
+ "https://github.com/sschleis/sschl-comfyui-notes": [
+ [
+ "AddNumbers",
+ "Character",
+ "CombineStrings",
+ "Connector",
+ "FloatToStr",
+ "Gallery",
+ "GroupManager",
+ "InputText",
+ "OneMScale",
+ "ResFinder",
+ "SSchlTextEncoder",
+ "ShowText",
+ "TextAppender"
+ ],
+ {
+ "title_aux": "sschl-comfyui-notes"
+ }
+ ],
+ "https://github.com/sswink/comfyui-lingshang": [
+ [
+ "LS_ALY_Seg_Body_Utils",
+ "LS_ALY_Seg_Body_Utils_Return_crop",
+ "LS_ALY_Seg_Clothes_Utils",
+ "LS_ALY_Seg_Common_Utils",
+ "LS_ALY_Seg_Utils",
+ "LS_ALY_UploadToOssAndGetUrl",
+ "LS_DigImageByMask",
+ "LS_GrowMaskWithBlur",
+ "LS_LoadMaskFromUrl",
+ "LS_SaveImageToOss"
+ ],
+ {
+ "title_aux": "comfyui-lingshang"
+ }
+ ],
+ "https://github.com/stalkervr/ComfyUI-StalkerVr": [
+ [
+ "AnyCollector",
+ "ImageBatchCrop",
+ "ImageGridCropper",
+ "ImageRatioResizer",
+ "JsonArraySplitter",
+ "JsonBuilder",
+ "JsonDeserializeObject",
+ "JsonFieldRemover",
+ "JsonFieldReplaceAdvanced",
+ "JsonFieldValueExtractor",
+ "JsonPairInput",
+ "JsonPathLoader",
+ "JsonPromptToTextPromptConverter",
+ "JsonRootListExtractor",
+ "JsonSerializeObject",
+ "JsonToString",
+ "ListItemExtractor",
+ "LogValue",
+ "LoopAny",
+ "PromptPartJoin",
+ "StringBuilder",
+ "StringCollector",
+ "StringConcatenation",
+ "StringListToString",
+ "StringWrapper",
+ "WanVideoMultiPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-StalkerVr"
+ }
+ ],
+ "https://github.com/stalkervr/comfyui-custom-path-nodes": [
+ [
+ "AnyCollector",
+ "ContextPipeIn",
+ "ContextPipeOut",
+ "ContextPipeReroute",
+ "DataFileLoader",
+ "ImageAspectRatioFixer",
+ "ImageBatchCrop",
+ "ImageGridCropper",
+ "JsonArraySplitter",
+ "JsonFieldRemover",
+ "JsonFieldReplaceAdvanced",
+ "JsonFieldValueExtractor",
+ "JsonPathLoader",
+ "JsonPromptToTextPromptConverter",
+ "JsonToString",
+ "ListItemExtractor",
+ "LoopAny",
+ "PathPipeIn",
+ "PathPipeOut",
+ "PathPipeReroute",
+ "PromptPartJoin",
+ "SavePath",
+ "StringCollector",
+ "StringConcatenation",
+ "StringListToString",
+ "StringWrapper",
+ "WanVideoMultiPrompt"
+ ],
+ {
+ "title_aux": "comfyui-custom-path-nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/starsFriday/ComfyUI-Audio-Subtitle": [
+ [
+ "AudioSubtitle"
+ ],
+ {
+ "title_aux": "ComfyUI-Audio-Subtitle [WIP]"
+ }
+ ],
+ "https://github.com/starsFriday/ComfyUI-KLingAI-OmniVideo": [
+ [
+ "KlingFirstEndFrame",
+ "KlingImage2Video",
+ "KlingText2Video",
+ "KlingVideoEdit",
+ "KlingVideoExtend"
+ ],
+ {
+ "title_aux": "ComfyUI-KLingAI-OmniVideo [WIP]"
+ }
+ ],
+ "https://github.com/starsFriday/ComfyUI-LongCat-Image": [
+ [
+ "LongCatImageEdit",
+ "LongCatImageModelLoader",
+ "LongCatImageTextToImage"
+ ],
+ {
+ "title_aux": "ComfyUI-LongCat-Image [WIP]"
+ }
+ ],
+ "https://github.com/starsFriday/ComfyUI-Qwen3-TTS": [
+ [
+ "Qwen3TTSLoader",
+ "Qwen3TTSRealVoiceClone",
+ "Qwen3TTSVoiceClone",
+ "Qwen3TTSVoiceDesign"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen3-TTS [NAME CONFLICT/WIP]"
+ }
+ ],
+ "https://github.com/starsFriday/ComfyUI-Tracker-Person": [
+ [
+ "YoloTrackNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Tracker-Person [WIP]"
+ }
+ ],
+ "https://github.com/steelan9199/ComfyUI-Teeth": [
+ [
+ "teeth FindContours",
+ "teeth Gemini2",
+ "teeth GetFirstSeg",
+ "teeth GetValueByIndexFromList",
+ "teeth ImageGridLines",
+ "teeth LoadTextFile",
+ "teeth RunPythonCode",
+ "teeth SaveTextFile",
+ "teeth SplitGridImage",
+ "teeth TextSplitByDelimiter"
+ ],
+ {
+ "title_aux": "ComfyUI-Teeth [UNSAFE]"
+ }
+ ],
+ "https://github.com/stevanisya/comfyui_txt_selector": [
+ [
+ "TextSelector"
+ ],
+ {
+ "title_aux": "comfyui_txt_selector [WIP]"
+ }
+ ],
+ "https://github.com/sthao42/comfyui-melodkeet-tts": [
+ [
+ "MelodkeetTTS"
+ ],
+ {
+ "title_aux": "ComfyUI Melodkeet TTS"
+ }
+ ],
+ "https://github.com/strhwste/comfyui_csv_utils": [
+ [
+ "ExtractFromJSON",
+ "SearchCSVByRow",
+ "WriteCSVByRow"
+ ],
+ {
+ "title_aux": "CSV Utils [WIP]"
+ }
+ ],
+ "https://github.com/stutya/ComfyUI-Terminal": [
+ [
+ "Terminal"
+ ],
+ {
+ "title_aux": "ComfyUI-Terminal [UNSAFE]"
+ }
+ ],
+ "https://github.com/subnet99/ComfyUI-URLLoader": [
+ [
+ "URLAudioDownloader",
+ "URLImageDownloader"
+ ],
+ {
+ "title_aux": "ComfyUI-URLLoader"
+ }
+ ],
+ "https://github.com/sugarkwork/comfyui-trtools": [
+ [
+ "TRTUpscaler",
+ "TRTagger"
+ ],
+ {
+ "title_aux": "comfyui-trtools"
+ }
+ ],
+ "https://github.com/sugarkwork/comfyui_image_crop": [
+ [
+ "CropReapply",
+ "CropTransparent",
+ "ExpandMultiple",
+ "RestoreCrop"
+ ],
+ {
+ "title_aux": "comfyui_image_crop"
+ }
+ ],
+ "https://github.com/sugarkwork/comfyui_my_img_util": [
+ [
+ "Auto Image Selector",
+ "Image Resize And Crop",
+ "OpenCVDenoiseColored",
+ "Simple Image Rotate"
+ ],
+ {
+ "title_aux": "comfyui_my_img_util"
+ }
+ ],
+ "https://github.com/sugarkwork/comfyui_psd": [
+ [
+ "Convert PSD to Image",
+ "PSDConvert",
+ "PSDLayer",
+ "PSDSave",
+ "Save PSD"
+ ],
+ {
+ "title_aux": "comfyui_psd [WIP]"
+ }
+ ],
+ "https://github.com/suncat2ps/ComfyUI-SaveImgNextcloud": [
+ [
+ "SaveImageNextcloud"
+ ],
+ {
+ "title_aux": "ComfyUI-SaveImgNextcloud"
+ }
+ ],
+ "https://github.com/supaidauen/ComfyUI-supaidauen": [
+ [
+ "ClearVRAM",
+ "ImageBatchToCount",
+ "Integer",
+ "KSampler_Advanced_Calculator",
+ "Latent_Switcher",
+ "Subject_Detection_and_Interrupt",
+ "Supaidauen_Add_RunID",
+ "Supaidauen_Character_IO",
+ "Supaidauen_Create_DummyRandomInt",
+ "Supaidauen_Create_Filename",
+ "Supaidauen_GenerateRandomImagePadding",
+ "Supaidauen_ImagePadding",
+ "Supaidauen_Image_Compositor",
+ "Supaidauen_LoadImageFromPath_input",
+ "Supaidauen_Normalized_Float_Slider",
+ "Supaidauen_Passthrough_CLIP",
+ "Supaidauen_Passthrough_IMAGE",
+ "Supaidauen_Passthrough_LATENT",
+ "Supaidauen_Passthrough_MASK",
+ "Supaidauen_Passthrough_STRING",
+ "Supaidauen_Passthrough_VAE",
+ "Supaidauen_Prompt_Consolidator",
+ "Supaidauen_Recursive_Uspcaler",
+ "Supaidauen_Text_Concat",
+ "Supaidauen_Text_Replace",
+ "Supaidauen_Text_Wildcard",
+ "Supaidauen_Text_w_Options_Replace_LoRA"
+ ],
+ {
+ "title_aux": "ComfyUI-supaidauen [WIP]"
+ }
+ ],
+ "https://github.com/svyatojdismas/ComfyUI-StDismas": [
+ [
+ "BatchImageCropByMaskAdvanced_StDismas",
+ "BatchImageCropByMask_StDismas",
+ "BatchImageUncropByMaskAdvanced_StDismas",
+ "BatchImageUncropByMask_StDismas",
+ "CSVIndexPicker_StDismas",
+ "DualKSamplerCore",
+ "DualKSamplerCoreAdvanced",
+ "DualKSamplerCoreAdvancedAlt",
+ "DualWVSamplerWanLightning",
+ "DualWVSamplerWanLightningAdvancedAlt",
+ "MultiStringSelector_StDismas"
+ ],
+ {
+ "title_aux": "ComfyUI-StDismas [WIP]"
+ }
+ ],
+ "https://github.com/synchronicity-labs/sync-comfyui": [
+ [
+ "SyncApiKeyNode",
+ "SyncAudioInputNode",
+ "SyncLipsyncMainNode",
+ "SyncLipsyncOutputNode",
+ "SyncVideoInputNode"
+ ],
+ {
+ "title_aux": "ComfyUI Sync Lipsync Node"
+ }
+ ],
+ "https://github.com/system-out-cho/displayHistory_ComfyUI": [
+ [
+ "Client Proxy",
+ "DisplayHistory",
+ "Example",
+ "Image Selector"
+ ],
+ {
+ "title_aux": "displayHistory [WIP]"
+ }
+ ],
+ "https://github.com/systemaiofinterest-wq/ComfyUI-GoogleFX": [
+ [
+ "GoogleImagen31Node",
+ "GoogleImagen35Node",
+ "GoogleImagenR2INode",
+ "GoogleNanoBananaNode"
+ ],
+ {
+ "title_aux": "ComfyUI-GoogleFX"
+ }
+ ],
+ "https://github.com/tackcrypto1031/tk_comfyui_SimpleSize": [
+ [
+ "TK_SimpleSize"
+ ],
+ {
+ "title_aux": "[WIP] tk_comfyui_SimpleSize"
+ }
+ ],
+ "https://github.com/takoyaki1118/ComfyUI-Kakimoji-Layer": [
+ [
+ "KakimojiEditor"
+ ],
+ {
+ "title_aux": "ComfyUI-Kakimoji-Layer"
+ }
+ ],
+ "https://github.com/takoyaki1118/ComfyUI_PromptExtractor": [
+ [
+ "CustomLoadImageWithPathNode",
+ "PromptExtractorNode"
+ ],
+ {
+ "title_aux": "ComfyUI_PromptExtractor"
+ }
+ ],
+ "https://github.com/talon468/ComfyUI-Rpg-Architect": [
+ [
+ "ComfyUI Rpg Architect \ud83e\ude84"
+ ],
+ {
+ "title_aux": "ComfyUI-Rpg-Architect [WIP]"
+ }
+ ],
+ "https://github.com/tankenyuen-ola/comfyui-env-variable-reader": [
+ [
+ "EnvironmentVariableNode"
+ ],
+ {
+ "title_aux": "comfyui-env-variable-reader [UNSAFE]"
+ }
+ ],
+ "https://github.com/tankenyuen-ola/comfyui-wanvideo-scheduler-loop": [
+ [
+ "FloatRangeLoop",
+ "ParametersRangeLoop",
+ "WanVideoAllParametersLoop",
+ "WanVideoSchedulerInfo",
+ "WanVideoSchedulerLoop"
+ ],
+ {
+ "title_aux": "comfyui-wanvideo-scheduler-loop"
+ }
+ ],
+ "https://github.com/tanmoy-it/comfyuiCustomNode": [
+ [
+ "DownloadImageDataUrl"
+ ],
+ {
+ "title_aux": "comfyuiCustomNode"
+ }
+ ],
+ "https://github.com/tc888/ComfyUI_Save_Flux_Image": [
+ [
+ "Cfg Literal",
+ "Int Literal",
+ "Sampler Select",
+ "Save Flux Image with Metadata",
+ "Scheduler Select",
+ "Seed Gen",
+ "String Literal",
+ "Unet Select",
+ "Width/Height Literal"
+ ],
+ {
+ "title_aux": "ComfyUI_Save_Flux_Image"
+ }
+ ],
+ "https://github.com/tdrminglin/ComfyUI_SceneSplitter": [
+ [
+ "SceneDetectSplitter",
+ "SceneStartFramesNode"
+ ],
+ {
+ "title_aux": "ComfyUI_SceneSplitter"
+ }
+ ],
+ "https://github.com/tdrminglin/Comfyui-hymotionbridge": [
+ [
+ "HYMotionToNLFBridge",
+ "HYMotionToSCAILBridge"
+ ],
+ {
+ "title_aux": "Comfyui-hymotionbridge"
+ }
+ ],
+ "https://github.com/techidsk/comfyui_molook_nodes": [
+ [
+ "ImageOutpaintPadding(Molook)",
+ "MaskExpand(Molook)",
+ "OpenAIProvider(Molook)"
+ ],
+ {
+ "title_aux": "comfyui_molook_nodes [WIP]"
+ }
+ ],
+ "https://github.com/techtruth/ComfyUI-Dreambooth": [
+ [
+ "DreamboothNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Dreambooth"
+ }
+ ],
+ "https://github.com/techzuhaib/ComfyUI-CacheImageNode": [
+ [
+ "CacheImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI-CacheImageNode"
+ }
+ ],
+ "https://github.com/teskor-hub/comfyui-teskors-utils": [
+ [
+ "TSLoadPoseDataPickle",
+ "TSLoadVideoBatchListFromDir",
+ "TSPoseDataSmoother",
+ "TSSavePoseDataAsPickle"
+ ],
+ {
+ "title_aux": "comfyui-teskors-utils [WIP]"
+ }
+ ],
+ "https://github.com/tfernd/ComfyUI-AutoCPUOffload": [
+ [
+ "AutoCPUOffload"
+ ],
+ {
+ "title_aux": "Auto CPU Offload for ComfyUI [WIP]"
+ }
+ ],
+ "https://github.com/tg-tjmitchell/comfyui-custom-node-lister": [
+ [
+ "CustomNodeLister"
+ ],
+ {
+ "title_aux": "ComfyUI Manager Package Lister"
+ }
+ ],
+ "https://github.com/tg-tjmitchell/comfyui-rsync-plugin": [
+ [
+ "FileTransferHelperNode"
+ ],
+ {
+ "title_aux": "ComfyUI File Transfer Plugin (comfyui-rsync-plugin) [UNSAFE]"
+ }
+ ],
+ "https://github.com/thaakeno/comfyui-universal-asset-downloader": [
+ [
+ "UniversalAssetDownloader"
+ ],
+ {
+ "title_aux": "comfyui-universal-asset-downloader [UNSAFE/WIP]"
+ }
+ ],
+ "https://github.com/thavocado/comfyui-danbooru-lookup": [
+ [
+ "DanbooruFAISSLookup",
+ "DanbooruFAISSLookupAdvanced",
+ "WD14ToConditioning"
+ ],
+ {
+ "author": "ComfyUI Danbooru Lookup",
+ "description": "ComfyUI node that performs FAISS cosine similarity lookup on Danbooru embeddings using CLIP conditioning inputs.",
+ "nickname": "Danbooru Lookup",
+ "title": "Danbooru FAISS Lookup",
+ "title_aux": "comfyui-danbooru-lookup"
+ }
+ ],
+ "https://github.com/thderoo/ComfyUI-_topfun_s_nodes": [
+ [
+ "ConditioningPerturbation",
+ "TextGenerator"
+ ],
+ {
+ "title_aux": "_topfun_s_nodes"
+ }
+ ],
+ "https://github.com/theshubzworld/ComfyUI-NvidiaVision": [
+ [
+ "\u2728 NVIDIA Prompt Generator (Text) \u2728",
+ "\ud83d\udc41\ufe0f\u200d\ud83d\udde8\ufe0f NVIDIA Vision Node \ud83d\udc41\ufe0f\u200d\ud83d\udde8\ufe0f"
+ ],
+ {
+ "title_aux": "ComfyUI-NvidiaVision [WIP]"
+ }
+ ],
+ "https://github.com/threadedblue/MLXnodes": [
+ [
+ "MLXImg2Img",
+ "MLXText2Image"
+ ],
+ {
+ "title_aux": "MLXnodes [WIP]"
+ }
+ ],
+ "https://github.com/threecrowco/ComfyUI-FlowMatchScheduler": [
+ [
+ "FlowMatchSigmas"
+ ],
+ {
+ "title_aux": "ComfyUI-FlowMatchScheduler [WIP]"
+ }
+ ],
+ "https://github.com/tiange-tree/BLUEAI_ComfyUI_OpenAI": [
+ [
+ "BLUEAI_OpenAI_Node"
+ ],
+ {
+ "title_aux": "BLUEAI_ComfyUI_OpenAI"
+ }
+ ],
+ "https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes": [
+ [
+ "ImageSizer",
+ "KSamplerSDXLAdvanced",
+ "My-ImageSizer"
+ ],
+ {
+ "title_aux": "my-useful-comfyui-custom-nodes"
+ }
+ ],
+ "https://github.com/tnil25/ComfyUI-TJNodes": [
+ [
+ "ExpandMaskDir",
+ "OverlayMaskNode",
+ "Tracker"
+ ],
+ {
+ "title_aux": "ComfyUI-TJNodes [WIP]"
+ }
+ ],
+ "https://github.com/tom-doerr/dspy_nodes": [
+ [
+ "Accepted Examples Viewer",
+ "Dataset Reader",
+ "DynamicOptionsNode",
+ "Few Shot CoT",
+ "Few Shot Control",
+ "Few Shot Review",
+ "FewShotReview",
+ "FewShotReviewServer",
+ "Model",
+ "Predict",
+ "Print Hello World",
+ "ShowText|pysssss",
+ "String List Viewer",
+ "String Splitter",
+ "StringReverser",
+ "StringSplitter",
+ "Text Field",
+ "Text Output"
+ ],
+ {
+ "title_aux": "DSPy Nodes [WIP]"
+ }
+ ],
+ "https://github.com/tony-zn/comfyui-zn-pycode": [
+ [
+ "ZnPyCode: CustomCode"
+ ],
+ {
+ "title_aux": "comfyui-zn-pycode [UNSAFE]"
+ }
+ ],
+ "https://github.com/tori29umai0123/ComfyUI-SDXLGenerateFromTextFile": [
+ [
+ "GenerateFromTextFile"
+ ],
+ {
+ "title_aux": "ComfyUI-SDXLGenerateFromTextFile [UNSAFE]"
+ }
+ ],
+ "https://github.com/tpc2233/ComfyUI-TP-IMtalker": [
+ [
+ "IMTalkerAudioDriven",
+ "IMTalkerLoader",
+ "IMTalkerVideoDriven"
+ ],
+ {
+ "title_aux": "ComfyUI-TP-IMtalker [WIP]"
+ }
+ ],
+ "https://github.com/tracerstar/comfyui-p5js-node": [
+ [
+ "HYPE_P5JSImage"
+ ],
+ {
+ "title_aux": "comfyui-p5js-node"
+ }
+ ],
+ "https://github.com/trampolin/comfy-ui-scryfall": [
+ [
+ "ScryfallCardInfoNode",
+ "ScryfallDecklistParserNode",
+ "ScryfallImageExtractorNode",
+ "ScryfallSearchNode"
+ ],
+ {
+ "title_aux": "comfy-ui-scryfall"
+ }
+ ],
+ "https://github.com/trashgraphicard/Albedo-Sampler-for-ComfyUI": [
+ [
+ "Make Seamless Tile",
+ "Sample Image"
+ ],
+ {
+ "title_aux": "Albedo-Sampler-for-ComfyUI"
+ }
+ ],
+ "https://github.com/trashkollector/TKVideoZoom": [
+ [
+ "TKVideoFuse",
+ "TKVideoSmoothLooper",
+ "TKVideoSpeedZones",
+ "TKVideoStitcher",
+ "TKVideoZoom"
+ ],
+ {
+ "title_aux": "ComfyUI-TKVideoZoom [WIP]"
+ }
+ ],
+ "https://github.com/truebillyblue/lC.ComfyUI_epistemic_nodes": [
+ [
+ "AddApplicationNode",
+ "AddInterpretationNode",
+ "AddObservationNode",
+ "CreatePbiNode",
+ "CreateRDSOTMComponentNode",
+ "GetMadaObjectNode",
+ "InitiateOiaNode",
+ "InitiateRDSOTMCycleNode",
+ "LcADKConfigNode",
+ "LcADKGuiInteractionNode",
+ "LcAddCommentToPbiNode",
+ "LcAnchorClickNode",
+ "LcApiLlmAgentNode",
+ "LcApplyDoneNode",
+ "LcEpistemicPipelineNode",
+ "LcFieldClickNode",
+ "LcFrameClickNode",
+ "LcGetPbiDetailsNode",
+ "LcKeymapClickNode",
+ "LcLinkPbiNode",
+ "LcMemWriteNode",
+ "LcReflectBoomNode",
+ "LcStartleNode",
+ "LcWebLlmAgentNode",
+ "QueryPbisNode",
+ "ShowTextNode",
+ "StoreMadaObjectNode",
+ "UpdatePbiNode",
+ "ViewOiaCycleNode",
+ "ViewRDSOTMCycleDetailsNode"
+ ],
+ {
+ "title_aux": "lC.ComfyUI_epistemic_nodes [WIP]"
+ }
+ ],
+ "https://github.com/tuckerdarby/ComfyUI-TDNodes": [
+ [
+ "HandTrackerNode",
+ "InstanceDiffusionLoader",
+ "InstanceTrackerPrompt",
+ "KSamplerBatchedNode",
+ "KSamplerRAVE",
+ "KSamplerTF",
+ "TemporalNetPreprocessor",
+ "TrackerNode",
+ "VideoTrackerPromptNode"
+ ],
+ {
+ "title_aux": "ComfyUI-TDNodes [WIP]"
+ }
+ ],
+ "https://github.com/turskeli/comfyui-SetWallpaper": [
+ [
+ "SetWallpaper"
+ ],
+ {
+ "title_aux": "comfyui-SetWallpaper"
+ }
+ ],
+ "https://github.com/tuxiansheng-ld/Comfyui-tuxiansheng-nodes": [
+ [
+ "HTMLScreenshotterNode",
+ "KimiTableToJSONNode",
+ "StringToListNode",
+ "TableRendererNode",
+ "TableStyleConfigNode"
+ ],
+ {
+ "title_aux": "Comfyui-tuxiansheng-nodes"
+ }
+ ],
+ "https://github.com/twdockery/ComfyUI_Prompt_Batch_Generator": [
+ [
+ "PromptBatchIterator"
+ ],
+ {
+ "title_aux": "ComfyUI_Prompt_Batch_Generator"
+ }
+ ],
+ "https://github.com/twj515895394/ComfyUI-LowMemVideoSuite": [
+ [
+ "FFmpeg \u89c6\u9891\u5408\u6210\uff08\u4f4e\u5185\u5b58\uff09 / FFmpegVideoCombineLowMem",
+ "SaveImageWebsocket",
+ "\u4fdd\u5b58\u5355\u5e27\u5230\u78c1\u76d8 / SaveSingleFrameToDisk",
+ "\u6279\u91cf\u4fdd\u5b58\u5e27\u5230\u78c1\u76d8 / SaveFrameBatchToDisk"
+ ],
+ {
+ "title_aux": "ComfComfyUI-LowMemVideoSuite [UNSAFE]"
+ }
+ ],
+ "https://github.com/tzsoulcap/ComfyUI-SaveImg-W-MetaData": [
+ [
+ "CAP Cfg Literal",
+ "CAP Checkpoint Selector",
+ "CAP Int Literal",
+ "CAP Load Image with Metadata",
+ "CAP Sampler Selector",
+ "CAP Save Image w/Metadata",
+ "CAP Scheduler Selector",
+ "CAP Seed Generator",
+ "CAP String Literal",
+ "CAP Tag Image",
+ "CAP Width/Height Literal"
+ ],
+ {
+ "title_aux": "ComfyUI-SaveImg-W-MetaData"
+ }
+ ],
+ "https://github.com/u5dev/ComfyUI_u5_EasyScripter": [
+ [
+ "comfyUI_u5_easyscripter",
+ "u5_CLIPLoader",
+ "u5_CLIPVisionLoader",
+ "u5_CheckpointLoader",
+ "u5_ControlNetLoader",
+ "u5_GLIGENLoader",
+ "u5_LoraLoader",
+ "u5_StyleModelLoader",
+ "u5_UNETLoader",
+ "u5_VAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI_u5_EasyScripter [UNSAFE]"
+ }
+ ],
+ "https://github.com/unanan/ComfyUI-Dist": [
+ [
+ "LoadImageFromLAN",
+ "LoadImageFromURL"
+ ],
+ {
+ "title_aux": "ComfyUI-Dist [WIP]"
+ }
+ ],
+ "https://github.com/unphased/code-nodes": [
+ [
+ "ImageBatcherByIndexProV2",
+ "PythonCodeNode",
+ "ShellCodeNode"
+ ],
+ {
+ "title_aux": "code-nodes [UNSAFE]"
+ }
+ ],
+ "https://github.com/usman2003/ComfyUI-Gender-Classifier": [
+ [
+ "GenderClassificationNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Gender-Classifier"
+ }
+ ],
+ "https://github.com/usrname0/ComfyUI-AllergicPack": [
+ [
+ "FolderFileCounter_Allergic",
+ "IncrementorPlus",
+ "RememberMeNode"
+ ],
+ {
+ "title_aux": "ComfyUI-AllergicPack [WIP]"
+ }
+ ],
+ "https://github.com/vadimcro/External-Image-Revised-with-MASK": [
+ [
+ "ComfyUIDeployExternalImageRevised"
+ ],
+ {
+ "title_aux": "External-Image-Revised-with-MASK"
+ }
+ ],
+ "https://github.com/vadimcro/string_by_index": [
+ [
+ "StringByIndex"
+ ],
+ {
+ "title_aux": "string_by_index"
+ }
+ ],
+ "https://github.com/vasilmitov/ComfyUI-SeedSnapShotManager": [
+ [
+ "SeedSSManager"
+ ],
+ {
+ "title_aux": "ComfyUI-SeedSnapShotManager [WIP]"
+ }
+ ],
+ "https://github.com/viik420/AdvancedModelDownloader": [
+ [
+ "AdvancedDownloader"
+ ],
+ {
+ "title_aux": "AdvancedModelDownloader [UNSAFE]"
+ }
+ ],
+ "https://github.com/virallover/comfyui-virallover": [
+ [
+ "BrightnessCorrectionNode",
+ "ConcatHorizontalWithMask",
+ "DeHaloAlphaWithMaskTorch",
+ "DepthFitter",
+ "DownloadAndLoadLoraModelOnly",
+ "EdgeNoise",
+ "FeatheredSharpen",
+ "IterativeDeHaloAlphaWithMaskTorch",
+ "SkinColorFusion"
+ ],
+ {
+ "title_aux": "comfyui-virallover"
+ }
+ ],
+ "https://github.com/visualbruno/ComfyUI-QRemeshify": [
+ [
+ "QRemeshify"
+ ],
+ {
+ "title_aux": "ComfyUI-QRemeshify"
+ }
+ ],
+ "https://github.com/vito0131/ComfyUI_SmartContentCrop": [
+ [
+ "SimpleCircleProcessor",
+ "SmartContentCrop"
+ ],
+ {
+ "title_aux": "ComfyUI_SmartContentCrop [WIP]"
+ }
+ ],
+ "https://github.com/vjumpkung/comfyui-mosaic-blur": [
+ [
+ "MosaicBlur"
+ ],
+ {
+ "title_aux": "comfyui-mosaic-blur [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/vladp0727/Comfyui-with-Furniture": [
+ [
+ "GetMaskFromAlpha",
+ "GetQuadrilateralOutfit"
+ ],
+ {
+ "title_aux": "ComfyUI Simple Image Tools [WIP]"
+ }
+ ],
+ "https://github.com/vovler/ComfyUI-vovlerTools": [
+ [
+ "WD14BlackListLoader",
+ "WD14TaggerAndImageFilterer",
+ "WD14TensorRTModelLoader",
+ "WDTaggerONNXtoTENSORRT"
+ ],
+ {
+ "title_aux": "comfyui-vovlertools"
+ }
+ ],
+ "https://github.com/vunguyen-oss/ComfyUI-ccsrv2": [
+ [
+ "CCSRUpscale"
+ ],
+ {
+ "title_aux": "ComfyUI-ccsrv2 [WIP]"
+ }
+ ],
+ "https://github.com/w3rc/lpips-similarity-comfyui": [
+ [
+ "GetSimilarity",
+ "LPIPSSimilarity"
+ ],
+ {
+ "title_aux": "lpips-similarity-comfyui"
+ }
+ ],
+ "https://github.com/wTechArtist/ComfyUI-VVL-Tools": [
+ [
+ "ApplyUrlsToJson",
+ "BlenderModelAligner",
+ "BlenderSmartModelScalerBatch",
+ "DimensionReorderAndScale",
+ "DynamicBatchAnything",
+ "Enhanced3DRenderer",
+ "IndexOffsetAdjuster",
+ "IndexUrlPairDeduplicator",
+ "JsonArrayElementFieldExtractor",
+ "JsonArrayFieldUniformSetter",
+ "JsonCompressor",
+ "JsonExtractSubjectNamesScales",
+ "JsonFieldDeleter",
+ "JsonFieldRenamer",
+ "JsonMarkdownCleaner",
+ "JsonObjectDeduplicator",
+ "JsonObjectMerger",
+ "JsonObjectOutputUrlCheck",
+ "JsonObjectSplitter",
+ "JsonRotationScaleAdjuster",
+ "JsonScaleMaxAdjuster",
+ "ModelTransformParameters",
+ "RoomBboxGeneratorNode",
+ "TensorListPreview",
+ "TextCombineMulti",
+ "VVL compare",
+ "VVL forLoopEnd",
+ "VVL forLoopStart",
+ "VVL listChunk",
+ "VVL listConstruct",
+ "VVL listGetItem",
+ "VVL listLength",
+ "VVL mathInt",
+ "VVL whileLoopEnd",
+ "VVL whileLoopStart",
+ "VVL_Load_Text_Batch",
+ "async_sleep_v1"
+ ],
+ {
+ "title_aux": "ComfyUI-VVL-Tools"
+ }
+ ],
+ "https://github.com/wTechArtist/ComfyUI_VVL_Segmentation": [
+ [
+ "Mask2FormerPanoptic",
+ "OneFormerPanoptic"
+ ],
+ {
+ "title_aux": "ComfyUI_VVL_Segmentation [WIP]"
+ }
+ ],
+ "https://github.com/wTechArtist/ComfyUI_VVL_VideoCamera": [
+ [
+ "ImageSequenceCameraEstimator",
+ "VVLColmapMVSDepthNode"
+ ],
+ {
+ "title_aux": "ComfyUI_VVL_VideoCamera"
+ }
+ ],
+ "https://github.com/wTechArtist/ComfyUI_vvl_BBOX": [
+ [
+ "vvl_BBoxInput"
+ ],
+ {
+ "title_aux": "ComfyUI_vvl_BBOX"
+ }
+ ],
+ "https://github.com/walterFeng/ComfyUI-Image-Utils": [
+ [
+ "Calculate Image Brightness",
+ "Calculate Image Contrast",
+ "Calculate Image Saturation",
+ "Color Similarity Checker",
+ "Crop Mask Util",
+ "Displace Filter",
+ "Image Fix (tensor shape convert)",
+ "Load Image (By Url)",
+ "Mask Refine (Aliyun)"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Utils"
+ }
+ ],
+ "https://github.com/wandaijin/ComfyUI-PaddleOCR": [
+ [
+ "OcrBox"
+ ],
+ {
+ "title_aux": "ComfyUI-PaddleOCR [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/warshanks/Shank-Tools": [
+ [
+ "HeightWidth",
+ "ResolutionDivider",
+ "TileCalculator"
+ ],
+ {
+ "title_aux": "Shank-Tools"
+ }
+ ],
+ "https://github.com/wasilone11/comfyui-sync-translate-node": [
+ [
+ "SyncTranslateInputNode",
+ "SyncTranslateNode"
+ ],
+ {
+ "title_aux": "comfyui-sync-translate-node"
+ }
+ ],
+ "https://github.com/watarika/ComfyUI-Text-Utility": [
+ [
+ "ConditionalTagProcessorNode",
+ "LoadTextFile",
+ "ParsePromptCustom",
+ "ParsePromptFull",
+ "ProcessWildcard",
+ "PromptsFromTextbox",
+ "RemoveComments",
+ "ReplaceVariables",
+ "ReplaceVariablesAndProcessWildcard",
+ "SaveTextFile",
+ "StringsFromTextbox",
+ "StringsToList"
+ ],
+ {
+ "title_aux": "ComfyUI-Text-Utility [UNSAFE]"
+ }
+ ],
+ "https://github.com/watarika/ComfyUI-exit": [
+ [
+ "ExitComfyUI",
+ "ExitWhenLastBatchConfirm",
+ "FetchApi"
+ ],
+ {
+ "title_aux": "ComfyUI-exit [UNSAFE]"
+ }
+ ],
+ "https://github.com/waynepimpzhang/comfyui-opencv-brightestspot": [
+ [
+ "FindBrightestSpot"
+ ],
+ {
+ "title_aux": "FindBrightestSpot [WIP]"
+ }
+ ],
+ "https://github.com/wciq1208/even-comfyui-plugin": [
+ [
+ "Gemini",
+ "NanoBanana"
+ ],
+ {
+ "title_aux": "even-comfyui-plugin"
+ }
+ ],
+ "https://github.com/whmc76/ComfyUI-AudioSuiteAdvanced": [
+ [
+ "AudioConcatenateFree",
+ "AudioSeparation",
+ "CharacterVocalExtractor",
+ "CharacterVocalExtractorMultiTrack",
+ "CombineAudioFromList",
+ "IndexSelectFromList",
+ "ListLength",
+ "LongTextSplitter",
+ "MakeAudioBatch",
+ "MultiSpeakerSpeechToText",
+ "SubtitleFileLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-AudioSuiteAdvanced [WIP]"
+ }
+ ],
+ "https://github.com/wildminder/ComfyUI-MagCache": [
+ [
+ "MagCache"
+ ],
+ {
+ "title_aux": "ComfyUI-MagCache [NAME CONFLICT|WIP]"
+ }
+ ],
+ "https://github.com/willblaschko/ComfyUI-Unload-Models": [
+ [
+ "DeleteAnyObject",
+ "UnloadAllModels",
+ "UnloadOneModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Unload-Models"
+ }
+ ],
+ "https://github.com/wilzamguerrero/Comfyui-zZzZz": [
+ [
+ "CaptureZNode",
+ "CompressFolderNode",
+ "CreateZNode",
+ "DeleteZNode",
+ "DownloadFileNode",
+ "InfiniteZNode",
+ "MoveZNode",
+ "RenameZNode",
+ "VideoZNode",
+ "ZFShareScreen"
+ ],
+ {
+ "title_aux": "Comfyui-zZzZz [UNSAFE]"
+ }
+ ],
+ "https://github.com/woitec/ComfyUI_ImageDimensions": [
+ [
+ "ImageDimensionsExtractorFloat",
+ "ImageDimensionsExtractorInt"
+ ],
+ {
+ "title_aux": "ComfyUI_ImageDimensions [WIP]"
+ }
+ ],
+ "https://github.com/wordbrew/comfyui-wan-control-nodes": [
+ [
+ "WanWeightedControlToVideo"
+ ],
+ {
+ "title_aux": "WAN Control Nodes for ComfyUI [WIP]"
+ }
+ ],
+ "https://github.com/wormley/comfyui-wormley-nodes": [
+ [
+ "CheckpointVAELoaderSimpleText",
+ "CheckpointVAESelectorText",
+ "LoRA_Tag_To_Stack"
+ ],
+ {
+ "title_aux": "comfyui-wormley-nodes"
+ }
+ ],
+ "https://github.com/xgfone/ComfyUI_FaceToMask": [
+ [
+ "FaceToMaskCopy"
+ ],
+ {
+ "title_aux": "ComfyUI_FaceToMask"
+ }
+ ],
+ "https://github.com/xgfone/ComfyUI_PromptLogoCleaner": [
+ [
+ "PromptLogoCleaner"
+ ],
+ {
+ "title_aux": "ComfyUI_PromptLogoCleaner"
+ }
+ ],
+ "https://github.com/xgfone/ComfyUI_RasterCardMaker": [
+ [
+ "RasterCardMaker"
+ ],
+ {
+ "title_aux": "ComfyUI_RasterCardMaker"
+ }
+ ],
+ "https://github.com/xiaoxidashen/comfyui_my_utils": [
+ [
+ "VideoSplitCombine"
+ ],
+ {
+ "title_aux": "comfyui_my_utils"
+ }
+ ],
+ "https://github.com/xiaoyumu/ComfyUI-XYNodes": [
+ [
+ "AdjustImageColor",
+ "AppyColorToImage",
+ "PrimitiveBBOX",
+ "StringToBBOX"
+ ],
+ {
+ "title_aux": "ComfyUI-XYNodes"
+ }
+ ],
+ "https://github.com/xinyiSS/CombineMasksNode": [
+ [
+ "CombineMasksNode"
+ ],
+ {
+ "title_aux": "CombineMasksNode"
+ }
+ ],
+ "https://github.com/xqqe/honey_nodes": [
+ [
+ "ExtractLoRAName",
+ "Honey Lora Loader",
+ "HoneyBatchAspectRatio",
+ "HoneyLoraStackTags",
+ "HoneyTextConcat",
+ "Honey_LoRAStackRandom",
+ "Honey_LoRATags",
+ "LoraLoaderx",
+ "SmLoraLoader",
+ "Small Lora Loader",
+ "TagAdder"
+ ],
+ {
+ "title_aux": "honey_nodes [WIP]"
+ }
+ ],
+ "https://github.com/xsai-collab/ComfyUI-CombineVideoAndSubtitle": [
+ [
+ "CombineVideosFromFolder",
+ "GetSubtitlesFromVideo",
+ "MergeVideoAndSubtitle"
+ ],
+ {
+ "title_aux": "ComfyUI-CombineVideoAndSubtitle"
+ }
+ ],
+ "https://github.com/xtanqn/comfyui-xishen": [
+ [
+ "BatchSizeControl",
+ "XishenCommonPromptNode",
+ "XishenCommonResolutionNode",
+ "XishenPromptEditNode",
+ "XishenRandomIntegerNode",
+ "XishenRemoveEmptyLinesNode",
+ "XishenShutdownTimerAdvanced",
+ "XishenShutdownTimerNode",
+ "XishenSmartDisplayNode",
+ "XishenThemePromptNode",
+ "\ud83c\udf49Image-\u9897\u7c92\u8d28\u611f",
+ "\ud83c\udf61Qwen-\u5c3a\u5bf8\u9884\u8bbe",
+ "\ud83c\udf65Qwen-\u6253\u5149\u9884\u8bbe",
+ "\ud83c\udf6dImage-\u6cdb\u5149\u6548\u679c",
+ "\ud83c\udf70Qwen-\u955c\u5934\u9884\u8bbe"
+ ],
+ {
+ "title_aux": "comfyui-xishen [WIP]"
+ }
+ ],
+ "https://github.com/xuchenxu168/ComfyUI-Gemini-3": [
+ [
+ "Gemini3Chat",
+ "Gemini3ContextCache",
+ "Gemini3FunctionCalling",
+ "Gemini3ImageEditorPrompt",
+ "Gemini3MultiModalAnalysis",
+ "Gemini3SafetySettings",
+ "Gemini3StreamingGeneration",
+ "Gemini3StructuredOutput",
+ "Gemini3TextGeneration",
+ "Gemini3UseCachedContent",
+ "Gemini3WithCodeExecution",
+ "Gemini3WithGoogleSearch"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemini-3 [UNSAFE/WIP]"
+ }
+ ],
+ "https://github.com/xuchenxu168/ComfyUI_Qwen3-VL": [
+ [
+ "CombineImagesForQwen3VL",
+ "LoadImageForQwen3VL",
+ "LoadVideo",
+ "LoadVideoForQwen3VL",
+ "LoadVideoURL",
+ "Qwen3VLAPIAdvanced",
+ "Qwen3VLAPINode",
+ "Qwen3VLProcessor",
+ "Qwen3VLResponseFormatter",
+ "TextPromptForQwen3VL"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen3-VL [WIP]"
+ }
+ ],
+ "https://github.com/xuchenxu168/Comfyui_Prompt_Edit": [
+ [
+ "Prompt_Edit"
+ ],
+ {
+ "title_aux": "ComfyUI-DreamOmni2-GGUF [WIP]"
+ }
+ ],
+ "https://github.com/xuchenxu168/comfyui_meituan_image": [
+ [
+ "MeituanLongCatEdit",
+ "MeituanLongCatLoader",
+ "MeituanLongCatT2I"
+ ],
+ {
+ "title_aux": "[WIP] comfyui_meituan_image"
+ }
+ ],
+ "https://github.com/xzuyn/ComfyUI-xzuynodes": [
+ [
+ "CLIPLoaderXZ",
+ "CLIPTextEncodeXZ",
+ "DualCLIPLoaderXZ",
+ "FirstLastFrameXZ",
+ "ImageResizeKJ",
+ "ImageResizeXZ",
+ "SelfGuidanceXZ",
+ "TextEncodeQwenImageEditSimpleXZ",
+ "TextEncodeQwenImageEditXZ",
+ "TripleCLIPLoaderXZ",
+ "VAEDecodeTiledXZ",
+ "VAEDecodeXZ",
+ "WanImageToVideoXZ"
+ ],
+ {
+ "title_aux": "xzuynodes-ComfyUI"
+ }
+ ],
+ "https://github.com/y4my4my4m/ComfyUI_Direct3DS2": [
+ [
+ "Direct3DS2ModelDownloader",
+ "Direct3DS2Node"
+ ],
+ {
+ "title_aux": "ComfyUI-Direct3DS2 [WIP]"
+ }
+ ],
+ "https://github.com/yamanacn/ComfyUI-ImageMask-Random-Sync-Picker": [
+ [
+ "ImageMaskRandomSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageMask-Random-Sync-Picker"
+ }
+ ],
+ "https://github.com/yamanacn/ComfyUI-QwenVL3-image": [
+ [
+ "QwenVL3_image",
+ "QwenVLUnloadModel"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenVL3-image [WIP]"
+ }
+ ],
+ "https://github.com/yamanacn/comfyui_qwen_object": [
+ [
+ "BBoxToSAM",
+ "DetectObject",
+ "LoadQwenModel",
+ "SortBBox"
+ ],
+ {
+ "title_aux": "comfyui_qwen_object [WIP]"
+ }
+ ],
+ "https://github.com/yamanacn/comfyui_qwenbbox": [
+ [
+ "BBoxToSAM_v2",
+ "LoadQwenModel_v2",
+ "QwenBbox"
+ ],
+ {
+ "title_aux": "comfyui_qwenbbox"
+ }
+ ],
+ "https://github.com/yanhuifair/ComfyUI-FairLab": [
+ [
+ "ASCIICharNode",
+ "AddNode",
+ "AppendTagsNode",
+ "AspectRatiosNode",
+ "Base64ToImageNode",
+ "DetailMapNode",
+ "DivideNode",
+ "DownloadImageNode",
+ "ExcludeTagsNode",
+ "FillAlphaNode",
+ "FixUTF8StringNode",
+ "FloatNode",
+ "FloatToIntNode",
+ "IfNode",
+ "ImageRemoveAlphaNode",
+ "ImageShapeNode",
+ "ImageSizeNode",
+ "ImageToBase64Node",
+ "ImageToVideoNode",
+ "ImagesCatNode",
+ "ImagesIndexNode",
+ "ImagesRangeNode",
+ "IntNode",
+ "IntToFloatNode",
+ "LoadImageBatchFromDirectoryNode",
+ "LoadImageFromDirectoryNode",
+ "LoadImageFromURLNode",
+ "LoadStringFromDirectoryNode",
+ "LoadStringNode",
+ "LoraLoaderDualNode",
+ "MaskMapNode",
+ "MaxNode",
+ "MinNode",
+ "ModulationDirectionNode",
+ "ModulationNode",
+ "MultiplyIntNode",
+ "MultiplyNode",
+ "NumberNode",
+ "OutpaintingPadNode",
+ "PerfectPixelNode",
+ "PrependTagsNode",
+ "PrintAnyNode",
+ "PrintImageNode",
+ "PureColorImageNode",
+ "PythonScriptNode",
+ "RangeStringListNode",
+ "RangeStringNode",
+ "ResizeImageNode",
+ "RoughnessToSmoothnessNode",
+ "SaveImageToDirectoryNode",
+ "SaveImageToFolderNode",
+ "SaveStringToDirectoryNode",
+ "ShowStringNode",
+ "StringAppendNode",
+ "StringNode",
+ "StringTranslateNode",
+ "SubtractNode",
+ "UniqueTagsNode",
+ "VideoToImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI-FairLab"
+ }
+ ],
+ "https://github.com/yanhuifair/comfyui-deepseek": [
+ [
+ "DeepSeekChatNode",
+ "DeepSeekChatProNode",
+ "DeepSeekReasonerNode"
+ ],
+ {
+ "title_aux": "comfyui-deepseek [WIP]"
+ }
+ ],
+ "https://github.com/yichengup/ComfyUI-Transition": [
+ [
+ "CircularSequenceTransition",
+ "CircularTransition",
+ "DualLineTransition",
+ "GradientTransition",
+ "LinearTransition",
+ "SequenceTransition"
+ ],
+ {
+ "title_aux": "ComfyUI-Transition"
+ }
+ ],
+ "https://github.com/yichengup/ComfyUI-YCNodes_Advance": [
+ [
+ "FaceDetectorSelector",
+ "HumanPartsUltra",
+ "ImageUpscaleWithModel_Optimized",
+ "UpscaleModelLoader_Optimized",
+ "YC Color Match",
+ "YCFaceAlignToCanvas",
+ "YCFaceAlignToCanvasV2",
+ "YCFaceAlignToReference",
+ "YCFaceAnalysisModels",
+ "ycFaceMaskCreator"
+ ],
+ {
+ "title_aux": "ComfyUI-YCNodes_Advance"
+ }
+ ],
+ "https://github.com/yichengup/Comfyui-NodeSpark": [
+ [
+ "ImageCircleWarp",
+ "ImageStretch",
+ "ImageWaveWarp",
+ "LiquifyNode"
+ ],
+ {
+ "title_aux": "Comfyui-NodeSpark"
+ }
+ ],
+ "https://github.com/yincangshiwei/ComfyUI-SEQLToolNode": [
+ [
+ "CanvasFusionNode",
+ "ImageCropByAlpha"
+ ],
+ {
+ "title_aux": "ComfyUI-SEQLToolNode"
+ }
+ ],
+ "https://github.com/yojimbodayne/ComfyUI-Dropbox-API": [
+ [
+ "FetchTokenFromDropbox",
+ "PostImagesToDropboxAPI",
+ "PostPromptsToDropboxAPI",
+ "PullImagesFromDropboxAPI",
+ "PullTextFromDropboxAPI",
+ "PullVideosFromDropboxAPI",
+ "VideoCombineAndExportToDropboxAPI"
+ ],
+ {
+ "title_aux": "ComfyUI-Dropbox-API [WIP]"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-HYPIR": [
+ [
+ "HYPIRProcess",
+ "LoadHYPIRModel",
+ "LoadTheraModel"
+ ],
+ {
+ "title_aux": "ComfyUI HYPIR [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/yuyu0218yu/comfyui-NXCM-tool": [
+ [
+ "HD_EncryptImage",
+ "HD_EncryptVideo",
+ "VideoToGarbledImage"
+ ],
+ {
+ "title_aux": "comfyui-NXCM-tool [UNSAFE]"
+ }
+ ],
+ "https://github.com/z604159435g/comfyui_random_prompt_plugin": [
+ [
+ "NaturalLanguagePromptGenerator",
+ "PromptCacheCleaner"
+ ],
+ {
+ "title_aux": "comfyui_random_prompt_plugin [WIP]"
+ }
+ ],
+ "https://github.com/zRich/ComfyUI-zRich-ObjectCutter": [
+ [
+ "SAM2AutoLayer",
+ "zRichObjectCutter"
+ ],
+ {
+ "title_aux": "ComfyUI-zRich-ObjectCutter"
+ }
+ ],
+ "https://github.com/zRich/sam2_layer_node": [
+ [
+ "SAM2AutoLayer"
+ ],
+ {
+ "title_aux": "sam2_layer_node"
+ }
+ ],
+ "https://github.com/zackabrams/ComfyUI-KeySyncWrapper": [
+ [
+ "KeySyncAdvanced",
+ "KeySyncWrapper"
+ ],
+ {
+ "title_aux": "ComfyUI-KeySyncWrapper [WIP]"
+ }
+ ],
+ "https://github.com/zhaorishuai/ComfyUI-StoryboardDistributor": [
+ [
+ "StoryboardDistributor"
+ ],
+ {
+ "title_aux": "ComfyUI-StoryboardDistributor"
+ }
+ ],
+ "https://github.com/zhengxyz123/ComfyUI-CLIPSeg": [
+ [
+ "CLIPSegImage",
+ "CLIPSegText"
+ ],
+ {
+ "title_aux": "zhengxyz123/ComfyUI-CLIPSeg [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/zhongpei/Comfyui_image2prompt": [
+ [
+ "CLIP AdvancedTextEncode|fofo",
+ "CLIP PromptConditioning|fofo",
+ "Image2Text",
+ "Image2TextWithTags",
+ "ImageBatchToList|fofo",
+ "ImageRewardScore|fofo",
+ "LoadImage2TextModel",
+ "LoadImageRewardScoreModel|fofo",
+ "LoadT5Model|fofo",
+ "LoadText2PromptModel",
+ "ShowText|fofo",
+ "T5QuantizationConfig|fofo",
+ "T5Text2Prompt|fofo",
+ "Text2GPTPrompt",
+ "Text2Prompt",
+ "TextBox|fofo",
+ "Translate2Chinese|fofo"
+ ],
+ {
+ "title_aux": "Comfyui_image2prompt"
+ }
+ ],
+ "https://github.com/zhu733756/Comfyui-Anything-Converter": [
+ [
+ "FileConverter.FileDictConverter",
+ "FileConverter.FileSplitter",
+ "FileConverter.LineConverter",
+ "ImageCoverter.LoadImage2Kontext",
+ "ImageCoverter.SaveImage",
+ "JsonCoverter.JsonCombiner",
+ "JsonCoverter.JsonParser",
+ "JsonCoverter.JsonPromptProcessor",
+ "TextConverter.PromptTemplateText"
+ ],
+ {
+ "title_aux": "Comfyui-Anything-Converter [UNSAFE]"
+ }
+ ],
+ "https://github.com/zhu798542746/comfyui_model": [
+ [
+ "ModelManagerNode"
+ ],
+ {
+ "title_aux": "comfyui_model [UNSAFE]"
+ }
+ ],
+ "https://github.com/zhuanvi/ComfyUI-ZVNodes": [
+ [
+ "ApimartDownloadSavedTaskImageZV",
+ "ApimartDownloadSavedTaskVideoZV",
+ "ApimartImage2VideoSubmitZV",
+ "ApimartNanoBananaProImageSubmitZV",
+ "ApimartRemixByTaskIdSubmitZV",
+ "ApimartRemixVideoSubmitZV",
+ "ApimartSeedream40ImageSubmitZV",
+ "ApimartSeedream45ImageSubmitZV",
+ "ApimartText2VideoSubmitZV",
+ "BBOXFormatConverterZV",
+ "GrsaiLoadImageFromPathNodeZV",
+ "GrsaiNanoBananaGeminiNodeZV",
+ "GrsaiNanoBananaNodeZV",
+ "GrsaiResultNodeZV",
+ "GrsaiSoraCreateCharacterNodeZV",
+ "GrsaiSoraUploadCharacterNodeZV",
+ "GrsaiSoraVideoNodeZV",
+ "ImageCounterNodeZV",
+ "JoinListZV",
+ "JsonListIndexerZV",
+ "JsonListLengthZV",
+ "JsonListNodeZV",
+ "JsonListSlicerZV",
+ "JsonListToMaskZV",
+ "JsonReaderZV",
+ "JsonToSrtConverterZV",
+ "LineNumberGeneratorZV",
+ "LoadImageFromDirZV",
+ "LoadImageFromUrlZV",
+ "LoadTxtFromDirZV",
+ "LoadVideoFromDirZV",
+ "MultiLineConditionalZV",
+ "MultiLineOperationZV",
+ "PatternFillNodeZV",
+ "ProductionDisplacementMapNodeZV",
+ "RandomSelectListZV",
+ "SaveImageToPathZV",
+ "SaveTxtToPathZV",
+ "StringToPathZV",
+ "TriangleCharacterLayoutZV",
+ "TxtCounterNodeZV",
+ "UniversalBBOXToMaskZV",
+ "Veo31Image2VideoSubmitZV",
+ "VideoGeneratorFFmpegZV",
+ "VideoSceneDetectorZV",
+ "VideoSpeedZV",
+ "doubaoI2INodeZV",
+ "doubaoT2INodeZV"
+ ],
+ {
+ "title_aux": "ComfyUI-ZVNodes [WIP]"
+ }
+ ],
+ "https://github.com/zhupeter010903/ComfyUI-prompt-library": [
+ [
+ "GroupedPromptNode",
+ "XYZ Grouped Prompts",
+ "XYZ Multi Clip Encoder",
+ "XYZ Multi Text Concatenate",
+ "XYZ Multi Text Replace",
+ "XYZ Prompt Library",
+ "XYZ Random String Picker"
+ ],
+ {
+ "title_aux": "ComfyUI-prompt-library"
+ }
+ ],
+ "https://github.com/zjkhurry/comfyui_MetalFX": [
+ [
+ "metalFXImg"
+ ],
+ {
+ "title_aux": "comfyui_MetalFX [WIP]"
+ }
+ ],
+ "https://github.com/zl9739379/comfyui-qwen-vl-api": [
+ [
+ "VL_QwenDescribeImage"
+ ],
+ {
+ "title_aux": "ComfyUI Qwen Vision Language API Node [NAME CONFLICT]"
+ }
+ ],
+ "https://github.com/zopieux/ComfyUI-zopi": [
+ [
+ "EvalPython",
+ "LoadTensortRTAndCheckpoint"
+ ],
+ {
+ "title_aux": "ComfyUI-zopi [UNSAFE]"
+ }
+ ],
+ "https://github.com/zyd232/ComfyUI-zyd232-Nodes": [
+ [
+ "zyd232 ImagesPixelsCompare",
+ "zyd232 MaskBatchBlend",
+ "zyd232_SavePreviewImages"
+ ],
+ {
+ "title_aux": "ComfyUI-zyd232-Nodes"
+ }
+ ],
+ "https://github.com/zyquon/ComfyUI-Stash": [
+ [
+ "StashImage",
+ "StashNode"
+ ],
+ {
+ "title_aux": "ComfyUI Stash"
+ }
+ ],
+ "https://raw.githubusercontent.com/jp0215/comfyUI_padding-resize_node/main/PaddingNode.py": [
+ [
+ "function"
+ ],
+ {
+ "title_aux": "comfyUI_padding-resize_node"
+ }
+ ],
+ "https://raw.githubusercontent.com/komojini/ComfyUI_Prompt_Template_CustomNodes/main/prompt_with_template.py": [
+ [
+ "ObjectPromptWithTemplate",
+ "PromptWithTemplate"
+ ],
+ {
+ "title_aux": "ComfyUI_Prompt_Template_CustomNodes"
+ }
+ ],
+ "https://raw.githubusercontent.com/okg21/VLLMVisionChatNode/refs/heads/main/VLLMVisionChatNode.py": [
+ [
+ "VLLMVisionChatNode"
+ ],
+ {
+ "title_aux": "VLLMVisionChatNode"
+ }
+ ],
+ "https://raw.githubusercontent.com/olyyarm/ComfyUI-VLMStudio/refs/heads/master/vlm_visionary_node_v3_.py": [
+ [
+ "GemmaMultimodalAnalyzer"
+ ],
+ {
+ "title_aux": "ComfyUI-VLMStudio"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/dev/github-stats.json b/custom_nodes/ComfyUI-Manager/node_db/dev/github-stats.json
new file mode 100644
index 0000000000000000000000000000000000000000..e0514ce075106671de3c6a088dc5e9f9900c91d8
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/dev/github-stats.json
@@ -0,0 +1,5557 @@
+{
+ "https://github.com/123jimin/ComfyUI-MobileForm": {
+ "stars": 13,
+ "last_update": "2025-04-06 13:36:29",
+ "author_account_age_days": 5360
+ },
+ "https://github.com/17Retoucher/ComfyUI_Fooocus": {
+ "stars": 57,
+ "last_update": "2024-02-24 07:33:29",
+ "author_account_age_days": 766
+ },
+ "https://github.com/1H-hobit/ComfyUI_InternVL3": {
+ "stars": 1,
+ "last_update": "2025-10-20 07:24:30",
+ "author_account_age_days": 522
+ },
+ "https://github.com/206811/ComfyUI_ZhipuAIO": {
+ "stars": 3,
+ "last_update": "2025-07-29 10:11:45",
+ "author_account_age_days": 2102
+ },
+ "https://github.com/3dmindscapper/ComfyUI-PartField": {
+ "stars": 33,
+ "last_update": "2025-05-01 02:50:39",
+ "author_account_age_days": 998
+ },
+ "https://github.com/3dmindscapper/ComfyUI-Sam-Mesh": {
+ "stars": 43,
+ "last_update": "2025-05-07 12:42:13",
+ "author_account_age_days": 998
+ },
+ "https://github.com/438443467/ComfyUI-SanMian-Nodes": {
+ "stars": 32,
+ "last_update": "2025-04-29 10:29:07",
+ "author_account_age_days": 1008
+ },
+ "https://github.com/543872524/ComfyUI_crdong": {
+ "stars": 0,
+ "last_update": "2025-09-25 13:37:23",
+ "author_account_age_days": 2610
+ },
+ "https://github.com/5x00/ComfyUI-Prompt-Plus": {
+ "stars": 2,
+ "last_update": "2025-01-08 15:54:08",
+ "author_account_age_days": 1566
+ },
+ "https://github.com/77oussam/Aio77-Comfyui": {
+ "stars": 0,
+ "last_update": "2025-08-05 06:46:11",
+ "author_account_age_days": 979
+ },
+ "https://github.com/78Ventures/ComfyUI-Tortu": {
+ "stars": 1,
+ "last_update": "2025-09-17 21:51:59",
+ "author_account_age_days": 698
+ },
+ "https://github.com/7BEII/Comfyui_PDuse": {
+ "stars": 45,
+ "last_update": "2026-01-20 05:46:47",
+ "author_account_age_days": 407
+ },
+ "https://github.com/853587221/ComfyUI_XLweb": {
+ "stars": 3,
+ "last_update": "2026-01-11 03:44:33",
+ "author_account_age_days": 1251
+ },
+ "https://github.com/861289009/comfyui_video_node": {
+ "stars": 2,
+ "last_update": "2026-02-05 03:41:50",
+ "author_account_age_days": 1630
+ },
+ "https://github.com/A1rCHAN/ComfyUI_A1rSpace": {
+ "stars": 5,
+ "last_update": "2026-01-27 09:09:27",
+ "author_account_age_days": 597
+ },
+ "https://github.com/A4P7J1N7M05OT/ComfyUI-ManualSigma": {
+ "stars": 1,
+ "last_update": "2024-12-30 10:45:23",
+ "author_account_age_days": 1067
+ },
+ "https://github.com/A4P7J1N7M05OT/ComfyUI-VAELoaderSDXLmod": {
+ "stars": 0,
+ "last_update": "2025-06-23 23:42:45",
+ "author_account_age_days": 1067
+ },
+ "https://github.com/A719689614/ComfyUI_AC_FUNV7-FLUX-": {
+ "stars": 0,
+ "last_update": "2025-11-14 08:30:14",
+ "author_account_age_days": 909
+ },
+ "https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1": {
+ "stars": 13,
+ "last_update": "2026-01-15 06:53:01",
+ "author_account_age_days": 909
+ },
+ "https://github.com/AICodeFactory/ComfyUI-Viva": {
+ "stars": 1,
+ "last_update": "2025-05-15 08:07:12",
+ "author_account_age_days": 663
+ },
+ "https://github.com/AIExplorer25/ComfyUI_HuggingfaceHelper": {
+ "stars": 0,
+ "last_update": "2025-11-17 10:18:29",
+ "author_account_age_days": 4061
+ },
+ "https://github.com/AIFSH/ComfyUI-OpenDIT": {
+ "stars": 0,
+ "last_update": "2024-06-30 09:33:55",
+ "author_account_age_days": 826
+ },
+ "https://github.com/AIFSH/ComfyUI-ViViD": {
+ "stars": 5,
+ "last_update": "2024-06-25 08:16:53",
+ "author_account_age_days": 826
+ },
+ "https://github.com/AIFSH/UltralightDigitalHuman-ComfyUI": {
+ "stars": 131,
+ "last_update": "2024-11-25 11:39:23",
+ "author_account_age_days": 826
+ },
+ "https://github.com/AIFSH/UtilNodes-ComfyUI": {
+ "stars": 14,
+ "last_update": "2024-12-19 06:44:25",
+ "author_account_age_days": 826
+ },
+ "https://github.com/AIGCZero/AIGCZero-comfyui-Qwen_edit-zero": {
+ "stars": 5,
+ "last_update": "2025-09-16 08:49:34",
+ "author_account_age_days": 253
+ },
+ "https://github.com/AMTPorn/comfyui_amt": {
+ "stars": 0,
+ "last_update": "2025-12-19 10:38:04",
+ "author_account_age_days": 327
+ },
+ "https://github.com/APZmedia/ComfyUI-folder-parser": {
+ "stars": 0,
+ "last_update": "2025-11-02 14:39:38",
+ "author_account_age_days": 3071
+ },
+ "https://github.com/APZmedia/Joshua-brand-assets-loader": {
+ "stars": 0,
+ "last_update": "2025-10-27 19:44:50",
+ "author_account_age_days": 3071
+ },
+ "https://github.com/APZmedia/comfyui-textools": {
+ "stars": 9,
+ "last_update": "2025-11-04 23:40:59",
+ "author_account_age_days": 3071
+ },
+ "https://github.com/Aero-Ex/comfyui_diffswap": {
+ "stars": 0,
+ "last_update": "2025-07-29 11:43:43",
+ "author_account_age_days": 1345
+ },
+ "https://github.com/AhBumm/ComfyUI-Upscayl": {
+ "stars": 0,
+ "last_update": "2025-02-19 09:41:02",
+ "author_account_age_days": 1403
+ },
+ "https://github.com/AhiruNeko/ComfyUI-MiniTools": {
+ "stars": 0,
+ "last_update": "2026-01-13 16:32:33",
+ "author_account_age_days": 1303
+ },
+ "https://github.com/AkiEvansDev/ComfyUI-Tools": {
+ "stars": 0,
+ "last_update": "2025-06-28 14:48:29",
+ "author_account_age_days": 2912
+ },
+ "https://github.com/Alazuaka/comfyui-lora-stack-node": {
+ "stars": 0,
+ "last_update": "2025-06-12 23:14:31",
+ "author_account_age_days": 1381
+ },
+ "https://github.com/AlejandroTuzzi/TUZZI-ByPass": {
+ "stars": 5,
+ "last_update": "2025-08-07 11:48:54",
+ "author_account_age_days": 1839
+ },
+ "https://github.com/AlexXi19/ComfyUI-OpenAINode": {
+ "stars": 1,
+ "last_update": "2025-01-13 18:43:22",
+ "author_account_age_days": 2025
+ },
+ "https://github.com/AlexYez/comfyui-timesaver": {
+ "stars": 2,
+ "last_update": "2026-02-05 13:00:06",
+ "author_account_age_days": 1749
+ },
+ "https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes": {
+ "stars": 3,
+ "last_update": "2025-06-12 23:48:01",
+ "author_account_age_days": 2699
+ },
+ "https://github.com/Alvaroeai/ComfyUI-SunoAI-Mds": {
+ "stars": 0,
+ "last_update": "2025-01-11 21:13:41",
+ "author_account_age_days": 4296
+ },
+ "https://github.com/Amor718/AmorForge": {
+ "stars": 1,
+ "last_update": "2025-11-03 15:21:33",
+ "author_account_age_days": 116
+ },
+ "https://github.com/Anonymzx/ComfyUI-Indonesia-TTS": {
+ "stars": 0,
+ "last_update": "2025-05-07 14:33:50",
+ "author_account_age_days": 2423
+ },
+ "https://github.com/Anze-/ComfyUI-OIDN": {
+ "stars": 10,
+ "last_update": "2024-11-27 18:05:41",
+ "author_account_age_days": 4549
+ },
+ "https://github.com/Anze-/ComfyUI_deepDeband": {
+ "stars": 3,
+ "last_update": "2024-11-12 19:13:59",
+ "author_account_age_days": 4549
+ },
+ "https://github.com/AprEcho/ComfyUI-RandomSeed": {
+ "stars": 0,
+ "last_update": "2025-12-16 09:17:01",
+ "author_account_age_days": 2052
+ },
+ "https://github.com/ArmandAlbert/Kwai_font_comfyui": {
+ "stars": 1,
+ "last_update": "2025-01-14 04:02:21",
+ "author_account_age_days": 2586
+ },
+ "https://github.com/ArthusLiang/comfyui-face-remap": {
+ "stars": 5,
+ "last_update": "2024-11-30 12:34:28",
+ "author_account_age_days": 4610
+ },
+ "https://github.com/Aruntd008/ComfyUI_SeamlessPattern": {
+ "stars": 0,
+ "last_update": "2025-12-11 12:31:38",
+ "author_account_age_days": 1136
+ },
+ "https://github.com/Aruntd008/ComfyUI_blender_render": {
+ "stars": 0,
+ "last_update": "2025-12-11 12:23:07",
+ "author_account_age_days": 1136
+ },
+ "https://github.com/AustinMroz/ComfyUI-WorkflowCheckpointing": {
+ "stars": 11,
+ "last_update": "2024-10-17 19:59:40",
+ "author_account_age_days": 4669
+ },
+ "https://github.com/BARKEM-JC/ComfyUI-Dynamic-Lora-Loader": {
+ "stars": 0,
+ "last_update": "2025-09-07 18:07:33",
+ "author_account_age_days": 2279
+ },
+ "https://github.com/Babiduba/ivan_knows": {
+ "stars": 0,
+ "last_update": "2025-08-12 23:51:47",
+ "author_account_age_days": 4065
+ },
+ "https://github.com/BadCafeCode/execution-inversion-demo-comfyui": {
+ "stars": 97,
+ "last_update": "2025-03-09 00:44:37",
+ "author_account_age_days": 1025
+ },
+ "https://github.com/BaronVonBoolean/ComfyUI-FileOps": {
+ "stars": 0,
+ "last_update": "2024-12-22 18:04:20",
+ "author_account_age_days": 433
+ },
+ "https://github.com/Beinsezii/DEET": {
+ "stars": 2,
+ "last_update": "2025-10-27 04:51:55",
+ "author_account_age_days": 2820
+ },
+ "https://github.com/Beinsezii/comfyui-amd-go-fast": {
+ "stars": 47,
+ "last_update": "2025-04-21 19:37:22",
+ "author_account_age_days": 2820
+ },
+ "https://github.com/BenjaMITM/ComfyUI_On_The_Fly_Wildcards": {
+ "stars": 0,
+ "last_update": "2024-11-20 06:17:53",
+ "author_account_age_days": 542
+ },
+ "https://github.com/BetaDoggo/ComfyUI-LogicGates": {
+ "stars": 3,
+ "last_update": "2024-07-21 06:31:25",
+ "author_account_age_days": 1392
+ },
+ "https://github.com/Big-Idea-Technology/ComfyUI-Movie-Tools": {
+ "stars": 3,
+ "last_update": "2024-11-29 11:13:57",
+ "author_account_age_days": 1466
+ },
+ "https://github.com/BigStationW/flowmatch_scheduler-comfyui": {
+ "stars": 19,
+ "last_update": "2025-06-17 13:31:03",
+ "author_account_age_days": 280
+ },
+ "https://github.com/BinglongLi/ComfyUI_ToolsForAutomask": {
+ "stars": 1,
+ "last_update": "2025-06-04 11:56:53",
+ "author_account_age_days": 2279
+ },
+ "https://github.com/BiodigitalJaz/ComfyUI-Dafaja-Nodes": {
+ "stars": 1,
+ "last_update": "2025-08-16 14:12:10",
+ "author_account_age_days": 772
+ },
+ "https://github.com/BizaNator/BrainDead_QwenCharacterEditor": {
+ "stars": 3,
+ "last_update": "2025-09-29 01:04:46",
+ "author_account_age_days": 3651
+ },
+ "https://github.com/BlueDangerX/ComfyUI-BDXNodes": {
+ "stars": 1,
+ "last_update": "2023-12-10 04:01:19",
+ "author_account_age_days": 841
+ },
+ "https://github.com/Brandelan/ComfyUI_bd_customNodes": {
+ "stars": 2,
+ "last_update": "2026-01-05 20:30:24",
+ "author_account_age_days": 4746
+ },
+ "https://github.com/BrettMedia/comfyui-bhtools": {
+ "stars": 1,
+ "last_update": "2025-07-24 21:32:37",
+ "author_account_age_days": 254
+ },
+ "https://github.com/BuffMcBigHuge/ComfyUI-Buff-Nodes": {
+ "stars": 2,
+ "last_update": "2025-09-10 16:09:48",
+ "author_account_age_days": 3507
+ },
+ "https://github.com/Burgstall-labs/ComfyUI-BS_FalAi-API-Video": {
+ "stars": 5,
+ "last_update": "2025-10-26 14:31:29",
+ "author_account_age_days": 385
+ },
+ "https://github.com/Bwebbfx/ComfyUI_FaceParsing": {
+ "stars": 14,
+ "last_update": "2025-07-02 20:41:55",
+ "author_account_age_days": 821
+ },
+ "https://github.com/COcisuts/CObot-ComfyUI-WhisperToTranscription": {
+ "stars": 0,
+ "last_update": "2025-06-08 13:32:25",
+ "author_account_age_days": 3210
+ },
+ "https://github.com/CarlMarkswx/ComfyUI-Mirror-Download": {
+ "stars": 0,
+ "last_update": "2026-01-14 04:05:45",
+ "author_account_age_days": 1101
+ },
+ "https://github.com/CeeVeeR/ComfyUi-Text-Tiler": {
+ "stars": 0,
+ "last_update": "2025-03-25 20:26:18",
+ "author_account_age_days": 1668
+ },
+ "https://github.com/Chang-Jin-Lee/ComfyUI-PromptMixer-AI": {
+ "stars": 0,
+ "last_update": "2025-12-01 00:53:32",
+ "author_account_age_days": 2359
+ },
+ "https://github.com/Chargeuk/ComfyUI-vts-nodes": {
+ "stars": 0,
+ "last_update": "2025-10-24 16:01:27",
+ "author_account_age_days": 4702
+ },
+ "https://github.com/Charonartist/ComfyUI-send-eagle-pro_2": {
+ "stars": 0,
+ "last_update": "2025-05-26 12:12:47",
+ "author_account_age_days": 588
+ },
+ "https://github.com/Charonartist/comfyui-lora-random-selector": {
+ "stars": 0,
+ "last_update": "2025-08-08 13:34:04",
+ "author_account_age_days": 588
+ },
+ "https://github.com/ChrisColeTech/ComfyUI-Get-Random-File": {
+ "stars": 3,
+ "last_update": "2025-06-19 03:10:17",
+ "author_account_age_days": 3007
+ },
+ "https://github.com/Clelstyn/ComfyUI-Inpaint_with_Detailer": {
+ "stars": 1,
+ "last_update": "2024-11-02 12:04:53",
+ "author_account_age_days": 912
+ },
+ "https://github.com/Clivey1234/ComfyUI_FBX_Import": {
+ "stars": 7,
+ "last_update": "2026-01-04 22:06:02",
+ "author_account_age_days": 1416
+ },
+ "https://github.com/Clybius/ComfyUI-FluxDeCLIP": {
+ "stars": 1,
+ "last_update": "2024-11-17 20:06:29",
+ "author_account_age_days": 2328
+ },
+ "https://github.com/Comfy-Org/ComfyUI_devtools": {
+ "stars": 24,
+ "last_update": "2026-01-28 03:31:40",
+ "author_account_age_days": 670
+ },
+ "https://github.com/CooperCorona/comfy-auto-unload": {
+ "stars": 1,
+ "last_update": "2025-09-13 17:43:43",
+ "author_account_age_days": 4210
+ },
+ "https://github.com/CypherNaught-0x/ComfyUI-StarVector": {
+ "stars": 1,
+ "last_update": "2025-12-14 21:57:41",
+ "author_account_age_days": 4094
+ },
+ "https://github.com/D1-3105/ComfyUI-VideoStream": {
+ "stars": 0,
+ "last_update": "2025-02-17 04:02:01",
+ "author_account_age_days": 2097
+ },
+ "https://github.com/DailyMok/ComfyUI-PromptMixerNode": {
+ "stars": 0,
+ "last_update": "2026-01-16 09:50:13",
+ "author_account_age_days": 449
+ },
+ "https://github.com/DataCTE/ComfyUI-DataVoid-nodes": {
+ "stars": 0,
+ "last_update": "2024-11-20 14:20:31",
+ "author_account_age_days": 1372
+ },
+ "https://github.com/DavidJBarnes/comfyui-djb-utils": {
+ "stars": 0,
+ "last_update": "2025-09-18 17:00:25",
+ "author_account_age_days": 4475
+ },
+ "https://github.com/DeTK/ComfyUI-Switch": {
+ "stars": 0,
+ "last_update": "2024-03-04 11:52:04",
+ "author_account_age_days": 2625
+ },
+ "https://github.com/Dehypnotic/comfyui-save-mp3": {
+ "stars": 1,
+ "last_update": "2025-10-24 09:40:52",
+ "author_account_age_days": 1686
+ },
+ "https://github.com/DenRakEiw/Comfyui-Aspect-Ratio-Processor": {
+ "stars": 0,
+ "last_update": "2025-08-18 05:23:24",
+ "author_account_age_days": 1625
+ },
+ "https://github.com/DenRakEiw/DenRakEiw_Nodes": {
+ "stars": 31,
+ "last_update": "2025-09-17 05:30:41",
+ "author_account_age_days": 1625
+ },
+ "https://github.com/DeyanShahov/ComfyUI_RedFox": {
+ "stars": 0,
+ "last_update": "2025-10-21 22:43:48",
+ "author_account_age_days": 1684
+ },
+ "https://github.com/DiffusionWave-YT/DiffusionWave_PickResolution": {
+ "stars": 0,
+ "last_update": "2025-06-29 23:55:17",
+ "author_account_age_days": 244
+ },
+ "https://github.com/DoctorDiffusion/ComfyUI-Flashback": {
+ "stars": 0,
+ "last_update": "2024-11-11 01:37:43",
+ "author_account_age_days": 936
+ },
+ "https://github.com/DonutsDelivery/ComfyUI-DonutNodes": {
+ "stars": 16,
+ "last_update": "2026-02-04 02:39:39",
+ "author_account_age_days": 320
+ },
+ "https://github.com/DrMWeigand/ComfyUI_LineBreakInserter": {
+ "stars": 0,
+ "last_update": "2024-04-19 11:37:19",
+ "author_account_age_days": 1626
+ },
+ "https://github.com/DraconicDragon/ComfyUI_e621_booru_toolkit": {
+ "stars": 5,
+ "last_update": "2025-09-22 18:28:25",
+ "author_account_age_days": 1968
+ },
+ "https://github.com/Dream-Pixels-Forge/ComfyUI-Mzikart-Player": {
+ "stars": 0,
+ "last_update": "2025-07-18 15:11:25",
+ "author_account_age_days": 2450
+ },
+ "https://github.com/Dream-Pixels-Forge/ComfyUI-Mzikart-Vocal": {
+ "stars": 0,
+ "last_update": "2025-08-05 10:58:20",
+ "author_account_age_days": 2450
+ },
+ "https://github.com/Dream-Pixels-Forge/ComfyUI-RendArt-Nodes": {
+ "stars": 0,
+ "last_update": "2025-08-05 11:22:39",
+ "author_account_age_days": 2450
+ },
+ "https://github.com/DreamsInAutumn/ComfyUI-Autumn-LLM-Nodes": {
+ "stars": 0,
+ "last_update": "2025-06-14 06:14:05",
+ "author_account_age_days": 1461
+ },
+ "https://github.com/Dreamshot-io/ComfyUI-Extend-Resolution": {
+ "stars": 0,
+ "last_update": "2025-06-02 07:15:00",
+ "author_account_age_days": 447
+ },
+ "https://github.com/ELiZswe/ComfyUI-ELiZTools": {
+ "stars": 0,
+ "last_update": "2025-06-24 06:14:44",
+ "author_account_age_days": 2418
+ },
+ "https://github.com/ElyZeng/ComfyUI-Translator": {
+ "stars": 2,
+ "last_update": "2025-07-31 03:12:40",
+ "author_account_age_days": 1349
+ },
+ "https://github.com/Elypha/ComfyUI-Prompt-Helper": {
+ "stars": 0,
+ "last_update": "2025-09-20 04:42:50",
+ "author_account_age_days": 3126
+ },
+ "https://github.com/EmanueleUniroma2/ComfyUI-FLAC-to-WAV": {
+ "stars": 2,
+ "last_update": "2025-01-26 11:25:43",
+ "author_account_age_days": 3240
+ },
+ "https://github.com/EmilioPlumed/ComfyUI-Math": {
+ "stars": 1,
+ "last_update": "2025-01-11 14:28:42",
+ "author_account_age_days": 2572
+ },
+ "https://github.com/Enferlain/ComfyUI-Model-Comparison": {
+ "stars": 0,
+ "last_update": "2025-12-18 02:07:26",
+ "author_account_age_days": 3738
+ },
+ "https://github.com/Enferlain/ComfyUI-SamplerCustom-3Decimals": {
+ "stars": 0,
+ "last_update": "2025-12-18 02:19:45",
+ "author_account_age_days": 3738
+ },
+ "https://github.com/Enferlain/ComfyUI-extra-schedulers": {
+ "stars": 0,
+ "last_update": "2025-12-08 00:02:31",
+ "author_account_age_days": 3738
+ },
+ "https://github.com/Eric7758/ComfyUI-IAT": {
+ "stars": 0,
+ "last_update": "2025-10-29 06:28:08",
+ "author_account_age_days": 924
+ },
+ "https://github.com/EricRollei/Comfy-Metadata-System": {
+ "stars": 3,
+ "last_update": "2025-04-28 23:42:26",
+ "author_account_age_days": 1489
+ },
+ "https://github.com/EricRollei/HYPIR-ComfyUI": {
+ "stars": 5,
+ "last_update": "2025-11-18 18:34:15",
+ "author_account_age_days": 1489
+ },
+ "https://github.com/EricRorich/ComfyUI-MegaTran-cutom-node": {
+ "stars": 0,
+ "last_update": "2025-12-18 10:54:29",
+ "author_account_age_days": 1695
+ },
+ "https://github.com/Estanislao-Oviedo/ComfyUI-CustomNodes": {
+ "stars": 0,
+ "last_update": "2025-11-19 02:44:52",
+ "author_account_age_days": 2775
+ },
+ "https://github.com/ExponentialML/ComfyUI_LiveDirector": {
+ "stars": 37,
+ "last_update": "2024-04-09 19:01:49",
+ "author_account_age_days": 2218
+ },
+ "https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI": {
+ "stars": 18,
+ "last_update": "2024-03-10 01:04:02",
+ "author_account_age_days": 3744
+ },
+ "https://github.com/Fannovel16/ComfyUI-AppIO": {
+ "stars": 0,
+ "last_update": "2024-12-01 16:37:19",
+ "author_account_age_days": 3726
+ },
+ "https://github.com/Filexor/File_x_dynamic_prompt2": {
+ "stars": 0,
+ "last_update": "2025-07-29 16:19:34",
+ "author_account_age_days": 4542
+ },
+ "https://github.com/FinetunersAI/comfyui-fast-group-link": {
+ "stars": 0,
+ "last_update": "2024-12-09 17:35:50",
+ "author_account_age_days": 615
+ },
+ "https://github.com/FinetunersAI/finetuners": {
+ "stars": 1,
+ "last_update": "2025-01-06 16:29:33",
+ "author_account_age_days": 615
+ },
+ "https://github.com/Firetheft/ComfyUI_Local_Media_Manager": {
+ "stars": 130,
+ "last_update": "2025-12-04 06:15:39",
+ "author_account_age_days": 1495
+ },
+ "https://github.com/FoundD-oka/ComfyUI-kisekae-OOTD": {
+ "stars": 0,
+ "last_update": "2024-06-02 06:13:42",
+ "author_account_age_days": 1032
+ },
+ "https://github.com/Fucci-Mateo/ComfyUI-Airtable": {
+ "stars": 1,
+ "last_update": "2024-06-25 13:35:18",
+ "author_account_age_days": 1473
+ },
+ "https://github.com/Fuhze73/ComfyUI-PainterI2V-StartEndImage-Tiled": {
+ "stars": 1,
+ "last_update": "2025-11-22 17:16:02",
+ "author_account_age_days": 363
+ },
+ "https://github.com/GalactusX31/ComfyUI-FileBrowserAPI": {
+ "stars": 6,
+ "last_update": "2025-06-13 20:53:11",
+ "author_account_age_days": 2921
+ },
+ "https://github.com/GeekatplayStudio/ComfyUI_Toolbox": {
+ "stars": 4,
+ "last_update": "2025-03-18 16:12:09",
+ "author_account_age_days": 4185
+ },
+ "https://github.com/GentlemanHu/ComfyUI-Notifier": {
+ "stars": 4,
+ "last_update": "2024-07-14 15:38:44",
+ "author_account_age_days": 2978
+ },
+ "https://github.com/George0726/ComfyUI-video-accessory": {
+ "stars": 1,
+ "last_update": "2025-09-26 18:36:12",
+ "author_account_age_days": 2846
+ },
+ "https://github.com/Gergzilla/Slim-Comfy-Pack": {
+ "stars": 0,
+ "last_update": "2025-11-14 14:52:58",
+ "author_account_age_days": 3877
+ },
+ "https://github.com/Ginolazy/ComfyUI-FluxKontextImageCompensate": {
+ "stars": 1,
+ "last_update": "2025-12-30 07:50:37",
+ "author_account_age_days": 1029
+ },
+ "https://github.com/GoddessLabs/ComfyUI-GoddessLabs-NodePack": {
+ "stars": 7,
+ "last_update": "2025-11-25 18:56:25",
+ "author_account_age_days": 105
+ },
+ "https://github.com/GokuHiki/ComfyUI-Goku-Tools": {
+ "stars": 0,
+ "last_update": "2026-01-13 15:11:36",
+ "author_account_age_days": 1258
+ },
+ "https://github.com/Goldlionren/ComfyUI-CleanSlate": {
+ "stars": 1,
+ "last_update": "2025-10-07 04:14:16",
+ "author_account_age_days": 673
+ },
+ "https://github.com/Goldlionren/ComfyUI_Bridge_fabric": {
+ "stars": 1,
+ "last_update": "2025-11-30 07:49:34",
+ "author_account_age_days": 673
+ },
+ "https://github.com/GraftingRayman/Unified-Vision-Prompt-Generator": {
+ "stars": 1,
+ "last_update": "2025-11-20 17:47:15",
+ "author_account_age_days": 757
+ },
+ "https://github.com/Grant-CP/ComfyUI-LivePortraitKJ-MPS": {
+ "stars": 12,
+ "last_update": "2024-07-11 22:04:16",
+ "author_account_age_days": 1768
+ },
+ "https://github.com/Grey3016/Save2Icon": {
+ "stars": 2,
+ "last_update": "2025-01-06 15:18:57",
+ "author_account_age_days": 923
+ },
+ "https://github.com/GrindHouse66/ComfyUI-GH_Tools": {
+ "stars": 0,
+ "last_update": "2024-03-10 13:27:14",
+ "author_account_age_days": 1218
+ },
+ "https://github.com/GuardSkill/ComfyUI-AffineImage": {
+ "stars": 6,
+ "last_update": "2025-11-18 09:08:39",
+ "author_account_age_days": 3627
+ },
+ "https://github.com/GuusF/Comfyui_CrazyMaths": {
+ "stars": 0,
+ "last_update": "2025-08-14 13:12:31",
+ "author_account_age_days": 1980
+ },
+ "https://github.com/HWDigi/Camera_Factory_Station_comfyui": {
+ "stars": 2,
+ "last_update": "2025-08-06 17:46:41",
+ "author_account_age_days": 217
+ },
+ "https://github.com/HailXD/comfyui-random-artist": {
+ "stars": 0,
+ "last_update": "2026-01-11 03:06:28",
+ "author_account_age_days": 1850
+ },
+ "https://github.com/HalfADog/ComfyUI-Mask2JSON": {
+ "stars": 0,
+ "last_update": "2025-12-27 07:03:47",
+ "author_account_age_days": 2793
+ },
+ "https://github.com/Hapseleg/ComfyUI-This-n-That": {
+ "stars": 0,
+ "last_update": "2025-06-03 20:26:27",
+ "author_account_age_days": 3890
+ },
+ "https://github.com/Hifunyo/comfyui_google_ai": {
+ "stars": 0,
+ "last_update": "2025-12-26 11:38:47",
+ "author_account_age_days": 396
+ },
+ "https://github.com/HuangYuChuh/ComfyUI-LLMs-Toolkit": {
+ "stars": 15,
+ "last_update": "2026-02-08 08:32:06",
+ "author_account_age_days": 659
+ },
+ "https://github.com/IAFFeng/Comfyui_XF_Custom_Actual-Node": {
+ "stars": 1,
+ "last_update": "2025-11-28 09:14:16",
+ "author_account_age_days": 721
+ },
+ "https://github.com/IIEleven11/ComfyUI-Dataset_Maker": {
+ "stars": 4,
+ "last_update": "2026-01-09 22:51:53",
+ "author_account_age_days": 2323
+ },
+ "https://github.com/IO-AtelierTech/comfyui-genai-connectors": {
+ "stars": 0,
+ "last_update": "2025-12-16 02:31:50",
+ "author_account_age_days": 95
+ },
+ "https://github.com/IO-AtelierTech/comfyui-video-utils": {
+ "stars": 0,
+ "last_update": "2025-12-16 02:37:32",
+ "author_account_age_days": 95
+ },
+ "https://github.com/IXIWORKS-KIMJUNGHO/comfyui-ixiworks": {
+ "stars": 0,
+ "last_update": "2025-08-14 09:22:06",
+ "author_account_age_days": 2917
+ },
+ "https://github.com/IfnotFr/ComfyUI-Ifnot-Pack": {
+ "stars": 0,
+ "last_update": "2025-02-05 08:51:23",
+ "author_account_age_days": 5179
+ },
+ "https://github.com/IgPoly/ComfyUI-igTools": {
+ "stars": 0,
+ "last_update": "2025-12-27 00:37:05",
+ "author_account_age_days": 522
+ },
+ "https://github.com/Immac/ComfyUI-ImmacTools": {
+ "stars": 0,
+ "last_update": "2025-10-21 19:34:57",
+ "author_account_age_days": 4773
+ },
+ "https://github.com/Inoriac/comfyui-HandDetect": {
+ "stars": 0,
+ "last_update": "2025-09-16 06:11:22",
+ "author_account_age_days": 823
+ },
+ "https://github.com/Isi-dev/ComfyUI_DeleteModelPassthrough_ExecutionFlowControl": {
+ "stars": 4,
+ "last_update": "2026-01-12 22:21:50",
+ "author_account_age_days": 1686
+ },
+ "https://github.com/IuvenisSapiens/ComfyUI_MiniCPM-V-4_5": {
+ "stars": 253,
+ "last_update": "2025-08-29 00:23:20",
+ "author_account_age_days": 1005
+ },
+ "https://github.com/IvanZhd/comfyui-codeformer": {
+ "stars": 0,
+ "last_update": "2023-12-02 20:51:52",
+ "author_account_age_days": 3173
+ },
+ "https://github.com/JBKing514/map_comfyui": {
+ "stars": 6,
+ "last_update": "2026-01-01 14:02:59",
+ "author_account_age_days": 2099
+ },
+ "https://github.com/JHBOY-ha/ComfyUI-jh-essential": {
+ "stars": 0,
+ "last_update": "2025-10-30 08:36:48",
+ "author_account_age_days": 737
+ },
+ "https://github.com/Jairodaniel-17/ComfyUI-traductor-offline": {
+ "stars": 0,
+ "last_update": "2025-08-28 04:57:25",
+ "author_account_age_days": 1795
+ },
+ "https://github.com/Jaxkr/comfyui-terminal-command": {
+ "stars": 1,
+ "last_update": "2023-12-03 10:31:40",
+ "author_account_age_days": 5222
+ },
+ "https://github.com/JayLyu/ComfyUI_BaiKong_Node": {
+ "stars": 8,
+ "last_update": "2025-07-12 15:27:51",
+ "author_account_age_days": 3863
+ },
+ "https://github.com/JiSenHua/ComfyUI-yolov5-face": {
+ "stars": 2,
+ "last_update": "2026-01-13 03:38:02",
+ "author_account_age_days": 1338
+ },
+ "https://github.com/JiangAogo/ComfyUI-Gemini-API": {
+ "stars": 2,
+ "last_update": "2025-12-16 07:02:06",
+ "author_account_age_days": 697
+ },
+ "https://github.com/Jiffies-64/ComfyUI-SaveImagePlus": {
+ "stars": 1,
+ "last_update": "2024-04-01 10:52:59",
+ "author_account_age_days": 1486
+ },
+ "https://github.com/Jingwen-genies/comfyui-genies-nodes": {
+ "stars": 0,
+ "last_update": "2025-05-13 19:36:45",
+ "author_account_age_days": 928
+ },
+ "https://github.com/JioJe/comfyui_video_BC": {
+ "stars": 11,
+ "last_update": "2025-09-12 07:30:45",
+ "author_account_age_days": 618
+ },
+ "https://github.com/JissiChoi/ComfyUI-Jissi-List": {
+ "stars": 0,
+ "last_update": "2024-12-24 08:24:27",
+ "author_account_age_days": 2813
+ },
+ "https://github.com/JoeAu/ComfyUI-PythonNode": {
+ "stars": 4,
+ "last_update": "2025-03-16 13:05:38",
+ "author_account_age_days": 4780
+ },
+ "https://github.com/Jordach/comfy-consistency-vae": {
+ "stars": 69,
+ "last_update": "2023-11-06 20:50:40",
+ "author_account_age_days": 5107
+ },
+ "https://github.com/JosDigby/ComfyUI-DigbyWan": {
+ "stars": 5,
+ "last_update": "2026-01-15 22:18:38",
+ "author_account_age_days": 208
+ },
+ "https://github.com/Junst/ComfyUI-PNG2SVG2PNG": {
+ "stars": 0,
+ "last_update": "2024-12-04 02:25:04",
+ "author_account_age_days": 3133
+ },
+ "https://github.com/Juste-Leo2/ComfyUI-Arduino": {
+ "stars": 5,
+ "last_update": "2025-09-08 19:56:13",
+ "author_account_age_days": 465
+ },
+ "https://github.com/K1maran/ComfyUI-Kimaran": {
+ "stars": 0,
+ "last_update": "2025-11-20 17:01:38",
+ "author_account_age_days": 101
+ },
+ "https://github.com/KERRY-YUAN/ComfyUI_Python_Executor": {
+ "stars": 1,
+ "last_update": "2025-04-07 07:49:03",
+ "author_account_age_days": 1848
+ },
+ "https://github.com/KXSR/ComfyUI-Easy-s3": {
+ "stars": 0,
+ "last_update": "2025-11-27 11:09:24",
+ "author_account_age_days": 165
+ },
+ "https://github.com/Karlmeister/comfyui-karlmeister-nodes-suit": {
+ "stars": 0,
+ "last_update": "2025-10-04 01:22:02",
+ "author_account_age_days": 1500
+ },
+ "https://github.com/Karniverse/ComfyUI-Randomselector": {
+ "stars": 0,
+ "last_update": "2025-08-05 10:26:42",
+ "author_account_age_days": 2960
+ },
+ "https://github.com/Kayarte/Time-Series-Nodes-for-ComfyUI": {
+ "stars": 1,
+ "last_update": "2025-01-29 02:33:25",
+ "author_account_age_days": 648
+ },
+ "https://github.com/KihongK/comfyui-roysnodes": {
+ "stars": 0,
+ "last_update": "2025-01-23 09:11:02",
+ "author_account_age_days": 2156
+ },
+ "https://github.com/KoinnAI/ComfyUI-DynPromptSimplified": {
+ "stars": 2,
+ "last_update": "2025-10-27 18:44:13",
+ "author_account_age_days": 3449
+ },
+ "https://github.com/Kraven1109/ComfyUI-Llama": {
+ "stars": 0,
+ "last_update": "2026-02-03 15:16:59",
+ "author_account_age_days": 1707
+ },
+ "https://github.com/Krish-701/RK_Comfyui": {
+ "stars": 0,
+ "last_update": "2026-01-19 10:08:42",
+ "author_account_age_days": 450
+ },
+ "https://github.com/Kur0butiMegane/Comfyui-StringUtils2": {
+ "stars": 0,
+ "last_update": "2025-05-04 16:34:13",
+ "author_account_age_days": 2247
+ },
+ "https://github.com/KurtHokke/ComfyUI_KurtHokke_Nodes": {
+ "stars": 1,
+ "last_update": "2025-03-27 19:04:42",
+ "author_account_age_days": 419
+ },
+ "https://github.com/LAOGOU-666/Comfyui_StartPatch": {
+ "stars": 51,
+ "last_update": "2025-02-24 17:22:34",
+ "author_account_age_days": 689
+ },
+ "https://github.com/LK-168/comfyui_LK_selfuse": {
+ "stars": 0,
+ "last_update": "2025-07-10 09:55:05",
+ "author_account_age_days": 224
+ },
+ "https://github.com/LMietkiewicz/HiggsfieldAPI_Node": {
+ "stars": 1,
+ "last_update": "2025-12-07 18:48:47",
+ "author_account_age_days": 1002
+ },
+ "https://github.com/LZpenguin/ComfyUI-Text": {
+ "stars": 23,
+ "last_update": "2024-06-20 13:38:16",
+ "author_account_age_days": 2573
+ },
+ "https://github.com/Laolilzp/Laoli3D": {
+ "stars": 22,
+ "last_update": "2026-02-02 03:18:30",
+ "author_account_age_days": 69
+ },
+ "https://github.com/LarryJane491/ComfyUI-ModelUnloader": {
+ "stars": 4,
+ "last_update": "2024-01-14 08:22:39",
+ "author_account_age_days": 758
+ },
+ "https://github.com/Leecoahs/ComfyUI_LeeNodes": {
+ "stars": 7,
+ "last_update": "2026-01-23 12:12:01",
+ "author_account_age_days": 1759
+ },
+ "https://github.com/Letz-AI/ComfyUI-LetzAI": {
+ "stars": 1,
+ "last_update": "2025-11-13 19:09:26",
+ "author_account_age_days": 932
+ },
+ "https://github.com/Lilien86/Comfyui_Latent_Interpolation": {
+ "stars": 2,
+ "last_update": "2024-09-03 21:00:49",
+ "author_account_age_days": 1088
+ },
+ "https://github.com/LittleTechPomp/comfyui-pixxio": {
+ "stars": 0,
+ "last_update": "2025-08-22 13:18:56",
+ "author_account_age_days": 199
+ },
+ "https://github.com/Long-form-AI-video-generation/ComfyUI_vaceFramepack": {
+ "stars": 0,
+ "last_update": "2025-11-24 12:55:46",
+ "author_account_age_days": 197
+ },
+ "https://github.com/Looking-Glass/LKG-ComfyUI": {
+ "stars": 5,
+ "last_update": "2024-10-30 17:02:54",
+ "author_account_age_days": 3579
+ },
+ "https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion": {
+ "stars": 0,
+ "last_update": "2025-02-27 15:07:36",
+ "author_account_age_days": 1524
+ },
+ "https://github.com/Lovzu/ComfyUI-Qwen": {
+ "stars": 0,
+ "last_update": "2025-08-09 05:59:53",
+ "author_account_age_days": 378
+ },
+ "https://github.com/LucianGnn/ComfyUI-Lucian": {
+ "stars": 0,
+ "last_update": "2025-06-18 06:47:37",
+ "author_account_age_days": 2473
+ },
+ "https://github.com/LucianoCirino/ComfyUI-invAIder-Nodes": {
+ "stars": 0,
+ "last_update": "2025-07-27 22:04:59",
+ "author_account_age_days": 1258
+ },
+ "https://github.com/LucipherDev/ComfyUI-Sentinel": {
+ "stars": 58,
+ "last_update": "2025-04-07 14:53:13",
+ "author_account_age_days": 2091
+ },
+ "https://github.com/LvyuanW/ComfyUI-6yuan": {
+ "stars": 0,
+ "last_update": "2025-12-01 09:20:19",
+ "author_account_age_days": 1919
+ },
+ "https://github.com/LyazS/ComfyUI-aznodes": {
+ "stars": 0,
+ "last_update": "2025-06-03 14:57:29",
+ "author_account_age_days": 3452
+ },
+ "https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes": {
+ "stars": 39,
+ "last_update": "2025-09-09 07:42:51",
+ "author_account_age_days": 973
+ },
+ "https://github.com/M4lF3s/comfy-tif-support": {
+ "stars": 0,
+ "last_update": "2025-02-12 09:29:11",
+ "author_account_age_days": 3818
+ },
+ "https://github.com/MadPonyInteractive/ComfyUi-MpiNodes": {
+ "stars": 1,
+ "last_update": "2026-02-08 08:03:37",
+ "author_account_age_days": 3105
+ },
+ "https://github.com/Madygnomo/ComfyUI-NanoBanana-ImageGenerator": {
+ "stars": 0,
+ "last_update": "2025-09-03 04:03:24",
+ "author_account_age_days": 1955
+ },
+ "https://github.com/Malloc-pix/comfyui-QwenVL": {
+ "stars": 0,
+ "last_update": "2025-06-24 09:35:32",
+ "author_account_age_days": 243
+ },
+ "https://github.com/ManuShamil/ComfyUI_BodyEstimation_Nodes": {
+ "stars": 0,
+ "last_update": "2025-02-28 19:23:24",
+ "author_account_age_days": 2747
+ },
+ "https://github.com/MarkFreeDom168/ComfyUI-image-load-url": {
+ "stars": 0,
+ "last_update": "2025-12-09 03:34:35",
+ "author_account_age_days": 1940
+ },
+ "https://github.com/Matrix-King-Studio/ComfyUI-MoviePy": {
+ "stars": 0,
+ "last_update": "2024-12-10 01:50:42",
+ "author_account_age_days": 2058
+ },
+ "https://github.com/MatthewClayHarrison/ComfyUI-MetaMan": {
+ "stars": 2,
+ "last_update": "2025-08-13 20:53:39",
+ "author_account_age_days": 920
+ },
+ "https://github.com/Maxim-Dey/ComfyUI-MaksiTools": {
+ "stars": 3,
+ "last_update": "2025-02-08 08:04:03",
+ "author_account_age_days": 1007
+ },
+ "https://github.com/Mervent/comfyui-telegram-send": {
+ "stars": 0,
+ "last_update": "2025-07-12 07:22:09",
+ "author_account_age_days": 3414
+ },
+ "https://github.com/Mervent/comfyui-yaml-prompt": {
+ "stars": 0,
+ "last_update": "2025-09-16 08:15:24",
+ "author_account_age_days": 3414
+ },
+ "https://github.com/Mets3D/mets-nodes": {
+ "stars": 0,
+ "last_update": "2026-02-04 22:17:11",
+ "author_account_age_days": 3736
+ },
+ "https://github.com/Mexes1978/film_prompt_styler": {
+ "stars": 16,
+ "last_update": "2026-01-29 14:12:05",
+ "author_account_age_days": 13
+ },
+ "https://github.com/MickeyJ/ComfyUI_mickster_nodes": {
+ "stars": 0,
+ "last_update": "2025-02-07 02:29:12",
+ "author_account_age_days": 3808
+ },
+ "https://github.com/MockbaTheBorg/ComfyUI-Mockba": {
+ "stars": 1,
+ "last_update": "2025-12-02 22:15:26",
+ "author_account_age_days": 3674
+ },
+ "https://github.com/Mohamed-Sakr/ComfyUI-SimpleMarkdown": {
+ "stars": 2,
+ "last_update": "2025-11-29 14:27:32",
+ "author_account_age_days": 4433
+ },
+ "https://github.com/MrAdamBlack/CheckProgress": {
+ "stars": 1,
+ "last_update": "2024-01-10 08:02:18",
+ "author_account_age_days": 3314
+ },
+ "https://github.com/MuAIGC/ComfyUI-DMXAPI_mmx": {
+ "stars": 6,
+ "last_update": "2026-01-26 12:01:26",
+ "author_account_age_days": 517
+ },
+ "https://github.com/MushroomFleet/ComfyUI-SCP-nodes": {
+ "stars": 0,
+ "last_update": "2025-11-09 05:25:05",
+ "author_account_age_days": 4316
+ },
+ "https://github.com/MushroomFleet/DJZ-Nodes": {
+ "stars": 71,
+ "last_update": "2025-12-17 21:19:43",
+ "author_account_age_days": 4316
+ },
+ "https://github.com/MythicalChu/ComfyUI-APG_ImYourCFGNow": {
+ "stars": 34,
+ "last_update": "2024-11-29 17:45:03",
+ "author_account_age_days": 2089
+ },
+ "https://github.com/N3uR0TiCV0iD/ComfyUI-ModelListTools": {
+ "stars": 0,
+ "last_update": "2026-01-26 01:45:44",
+ "author_account_age_days": 4285
+ },
+ "https://github.com/NEZHA625/ComfyUI-tools-by-dong": {
+ "stars": 2,
+ "last_update": "2026-01-21 20:58:40",
+ "author_account_age_days": 1053
+ },
+ "https://github.com/NSFW-API/ComfyUI-Embedding-Delta-Adapter": {
+ "stars": 3,
+ "last_update": "2025-08-24 04:51:03",
+ "author_account_age_days": 415
+ },
+ "https://github.com/NSFW-API/ComfyUI-WanSoftPrefix": {
+ "stars": 1,
+ "last_update": "2025-09-11 13:43:23",
+ "author_account_age_days": 415
+ },
+ "https://github.com/NakanoSanku/ComfyUI-Gemini": {
+ "stars": 4,
+ "last_update": "2026-01-08 05:50:41",
+ "author_account_age_days": 1513
+ },
+ "https://github.com/Nambi24/ComfyUI-Save_Image": {
+ "stars": 0,
+ "last_update": "2025-05-05 15:05:27",
+ "author_account_age_days": 1479
+ },
+ "https://github.com/NeoTech/comfyui-laserprep": {
+ "stars": 0,
+ "last_update": "2025-12-08 08:42:49",
+ "author_account_age_days": 5898
+ },
+ "https://github.com/NeuroWaifu/ComfyUI.Node.MediaSuite": {
+ "stars": 0,
+ "last_update": "2025-10-27 00:29:03",
+ "author_account_age_days": 133
+ },
+ "https://github.com/NicholasKao1029/comfyui-hook": {
+ "stars": 0,
+ "last_update": "2024-03-07 05:50:56",
+ "author_account_age_days": 2625
+ },
+ "https://github.com/Nienai666/comfyui-encrypt-image-main": {
+ "stars": 1,
+ "last_update": "2025-09-05 05:41:31",
+ "author_account_age_days": 255
+ },
+ "https://github.com/NimbleWing/ComfyUI-NW": {
+ "stars": 0,
+ "last_update": "2025-09-09 07:03:37",
+ "author_account_age_days": 1908
+ },
+ "https://github.com/No-22-Github/ComfyUI_SaveImageCustom": {
+ "stars": 0,
+ "last_update": "2025-06-26 06:33:38",
+ "author_account_age_days": 1014
+ },
+ "https://github.com/Norsnow/comfyui-image-ratio-preset": {
+ "stars": 1,
+ "last_update": "2026-01-25 09:03:11",
+ "author_account_age_days": 1594
+ },
+ "https://github.com/Northerner1/ComfyUI_North_Noise": {
+ "stars": 1,
+ "last_update": "2025-03-01 12:32:29",
+ "author_account_age_days": 1036
+ },
+ "https://github.com/Novavision0313/ComfyUI-NVVS": {
+ "stars": 1,
+ "last_update": "2025-08-19 09:14:19",
+ "author_account_age_days": 262
+ },
+ "https://github.com/OSAnimate/ComfyUI-SpriteSheetMaker": {
+ "stars": 5,
+ "last_update": "2025-03-12 04:22:34",
+ "author_account_age_days": 1041
+ },
+ "https://github.com/Oct7/ComfyUI-LaplaMask": {
+ "stars": 0,
+ "last_update": "2025-06-03 07:45:26",
+ "author_account_age_days": 2196
+ },
+ "https://github.com/OgreLemonSoup/ComfyUI-Notes-manager": {
+ "stars": 2,
+ "last_update": "2025-06-25 07:24:16",
+ "author_account_age_days": 547
+ },
+ "https://github.com/OhSeongHyeon/comfyui-random-image-size": {
+ "stars": 0,
+ "last_update": "2025-12-31 19:27:45",
+ "author_account_age_days": 1805
+ },
+ "https://github.com/Omario92/ComfyUI-OmarioNodes": {
+ "stars": 0,
+ "last_update": "2026-02-02 04:36:27",
+ "author_account_age_days": 4368
+ },
+ "https://github.com/Omega-L/comfyUI-prompts": {
+ "stars": 0,
+ "last_update": "2026-02-05 13:50:29",
+ "author_account_age_days": 2667
+ },
+ "https://github.com/OtwakO/ComfyUI-UsefulTools": {
+ "stars": 0,
+ "last_update": "2026-01-26 17:53:03",
+ "author_account_age_days": 1829
+ },
+ "https://github.com/PATATAJEC/ComfyUI-PatatajecNodes": {
+ "stars": 2,
+ "last_update": "2025-09-27 08:29:31",
+ "author_account_age_days": 2529
+ },
+ "https://github.com/Pablerdo/ComfyUI-Sa2VAWrapper": {
+ "stars": 6,
+ "last_update": "2025-03-27 22:58:39",
+ "author_account_age_days": 3395
+ },
+ "https://github.com/PabloGrant/comfyui-giraffe-test-panel": {
+ "stars": 0,
+ "last_update": "2025-05-18 16:38:09",
+ "author_account_age_days": 881
+ },
+ "https://github.com/PaleBloodq/ComfyUI-HFTransformers": {
+ "stars": 0,
+ "last_update": "2025-07-11 12:01:43",
+ "author_account_age_days": 1424
+ },
+ "https://github.com/PauldeLavallaz/comfyui_morpheus_NanoBanana_Mask": {
+ "stars": 0,
+ "last_update": "2025-10-21 15:03:35",
+ "author_account_age_days": 2438
+ },
+ "https://github.com/PeterMikhai/Doom_Flux_NodePack": {
+ "stars": 1,
+ "last_update": "2025-10-06 08:17:09",
+ "author_account_age_days": 827
+ },
+ "https://github.com/PladsElsker/comfyui-krita": {
+ "stars": 1,
+ "last_update": "2026-02-01 00:07:59",
+ "author_account_age_days": 2994
+ },
+ "https://github.com/Polygoningenieur/ComfyUI-Diffusion-SDXL-Video": {
+ "stars": 1,
+ "last_update": "2025-09-15 21:20:52",
+ "author_account_age_days": 709
+ },
+ "https://github.com/PopeyesBiscuit/ComfyUI-DeleteFolder": {
+ "stars": 0,
+ "last_update": "2025-12-22 18:33:26",
+ "author_account_age_days": 2482
+ },
+ "https://github.com/PopeyesBiscuit/ComfyUI-WebSocketLoRAExporter": {
+ "stars": 0,
+ "last_update": "2025-10-24 15:41:45",
+ "author_account_age_days": 2482
+ },
+ "https://github.com/Poseidon-fan/ComfyUI-fileCleaner": {
+ "stars": 1,
+ "last_update": "2024-11-19 02:42:29",
+ "author_account_age_days": 1176
+ },
+ "https://github.com/PozzettiAndrea/ComfyUI-CADabra": {
+ "stars": 18,
+ "last_update": "2026-01-23 16:37:05",
+ "author_account_age_days": 2287
+ },
+ "https://github.com/PozzettiAndrea/ComfyUI-Hunyuan3D-Part": {
+ "stars": 39,
+ "last_update": "2026-01-19 09:33:26",
+ "author_account_age_days": 2287
+ },
+ "https://github.com/PozzettiAndrea/ComfyUI-MVDUST3R": {
+ "stars": 1,
+ "last_update": "2026-01-19 09:33:30",
+ "author_account_age_days": 2287
+ },
+ "https://github.com/PozzettiAndrea/ComfyUI-MotionCapture": {
+ "stars": 160,
+ "last_update": "2026-02-08 23:49:15",
+ "author_account_age_days": 2287
+ },
+ "https://github.com/PozzettiAndrea/ComfyUI-SAM3DObjects": {
+ "stars": 162,
+ "last_update": "2026-02-05 23:48:20",
+ "author_account_age_days": 2287
+ },
+ "https://github.com/PozzettiAndrea/ComfyUI-TRELLIS2": {
+ "stars": 354,
+ "last_update": "2026-02-08 23:49:32",
+ "author_account_age_days": 2287
+ },
+ "https://github.com/PozzettiAndrea/ComfyUI-UniRig": {
+ "stars": 278,
+ "last_update": "2026-02-08 23:52:35",
+ "author_account_age_days": 2287
+ },
+ "https://github.com/ProjectAtlantis-dev/comfyui-atlantis-json": {
+ "stars": 0,
+ "last_update": "2026-01-13 20:58:32",
+ "author_account_age_days": 3693
+ },
+ "https://github.com/QingLuanWithoutHeart/comfyui-file-image-utils": {
+ "stars": 1,
+ "last_update": "2025-04-08 11:13:50",
+ "author_account_age_days": 2619
+ },
+ "https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": {
+ "stars": 14,
+ "last_update": "2025-06-09 08:58:42",
+ "author_account_age_days": 5869
+ },
+ "https://github.com/QuietNoise/ComfyUI-Queue-Manager": {
+ "stars": 43,
+ "last_update": "2025-12-21 18:20:17",
+ "author_account_age_days": 4800
+ },
+ "https://github.com/RLW-Chars/comfyui-promptbymood": {
+ "stars": 1,
+ "last_update": "2025-01-25 11:21:59",
+ "author_account_age_days": 379
+ },
+ "https://github.com/RM2-0/ComfyUI-Upscale": {
+ "stars": 0,
+ "last_update": "2025-10-15 07:37:36",
+ "author_account_age_days": 422
+ },
+ "https://github.com/RUFFY-369/ComfyUI-FeatureBank": {
+ "stars": 0,
+ "last_update": "2025-03-07 19:30:55",
+ "author_account_age_days": 2071
+ },
+ "https://github.com/RaeZhLiu/comfy_ark": {
+ "stars": 0,
+ "last_update": "2026-01-30 08:50:56",
+ "author_account_age_days": 3001
+ },
+ "https://github.com/Raidez/comfyui-kuniklo-collection": {
+ "stars": 0,
+ "last_update": "2025-05-02 19:44:45",
+ "author_account_age_days": 4268
+ },
+ "https://github.com/RamonGuthrie/ComfyUI-RBG-LoraConverter": {
+ "stars": 28,
+ "last_update": "2025-11-17 15:40:32",
+ "author_account_age_days": 755
+ },
+ "https://github.com/Randomwalkforest/Comfyui-Koi-Toolkit": {
+ "stars": 0,
+ "last_update": "2026-01-23 08:14:40",
+ "author_account_age_days": 583
+ },
+ "https://github.com/Rayen21/ComfyUI-PromptLinePlus": {
+ "stars": 0,
+ "last_update": "2025-12-06 16:48:49",
+ "author_account_age_days": 3539
+ },
+ "https://github.com/RicherdLee/comfyui-oss-image-save": {
+ "stars": 0,
+ "last_update": "2024-12-10 09:08:39",
+ "author_account_age_days": 4238
+ },
+ "https://github.com/RicoMeng/CartoonGenComfyui-PromtGenerator": {
+ "stars": 0,
+ "last_update": "2026-01-21 21:10:36",
+ "author_account_age_days": 18
+ },
+ "https://github.com/Rizzlord/ComfyUI-SeqTex": {
+ "stars": 9,
+ "last_update": "2025-12-30 03:18:21",
+ "author_account_age_days": 2024
+ },
+ "https://github.com/RobbertB80/ComfyUI-SharePoint-Upload": {
+ "stars": 0,
+ "last_update": "2025-08-24 15:54:01",
+ "author_account_age_days": 1605
+ },
+ "https://github.com/RobeSantoro/ComfyUI-RobeNodes": {
+ "stars": 0,
+ "last_update": "2026-02-02 20:42:04",
+ "author_account_age_days": 5211
+ },
+ "https://github.com/Rocky-Lee-001/ComfyUI_SZtools": {
+ "stars": 2,
+ "last_update": "2025-07-17 02:14:52",
+ "author_account_age_days": 1050
+ },
+ "https://github.com/RomanticQq/ComfyUI-Groudingdino-Sam": {
+ "stars": 0,
+ "last_update": "2025-11-21 08:56:50",
+ "author_account_age_days": 2509
+ },
+ "https://github.com/Rosegun007/ComfyUI-Pandora": {
+ "stars": 0,
+ "last_update": "2025-10-29 19:23:19",
+ "author_account_age_days": 1028
+ },
+ "https://github.com/RoyKillington/miscomfy-nodes": {
+ "stars": 0,
+ "last_update": "2025-03-06 19:36:33",
+ "author_account_age_days": 3000
+ },
+ "https://github.com/SKBv0/ComfyUI-RetroEngine": {
+ "stars": 11,
+ "last_update": "2025-05-10 14:29:43",
+ "author_account_age_days": 2150
+ },
+ "https://github.com/SSYCloud/comfyui-ssy-syncapi": {
+ "stars": 1,
+ "last_update": "2025-12-05 09:32:36",
+ "author_account_age_days": 324
+ },
+ "https://github.com/SXQBW/ComfyUI-Qwen3": {
+ "stars": 0,
+ "last_update": "2025-04-18 06:06:49",
+ "author_account_age_days": 3386
+ },
+ "https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt": {
+ "stars": 26,
+ "last_update": "2024-03-17 04:30:01",
+ "author_account_age_days": 4634
+ },
+ "https://github.com/Saganaki22/ComfyUI-NovaSR": {
+ "stars": 30,
+ "last_update": "2026-01-13 16:56:02",
+ "author_account_age_days": 1731
+ },
+ "https://github.com/Saganaki22/ComfyUI-ytdl_nodes": {
+ "stars": 29,
+ "last_update": "2025-09-06 18:55:00",
+ "author_account_age_days": 1731
+ },
+ "https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes": {
+ "stars": 2,
+ "last_update": "2024-02-22 08:34:44",
+ "author_account_age_days": 803
+ },
+ "https://github.com/Sakura-nee/ComfyUI_Save2Discord": {
+ "stars": 0,
+ "last_update": "2024-08-27 19:01:46",
+ "author_account_age_days": 1906
+ },
+ "https://github.com/SanDiegoDude/ComfyUI-HiDream-Sampler": {
+ "stars": 96,
+ "last_update": "2025-05-09 15:17:23",
+ "author_account_age_days": 1226
+ },
+ "https://github.com/Scaryplasmon/ComfTrellis": {
+ "stars": 7,
+ "last_update": "2025-02-18 11:34:33",
+ "author_account_age_days": 1620
+ },
+ "https://github.com/Scorpiosis0/ComfyUI-WtlNodes": {
+ "stars": 3,
+ "last_update": "2026-01-28 20:27:57",
+ "author_account_age_days": 1276
+ },
+ "https://github.com/Seb-Lis/comfyui-seed-selector": {
+ "stars": 0,
+ "last_update": "2025-11-02 09:36:24",
+ "author_account_age_days": 128
+ },
+ "https://github.com/SeedV/ComfyUI-SeedV-Nodes": {
+ "stars": 1,
+ "last_update": "2025-10-24 09:26:56",
+ "author_account_age_days": 1720
+ },
+ "https://github.com/Sephrael/comfyui_caption-around-image": {
+ "stars": 0,
+ "last_update": "2025-06-02 19:16:34",
+ "author_account_age_days": 1058
+ },
+ "https://github.com/Sergey004/ComfyUI-Telegram-Sender": {
+ "stars": 0,
+ "last_update": "2026-02-07 12:55:48",
+ "author_account_age_days": 3957
+ },
+ "https://github.com/SergeyKarleev/comfyui-textutils": {
+ "stars": 0,
+ "last_update": "2025-12-19 14:34:30",
+ "author_account_age_days": 4175
+ },
+ "https://github.com/ServiceStack/classifier-agent": {
+ "stars": 0,
+ "last_update": "2025-09-12 09:16:45",
+ "author_account_age_days": 5480
+ },
+ "https://github.com/ShahFaisalWani/ComfyUI-Mojen-Nodeset": {
+ "stars": 0,
+ "last_update": "2025-05-03 08:29:40",
+ "author_account_age_days": 1005
+ },
+ "https://github.com/ShammiG/ComfyUI_Text_Tools_SG": {
+ "stars": 3,
+ "last_update": "2025-12-05 05:46:41",
+ "author_account_age_days": 130
+ },
+ "https://github.com/Shinsplat/ComfyUI-Shinsplat": {
+ "stars": 47,
+ "last_update": "2025-03-15 00:02:11",
+ "author_account_age_days": 1619
+ },
+ "https://github.com/SilentLuxRay/ComfyUI-Furrey-Super-Prompt": {
+ "stars": 0,
+ "last_update": "2025-12-23 16:23:42",
+ "author_account_age_days": 4946
+ },
+ "https://github.com/SirVeggie/comfyui-sv-nodes": {
+ "stars": 5,
+ "last_update": "2025-10-19 09:44:27",
+ "author_account_age_days": 3055
+ },
+ "https://github.com/SlackinJack/multigpu_diffusion_comfyui": {
+ "stars": 0,
+ "last_update": "2026-02-08 17:08:31",
+ "author_account_age_days": 2770
+ },
+ "https://github.com/SleazySleaze/aesthetic-persona-comfyui-node": {
+ "stars": 0,
+ "last_update": "2025-11-30 04:12:05",
+ "author_account_age_days": 36
+ },
+ "https://github.com/Slix-M-Lestragg/comfyui-enhanced": {
+ "stars": 0,
+ "last_update": "2025-04-11 21:32:23",
+ "author_account_age_days": 1909
+ },
+ "https://github.com/Smyshnikof/ComfyUI-PresetDownloadManager": {
+ "stars": 31,
+ "last_update": "2025-11-26 11:23:59",
+ "author_account_age_days": 1683
+ },
+ "https://github.com/Solankimayursinh/PMSnodes": {
+ "stars": 0,
+ "last_update": "2025-04-26 07:47:15",
+ "author_account_age_days": 459
+ },
+ "https://github.com/Solarish/ComfyUI-MidnightLook": {
+ "stars": 0,
+ "last_update": "2025-11-10 13:13:54",
+ "author_account_age_days": 2840
+ },
+ "https://github.com/Soliton80/ComfyUI-Watermark-Detection-YOLO": {
+ "stars": 4,
+ "last_update": "2025-07-22 08:55:26",
+ "author_account_age_days": 1558
+ },
+ "https://github.com/Sophylax/ComfyUI-ReferenceMerge": {
+ "stars": 0,
+ "last_update": "2025-04-30 21:48:18",
+ "author_account_age_days": 4540
+ },
+ "https://github.com/Soppatorsk/comfyui_img_to_ascii": {
+ "stars": 0,
+ "last_update": "2024-09-07 15:39:28",
+ "author_account_age_days": 1734
+ },
+ "https://github.com/SpaceWarpStudio/ComfyUI_Remaker_FaceSwap": {
+ "stars": 0,
+ "last_update": "2024-07-15 11:57:20",
+ "author_account_age_days": 3550
+ },
+ "https://github.com/SparknightLLC/ComfyUI-GraphConstantFolder": {
+ "stars": 3,
+ "last_update": "2026-01-01 03:23:37",
+ "author_account_age_days": 547
+ },
+ "https://github.com/Spicely/ComfyUI-Luma": {
+ "stars": 0,
+ "last_update": "2026-01-20 02:17:01",
+ "author_account_age_days": 4084
+ },
+ "https://github.com/Stable-X/ComfyUI-Hi3DGen": {
+ "stars": 172,
+ "last_update": "2025-04-04 03:48:36",
+ "author_account_age_days": 617
+ },
+ "https://github.com/StableDiffusionVN/SDVN_Comfy_node": {
+ "stars": 91,
+ "last_update": "2026-02-07 04:49:39",
+ "author_account_age_days": 552
+ },
+ "https://github.com/StaffsGull/comfyui_scene_builder": {
+ "stars": 0,
+ "last_update": "2025-04-27 12:40:57",
+ "author_account_age_days": 3534
+ },
+ "https://github.com/StartHua/Comfyui_CSDMT_CXH": {
+ "stars": 21,
+ "last_update": "2024-07-11 15:36:03",
+ "author_account_age_days": 3430
+ },
+ "https://github.com/StartHua/Comfyui_CXH_CRM": {
+ "stars": 45,
+ "last_update": "2024-06-06 14:15:14",
+ "author_account_age_days": 3430
+ },
+ "https://github.com/StartHua/Comfyui_CXH_joy_caption": {
+ "stars": 619,
+ "last_update": "2025-02-06 02:35:10",
+ "author_account_age_days": 3430
+ },
+ "https://github.com/StartHua/Comfyui_Flux_Style_Ctr": {
+ "stars": 97,
+ "last_update": "2024-11-22 09:25:11",
+ "author_account_age_days": 3430
+ },
+ "https://github.com/StartHua/Comfyui_leffa": {
+ "stars": 241,
+ "last_update": "2024-12-18 03:04:54",
+ "author_account_age_days": 3430
+ },
+ "https://github.com/StevenBaby/comfyui-tools": {
+ "stars": 0,
+ "last_update": "2026-01-06 12:09:52",
+ "author_account_age_days": 3057
+ },
+ "https://github.com/StoryWalker/comfyui_flux_collection_advanced": {
+ "stars": 0,
+ "last_update": "2025-10-17 01:48:47",
+ "author_account_age_days": 405
+ },
+ "https://github.com/SushantSingh-23-01/comfyui_flowrider_nodes": {
+ "stars": 0,
+ "last_update": "2025-09-28 11:01:38",
+ "author_account_age_days": 814
+ },
+ "https://github.com/Suzu008/ComfyUI-ImageCritic": {
+ "stars": 0,
+ "last_update": "2025-12-16 12:53:16",
+ "author_account_age_days": 1557
+ },
+ "https://github.com/Suzu008/ComfyUI-TTYd": {
+ "stars": 0,
+ "last_update": "2025-09-24 07:15:53",
+ "author_account_age_days": 1557
+ },
+ "https://github.com/Symbiomatrix/Comfyui-Sort-Files": {
+ "stars": 1,
+ "last_update": "2025-04-22 22:24:00",
+ "author_account_age_days": 2769
+ },
+ "https://github.com/TSFSean/ComfyUI-TSFNodes": {
+ "stars": 6,
+ "last_update": "2024-05-18 00:59:06",
+ "author_account_age_days": 4067
+ },
+ "https://github.com/Taremin/comfyui-remove-print": {
+ "stars": 0,
+ "last_update": "2025-12-06 16:39:11",
+ "author_account_age_days": 2810
+ },
+ "https://github.com/Tawbaware/ComfyUI-Tawbaware": {
+ "stars": 1,
+ "last_update": "2025-04-20 22:23:11",
+ "author_account_age_days": 1866
+ },
+ "https://github.com/Temult/TWanSigmaSampler": {
+ "stars": 2,
+ "last_update": "2025-04-17 08:53:41",
+ "author_account_age_days": 861
+ },
+ "https://github.com/TharindaMarasingha/ComfyUI-CSV-to-Prompt": {
+ "stars": 5,
+ "last_update": "2025-12-03 06:53:59",
+ "author_account_age_days": 1074
+ },
+ "https://github.com/ThatGlennD/ComfyUI-Image-Analysis-Tools": {
+ "stars": 18,
+ "last_update": "2025-11-28 14:08:35",
+ "author_account_age_days": 3440
+ },
+ "https://github.com/TheJorseman/IntrinsicCompositingClean-ComfyUI": {
+ "stars": 0,
+ "last_update": "2025-05-07 17:07:51",
+ "author_account_age_days": 3877
+ },
+ "https://github.com/TheLocalLab/ComfyUI-Kandinsky-GGUF": {
+ "stars": 2,
+ "last_update": "2025-11-20 07:41:18",
+ "author_account_age_days": 901
+ },
+ "https://github.com/ThisModernDay/ComfyUI-InstructorOllama": {
+ "stars": 11,
+ "last_update": "2024-08-20 00:30:24",
+ "author_account_age_days": 4324
+ },
+ "https://github.com/ThuckMaBaws/TMB-Camera-Modifier": {
+ "stars": 1,
+ "last_update": "2025-10-08 12:30:14",
+ "author_account_age_days": 513
+ },
+ "https://github.com/TimothyCMeehan/comfyui-ck3-presets": {
+ "stars": 0,
+ "last_update": "2025-08-13 15:13:15",
+ "author_account_age_days": 3678
+ },
+ "https://github.com/TobiasGlaubach/ComfyUI-TG_PyCode": {
+ "stars": 0,
+ "last_update": "2025-12-22 10:25:14",
+ "author_account_age_days": 2984
+ },
+ "https://github.com/Toxic1228/Eleven-labs-comfyui-sts": {
+ "stars": 1,
+ "last_update": "2025-11-28 10:55:11",
+ "author_account_age_days": 72
+ },
+ "https://github.com/Tr1dae/ComfyUI-CustomNodes-MVM": {
+ "stars": 0,
+ "last_update": "2025-07-09 17:19:56",
+ "author_account_age_days": 1133
+ },
+ "https://github.com/Tr1dae/ComfyUI-MobileSAM": {
+ "stars": 0,
+ "last_update": "2026-01-27 01:43:50",
+ "author_account_age_days": 1133
+ },
+ "https://github.com/UltraNoob-NazoGiken/ComfyUI-TOML-Tools": {
+ "stars": 0,
+ "last_update": "2025-11-21 00:30:13",
+ "author_account_age_days": 81
+ },
+ "https://github.com/UmutGuzel/tryvariantai-comfyui": {
+ "stars": 1,
+ "last_update": "2025-07-15 12:05:03",
+ "author_account_age_days": 2365
+ },
+ "https://github.com/V-woodpecker-V/comfyui-stiffy-nodes": {
+ "stars": 1,
+ "last_update": "2025-04-12 22:36:51",
+ "author_account_age_days": 1851
+ },
+ "https://github.com/VectorASD/ComfyUI-VectorASD": {
+ "stars": 0,
+ "last_update": "2025-11-02 11:25:08",
+ "author_account_age_days": 2196
+ },
+ "https://github.com/Velour-Fog/comfy-latent-nodes": {
+ "stars": 16,
+ "last_update": "2025-02-24 00:34:41",
+ "author_account_age_days": 1555
+ },
+ "https://github.com/VictorLopes643/ComfyUI-Video-Dataset-Tools": {
+ "stars": 1,
+ "last_update": "2025-05-09 22:47:52",
+ "author_account_age_days": 2904
+ },
+ "https://github.com/Video3DGenResearch/comfyui-batch-input-node": {
+ "stars": 1,
+ "last_update": "2024-04-28 15:21:17",
+ "author_account_age_days": 701
+ },
+ "https://github.com/VisionExp/ve_custom_comfyui_nodes": {
+ "stars": 0,
+ "last_update": "2024-07-17 11:51:54",
+ "author_account_age_days": 599
+ },
+ "https://github.com/Vkabuto23/comfyui_openrouter_ollama": {
+ "stars": 1,
+ "last_update": "2025-07-16 09:03:47",
+ "author_account_age_days": 606
+ },
+ "https://github.com/Vollond/ComfyUI-LatentCutPlus": {
+ "stars": 0,
+ "last_update": "2026-02-02 03:35:22",
+ "author_account_age_days": 2991
+ },
+ "https://github.com/Vov1ch/ComfyUI_GLMImage": {
+ "stars": 0,
+ "last_update": "2026-01-17 22:31:42",
+ "author_account_age_days": 487
+ },
+ "https://github.com/Vsolon/ComfyUI-CBZ-Pack": {
+ "stars": 0,
+ "last_update": "2025-08-21 16:11:06",
+ "author_account_age_days": 3849
+ },
+ "https://github.com/WASasquatch/ASTERR": {
+ "stars": 30,
+ "last_update": "2024-10-27 01:48:56",
+ "author_account_age_days": 5220
+ },
+ "https://github.com/WSJUSA/Comfyui-StableSR": {
+ "stars": 54,
+ "last_update": "2023-10-18 12:40:30",
+ "author_account_age_days": 2019
+ },
+ "https://github.com/WaiyanLing/ComfyUI-Tracking": {
+ "stars": 1,
+ "last_update": "2025-04-18 04:36:33",
+ "author_account_age_days": 4716
+ },
+ "https://github.com/WenerSantos3/ComfyUI-BlueeUtils": {
+ "stars": 0,
+ "last_update": "2025-10-30 20:46:21",
+ "author_account_age_days": 583
+ },
+ "https://github.com/WilliamStanford/ComfyUI-VisualLabs": {
+ "stars": 1,
+ "last_update": "2024-04-16 21:53:02",
+ "author_account_age_days": 2364
+ },
+ "https://github.com/WozStudios/ComfyUI-WozNodes": {
+ "stars": 0,
+ "last_update": "2025-06-25 14:29:29",
+ "author_account_age_days": 4703
+ },
+ "https://github.com/XiaoHeiziGGG/ComfyUI-Gemini-Kontext": {
+ "stars": 9,
+ "last_update": "2025-07-02 21:15:07",
+ "author_account_age_days": 648
+ },
+ "https://github.com/XiaoHeiziGGG/ComfyUI-GeminiTranslator": {
+ "stars": 0,
+ "last_update": "2025-06-30 05:43:17",
+ "author_account_age_days": 648
+ },
+ "https://github.com/Yeonri/ComfyUI_LLM_Are_You_Listening": {
+ "stars": 0,
+ "last_update": "2025-02-21 00:35:03",
+ "author_account_age_days": 1131
+ },
+ "https://github.com/YokoYokoTEC/comfyui-batch-sequence": {
+ "stars": 0,
+ "last_update": "2025-10-06 08:53:03",
+ "author_account_age_days": 1852
+ },
+ "https://github.com/YokoYokoTEC/comfyui-sequential-prompt-file": {
+ "stars": 0,
+ "last_update": "2025-09-28 01:37:36",
+ "author_account_age_days": 1852
+ },
+ "https://github.com/Yuan-ManX/ComfyUI-Step1X-Edit": {
+ "stars": 11,
+ "last_update": "2025-04-29 07:36:52",
+ "author_account_age_days": 2034
+ },
+ "https://github.com/Yukinoshita-Yukinoe/ComfyUI-KontextOfficialNode": {
+ "stars": 2,
+ "last_update": "2025-06-06 09:23:19",
+ "author_account_age_days": 2001
+ },
+ "https://github.com/Yukinoshita-Yukinoe/ComfyUI-SenseVoice": {
+ "stars": 1,
+ "last_update": "2025-12-22 06:34:48",
+ "author_account_age_days": 2001
+ },
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AuraSR-ZHO": {
+ "stars": 96,
+ "last_update": "2024-07-11 07:33:30",
+ "author_account_age_days": 934
+ },
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO": {
+ "stars": 389,
+ "last_update": "2024-07-30 23:24:24",
+ "author_account_age_days": 934
+ },
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini": {
+ "stars": 782,
+ "last_update": "2024-05-22 14:15:11",
+ "author_account_age_days": 934
+ },
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Llama-3-2": {
+ "stars": 19,
+ "last_update": "2024-09-26 18:08:01",
+ "author_account_age_days": 934
+ },
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO": {
+ "stars": 237,
+ "last_update": "2024-05-22 13:38:23",
+ "author_account_age_days": 934
+ },
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen": {
+ "stars": 112,
+ "last_update": "2024-09-20 21:27:47",
+ "author_account_age_days": 934
+ },
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Wan-ZHO": {
+ "stars": 11,
+ "last_update": "2025-02-26 05:46:42",
+ "author_account_age_days": 934
+ },
+ "https://github.com/ZenAI-Vietnam/ComfyUI-gemini-IG": {
+ "stars": 1,
+ "last_update": "2025-03-26 14:49:13",
+ "author_account_age_days": 777
+ },
+ "https://github.com/ZenAI-Vietnam/ComfyUI_InfiniteYou": {
+ "stars": 251,
+ "last_update": "2025-03-31 07:56:02",
+ "author_account_age_days": 777
+ },
+ "https://github.com/a-One-Fan/ComfyUI-Blenderesque-Nodes": {
+ "stars": 6,
+ "last_update": "2025-12-22 17:13:19",
+ "author_account_age_days": 1449
+ },
+ "https://github.com/a-und-b/ComfyUI_Output_as_Input": {
+ "stars": 2,
+ "last_update": "2025-05-08 08:35:02",
+ "author_account_age_days": 1034
+ },
+ "https://github.com/aa-parky/pipemind-comfyui": {
+ "stars": 0,
+ "last_update": "2025-12-11 11:06:48",
+ "author_account_age_days": 2438
+ },
+ "https://github.com/abuzreq/ComfyUI-Model-Bending": {
+ "stars": 15,
+ "last_update": "2025-10-15 21:50:54",
+ "author_account_age_days": 4450
+ },
+ "https://github.com/adamdavidcole/comfyui-video-xy-plot": {
+ "stars": 1,
+ "last_update": "2025-10-05 11:06:56",
+ "author_account_age_days": 4500
+ },
+ "https://github.com/addddd2/AI_Generated_nodes": {
+ "stars": 5,
+ "last_update": "2025-10-18 18:25:19",
+ "author_account_age_days": 900
+ },
+ "https://github.com/adigayung/comfyui_PlutoNode": {
+ "stars": 0,
+ "last_update": "2025-09-20 06:55:42",
+ "author_account_age_days": 808
+ },
+ "https://github.com/adithis197/ComfyUI-Caption_to_audio": {
+ "stars": 1,
+ "last_update": "2025-08-01 23:03:40",
+ "author_account_age_days": 2468
+ },
+ "https://github.com/adithis197/ComfyUI-multimodal-CaptionToVideoGen": {
+ "stars": 1,
+ "last_update": "2025-08-01 23:08:31",
+ "author_account_age_days": 2468
+ },
+ "https://github.com/aesethtics/ComfyUI-OpenPoser": {
+ "stars": 1,
+ "last_update": "2025-08-27 17:50:40",
+ "author_account_age_days": 3441
+ },
+ "https://github.com/agavesunset/ComfyUI_LoRA_Tracker": {
+ "stars": 0,
+ "last_update": "2025-12-18 03:24:48",
+ "author_account_age_days": 340
+ },
+ "https://github.com/agavesunset/Comfyui_SiliconFlow_AgaveSunset": {
+ "stars": 0,
+ "last_update": "2025-12-19 07:00:08",
+ "author_account_age_days": 340
+ },
+ "https://github.com/ahkimkoo/ComfyUI-OSS-Upload": {
+ "stars": 0,
+ "last_update": "2026-01-31 11:58:36",
+ "author_account_age_days": 5832
+ },
+ "https://github.com/ahmedbana/File-Rename": {
+ "stars": 0,
+ "last_update": "2025-07-25 10:48:49",
+ "author_account_age_days": 3527
+ },
+ "https://github.com/ahmedbana/json-creator": {
+ "stars": 0,
+ "last_update": "2025-07-29 10:59:12",
+ "author_account_age_days": 3527
+ },
+ "https://github.com/ahmedbana/upload-to-azure": {
+ "stars": 0,
+ "last_update": "2025-07-29 10:58:26",
+ "author_account_age_days": 3527
+ },
+ "https://github.com/ai-joe-git/ComfyUI-Chatterbox": {
+ "stars": 0,
+ "last_update": "2026-01-14 00:04:21",
+ "author_account_age_days": 1655
+ },
+ "https://github.com/aiden1020/ComfyUI_Artcoder": {
+ "stars": 2,
+ "last_update": "2025-01-11 08:31:32",
+ "author_account_age_days": 1064
+ },
+ "https://github.com/ainanoha/etm_comfyui_nodes": {
+ "stars": 0,
+ "last_update": "2024-10-31 05:45:59",
+ "author_account_age_days": 4848
+ },
+ "https://github.com/ajcampbell1333/BudgetGuard_Artists": {
+ "stars": 0,
+ "last_update": "2025-11-08 08:55:08",
+ "author_account_age_days": 4997
+ },
+ "https://github.com/akashch1512/ComfyUI_UguuUploader": {
+ "stars": 0,
+ "last_update": "2026-02-04 17:36:58",
+ "author_account_age_days": 946
+ },
+ "https://github.com/akatz-ai/ComfyUI-Execution-Inversion": {
+ "stars": 19,
+ "last_update": "2025-12-23 09:00:14",
+ "author_account_age_days": 630
+ },
+ "https://github.com/aklevecz/ComfyUI-AutoPrompt": {
+ "stars": 0,
+ "last_update": "2025-05-26 18:36:34",
+ "author_account_age_days": 2867
+ },
+ "https://github.com/alchemist-novaro/ComfyUI-Affine-Transform": {
+ "stars": 4,
+ "last_update": "2025-10-05 22:43:14",
+ "author_account_age_days": 554
+ },
+ "https://github.com/alchemist-novaro/ComfyUI-Simple-Image-Tools": {
+ "stars": 0,
+ "last_update": "2025-10-05 22:47:10",
+ "author_account_age_days": 554
+ },
+ "https://github.com/alexgenovese/ComfyUI-Diffusion-4k": {
+ "stars": 6,
+ "last_update": "2025-05-22 20:48:23",
+ "author_account_age_days": 5609
+ },
+ "https://github.com/alexgenovese/ComfyUI-Reica": {
+ "stars": 0,
+ "last_update": "2025-07-17 08:21:13",
+ "author_account_age_days": 5609
+ },
+ "https://github.com/alexisrolland/ComfyUI-AuraSR": {
+ "stars": 28,
+ "last_update": "2025-09-02 15:57:17",
+ "author_account_age_days": 3880
+ },
+ "https://github.com/alisson-anjos/ComfyUI-Workarounds": {
+ "stars": 15,
+ "last_update": "2026-01-01 02:58:15",
+ "author_account_age_days": 1195
+ },
+ "https://github.com/alistairallan/ComfyUI-skin-retouch": {
+ "stars": 0,
+ "last_update": "2025-08-02 15:45:04",
+ "author_account_age_days": 5119
+ },
+ "https://github.com/alt-key-project/comfyui-dream-painter": {
+ "stars": 2,
+ "last_update": "2025-02-23 10:19:26",
+ "author_account_age_days": 1255
+ },
+ "https://github.com/ammahmoudi/ComfyUI-Legendary-Nodes": {
+ "stars": 0,
+ "last_update": "2025-09-12 08:44:10",
+ "author_account_age_days": 1536
+ },
+ "https://github.com/anilstream/ComfyUI-NanoBananaPro": {
+ "stars": 0,
+ "last_update": "2026-01-13 06:20:30",
+ "author_account_age_days": 601
+ },
+ "https://github.com/animEEEmpire/ComfyUI-Animemory-Loader": {
+ "stars": 3,
+ "last_update": "2025-01-20 08:02:58",
+ "author_account_age_days": 440
+ },
+ "https://github.com/apeirography/ModelCopyNode": {
+ "stars": 0,
+ "last_update": "2025-08-20 02:39:14",
+ "author_account_age_days": 2335
+ },
+ "https://github.com/apetitbois/nova_utils": {
+ "stars": 0,
+ "last_update": "2025-04-02 20:01:49",
+ "author_account_age_days": 3692
+ },
+ "https://github.com/aria1th/ComfyUI-CairoSVG": {
+ "stars": 0,
+ "last_update": "2025-01-07 19:40:19",
+ "author_account_age_days": 2939
+ },
+ "https://github.com/aria1th/ComfyUI-SkipCFGSigmas": {
+ "stars": 3,
+ "last_update": "2025-03-05 07:50:45",
+ "author_account_age_days": 2939
+ },
+ "https://github.com/aria1th/ComfyUI-camietagger-onnx": {
+ "stars": 0,
+ "last_update": "2025-03-06 01:55:51",
+ "author_account_age_days": 2939
+ },
+ "https://github.com/artem-konevskikh/comfyui-split-merge-video": {
+ "stars": 2,
+ "last_update": "2024-11-19 00:11:17",
+ "author_account_age_days": 4966
+ },
+ "https://github.com/artifyfun/ComfyUI-JS": {
+ "stars": 2,
+ "last_update": "2025-07-02 10:45:12",
+ "author_account_age_days": 685
+ },
+ "https://github.com/artisanalcomputing/ComfyUI-Custom-Nodes": {
+ "stars": 0,
+ "last_update": "2024-10-13 05:55:33",
+ "author_account_age_days": 2870
+ },
+ "https://github.com/asaddi/allans-comfy-nodes": {
+ "stars": 2,
+ "last_update": "2025-09-24 20:51:32",
+ "author_account_age_days": 4129
+ },
+ "https://github.com/ashishsaini/comfyui-segment-clothing-sleeves": {
+ "stars": 2,
+ "last_update": "2024-09-23 19:09:15",
+ "author_account_age_days": 4543
+ },
+ "https://github.com/ashllay/ComfyUI_MoreComfy": {
+ "stars": 0,
+ "last_update": "2025-08-11 13:46:34",
+ "author_account_age_days": 4564
+ },
+ "https://github.com/avocadori/ComfyUI-AudioAmplitudeConverter": {
+ "stars": 0,
+ "last_update": "2025-05-29 07:57:22",
+ "author_account_age_days": 668
+ },
+ "https://github.com/ayaoayaoayaoaya/ComfyUI-KLUT-DeepSeek-API": {
+ "stars": 0,
+ "last_update": "2025-03-27 15:38:59",
+ "author_account_age_days": 614
+ },
+ "https://github.com/babydjac/comfyui-grok-ponyxl": {
+ "stars": 0,
+ "last_update": "2025-07-18 19:10:49",
+ "author_account_age_days": 1000
+ },
+ "https://github.com/backearth1/Comfyui-MiniMax-Video": {
+ "stars": 19,
+ "last_update": "2025-03-12 15:26:35",
+ "author_account_age_days": 847
+ },
+ "https://github.com/badmike/comfyui-prompt-factory": {
+ "stars": 2,
+ "last_update": "2025-02-18 09:28:53",
+ "author_account_age_days": 5274
+ },
+ "https://github.com/bakker/BK_Utils": {
+ "stars": 0,
+ "last_update": "2025-12-07 19:28:19",
+ "author_account_age_days": 5957
+ },
+ "https://github.com/bananasss00/Comfyui-PyExec": {
+ "stars": 3,
+ "last_update": "2025-02-26 12:01:18",
+ "author_account_age_days": 3128
+ },
+ "https://github.com/bandido37/comfyui-kaggle-local-save": {
+ "stars": 0,
+ "last_update": "2025-04-23 16:20:30",
+ "author_account_age_days": 2337
+ },
+ "https://github.com/banini1841/BigModelPipe": {
+ "stars": 0,
+ "last_update": "2025-10-14 18:15:14",
+ "author_account_age_days": 1925
+ },
+ "https://github.com/baoanhng/ComfyUI-utils": {
+ "stars": 0,
+ "last_update": "2026-01-16 18:40:53",
+ "author_account_age_days": 4899
+ },
+ "https://github.com/barakapa/barakapa-nodes": {
+ "stars": 0,
+ "last_update": "2025-05-13 20:47:52",
+ "author_account_age_days": 274
+ },
+ "https://github.com/basenc/Comfyui-EnvVarNode": {
+ "stars": 0,
+ "last_update": "2025-10-18 12:50:39",
+ "author_account_age_days": 3249
+ },
+ "https://github.com/basenc/Comfyui-Nodes-basenc": {
+ "stars": 0,
+ "last_update": "2026-01-10 02:07:08",
+ "author_account_age_days": 3249
+ },
+ "https://github.com/benda1989/WaterMarkRemover_ComfyUI": {
+ "stars": 1,
+ "last_update": "2025-05-01 22:31:19",
+ "author_account_age_days": 2708
+ },
+ "https://github.com/benmizrahi/ComfyGCS": {
+ "stars": 1,
+ "last_update": "2025-05-05 15:18:40",
+ "author_account_age_days": 3836
+ },
+ "https://github.com/beyastard/ComfyUI_BeySoft": {
+ "stars": 0,
+ "last_update": "2024-05-26 22:44:55",
+ "author_account_age_days": 4881
+ },
+ "https://github.com/bhaveek424/ComfyUI-HMNodes": {
+ "stars": 0,
+ "last_update": "2025-12-16 18:38:07",
+ "author_account_age_days": 2163
+ },
+ "https://github.com/bheins/ComfyUI-glb-to-stl": {
+ "stars": 0,
+ "last_update": "2025-05-31 17:41:31",
+ "author_account_age_days": 4258
+ },
+ "https://github.com/bikiam/ComfyUi_WhisperGTranslate": {
+ "stars": 0,
+ "last_update": "2025-07-01 19:41:11",
+ "author_account_age_days": 744
+ },
+ "https://github.com/bikiam/Comfyui_AudioRecoder": {
+ "stars": 0,
+ "last_update": "2025-07-08 05:35:33",
+ "author_account_age_days": 744
+ },
+ "https://github.com/binarystatic/ComfyUI-BinarystaticMasterSeed": {
+ "stars": 0,
+ "last_update": "2025-12-11 15:13:17",
+ "author_account_age_days": 4987
+ },
+ "https://github.com/birnam/ComfyUI-GenData-Pack": {
+ "stars": 0,
+ "last_update": "2024-03-25 01:25:23",
+ "author_account_age_days": 5604
+ },
+ "https://github.com/bleash-dev/ComfyUI-Auth-Manager": {
+ "stars": 0,
+ "last_update": "2025-08-10 13:13:23",
+ "author_account_age_days": 1658
+ },
+ "https://github.com/bleash-dev/Comfyui-FileSytem-Manager": {
+ "stars": 0,
+ "last_update": "2025-08-10 17:27:02",
+ "author_account_age_days": 1658
+ },
+ "https://github.com/bleash-dev/Comfyui-Idle-Checker": {
+ "stars": 0,
+ "last_update": "2025-08-07 21:04:58",
+ "author_account_age_days": 1658
+ },
+ "https://github.com/blepping/comfyui_dum_samplers": {
+ "stars": 5,
+ "last_update": "2025-08-11 12:09:57",
+ "author_account_age_days": 748
+ },
+ "https://github.com/blib-la/ComfyUI-Captain-Extensions": {
+ "stars": 0,
+ "last_update": "2024-05-17 23:27:25",
+ "author_account_age_days": 868
+ },
+ "https://github.com/blueraincoatli/ComfyUI-Model-Cleaner": {
+ "stars": 3,
+ "last_update": "2025-12-18 04:19:16",
+ "author_account_age_days": 907
+ },
+ "https://github.com/blurymind/cozy-fireplace": {
+ "stars": 4,
+ "last_update": "2024-11-08 19:42:20",
+ "author_account_age_days": 4398
+ },
+ "https://github.com/bmad4ever/comfyui_bmad_nodes": {
+ "stars": 69,
+ "last_update": "2025-11-25 21:29:34",
+ "author_account_age_days": 4131
+ },
+ "https://github.com/bmgjet/comfyui-powerlimit": {
+ "stars": 0,
+ "last_update": "2025-08-30 03:13:17",
+ "author_account_age_days": 2466
+ },
+ "https://github.com/boricuapab/ComfyUI-Bori-KontextPresets": {
+ "stars": 7,
+ "last_update": "2025-07-21 05:49:40",
+ "author_account_age_days": 2164
+ },
+ "https://github.com/borisfaley/ComfyUI-ACES-EXR-OCIO": {
+ "stars": 4,
+ "last_update": "2025-08-24 05:31:47",
+ "author_account_age_days": 4229
+ },
+ "https://github.com/bozkut/ComfyUI-Prompt-Expander": {
+ "stars": 6,
+ "last_update": "2026-01-12 16:56:43",
+ "author_account_age_days": 4357
+ },
+ "https://github.com/brace-great/comfyui-eim": {
+ "stars": 0,
+ "last_update": "2025-05-14 06:09:18",
+ "author_account_age_days": 1683
+ },
+ "https://github.com/brace-great/comfyui-mc": {
+ "stars": 0,
+ "last_update": "2026-01-20 09:53:35",
+ "author_account_age_days": 1683
+ },
+ "https://github.com/brandonkish/comfyUI-extractable-text": {
+ "stars": 0,
+ "last_update": "2026-02-08 13:30:57",
+ "author_account_age_days": 4340
+ },
+ "https://github.com/broumbroum/comfyui-time-system": {
+ "stars": 0,
+ "last_update": "2025-10-16 18:00:30",
+ "author_account_age_days": 1363
+ },
+ "https://github.com/bruce007lee/comfyui-cleaner": {
+ "stars": 3,
+ "last_update": "2024-04-20 15:36:03",
+ "author_account_age_days": 5107
+ },
+ "https://github.com/bruce007lee/comfyui-tiny-utils": {
+ "stars": 1,
+ "last_update": "2024-08-31 13:34:57",
+ "author_account_age_days": 5107
+ },
+ "https://github.com/bryanlholland1/comfyui-app-bridge": {
+ "stars": 0,
+ "last_update": "2026-01-01 20:55:33",
+ "author_account_age_days": 786
+ },
+ "https://github.com/brycegoh/comfyui-custom-nodes": {
+ "stars": 0,
+ "last_update": "2024-06-05 09:30:06",
+ "author_account_age_days": 3703
+ },
+ "https://github.com/bulldog68/ComfyUI_FMJ": {
+ "stars": 4,
+ "last_update": "2025-11-18 13:57:19",
+ "author_account_age_days": 698
+ },
+ "https://github.com/c1660181647-hash/ComfyUI-MM-Visual-Encryption": {
+ "stars": 1,
+ "last_update": "2025-12-16 14:14:05",
+ "author_account_age_days": 146
+ },
+ "https://github.com/casterpollux/ComfyUI-USO": {
+ "stars": 6,
+ "last_update": "2025-09-01 16:08:39",
+ "author_account_age_days": 268
+ },
+ "https://github.com/catboxanon/ComfyUI-Pixelsmith": {
+ "stars": 4,
+ "last_update": "2025-01-22 03:02:05",
+ "author_account_age_days": 1126
+ },
+ "https://github.com/cedarconnor/ComfyUI-DAP": {
+ "stars": 0,
+ "last_update": "2025-12-22 04:08:49",
+ "author_account_age_days": 4890
+ },
+ "https://github.com/cedarconnor/ComfyUI-HunyuanWorld-Mirror": {
+ "stars": 29,
+ "last_update": "2025-11-21 06:21:42",
+ "author_account_age_days": 4890
+ },
+ "https://github.com/cedarconnor/ComfyUI_MotionTransfer": {
+ "stars": 5,
+ "last_update": "2025-11-30 04:39:49",
+ "author_account_age_days": 4890
+ },
+ "https://github.com/celll1/cel_sampler": {
+ "stars": 1,
+ "last_update": "2024-11-20 13:04:54",
+ "author_account_age_days": 824
+ },
+ "https://github.com/cesilk10/cesilk-comfyui-nodes": {
+ "stars": 0,
+ "last_update": "2025-08-13 11:30:35",
+ "author_account_age_days": 278
+ },
+ "https://github.com/cgf120/comfyui-flowx-preprocess": {
+ "stars": 0,
+ "last_update": "2025-10-15 13:51:55",
+ "author_account_age_days": 3503
+ },
+ "https://github.com/chaojie/ComfyUI-mobvoi-openapi": {
+ "stars": 2,
+ "last_update": "2024-05-29 09:02:52",
+ "author_account_age_days": 5428
+ },
+ "https://github.com/charlie-otoy/ComfyUI-otoySKW-SystemMetrics": {
+ "stars": 0,
+ "last_update": "2025-09-25 21:27:15",
+ "author_account_age_days": 3628
+ },
+ "https://github.com/charlierz/comfyui-charlierz": {
+ "stars": 0,
+ "last_update": "2025-12-08 21:25:57",
+ "author_account_age_days": 3671
+ },
+ "https://github.com/chengzeyi/Comfy-WaveSpeed": {
+ "stars": 1211,
+ "last_update": "2025-08-02 14:24:30",
+ "author_account_age_days": 3371
+ },
+ "https://github.com/chenpipi0807/ComfyUI-InstantCharacterFlux": {
+ "stars": 2,
+ "last_update": "2025-08-18 13:04:22",
+ "author_account_age_days": 881
+ },
+ "https://github.com/ches2010/comfyui_aliyundrive_uploader": {
+ "stars": 1,
+ "last_update": "2025-09-16 03:10:47",
+ "author_account_age_days": 2764
+ },
+ "https://github.com/chetusangolgi/Comfyui-supabase": {
+ "stars": 0,
+ "last_update": "2025-12-18 13:19:35",
+ "author_account_age_days": 987
+ },
+ "https://github.com/chrisdreid/ComfyUI_EnvAutopsyAPI": {
+ "stars": 4,
+ "last_update": "2024-08-29 03:54:28",
+ "author_account_age_days": 3713
+ },
+ "https://github.com/christian-byrne/infinite-zoom-parallax-nodes": {
+ "stars": 5,
+ "last_update": "2024-07-08 15:07:05",
+ "author_account_age_days": 1943
+ },
+ "https://github.com/christian-byrne/python-interpreter-node": {
+ "stars": 72,
+ "last_update": "2025-04-02 02:06:27",
+ "author_account_age_days": 1943
+ },
+ "https://github.com/chuge26/ComfyUI_seal_migration": {
+ "stars": 0,
+ "last_update": "2025-04-21 07:23:45",
+ "author_account_age_days": 2960
+ },
+ "https://github.com/cidiro/cid-node-pack": {
+ "stars": 0,
+ "last_update": "2025-03-23 23:26:00",
+ "author_account_age_days": 2224
+ },
+ "https://github.com/ciga2011/ComfyUI-AppGen": {
+ "stars": 2,
+ "last_update": "2025-01-02 17:00:32",
+ "author_account_age_days": 4793
+ },
+ "https://github.com/clcimir/FileTo64": {
+ "stars": 0,
+ "last_update": "2025-08-23 21:26:35",
+ "author_account_age_days": 1765
+ },
+ "https://github.com/clubmate/comfyui-boll-nodes": {
+ "stars": 0,
+ "last_update": "2025-10-02 23:27:02",
+ "author_account_age_days": 2523
+ },
+ "https://github.com/colorAi/comfyui-prompt-manager": {
+ "stars": 9,
+ "last_update": "2026-01-02 07:56:28",
+ "author_account_age_days": 1009
+ },
+ "https://github.com/comfyanonymous/ComfyUI": {
+ "stars": 102787,
+ "last_update": "2026-02-09 02:16:45",
+ "author_account_age_days": 670
+ },
+ "https://github.com/comfyanonymous/ComfyUI_bitsandbytes_NF4": {
+ "stars": 422,
+ "last_update": "2024-08-16 18:06:10",
+ "author_account_age_days": 1143
+ },
+ "https://github.com/comfygit-ai/comfygit-manager": {
+ "stars": 4,
+ "last_update": "2026-02-06 09:31:30",
+ "author_account_age_days": 397
+ },
+ "https://github.com/comfypod/ComfyUI-Comflow": {
+ "stars": 0,
+ "last_update": "2024-06-17 08:44:08",
+ "author_account_age_days": 617
+ },
+ "https://github.com/comfyscript/ComfyUI-CloudClient": {
+ "stars": 0,
+ "last_update": "2025-09-11 13:41:35",
+ "author_account_age_days": 168
+ },
+ "https://github.com/comfyui-wiki/ComfyUI-SelectionFocus": {
+ "stars": 12,
+ "last_update": "2025-10-13 11:18:23",
+ "author_account_age_days": 413
+ },
+ "https://github.com/comfyuiblog/deepseek_prompt_generator_comfyui": {
+ "stars": 2,
+ "last_update": "2025-01-28 21:28:11",
+ "author_account_age_days": 485
+ },
+ "https://github.com/content-and-code/ComfyUI-SimpleCSVParse": {
+ "stars": 0,
+ "last_update": "2025-10-21 18:26:41",
+ "author_account_age_days": 5454
+ },
+ "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions": {
+ "stars": 7,
+ "last_update": "2024-06-12 17:45:21",
+ "author_account_age_days": 2410
+ },
+ "https://github.com/cosmicbuffalo/comfyui-mobile-frontend": {
+ "stars": 10,
+ "last_update": "2026-02-08 23:53:45",
+ "author_account_age_days": 3310
+ },
+ "https://github.com/crimro-se/ComfyUI-CascadedGaze": {
+ "stars": 1,
+ "last_update": "2025-08-04 23:03:24",
+ "author_account_age_days": 472
+ },
+ "https://github.com/ctf05/ComfyUI-AudioDuration": {
+ "stars": 0,
+ "last_update": "2025-08-13 02:20:17",
+ "author_account_age_days": 2396
+ },
+ "https://github.com/cubiq/Comfy_Dungeon": {
+ "stars": 270,
+ "last_update": "2024-04-26 11:00:58",
+ "author_account_age_days": 5605
+ },
+ "https://github.com/danieljanata/ComfyUI-phone_compression_ultimate": {
+ "stars": 0,
+ "last_update": "2026-01-21 15:55:47",
+ "author_account_age_days": 390
+ },
+ "https://github.com/daracazamea/comfyUI-DCNodes": {
+ "stars": 0,
+ "last_update": "2025-04-03 14:38:27",
+ "author_account_age_days": 2553
+ },
+ "https://github.com/dcduanchao/comfyui_video_http": {
+ "stars": 0,
+ "last_update": "2025-09-22 01:25:36",
+ "author_account_age_days": 2948
+ },
+ "https://github.com/dead-matrix/ComfyUI-RMBG-Custom": {
+ "stars": 0,
+ "last_update": "2025-08-28 23:20:59",
+ "author_account_age_days": 2071
+ },
+ "https://github.com/denislov/Comfyui_AutoSurvey": {
+ "stars": 1,
+ "last_update": "2024-08-03 06:50:57",
+ "author_account_age_days": 2582
+ },
+ "https://github.com/devzeroLL/comfyui-lxj-Node": {
+ "stars": 0,
+ "last_update": "2025-12-23 07:24:30",
+ "author_account_age_days": 3340
+ },
+ "https://github.com/dexintenebri/comfyui_voxel_nodes": {
+ "stars": 1,
+ "last_update": "2025-08-01 08:33:48",
+ "author_account_age_days": 1207
+ },
+ "https://github.com/dfl/comfyui-stylegan": {
+ "stars": 0,
+ "last_update": "2024-12-29 18:35:27",
+ "author_account_age_days": 6569
+ },
+ "https://github.com/dhpdong/ComfyUI-IPAdapter-Flux-Repair": {
+ "stars": 4,
+ "last_update": "2025-05-23 08:51:34",
+ "author_account_age_days": 2504
+ },
+ "https://github.com/dibowei1980/Comfyui-QwenEditUtilsFromRapid": {
+ "stars": 0,
+ "last_update": "2025-11-01 10:54:28",
+ "author_account_age_days": 2469
+ },
+ "https://github.com/dihan/comfyui-random-kps": {
+ "stars": 4,
+ "last_update": "2025-01-01 22:48:11",
+ "author_account_age_days": 4891
+ },
+ "https://github.com/diodiogod/Comfy-Inpainting-Works": {
+ "stars": 70,
+ "last_update": "2025-11-04 13:54:57",
+ "author_account_age_days": 722
+ },
+ "https://github.com/dmitry-guskov/ComfyUI_light_image_ops": {
+ "stars": 0,
+ "last_update": "2025-09-15 12:09:41",
+ "author_account_age_days": 2484
+ },
+ "https://github.com/doc-packages/comfyui-doc-utils": {
+ "stars": 0,
+ "last_update": "2025-10-07 20:06:25",
+ "author_account_age_days": 1074
+ },
+ "https://github.com/dogcomplex/ComfyUI-LOKI": {
+ "stars": 1,
+ "last_update": "2025-09-04 20:07:00",
+ "author_account_age_days": 4661
+ },
+ "https://github.com/doucx/ComfyUI_WcpD_Utility_Kit": {
+ "stars": 1,
+ "last_update": "2024-01-06 19:07:45",
+ "author_account_age_days": 2917
+ },
+ "https://github.com/dougbtv/comfyui-vllm-omni": {
+ "stars": 2,
+ "last_update": "2026-01-05 21:22:49",
+ "author_account_age_days": 4528
+ },
+ "https://github.com/dowands/ComfyUI-AddMaskForICLora": {
+ "stars": 1,
+ "last_update": "2024-11-26 09:40:06",
+ "author_account_age_days": 3133
+ },
+ "https://github.com/downlifted/ComfyUI_BWiZ_Nodes": {
+ "stars": 1,
+ "last_update": "2024-12-27 17:03:52",
+ "author_account_age_days": 2841
+ },
+ "https://github.com/downlifted/ComfyUI_GroqPrompt": {
+ "stars": 0,
+ "last_update": "2025-10-04 12:07:17",
+ "author_account_age_days": 2841
+ },
+ "https://github.com/duckmartians/Duck_Nodes": {
+ "stars": 2,
+ "last_update": "2025-08-21 02:24:03",
+ "author_account_age_days": 641
+ },
+ "https://github.com/eddiehavila/comfyui-nachoman": {
+ "stars": 0,
+ "last_update": "2025-11-25 02:01:52",
+ "author_account_age_days": 983
+ },
+ "https://github.com/eddyhhlure1Eddy/ComfyUI-QwenImageWrapper": {
+ "stars": 12,
+ "last_update": "2025-11-17 10:18:57",
+ "author_account_age_days": 342
+ },
+ "https://github.com/edisonchan/ComfyUI-Sysinfo": {
+ "stars": 3,
+ "last_update": "2025-11-27 07:40:45",
+ "author_account_age_days": 4180
+ },
+ "https://github.com/edvardtoth/ComfyUI-ETNodes": {
+ "stars": 2,
+ "last_update": "2025-12-27 03:52:35",
+ "author_account_age_days": 5210
+ },
+ "https://github.com/eggsbenedicto/DiffusionRenderer-ComfyUI": {
+ "stars": 3,
+ "last_update": "2025-09-30 01:58:51",
+ "author_account_age_days": 443
+ },
+ "https://github.com/egormly/ComfyUI-EG_Tools": {
+ "stars": 0,
+ "last_update": "2025-11-19 14:39:40",
+ "author_account_age_days": 1182
+ },
+ "https://github.com/eigenpunk/ComfyUI-audio": {
+ "stars": 99,
+ "last_update": "2025-08-10 18:30:01",
+ "author_account_age_days": 1520
+ },
+ "https://github.com/ejektaflex/ComfyUI-Ty": {
+ "stars": 0,
+ "last_update": "2024-06-12 16:08:16",
+ "author_account_age_days": 3366
+ },
+ "https://github.com/elfatherbrown/comfyui-realcugan-node": {
+ "stars": 0,
+ "last_update": "2025-08-29 05:32:29",
+ "author_account_age_days": 4117
+ },
+ "https://github.com/emranemran/ComfyUI-FasterLivePortrait": {
+ "stars": 0,
+ "last_update": "2024-12-18 20:03:19",
+ "author_account_age_days": 4779
+ },
+ "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition": {
+ "stars": 2,
+ "last_update": "2024-07-03 09:35:02",
+ "author_account_age_days": 3068
+ },
+ "https://github.com/endman100/ComfyUI-augmentation": {
+ "stars": 0,
+ "last_update": "2024-07-23 09:06:24",
+ "author_account_age_days": 3068
+ },
+ "https://github.com/endman100/ComfyUI_tensor_script": {
+ "stars": 0,
+ "last_update": "2026-02-06 12:22:58",
+ "author_account_age_days": 3068
+ },
+ "https://github.com/enlo/ComfyUI-CheckpointSettings": {
+ "stars": 0,
+ "last_update": "2025-07-20 04:27:46",
+ "author_account_age_days": 4064
+ },
+ "https://github.com/ericbeyer/guidance_interval": {
+ "stars": 2,
+ "last_update": "2024-04-16 03:24:01",
+ "author_account_age_days": 3189
+ },
+ "https://github.com/erosDiffusion/ComfyUI-enricos-json-file-load-and-value-selector": {
+ "stars": 2,
+ "last_update": "2025-06-04 16:32:17",
+ "author_account_age_days": 591
+ },
+ "https://github.com/ervinne13/ComfyUI-Metadata-Hub": {
+ "stars": 0,
+ "last_update": "2025-09-07 03:59:13",
+ "author_account_age_days": 4464
+ },
+ "https://github.com/ethanfel/ComfyUI-Mamad8-QwenEdit-fix": {
+ "stars": 7,
+ "last_update": "2025-10-08 11:00:47",
+ "author_account_age_days": 3192
+ },
+ "https://github.com/etng/ComfyUI-Heartbeat": {
+ "stars": 2,
+ "last_update": "2025-06-03 09:32:40",
+ "author_account_age_days": 1658
+ },
+ "https://github.com/exectails/comfyui-et_scripting": {
+ "stars": 3,
+ "last_update": "2024-11-29 17:23:07",
+ "author_account_age_days": 4512
+ },
+ "https://github.com/eyekayem/comfyui_runway_gen3": {
+ "stars": 0,
+ "last_update": "2025-01-27 06:59:45",
+ "author_account_age_days": 1207
+ },
+ "https://github.com/fangg2000/ComfyUI-SenseVoice": {
+ "stars": 0,
+ "last_update": "2025-05-06 06:42:52",
+ "author_account_age_days": 1022
+ },
+ "https://github.com/fangg2000/ComfyUI-StableAudioFG": {
+ "stars": 1,
+ "last_update": "2025-06-15 11:49:34",
+ "author_account_age_days": 1022
+ },
+ "https://github.com/fangg2000/comfyui_fgtools": {
+ "stars": 0,
+ "last_update": "2026-01-02 12:12:32",
+ "author_account_age_days": 1022
+ },
+ "https://github.com/fangziheng2321/comfyuinode_chopmask": {
+ "stars": 0,
+ "last_update": "2025-02-17 03:16:50",
+ "author_account_age_days": 1766
+ },
+ "https://github.com/fantaskiss/ComfyUI-Qwen3_VQA_enhanced": {
+ "stars": 18,
+ "last_update": "2026-01-27 22:42:18",
+ "author_account_age_days": 1105
+ },
+ "https://github.com/filipemeneses/ComfyUI_html": {
+ "stars": 2,
+ "last_update": "2025-06-10 10:53:55",
+ "author_account_age_days": 4071
+ },
+ "https://github.com/filliptm/ComfyUI_Fill-Node-Loader": {
+ "stars": 6,
+ "last_update": "2025-06-25 01:25:38",
+ "author_account_age_days": 2331
+ },
+ "https://github.com/flowtyone/comfyui-flowty-lcm": {
+ "stars": 63,
+ "last_update": "2023-10-23 12:08:55",
+ "author_account_age_days": 868
+ },
+ "https://github.com/flyingdogsoftware/gyre_for_comfyui": {
+ "stars": 1,
+ "last_update": "2024-11-18 22:35:37",
+ "author_account_age_days": 2607
+ },
+ "https://github.com/flywhale-666/ComfyUI_pixel_snapping": {
+ "stars": 39,
+ "last_update": "2026-01-24 14:31:02",
+ "author_account_age_days": 969
+ },
+ "https://github.com/foglerek/comfyui-cem-tools": {
+ "stars": 1,
+ "last_update": "2024-01-13 23:22:07",
+ "author_account_age_days": 4633
+ },
+ "https://github.com/fogyisland/Comfy_Show_StringText": {
+ "stars": 2,
+ "last_update": "2026-01-18 10:00:49",
+ "author_account_age_days": 1919
+ },
+ "https://github.com/franklydegenerate/ComfyUI-WAN-Resolution-Helper": {
+ "stars": 0,
+ "last_update": "2025-10-18 19:25:33",
+ "author_account_age_days": 790
+ },
+ "https://github.com/franky519/comfyui-redux-style": {
+ "stars": 0,
+ "last_update": "2025-02-13 10:04:45",
+ "author_account_age_days": 871
+ },
+ "https://github.com/franky519/comfyui_fnckc_Face_analysis": {
+ "stars": 0,
+ "last_update": "2025-06-16 02:09:00",
+ "author_account_age_days": 871
+ },
+ "https://github.com/fritzprix/ComfyUI-LLM-Utils": {
+ "stars": 1,
+ "last_update": "2025-01-04 23:25:38",
+ "author_account_age_days": 5322
+ },
+ "https://github.com/frost-byte/fbTools": {
+ "stars": 0,
+ "last_update": "2026-02-07 05:10:25",
+ "author_account_age_days": 5352
+ },
+ "https://github.com/ftechmax/ComfyUI-NovaKit-Pack": {
+ "stars": 0,
+ "last_update": "2025-04-26 13:27:06",
+ "author_account_age_days": 3172
+ },
+ "https://github.com/ftf001-tech/ComfyUI-ExternalLLMDetector": {
+ "stars": 2,
+ "last_update": "2025-06-22 03:43:09",
+ "author_account_age_days": 2290
+ },
+ "https://github.com/fuselayer/comfyui-libcom-image-composition": {
+ "stars": 0,
+ "last_update": "2025-11-11 20:15:21",
+ "author_account_age_days": 872
+ },
+ "https://github.com/fylrid2/comfyui_lock_previous_value": {
+ "stars": 0,
+ "last_update": "2025-06-30 22:05:07",
+ "author_account_age_days": 607
+ },
+ "https://github.com/gabe-init/ComfyUI-LM-Studio": {
+ "stars": 7,
+ "last_update": "2025-05-26 22:10:36",
+ "author_account_age_days": 259
+ },
+ "https://github.com/gabe-init/ComfyUI-Repo-Eater": {
+ "stars": 0,
+ "last_update": "2025-05-27 01:09:24",
+ "author_account_age_days": 259
+ },
+ "https://github.com/gabe-init/comfyui_ui_render": {
+ "stars": 3,
+ "last_update": "2025-05-27 00:27:32",
+ "author_account_age_days": 259
+ },
+ "https://github.com/gagaprince/ComfyUI_gaga_utils": {
+ "stars": 0,
+ "last_update": "2025-05-12 09:54:34",
+ "author_account_age_days": 4455
+ },
+ "https://github.com/gajjar4/ComfyUI-Qwen-Image-i2L": {
+ "stars": 64,
+ "last_update": "2025-12-12 10:56:27",
+ "author_account_age_days": 2146
+ },
+ "https://github.com/galoreware/ComfyUI-GaloreNodes": {
+ "stars": 0,
+ "last_update": "2024-10-24 05:47:23",
+ "author_account_age_days": 2020
+ },
+ "https://github.com/gameltb/ComfyUI_paper_playground": {
+ "stars": 10,
+ "last_update": "2025-05-14 16:18:43",
+ "author_account_age_days": 4649
+ },
+ "https://github.com/gameltb/ComfyUI_stable_fast": {
+ "stars": 208,
+ "last_update": "2024-08-04 09:25:33",
+ "author_account_age_days": 4649
+ },
+ "https://github.com/gameltb/io_comfyui": {
+ "stars": 6,
+ "last_update": "2025-02-04 15:14:01",
+ "author_account_age_days": 4649
+ },
+ "https://github.com/gamtruliar/ComfyUI-N_SwapInput": {
+ "stars": 0,
+ "last_update": "2025-05-08 19:08:30",
+ "author_account_age_days": 4719
+ },
+ "https://github.com/gaonprime-labs/ComfyUI_Nordy": {
+ "stars": 0,
+ "last_update": "2025-10-30 09:53:32",
+ "author_account_age_days": 775
+ },
+ "https://github.com/gaonprime-labs/nordy-custom-node-ComfyUI-NormalOverlapBandBlend": {
+ "stars": 0,
+ "last_update": "2026-01-26 04:24:57",
+ "author_account_age_days": 775
+ },
+ "https://github.com/gaowei-space/ComfyUI-Doubao-LLM": {
+ "stars": 5,
+ "last_update": "2025-09-15 10:35:06",
+ "author_account_age_days": 4072
+ },
+ "https://github.com/garciaone/g_one_toolkit": {
+ "stars": 1,
+ "last_update": "2025-10-20 22:46:14",
+ "author_account_age_days": 2721
+ },
+ "https://github.com/gilons/ComfyUI-GoogleDrive-Downloader": {
+ "stars": 0,
+ "last_update": "2025-06-13 20:43:59",
+ "author_account_age_days": 3142
+ },
+ "https://github.com/gioferreira/ComfyUI-Molde-Utils": {
+ "stars": 0,
+ "last_update": "2025-02-27 20:53:33",
+ "author_account_age_days": 3555
+ },
+ "https://github.com/githubYiheng/comfyui_median_filter": {
+ "stars": 0,
+ "last_update": "2024-07-03 11:38:39",
+ "author_account_age_days": 4497
+ },
+ "https://github.com/gitmylo/FlowNodes": {
+ "stars": 12,
+ "last_update": "2025-04-03 08:17:47",
+ "author_account_age_days": 2902
+ },
+ "https://github.com/glamorfleet0i/ComfyUI-Firewall": {
+ "stars": 0,
+ "last_update": "2024-12-30 02:14:57",
+ "author_account_age_days": 412
+ },
+ "https://github.com/gmammolo/comfyui-gmammolo": {
+ "stars": 0,
+ "last_update": "2025-10-18 12:25:29",
+ "author_account_age_days": 4188
+ },
+ "https://github.com/go-package-lab/ComfyUI-Tools-Video-Combine": {
+ "stars": 2,
+ "last_update": "2024-09-24 03:54:00",
+ "author_account_age_days": 1978
+ },
+ "https://github.com/godric8/ComfyUI_Step1X-Edit": {
+ "stars": 0,
+ "last_update": "2025-06-02 12:14:14",
+ "author_account_age_days": 2038
+ },
+ "https://github.com/gold24park/loki-comfyui-node": {
+ "stars": 0,
+ "last_update": "2025-02-07 01:55:07",
+ "author_account_age_days": 3885
+ },
+ "https://github.com/gordon123/ComfyUI_DreamBoard": {
+ "stars": 2,
+ "last_update": "2025-05-18 09:53:50",
+ "author_account_age_days": 5689
+ },
+ "https://github.com/gordon123/ComfyUI_srt2speech": {
+ "stars": 4,
+ "last_update": "2025-04-27 13:00:13",
+ "author_account_age_days": 5689
+ },
+ "https://github.com/gorillaframeai/GF_pixtral_node": {
+ "stars": 0,
+ "last_update": "2025-07-27 13:00:23",
+ "author_account_age_days": 828
+ },
+ "https://github.com/grimli333/ComfyUI_Grim": {
+ "stars": 0,
+ "last_update": "2024-12-01 18:10:07",
+ "author_account_age_days": 5359
+ },
+ "https://github.com/grinlau18/ComfyUI_XISER_Nodes": {
+ "stars": 28,
+ "last_update": "2026-01-31 01:28:39",
+ "author_account_age_days": 898
+ },
+ "https://github.com/grokuku/ComfyUI-Holaf": {
+ "stars": 3,
+ "last_update": "2026-01-07 15:12:52",
+ "author_account_age_days": 3051
+ },
+ "https://github.com/grokuku/ComfyUI-Holaf-Utilities": {
+ "stars": 5,
+ "last_update": "2026-01-06 17:04:34",
+ "author_account_age_days": 3051
+ },
+ "https://github.com/gulajawalegit/ComfyUI-Telegram-Sender": {
+ "stars": 0,
+ "last_update": "2026-01-04 16:56:38",
+ "author_account_age_days": 9
+ },
+ "https://github.com/haodman/ComfyUI_Rain": {
+ "stars": 1,
+ "last_update": "2024-09-01 10:41:20",
+ "author_account_age_days": 2734
+ },
+ "https://github.com/haofanwang/ComfyUI-InstantStyle": {
+ "stars": 8,
+ "last_update": "2024-05-23 16:11:13",
+ "author_account_age_days": 3572
+ },
+ "https://github.com/haomole/Comfyui-SadTalker": {
+ "stars": 22,
+ "last_update": "2025-10-16 11:25:05",
+ "author_account_age_days": 895
+ },
+ "https://github.com/harishcmgit/comfyui_sp": {
+ "stars": 0,
+ "last_update": "2026-01-31 11:28:50",
+ "author_account_age_days": 361
+ },
+ "https://github.com/hashms0a/ComfyUI-Qwen-Multi-Angle-Camera-Nodes": {
+ "stars": 6,
+ "last_update": "2026-01-09 08:28:44",
+ "author_account_age_days": 2559
+ },
+ "https://github.com/hay86/ComfyUI_AceNodes": {
+ "stars": 97,
+ "last_update": "2025-05-01 03:08:58",
+ "author_account_age_days": 5261
+ },
+ "https://github.com/hayden-fr/ComfyUI-Image-Browsing": {
+ "stars": 19,
+ "last_update": "2025-08-12 08:12:34",
+ "author_account_age_days": 2532
+ },
+ "https://github.com/hben35096/ComfyUI-ToolBox": {
+ "stars": 6,
+ "last_update": "2024-09-02 14:49:43",
+ "author_account_age_days": 942
+ },
+ "https://github.com/hdfhssg/ComfyUI_pxtool": {
+ "stars": 7,
+ "last_update": "2025-03-02 06:23:44",
+ "author_account_age_days": 1838
+ },
+ "https://github.com/hdfhssg/comfyui_EvoSearch": {
+ "stars": 6,
+ "last_update": "2025-06-15 11:05:48",
+ "author_account_age_days": 1838
+ },
+ "https://github.com/henjicc/ComfyUI-CC-ImageLoader": {
+ "stars": 1,
+ "last_update": "2025-10-17 16:38:49",
+ "author_account_age_days": 1720
+ },
+ "https://github.com/heyburns/ComfyUI-Logic-Redux": {
+ "stars": 1,
+ "last_update": "2025-12-02 04:43:34",
+ "author_account_age_days": 2818
+ },
+ "https://github.com/hgh086/Comfyui-HghImage": {
+ "stars": 1,
+ "last_update": "2025-12-23 06:57:46",
+ "author_account_age_days": 3994
+ },
+ "https://github.com/hhelloe/ComfyuiQuantizerToFp8": {
+ "stars": 0,
+ "last_update": "2025-11-11 12:52:05",
+ "author_account_age_days": 769
+ },
+ "https://github.com/hhelloe/comfyuiWeightOnlyQuant": {
+ "stars": 0,
+ "last_update": "2025-11-14 01:38:51",
+ "author_account_age_days": 769
+ },
+ "https://github.com/hiusdev/ComfyUI_Lah_Toffee": {
+ "stars": 0,
+ "last_update": "2025-02-14 12:40:14",
+ "author_account_age_days": 1938
+ },
+ "https://github.com/hndrr/Comfyui-SceneDetect": {
+ "stars": 2,
+ "last_update": "2025-11-26 06:56:56",
+ "author_account_age_days": 2395
+ },
+ "https://github.com/hnmr293/ComfyUI-SamOne": {
+ "stars": 0,
+ "last_update": "2025-04-16 08:07:42",
+ "author_account_age_days": 1149
+ },
+ "https://github.com/horidream/ComfyUI-Horidream": {
+ "stars": 0,
+ "last_update": "2024-09-08 08:57:57",
+ "author_account_age_days": 5638
+ },
+ "https://github.com/hotpizzatactics/ComfyUI-WaterMark-Detector": {
+ "stars": 0,
+ "last_update": "2024-07-23 14:36:35",
+ "author_account_age_days": 571
+ },
+ "https://github.com/hotpot-killer/ComfyUI_AlexNodes": {
+ "stars": 0,
+ "last_update": "2024-12-06 09:09:03",
+ "author_account_age_days": 2820
+ },
+ "https://github.com/houdinii/comfy-magick": {
+ "stars": 5,
+ "last_update": "2024-03-11 06:40:54",
+ "author_account_age_days": 4114
+ },
+ "https://github.com/huhu-tiger/ComfyUI-RemoteDownload": {
+ "stars": 0,
+ "last_update": "2025-11-27 10:11:09",
+ "author_account_age_days": 1862
+ },
+ "https://github.com/huhu-tiger/ComfyUI-RemoteResource": {
+ "stars": 0,
+ "last_update": "2025-11-27 10:11:09",
+ "author_account_age_days": 1862
+ },
+ "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": {
+ "stars": 2,
+ "last_update": "2024-02-27 08:22:49",
+ "author_account_age_days": 3049
+ },
+ "https://github.com/hujuying/ComfyUI-QwenVL3-image-Plus": {
+ "stars": 0,
+ "last_update": "2025-11-04 14:40:14",
+ "author_account_age_days": 1371
+ },
+ "https://github.com/hujuying/comfyui_gemini_banana_api": {
+ "stars": 0,
+ "last_update": "2025-09-09 14:19:12",
+ "author_account_age_days": 1371
+ },
+ "https://github.com/hulipanpan/Comfyui_tuteng": {
+ "stars": 0,
+ "last_update": "2025-07-14 08:33:39",
+ "author_account_age_days": 999
+ },
+ "https://github.com/hunterssl/ComfyUI_SSLNodes": {
+ "stars": 0,
+ "last_update": "2025-01-20 07:23:52",
+ "author_account_age_days": 3430
+ },
+ "https://github.com/hunzmusic/ComfyUI-Hunyuan3DTools": {
+ "stars": 4,
+ "last_update": "2025-06-19 18:11:36",
+ "author_account_age_days": 323
+ },
+ "https://github.com/hunzmusic/Comfyui-CraftsMan3DWrapper": {
+ "stars": 15,
+ "last_update": "2025-05-09 10:46:59",
+ "author_account_age_days": 323
+ },
+ "https://github.com/hunzmusic/comfyui-hnznodes": {
+ "stars": 1,
+ "last_update": "2025-03-24 21:53:50",
+ "author_account_age_days": 323
+ },
+ "https://github.com/husw725/comfyui_alta_nodes": {
+ "stars": 0,
+ "last_update": "2026-01-28 03:16:03",
+ "author_account_age_days": 4764
+ },
+ "https://github.com/hy134300/comfyui-hb-node": {
+ "stars": 0,
+ "last_update": "2024-04-09 09:56:22",
+ "author_account_age_days": 2355
+ },
+ "https://github.com/hy134300/comfyui-hydit": {
+ "stars": 9,
+ "last_update": "2024-06-07 09:52:15",
+ "author_account_age_days": 2355
+ },
+ "https://github.com/hylarucoder/comfyui-copilot": {
+ "stars": 27,
+ "last_update": "2024-06-28 04:43:18",
+ "author_account_age_days": 4508
+ },
+ "https://github.com/idoru/ComfyUI-SKCFI-NetworkFileIO": {
+ "stars": 0,
+ "last_update": "2025-08-15 03:07:11",
+ "author_account_age_days": 5788
+ },
+ "https://github.com/if-ai/ComfyUI-IF_Zonos": {
+ "stars": 1,
+ "last_update": "2025-02-18 01:28:04",
+ "author_account_age_days": 3457
+ },
+ "https://github.com/ifilipis/ComfyUI-Auto-Prompt-Engineer": {
+ "stars": 0,
+ "last_update": "2026-01-02 22:17:05",
+ "author_account_age_days": 2784
+ },
+ "https://github.com/ilovejohnwhite/Tracer": {
+ "stars": 0,
+ "last_update": "2024-11-26 03:39:33",
+ "author_account_age_days": 1468
+ },
+ "https://github.com/ilslli/Comfyui-IV2Z": {
+ "stars": 0,
+ "last_update": "2025-11-18 02:20:44",
+ "author_account_age_days": 948
+ },
+ "https://github.com/immersiveexperience/ie-comfyui-color-nodes": {
+ "stars": 2,
+ "last_update": "2024-06-18 10:54:55",
+ "author_account_age_days": 863
+ },
+ "https://github.com/io-club/ComfyUI-LuminaNext": {
+ "stars": 0,
+ "last_update": "2024-09-23 12:02:22",
+ "author_account_age_days": 1233
+ },
+ "https://github.com/isurulkh/ComfyUI-Lovis-Node": {
+ "stars": 0,
+ "last_update": "2025-10-07 20:15:00",
+ "author_account_age_days": 1301
+ },
+ "https://github.com/j-pyxal/ComfyUI-Lattice-Manim": {
+ "stars": 1,
+ "last_update": "2026-01-05 01:09:40",
+ "author_account_age_days": 38
+ },
+ "https://github.com/jKaarlehto/ComfyUI-GetWorkflowName": {
+ "stars": 1,
+ "last_update": "2025-11-28 18:17:32",
+ "author_account_age_days": 2188
+ },
+ "https://github.com/jax-explorer/ComfyUI-DreamO": {
+ "stars": 66,
+ "last_update": "2025-05-22 08:07:02",
+ "author_account_age_days": 1171
+ },
+ "https://github.com/jceme/Comfy_Extensions": {
+ "stars": 0,
+ "last_update": "2026-01-09 23:38:56",
+ "author_account_age_days": 4875
+ },
+ "https://github.com/jchiotaka/ComfyUI-ClarityAI-Upscaler": {
+ "stars": 0,
+ "last_update": "2025-12-22 08:59:53",
+ "author_account_age_days": 5210
+ },
+ "https://github.com/jcomeme/ComfyUI-AsunaroTools": {
+ "stars": 2,
+ "last_update": "2025-03-21 03:57:39",
+ "author_account_age_days": 5444
+ },
+ "https://github.com/jerryname2022/ComfyUI-MegaTTS3": {
+ "stars": 1,
+ "last_update": "2025-09-03 02:07:31",
+ "author_account_age_days": 3874
+ },
+ "https://github.com/jerryname2022/ComfyUI-Real-ESRGAN": {
+ "stars": 0,
+ "last_update": "2025-08-30 11:27:03",
+ "author_account_age_days": 3874
+ },
+ "https://github.com/jgbrblmd/ComfyUI-ComfyFluxSize": {
+ "stars": 0,
+ "last_update": "2024-08-30 06:42:39",
+ "author_account_age_days": 1050
+ },
+ "https://github.com/jgbyte/ComfyUI-RandomCube": {
+ "stars": 0,
+ "last_update": "2025-07-25 23:32:58",
+ "author_account_age_days": 550
+ },
+ "https://github.com/jiafuzeng/comfyui-fishSpeech": {
+ "stars": 0,
+ "last_update": "2025-07-23 08:29:43",
+ "author_account_age_days": 2807
+ },
+ "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node": {
+ "stars": 230,
+ "last_update": "2024-07-04 11:44:03",
+ "author_account_age_days": 615
+ },
+ "https://github.com/jimstudt/ComfyUI-Jims-Nodes": {
+ "stars": 0,
+ "last_update": "2025-01-21 17:36:29",
+ "author_account_age_days": 5542
+ },
+ "https://github.com/jinchanz/ComfyUI-AliCloud-Bailian": {
+ "stars": 1,
+ "last_update": "2025-12-30 09:19:14",
+ "author_account_age_days": 2660
+ },
+ "https://github.com/jinchanz/ComfyUI-Midjourney": {
+ "stars": 1,
+ "last_update": "2025-12-30 09:18:49",
+ "author_account_age_days": 2660
+ },
+ "https://github.com/jluo-github/comfyui-easy-resize": {
+ "stars": 0,
+ "last_update": "2026-01-12 09:12:01",
+ "author_account_age_days": 1866
+ },
+ "https://github.com/jn-jairo/jn_node_suite_comfyui": {
+ "stars": 6,
+ "last_update": "2024-06-08 05:15:33",
+ "author_account_age_days": 4579
+ },
+ "https://github.com/joe002/comfyui-rtx-remix": {
+ "stars": 0,
+ "last_update": "2026-01-14 19:10:11",
+ "author_account_age_days": 4456
+ },
+ "https://github.com/jonathan-bryant/ComfyUI-ImageStraightener": {
+ "stars": 0,
+ "last_update": "2025-08-02 15:46:45",
+ "author_account_age_days": 3663
+ },
+ "https://github.com/jonstreeter/comfyui-archive-output": {
+ "stars": 7,
+ "last_update": "2026-01-30 21:42:39",
+ "author_account_age_days": 1197
+ },
+ "https://github.com/jordancoult/ComfyUI_HelpfulNodes": {
+ "stars": 0,
+ "last_update": "2025-05-17 01:04:37",
+ "author_account_age_days": 3020
+ },
+ "https://github.com/jorin91/ComfyUI-JSG-Utils": {
+ "stars": 0,
+ "last_update": "2025-12-28 23:57:56",
+ "author_account_age_days": 1235
+ },
+ "https://github.com/jpwgad/jpwgad-comfy": {
+ "stars": 0,
+ "last_update": "2025-10-15 13:21:14",
+ "author_account_age_days": 4729
+ },
+ "https://github.com/jschoormans/Comfy-InterestingPixels": {
+ "stars": 1,
+ "last_update": "2025-02-05 08:34:17",
+ "author_account_age_days": 4134
+ },
+ "https://github.com/jtrue/ComfyUI-MaskTools": {
+ "stars": 0,
+ "last_update": "2025-08-24 14:39:23",
+ "author_account_age_days": 4524
+ },
+ "https://github.com/jtscmw01/ComfyUI-DiffBIR": {
+ "stars": 309,
+ "last_update": "2024-05-21 05:28:34",
+ "author_account_age_days": 1096
+ },
+ "https://github.com/jtydhr88/ComfyUI-PolotnoCanvasEditor": {
+ "stars": 56,
+ "last_update": "2025-12-22 02:27:06",
+ "author_account_age_days": 5347
+ },
+ "https://github.com/jtydhr88/ComfyUI-StableStudio": {
+ "stars": 22,
+ "last_update": "2025-08-15 00:06:43",
+ "author_account_age_days": 5347
+ },
+ "https://github.com/jtydhr88/ComfyUI-Unique3D": {
+ "stars": 224,
+ "last_update": "2024-10-18 10:37:10",
+ "author_account_age_days": 5347
+ },
+ "https://github.com/jtydhr88/ComfyUI_frontend_vue_basic": {
+ "stars": 17,
+ "last_update": "2025-12-14 01:46:52",
+ "author_account_age_days": 5347
+ },
+ "https://github.com/judian17/ComfyUI-MIDI-3D": {
+ "stars": 14,
+ "last_update": "2025-11-26 19:34:09",
+ "author_account_age_days": 2440
+ },
+ "https://github.com/junhe421/comfyui_batch_image_processor": {
+ "stars": 7,
+ "last_update": "2025-07-11 01:09:12",
+ "author_account_age_days": 729
+ },
+ "https://github.com/kadirnar/ComfyUI-Adapter": {
+ "stars": 3,
+ "last_update": "2024-04-03 12:05:39",
+ "author_account_age_days": 2924
+ },
+ "https://github.com/kandy/ComfyUI-KAndy": {
+ "stars": 0,
+ "last_update": "2026-01-11 22:47:31",
+ "author_account_age_days": 6067
+ },
+ "https://github.com/kanttouchthis/ComfyUI-SDNQ": {
+ "stars": 15,
+ "last_update": "2026-01-06 18:21:52",
+ "author_account_age_days": 1619
+ },
+ "https://github.com/karthikg-09/ComfyUI-3ncrypt": {
+ "stars": 0,
+ "last_update": "2024-12-27 09:09:07",
+ "author_account_age_days": 790
+ },
+ "https://github.com/kaski23/Kaskis_Comfy_Nodes": {
+ "stars": 2,
+ "last_update": "2025-12-11 21:13:13",
+ "author_account_age_days": 359
+ },
+ "https://github.com/kesslerdev/kesslerdev_comfyui_nodes": {
+ "stars": 0,
+ "last_update": "2025-10-10 11:31:54",
+ "author_account_age_days": 4929
+ },
+ "https://github.com/kevin314/ComfyUI-FastVideo": {
+ "stars": 5,
+ "last_update": "2025-07-03 05:21:54",
+ "author_account_age_days": 2727
+ },
+ "https://github.com/kijai/ComfyUI-CV-VAE": {
+ "stars": 12,
+ "last_update": "2024-06-03 21:46:49",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-DeepSeek-VL": {
+ "stars": 49,
+ "last_update": "2024-05-21 16:43:40",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-DiffSynthWrapper": {
+ "stars": 61,
+ "last_update": "2024-06-22 00:16:46",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-DiffusersSD3Wrapper": {
+ "stars": 10,
+ "last_update": "2024-06-17 13:03:43",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-EasyAnimateWrapper": {
+ "stars": 86,
+ "last_update": "2024-08-14 02:20:18",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-FollowYourEmojiWrapper": {
+ "stars": 65,
+ "last_update": "2025-04-18 10:50:26",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-FramePackWrapper": {
+ "stars": 1627,
+ "last_update": "2026-01-13 21:34:04",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-Hunyuan3DWrapper": {
+ "stars": 950,
+ "last_update": "2025-06-15 09:52:41",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-HunyuanVideoWrapper": {
+ "stars": 2575,
+ "last_update": "2025-08-20 08:38:14",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-MMAudio": {
+ "stars": 517,
+ "last_update": "2026-02-01 13:26:59",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-MochiWrapper": {
+ "stars": 799,
+ "last_update": "2024-11-11 13:54:57",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-VEnhancer": {
+ "stars": 71,
+ "last_update": "2024-11-02 00:24:36",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-VideoNoiseWarp": {
+ "stars": 159,
+ "last_update": "2025-03-30 13:39:03",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/kijai/ComfyUI-WanAnimatePreprocess": {
+ "stars": 460,
+ "last_update": "2025-12-22 14:47:36",
+ "author_account_age_days": 2777
+ },
+ "https://github.com/killshotttttt/ComfyUI-killshotttttt": {
+ "stars": 0,
+ "last_update": "2026-01-13 10:43:50",
+ "author_account_age_days": 1691
+ },
+ "https://github.com/kimara-ai/ComfyUI-Kimara-AI-Image-From-URL": {
+ "stars": 0,
+ "last_update": "2025-05-06 07:50:34",
+ "author_account_age_days": 451
+ },
+ "https://github.com/kongds1999/ComfyUI_was_image": {
+ "stars": 2,
+ "last_update": "2026-01-05 09:29:20",
+ "author_account_age_days": 1292
+ },
+ "https://github.com/krakenunbound/kraken-discord-bot": {
+ "stars": 1,
+ "last_update": "2025-12-10 20:36:38",
+ "author_account_age_days": 173
+ },
+ "https://github.com/krich-cto/ComfyUI-Flow-Control": {
+ "stars": 2,
+ "last_update": "2025-12-16 16:44:49",
+ "author_account_age_days": 1859
+ },
+ "https://github.com/krisshen2021/comfyui_OpenRouterNodes": {
+ "stars": 0,
+ "last_update": "2025-02-22 02:29:36",
+ "author_account_age_days": 1782
+ },
+ "https://github.com/kuailefengnan2024/Comfyui_Layer": {
+ "stars": 0,
+ "last_update": "2025-09-05 12:19:50",
+ "author_account_age_days": 554
+ },
+ "https://github.com/kuschanow/ComfyUI-SD-Slicer": {
+ "stars": 0,
+ "last_update": "2024-12-08 16:59:31",
+ "author_account_age_days": 1976
+ },
+ "https://github.com/kxh/ComfyUI-ImageUpscaleWithModelMultipleTimes": {
+ "stars": 0,
+ "last_update": "2024-10-16 13:53:50",
+ "author_account_age_days": 5141
+ },
+ "https://github.com/kxh/ComfyUI-sam2": {
+ "stars": 1,
+ "last_update": "2024-10-10 18:06:11",
+ "author_account_age_days": 5141
+ },
+ "https://github.com/kycg/comfyui-Kwtoolset": {
+ "stars": 0,
+ "last_update": "2024-11-04 21:14:07",
+ "author_account_age_days": 1535
+ },
+ "https://github.com/kylegrover/comfyui-python-cowboy": {
+ "stars": 2,
+ "last_update": "2024-11-04 18:37:04",
+ "author_account_age_days": 3247
+ },
+ "https://github.com/l1yongch1/ComfyUI-YcNodes": {
+ "stars": 1,
+ "last_update": "2025-05-05 04:00:28",
+ "author_account_age_days": 1370
+ },
+ "https://github.com/laksjdjf/ssd-1b-comfyui": {
+ "stars": 1,
+ "last_update": "2023-10-27 20:05:06",
+ "author_account_age_days": 3425
+ },
+ "https://github.com/laobaishu1/ComfyUI-JSON-Upload-Iterator": {
+ "stars": 0,
+ "last_update": "2025-11-02 09:10:52",
+ "author_account_age_days": 345
+ },
+ "https://github.com/laubsauger/comfyui-storyboard": {
+ "stars": 9,
+ "last_update": "2025-06-14 23:33:25",
+ "author_account_age_days": 5150
+ },
+ "https://github.com/lazybuttalented/ComfyUI_LBT": {
+ "stars": 2,
+ "last_update": "2025-11-11 02:42:22",
+ "author_account_age_days": 2346
+ },
+ "https://github.com/lcolok/ComfyUI-MagicAI": {
+ "stars": 8,
+ "last_update": "2025-10-30 07:20:48",
+ "author_account_age_days": 3008
+ },
+ "https://github.com/leacvikas0/ComfyUI-Presence": {
+ "stars": 0,
+ "last_update": "2026-01-06 13:53:40",
+ "author_account_age_days": 547
+ },
+ "https://github.com/leadbreak/comfyui-faceaging": {
+ "stars": 93,
+ "last_update": "2024-10-31 08:25:21",
+ "author_account_age_days": 1967
+ },
+ "https://github.com/leeguandong/ComfyUI_AliControlnetInpainting": {
+ "stars": 3,
+ "last_update": "2024-09-25 10:44:58",
+ "author_account_age_days": 3389
+ },
+ "https://github.com/leoleelxh/ComfyUI-MidjourneyNode-leoleexh": {
+ "stars": 27,
+ "last_update": "2024-08-01 03:37:17",
+ "author_account_age_days": 4670
+ },
+ "https://github.com/leon-etienne/ComfyUI_Scoring-Nodes": {
+ "stars": 0,
+ "last_update": "2025-04-21 11:48:26",
+ "author_account_age_days": 947
+ },
+ "https://github.com/lfelipegg/lfgg_custom_nodes_comfyui": {
+ "stars": 0,
+ "last_update": "2025-12-18 16:30:28",
+ "author_account_age_days": 1405
+ },
+ "https://github.com/lggcfx2020/ComfyUI-LGGCFX-Tools": {
+ "stars": 9,
+ "last_update": "2025-12-01 09:21:10",
+ "author_account_age_days": 2060
+ },
+ "https://github.com/lgldlk/ComfyUI-img-tiler": {
+ "stars": 1,
+ "last_update": "2024-10-17 07:56:42",
+ "author_account_age_days": 2284
+ },
+ "https://github.com/lichenhao/Comfyui_Ryota": {
+ "stars": 0,
+ "last_update": "2024-09-07 08:25:54",
+ "author_account_age_days": 4961
+ },
+ "https://github.com/light-and-ray/Minimalistic-Comfy-Wrapper-WebUI": {
+ "stars": 98,
+ "last_update": "2026-02-09 00:28:11",
+ "author_account_age_days": 3014
+ },
+ "https://github.com/lihaoyun6/ComfyUI-lhyNodes": {
+ "stars": 16,
+ "last_update": "2026-01-01 14:06:07",
+ "author_account_age_days": 3705
+ },
+ "https://github.com/linhusyung/comfyui-Build-and-train-your-network": {
+ "stars": 111,
+ "last_update": "2024-06-26 05:44:43",
+ "author_account_age_days": 1272
+ },
+ "https://github.com/littleowl/ComfyUI-MV-HECV": {
+ "stars": 1,
+ "last_update": "2025-06-04 12:42:47",
+ "author_account_age_days": 5256
+ },
+ "https://github.com/liusida/ComfyUI-Notebook": {
+ "stars": 35,
+ "last_update": "2025-12-16 05:09:46",
+ "author_account_age_days": 3802
+ },
+ "https://github.com/locphan201/ComfyUI-Alter-Nodes": {
+ "stars": 0,
+ "last_update": "2025-08-22 04:36:41",
+ "author_account_age_days": 1847
+ },
+ "https://github.com/locphan201/ComfyUI-Alternatives": {
+ "stars": 0,
+ "last_update": "2025-08-12 01:20:05",
+ "author_account_age_days": 1847
+ },
+ "https://github.com/logicalor/comfyui_mv_adapter": {
+ "stars": 0,
+ "last_update": "2025-12-15 07:34:35",
+ "author_account_age_days": 4492
+ },
+ "https://github.com/logtd/ComfyUI-HunyuanLoom": {
+ "stars": 495,
+ "last_update": "2025-02-21 21:01:57",
+ "author_account_age_days": 717
+ },
+ "https://github.com/logtd/ComfyUI-Veevee": {
+ "stars": 63,
+ "last_update": "2024-08-12 03:04:12",
+ "author_account_age_days": 717
+ },
+ "https://github.com/longgui0318/comfyui-one-more-step": {
+ "stars": 1,
+ "last_update": "2024-05-07 08:40:56",
+ "author_account_age_days": 4759
+ },
+ "https://github.com/longzoho/ComfyUI-Qdrant-Saver": {
+ "stars": 0,
+ "last_update": "2025-03-07 13:44:52",
+ "author_account_age_days": 2113
+ },
+ "https://github.com/lordwedggie/xcpNodes": {
+ "stars": 0,
+ "last_update": "2024-11-15 06:24:48",
+ "author_account_age_days": 1147
+ },
+ "https://github.com/love2hina-net/ComfyUI-Local-Translator": {
+ "stars": 2,
+ "last_update": "2025-09-03 04:37:20",
+ "author_account_age_days": 1646
+ },
+ "https://github.com/love530love/ComfyUI-TorchMonitor": {
+ "stars": 1,
+ "last_update": "2025-12-23 10:30:19",
+ "author_account_age_days": 1580
+ },
+ "https://github.com/lrzjason/Comfyui-Condition-Utils": {
+ "stars": 9,
+ "last_update": "2025-05-18 17:09:17",
+ "author_account_age_days": 4257
+ },
+ "https://github.com/lrzjason/Comfyui-DiffusersUtils": {
+ "stars": 13,
+ "last_update": "2026-01-16 16:53:55",
+ "author_account_age_days": 4257
+ },
+ "https://github.com/ltdrdata/ComfyUI-Workflow-Component": {
+ "stars": 248,
+ "last_update": "2024-07-30 08:08:28",
+ "author_account_age_days": 1057
+ },
+ "https://github.com/ltdrdata/comfyui-unsafe-torch": {
+ "stars": 44,
+ "last_update": "2025-06-10 22:31:29",
+ "author_account_age_days": 1057
+ },
+ "https://github.com/lu64k/ks_nodes": {
+ "stars": 1,
+ "last_update": "2025-10-11 03:14:04",
+ "author_account_age_days": 986
+ },
+ "https://github.com/lucafoscili/lf-nodes": {
+ "stars": 29,
+ "last_update": "2025-12-23 22:54:04",
+ "author_account_age_days": 2629
+ },
+ "https://github.com/lum3on/comfyui_RollingDepth": {
+ "stars": 1,
+ "last_update": "2025-06-01 18:46:56",
+ "author_account_age_days": 369
+ },
+ "https://github.com/lyra-ai/lyra-nodes": {
+ "stars": 0,
+ "last_update": "2025-12-09 05:12:33",
+ "author_account_age_days": 3999
+ },
+ "https://github.com/m-ai-studio/mai-prompt-progress": {
+ "stars": 0,
+ "last_update": "2025-08-14 08:47:35",
+ "author_account_age_days": 643
+ },
+ "https://github.com/maTORIx/ComfyUI-KeypointsToImage": {
+ "stars": 0,
+ "last_update": "2026-01-11 02:19:50",
+ "author_account_age_days": 3196
+ },
+ "https://github.com/machinesarenotpeople/comfyui-energycost": {
+ "stars": 0,
+ "last_update": "2025-05-03 21:22:23",
+ "author_account_age_days": 2128
+ },
+ "https://github.com/maekawataiki/ComfyUI-ALB-Login": {
+ "stars": 3,
+ "last_update": "2025-01-17 02:10:49",
+ "author_account_age_days": 3258
+ },
+ "https://github.com/maizerrr/comfyui-code-nodes": {
+ "stars": 0,
+ "last_update": "2025-06-30 03:36:19",
+ "author_account_age_days": 3664
+ },
+ "https://github.com/majocola/comfyui-standbybutton": {
+ "stars": 0,
+ "last_update": "2025-08-06 00:28:10",
+ "author_account_age_days": 1032
+ },
+ "https://github.com/majorsauce/comfyui_indieTools": {
+ "stars": 0,
+ "last_update": "2024-06-25 08:59:57",
+ "author_account_age_days": 2400
+ },
+ "https://github.com/mamamia1110/comfyui-boggerrr-nodes": {
+ "stars": 0,
+ "last_update": "2025-08-05 15:39:07",
+ "author_account_age_days": 1103
+ },
+ "https://github.com/mamorett/ComfyUI-SmolVLM": {
+ "stars": 6,
+ "last_update": "2024-11-30 14:31:14",
+ "author_account_age_days": 1346
+ },
+ "https://github.com/mamorett/comfyui_minicpm_vision": {
+ "stars": 0,
+ "last_update": "2025-06-17 13:25:18",
+ "author_account_age_days": 1346
+ },
+ "https://github.com/maoper11/comfyui_inteliweb_nodes": {
+ "stars": 3,
+ "last_update": "2025-09-10 05:51:38",
+ "author_account_age_days": 3049
+ },
+ "https://github.com/marcueberall/ComfyUI-BuildPath": {
+ "stars": 0,
+ "last_update": "2024-02-06 07:57:33",
+ "author_account_age_days": 2377
+ },
+ "https://github.com/marduk191/comfyui_cmdtls": {
+ "stars": 0,
+ "last_update": "2025-11-15 07:01:57",
+ "author_account_age_days": 5009
+ },
+ "https://github.com/martinken/ComfyUI-KMNodes": {
+ "stars": 0,
+ "last_update": "2025-12-30 22:38:39",
+ "author_account_age_days": 4309
+ },
+ "https://github.com/maruhidd/ComfyUI_Transparent-Background": {
+ "stars": 8,
+ "last_update": "2024-06-14 07:02:56",
+ "author_account_age_days": 2850
+ },
+ "https://github.com/mashb1t/comfyui-nodes-mashb1t": {
+ "stars": 0,
+ "last_update": "2024-06-11 15:55:53",
+ "author_account_age_days": 4130
+ },
+ "https://github.com/masmullin2000/ComfyUI-MMYolo": {
+ "stars": 0,
+ "last_update": "2025-02-22 22:23:02",
+ "author_account_age_days": 4673
+ },
+ "https://github.com/matDobek/ComfyUI_duck": {
+ "stars": 0,
+ "last_update": "2025-05-21 13:12:40",
+ "author_account_age_days": 4672
+ },
+ "https://github.com/maurorilla/ComfyUI-MisterMR-Nodes": {
+ "stars": 2,
+ "last_update": "2026-01-09 15:50:01",
+ "author_account_age_days": 4611
+ },
+ "https://github.com/max-dingsda/ComfyUI-PromptLoop": {
+ "stars": 0,
+ "last_update": "2025-11-20 12:25:44",
+ "author_account_age_days": 286
+ },
+ "https://github.com/mehbebe/ComfyLoraGallery": {
+ "stars": 1,
+ "last_update": "2024-12-29 12:44:29",
+ "author_account_age_days": 953
+ },
+ "https://github.com/melMass/ComfyUI-Lygia": {
+ "stars": 0,
+ "last_update": "2024-07-14 09:59:10",
+ "author_account_age_days": 4340
+ },
+ "https://github.com/mertgoksel/ComfyUI-Noot-Nodes": {
+ "stars": 0,
+ "last_update": "2025-11-23 19:28:41",
+ "author_account_age_days": 2399
+ },
+ "https://github.com/miabrahams/ComfyUI-WebAutomation": {
+ "stars": 0,
+ "last_update": "2025-11-26 01:39:52",
+ "author_account_age_days": 4013
+ },
+ "https://github.com/mico-world/comfyui_mico_node": {
+ "stars": 0,
+ "last_update": "2025-08-18 09:04:07",
+ "author_account_age_days": 466
+ },
+ "https://github.com/mikeymcfish/FishTools": {
+ "stars": 28,
+ "last_update": "2024-07-13 20:51:17",
+ "author_account_age_days": 3998
+ },
+ "https://github.com/mikheys/ComfyUI-mikheys": {
+ "stars": 0,
+ "last_update": "2025-06-21 15:35:56",
+ "author_account_age_days": 2996
+ },
+ "https://github.com/minhtuannhn/comfyui-gemini-studio": {
+ "stars": 0,
+ "last_update": "2024-11-19 16:05:05",
+ "author_account_age_days": 1775
+ },
+ "https://github.com/minujeong/comfyui-oklch-color-picker": {
+ "stars": 1,
+ "last_update": "2025-10-31 21:49:13",
+ "author_account_age_days": 4638
+ },
+ "https://github.com/miragecoa/ComfyUI-LLM-Evaluation": {
+ "stars": 1,
+ "last_update": "2024-11-21 01:29:48",
+ "author_account_age_days": 1160
+ },
+ "https://github.com/mittimi/ComfyUI_mittimiLoadPresetLite": {
+ "stars": 0,
+ "last_update": "2025-12-09 15:21:26",
+ "author_account_age_days": 4604
+ },
+ "https://github.com/mliand/ComfyUI-Calendar-Node": {
+ "stars": 0,
+ "last_update": "2025-01-10 07:33:40",
+ "author_account_age_days": 980
+ },
+ "https://github.com/mm-akhtar/comfyui-mask-selector-node": {
+ "stars": 0,
+ "last_update": "2025-04-18 10:06:17",
+ "author_account_age_days": 2087
+ },
+ "https://github.com/mobcat40/ComfyUI-RestartButton": {
+ "stars": 1,
+ "last_update": "2025-11-25 23:04:37",
+ "author_account_age_days": 199
+ },
+ "https://github.com/mohamedsobhi777/ComfyUI-FramerComfy": {
+ "stars": 0,
+ "last_update": "2025-01-25 14:39:17",
+ "author_account_age_days": 3014
+ },
+ "https://github.com/molbal/comfy-url-fetcher": {
+ "stars": 0,
+ "last_update": "2025-02-02 13:37:48",
+ "author_account_age_days": 4491
+ },
+ "https://github.com/moonwhaler/comfyui-moonpack": {
+ "stars": 12,
+ "last_update": "2025-10-10 09:53:05",
+ "author_account_age_days": 5018
+ },
+ "https://github.com/mr-krak3n/ComfyUI-Qwen": {
+ "stars": 32,
+ "last_update": "2025-03-08 12:12:29",
+ "author_account_age_days": 2636
+ },
+ "https://github.com/mrCodinghero/ComfyUI-Codinghero": {
+ "stars": 0,
+ "last_update": "2025-12-08 02:58:32",
+ "author_account_age_days": 677
+ },
+ "https://github.com/muriellee1x/ComfyUI-Logic-Switch": {
+ "stars": 3,
+ "last_update": "2025-11-11 09:15:55",
+ "author_account_age_days": 2283
+ },
+ "https://github.com/muriellee1x/ComfyUI-Mysterious-node2": {
+ "stars": 0,
+ "last_update": "2026-01-28 06:40:31",
+ "author_account_age_days": 2283
+ },
+ "https://github.com/muriellee1x/ComfyUI-Mysterious-node3": {
+ "stars": 0,
+ "last_update": "2026-01-28 07:58:24",
+ "author_account_age_days": 2283
+ },
+ "https://github.com/muriellee1x/ComfyUI-switch-angles": {
+ "stars": 2,
+ "last_update": "2025-11-06 09:29:04",
+ "author_account_age_days": 2283
+ },
+ "https://github.com/mut-ex/comfyui-gligengui-node": {
+ "stars": 52,
+ "last_update": "2024-02-28 02:46:05",
+ "author_account_age_days": 3453
+ },
+ "https://github.com/muvich3n/ComfyUI-Claude-I2T": {
+ "stars": 0,
+ "last_update": "2025-01-15 07:50:46",
+ "author_account_age_days": 1893
+ },
+ "https://github.com/muvich3n/ComfyUI-Crop-Border": {
+ "stars": 0,
+ "last_update": "2025-02-24 10:01:53",
+ "author_account_age_days": 1893
+ },
+ "https://github.com/my-xz-org/comfyui_xz_nodes": {
+ "stars": 0,
+ "last_update": "2026-01-28 10:12:30",
+ "author_account_age_days": 63
+ },
+ "https://github.com/naderzare/comfyui-inodes": {
+ "stars": 0,
+ "last_update": "2025-02-05 04:32:29",
+ "author_account_age_days": 3285
+ },
+ "https://github.com/nadushu/comfyui-handy-nodes": {
+ "stars": 0,
+ "last_update": "2025-08-24 14:38:32",
+ "author_account_age_days": 1940
+ },
+ "https://github.com/nat-chan/comfyui-exec": {
+ "stars": 3,
+ "last_update": "2024-05-28 11:56:37",
+ "author_account_age_days": 3588
+ },
+ "https://github.com/nat-chan/comfyui-paint": {
+ "stars": 3,
+ "last_update": "2024-06-14 11:01:38",
+ "author_account_age_days": 3588
+ },
+ "https://github.com/nat-chan/transceiver": {
+ "stars": 1,
+ "last_update": "2024-05-01 10:03:01",
+ "author_account_age_days": 3588
+ },
+ "https://github.com/ncky/ComfyUI-Qwen3-TTS": {
+ "stars": 0,
+ "last_update": "2026-01-23 05:34:17",
+ "author_account_age_days": 2385
+ },
+ "https://github.com/neeltheninja/ComfyUI-TempFileDeleter": {
+ "stars": 1,
+ "last_update": "2024-10-26 19:25:43",
+ "author_account_age_days": 2473
+ },
+ "https://github.com/neeltheninja/ComfyUI-TextOverlay": {
+ "stars": 0,
+ "last_update": "2024-07-31 18:40:19",
+ "author_account_age_days": 2473
+ },
+ "https://github.com/nekotxt/ComfyUI-NTX-support-nodes": {
+ "stars": 0,
+ "last_update": "2026-01-30 06:03:15",
+ "author_account_age_days": 616
+ },
+ "https://github.com/neo0801/my-comfy-node": {
+ "stars": 0,
+ "last_update": "2024-09-20 07:49:04",
+ "author_account_age_days": 4374
+ },
+ "https://github.com/nestflow/ComfyUI-WanPlus": {
+ "stars": 3,
+ "last_update": "2025-12-07 16:39:24",
+ "author_account_age_days": 3516
+ },
+ "https://github.com/netanelben/comfyui-camera2image-customnode": {
+ "stars": 1,
+ "last_update": "2024-09-29 15:14:57",
+ "author_account_age_days": 4476
+ },
+ "https://github.com/netanelben/comfyui-image2image-customnode": {
+ "stars": 1,
+ "last_update": "2024-09-29 12:50:53",
+ "author_account_age_days": 4476
+ },
+ "https://github.com/netanelben/comfyui-photobooth-customnode": {
+ "stars": 0,
+ "last_update": "2024-10-02 08:00:05",
+ "author_account_age_days": 4476
+ },
+ "https://github.com/netanelben/comfyui-text2image-customnode": {
+ "stars": 4,
+ "last_update": "2024-09-29 15:19:37",
+ "author_account_age_days": 4476
+ },
+ "https://github.com/neverbiasu/ComfyUI-DeepSeek": {
+ "stars": 0,
+ "last_update": "2025-02-01 04:17:59",
+ "author_account_age_days": 1613
+ },
+ "https://github.com/neverbiasu/ComfyUI-Show-o": {
+ "stars": 1,
+ "last_update": "2025-12-28 10:37:43",
+ "author_account_age_days": 1613
+ },
+ "https://github.com/neverbiasu/ComfyUI-StereoCrafter": {
+ "stars": 4,
+ "last_update": "2024-12-30 13:32:43",
+ "author_account_age_days": 1613
+ },
+ "https://github.com/newraina/ComfyUI-Remote-Save-Image": {
+ "stars": 0,
+ "last_update": "2025-04-18 10:50:44",
+ "author_account_age_days": 4031
+ },
+ "https://github.com/newraina/comfyui-photoshop-v2": {
+ "stars": 3,
+ "last_update": "2025-11-17 09:00:20",
+ "author_account_age_days": 4031
+ },
+ "https://github.com/nidefawl/ComfyUI-nidefawl": {
+ "stars": 2,
+ "last_update": "2024-01-16 18:16:41",
+ "author_account_age_days": 5462
+ },
+ "https://github.com/nikkuexe/ComfyUI-ListDataHelpers": {
+ "stars": 0,
+ "last_update": "2024-09-21 16:15:57",
+ "author_account_age_days": 5143
+ },
+ "https://github.com/nobandegani/comfyui_ino_nodes": {
+ "stars": 2,
+ "last_update": "2026-01-27 13:39:58",
+ "author_account_age_days": 1881
+ },
+ "https://github.com/nobinBB/comfyui-samenodes": {
+ "stars": 0,
+ "last_update": "2026-01-21 13:49:09",
+ "author_account_age_days": 383
+ },
+ "https://github.com/nomadop/ComfyUI-Video-Matting": {
+ "stars": 0,
+ "last_update": "2026-01-16 02:51:09",
+ "author_account_age_days": 4696
+ },
+ "https://github.com/nomcycle/ComfyUI_Cluster": {
+ "stars": 3,
+ "last_update": "2025-11-12 17:14:45",
+ "author_account_age_days": 4933
+ },
+ "https://github.com/norgeous/ComfyUI-UI-Builder": {
+ "stars": 9,
+ "last_update": "2024-08-11 22:22:04",
+ "author_account_age_days": 4624
+ },
+ "https://github.com/nschpy/ComfyUI_MovisAdapter": {
+ "stars": 0,
+ "last_update": "2025-12-24 09:20:30",
+ "author_account_age_days": 454
+ },
+ "https://github.com/numq/comfyui-camera-capture-node": {
+ "stars": 0,
+ "last_update": "2025-09-10 00:47:28",
+ "author_account_age_days": 2650
+ },
+ "https://github.com/obisin/ComfyUI-FSampler": {
+ "stars": 120,
+ "last_update": "2025-11-13 10:05:56",
+ "author_account_age_days": 1609
+ },
+ "https://github.com/octapus8085/OpenAI-comfyui-O": {
+ "stars": 0,
+ "last_update": "2025-10-12 21:40:00",
+ "author_account_age_days": 3256
+ },
+ "https://github.com/odedgranot/comfyui-ffmpeg-node": {
+ "stars": 1,
+ "last_update": "2025-08-25 09:17:44",
+ "author_account_age_days": 2117
+ },
+ "https://github.com/odedgranot/comfyui_video_save_node": {
+ "stars": 0,
+ "last_update": "2025-08-20 12:47:09",
+ "author_account_age_days": 2117
+ },
+ "https://github.com/oniboy/Archviz-Pack": {
+ "stars": 0,
+ "last_update": "2025-12-12 09:24:55",
+ "author_account_age_days": 3345
+ },
+ "https://github.com/orion4d/ComfyUI_unified_list_selector": {
+ "stars": 1,
+ "last_update": "2025-07-03 08:57:21",
+ "author_account_age_days": 1176
+ },
+ "https://github.com/orion4d/Orion4D_MasterPrompt": {
+ "stars": 7,
+ "last_update": "2025-09-20 13:01:51",
+ "author_account_age_days": 1176
+ },
+ "https://github.com/orpheus-gaze/comfyui-sundryutils": {
+ "stars": 0,
+ "last_update": "2025-09-19 10:53:25",
+ "author_account_age_days": 143
+ },
+ "https://github.com/osuiso-depot/comfyui-keshigom_custom": {
+ "stars": 0,
+ "last_update": "2025-02-27 10:01:17",
+ "author_account_age_days": 1704
+ },
+ "https://github.com/owengillett/ComfyUI-tilefusion": {
+ "stars": 0,
+ "last_update": "2025-02-19 11:05:53",
+ "author_account_age_days": 2327
+ },
+ "https://github.com/oxysoft/Comfy-Compel": {
+ "stars": 0,
+ "last_update": "2025-04-08 13:12:20",
+ "author_account_age_days": 4706
+ },
+ "https://github.com/oxysoft/ComfyUI-uiapi": {
+ "stars": 0,
+ "last_update": "2025-12-09 01:45:25",
+ "author_account_age_days": 4706
+ },
+ "https://github.com/oztrkoguz/ComfyUI_Kosmos2_BBox_Cutter": {
+ "stars": 16,
+ "last_update": "2024-07-25 05:50:01",
+ "author_account_age_days": 1436
+ },
+ "https://github.com/p1atdev/comfyui-aesthetic-predictor": {
+ "stars": 0,
+ "last_update": "2025-05-10 08:03:13",
+ "author_account_age_days": 2209
+ },
+ "https://github.com/pacchikAI/ImagePromptBatch": {
+ "stars": 1,
+ "last_update": "2025-10-22 16:27:05",
+ "author_account_age_days": 273
+ },
+ "https://github.com/pacchikAI/comfyui_pacchik_window": {
+ "stars": 8,
+ "last_update": "2025-10-22 16:20:20",
+ "author_account_age_days": 273
+ },
+ "https://github.com/panchovial-max/ComfyUI-ListHelper": {
+ "stars": 0,
+ "last_update": "2025-10-01 01:58:14",
+ "author_account_age_days": 191
+ },
+ "https://github.com/papcorns/ComfyUI-Papcorns-Node-UploadToGCS": {
+ "stars": 0,
+ "last_update": "2025-05-28 09:31:23",
+ "author_account_age_days": 2107
+ },
+ "https://github.com/parmarjh/ComfyUI-MochiWrapper-I2V": {
+ "stars": 0,
+ "last_update": "2025-01-10 14:28:51",
+ "author_account_age_days": 2155
+ },
+ "https://github.com/paulhoux/Smart-Prompting": {
+ "stars": 0,
+ "last_update": "2025-03-10 09:16:44",
+ "author_account_age_days": 5718
+ },
+ "https://github.com/pfpb/comfyui-badnodes": {
+ "stars": 0,
+ "last_update": "2025-10-07 22:44:03",
+ "author_account_age_days": 124
+ },
+ "https://github.com/pft-ChenKu/ComfyUI_system-dev": {
+ "stars": 0,
+ "last_update": "2026-01-08 07:24:30",
+ "author_account_age_days": 327
+ },
+ "https://github.com/phamngoctukts/ComyUI-Tupham": {
+ "stars": 1,
+ "last_update": "2025-01-09 04:02:54",
+ "author_account_age_days": 4482
+ },
+ "https://github.com/pickles/ComfyUI-PyPromptGenerator": {
+ "stars": 0,
+ "last_update": "2025-10-05 17:58:12",
+ "author_account_age_days": 5856
+ },
+ "https://github.com/pictorialink/ComfyUI-static-resource": {
+ "stars": 0,
+ "last_update": "2025-07-15 07:50:28",
+ "author_account_age_days": 270
+ },
+ "https://github.com/pinkpixel-dev/comfyui-llm-prompt-enhancer": {
+ "stars": 15,
+ "last_update": "2025-01-28 12:43:25",
+ "author_account_age_days": 383
+ },
+ "https://github.com/pixuai/ComfyUI-PixuAI": {
+ "stars": 0,
+ "last_update": "2025-03-01 13:56:56",
+ "author_account_age_days": 344
+ },
+ "https://github.com/pizurny/Comfyui-FeedbackSampler": {
+ "stars": 28,
+ "last_update": "2026-02-08 19:14:27",
+ "author_account_age_days": 1275
+ },
+ "https://github.com/pmarmotte2/Comfyui-VibeVoiceSelector": {
+ "stars": 2,
+ "last_update": "2025-04-08 11:18:55",
+ "author_account_age_days": 658
+ },
+ "https://github.com/poisenbery/NudeNet-Detector-Provider": {
+ "stars": 1,
+ "last_update": "2024-02-26 02:11:27",
+ "author_account_age_days": 1831
+ },
+ "https://github.com/pollockjj/ComfyUI-APIsolated": {
+ "stars": 0,
+ "last_update": "2026-01-29 15:53:18",
+ "author_account_age_days": 4101
+ },
+ "https://github.com/pollockjj/ComfyUI-StabilityTest": {
+ "stars": 0,
+ "last_update": "2026-01-30 18:40:52",
+ "author_account_age_days": 4101
+ },
+ "https://github.com/pomelyu/cy-prompt-tools": {
+ "stars": 0,
+ "last_update": "2025-06-13 15:09:26",
+ "author_account_age_days": 4850
+ },
+ "https://github.com/power88/ComfyUI-PDiD-Nodes": {
+ "stars": 0,
+ "last_update": "2025-01-04 11:21:29",
+ "author_account_age_days": 3326
+ },
+ "https://github.com/prabinpebam/anyPython": {
+ "stars": 19,
+ "last_update": "2025-02-15 06:56:01",
+ "author_account_age_days": 4837
+ },
+ "https://github.com/prodogape/ComfyUI-clip-interrogator": {
+ "stars": 62,
+ "last_update": "2024-07-27 18:33:22",
+ "author_account_age_days": 1624
+ },
+ "https://github.com/przewodo/ComfyUI-Przewodo-Utils": {
+ "stars": 4,
+ "last_update": "2025-08-27 20:02:50",
+ "author_account_age_days": 3905
+ },
+ "https://github.com/pschroedl/ComfyUI-StreamDiffusion": {
+ "stars": 6,
+ "last_update": "2025-05-21 01:33:15",
+ "author_account_age_days": 4582
+ },
+ "https://github.com/punicfaith/ComfyUI-GoogleAIStudio": {
+ "stars": 0,
+ "last_update": "2026-01-26 08:17:11",
+ "author_account_age_days": 3751
+ },
+ "https://github.com/pururin777/ComfyUI-Manual-Openpose": {
+ "stars": 3,
+ "last_update": "2025-09-01 07:28:15",
+ "author_account_age_days": 2741
+ },
+ "https://github.com/pzzmyc/comfyui-sd3-simple-simpletuner": {
+ "stars": 1,
+ "last_update": "2024-06-19 12:48:18",
+ "author_account_age_days": 2693
+ },
+ "https://github.com/qimi-dev/ComfyUI-Qimi-Tiler": {
+ "stars": 0,
+ "last_update": "2026-01-10 13:34:19",
+ "author_account_age_days": 2978
+ },
+ "https://github.com/qlikpetersen/ComfyUI-AI_Tools": {
+ "stars": 0,
+ "last_update": "2025-07-23 19:53:54",
+ "author_account_age_days": 1623
+ },
+ "https://github.com/quinteroac/comfyui_api_executor_nodes": {
+ "stars": 0,
+ "last_update": "2025-11-26 05:52:42",
+ "author_account_age_days": 2916
+ },
+ "https://github.com/r-vage/ComfyUI_Eclipse": {
+ "stars": 8,
+ "last_update": "2026-02-09 02:41:04",
+ "author_account_age_days": 267
+ },
+ "https://github.com/rafacost/rafacost-comfy": {
+ "stars": 3,
+ "last_update": "2025-11-11 14:26:29",
+ "author_account_age_days": 4283
+ },
+ "https://github.com/rafstahelin/ComfyUI_KieNanoBananaPro": {
+ "stars": 0,
+ "last_update": "2025-12-13 14:13:14",
+ "author_account_age_days": 2108
+ },
+ "https://github.com/rakete/comfyui-rakete": {
+ "stars": 0,
+ "last_update": "2025-10-19 13:49:07",
+ "author_account_age_days": 6173
+ },
+ "https://github.com/ralonsobeas/ComfyUI-HDRConversion": {
+ "stars": 5,
+ "last_update": "2024-12-12 20:21:26",
+ "author_account_age_days": 2653
+ },
+ "https://github.com/raohammad/ComfyUI-VTUtilNodes": {
+ "stars": 0,
+ "last_update": "2025-12-24 14:56:43",
+ "author_account_age_days": 4028
+ },
+ "https://github.com/razvanmatei-sf/razv-fal-ai": {
+ "stars": 0,
+ "last_update": "2025-11-26 14:44:33",
+ "author_account_age_days": 164
+ },
+ "https://github.com/realm-weaver/ComfyUI-tile-seamstress-360": {
+ "stars": 0,
+ "last_update": "2025-07-16 15:36:03",
+ "author_account_age_days": 801
+ },
+ "https://github.com/redhottensors/ComfyUI-ODE": {
+ "stars": 54,
+ "last_update": "2024-08-01 06:57:05",
+ "author_account_age_days": 734
+ },
+ "https://github.com/remhesneb/comfyui-remote-media": {
+ "stars": 0,
+ "last_update": "2025-10-05 12:37:40",
+ "author_account_age_days": 4465
+ },
+ "https://github.com/retech995/Save_Florence2_Bulk_Prompts": {
+ "stars": 0,
+ "last_update": "2025-06-03 18:27:37",
+ "author_account_age_days": 2574
+ },
+ "https://github.com/rhinoflavored/comfyui_QT": {
+ "stars": 0,
+ "last_update": "2025-03-18 08:35:59",
+ "author_account_age_days": 591
+ },
+ "https://github.com/ric-yu/comfyui-datadog-monitor": {
+ "stars": 0,
+ "last_update": "2025-09-12 22:44:08",
+ "author_account_age_days": 263
+ },
+ "https://github.com/richardctw/ComfyUI-ImageFillBackgroundColor": {
+ "stars": 0,
+ "last_update": "2026-02-04 06:40:05",
+ "author_account_age_days": 5
+ },
+ "https://github.com/ricklove/ComfyUI-AutoSeg-SAM2": {
+ "stars": 0,
+ "last_update": "2025-03-15 20:46:14",
+ "author_account_age_days": 5427
+ },
+ "https://github.com/rickyars/sd-cn-animation": {
+ "stars": 0,
+ "last_update": "2026-02-08 14:25:55",
+ "author_account_age_days": 4798
+ },
+ "https://github.com/rishipandey125/ComfyUI-FramePacking": {
+ "stars": 10,
+ "last_update": "2025-06-09 21:51:46",
+ "author_account_age_days": 2945
+ },
+ "https://github.com/rishipandey125/ComfyUI-StyleFrame-Nodes": {
+ "stars": 0,
+ "last_update": "2026-02-03 00:08:28",
+ "author_account_age_days": 2945
+ },
+ "https://github.com/risunobushi/ComfyUI_FaceMesh_Eyewear_Mask": {
+ "stars": 0,
+ "last_update": "2025-09-16 13:32:23",
+ "author_account_age_days": 1241
+ },
+ "https://github.com/risunobushi/ComfyUI_FocusMask": {
+ "stars": 4,
+ "last_update": "2024-12-09 11:52:53",
+ "author_account_age_days": 1241
+ },
+ "https://github.com/risunobushi/ComfyUI_HEXtoRGB": {
+ "stars": 1,
+ "last_update": "2025-01-28 14:37:42",
+ "author_account_age_days": 1241
+ },
+ "https://github.com/ritikvirus/comfyui-terminal-modal-node": {
+ "stars": 0,
+ "last_update": "2025-03-01 20:03:57",
+ "author_account_age_days": 2774
+ },
+ "https://github.com/rodpl/comfyui-asset-manager": {
+ "stars": 0,
+ "last_update": "2025-09-21 22:24:33",
+ "author_account_age_days": 6048
+ },
+ "https://github.com/romeobuilderotti/ComfyUI-EZ-Pipes": {
+ "stars": 3,
+ "last_update": "2023-11-15 22:00:49",
+ "author_account_age_days": 885
+ },
+ "https://github.com/ronalds-eu/comfyui-plus-integrations": {
+ "stars": 0,
+ "last_update": "2025-05-02 17:38:19",
+ "author_account_age_days": 4376
+ },
+ "https://github.com/rookiestar28/ComfyUI_Security_Audit": {
+ "stars": 1,
+ "last_update": "2025-12-25 22:03:02",
+ "author_account_age_days": 808
+ },
+ "https://github.com/rookiestar28/ComfyUI_Text_Processor": {
+ "stars": 5,
+ "last_update": "2026-01-29 04:27:17",
+ "author_account_age_days": 808
+ },
+ "https://github.com/rossturk/comfyui-primitive-mesh": {
+ "stars": 0,
+ "last_update": "2025-10-20 06:19:20",
+ "author_account_age_days": 5109
+ },
+ "https://github.com/rouxianmantou/comfyui-rxmt-nodes": {
+ "stars": 0,
+ "last_update": "2025-07-01 12:11:18",
+ "author_account_age_days": 3771
+ },
+ "https://github.com/rphmeier/comfyui-videodepthanything": {
+ "stars": 1,
+ "last_update": "2025-04-14 18:53:06",
+ "author_account_age_days": 4080
+ },
+ "https://github.com/ruka-game/rukalib_comfyui": {
+ "stars": 0,
+ "last_update": "2024-10-03 23:59:55",
+ "author_account_age_days": 499
+ },
+ "https://github.com/ryanontheinside/ComfyUI-Livepeer": {
+ "stars": 1,
+ "last_update": "2025-04-21 22:53:14",
+ "author_account_age_days": 4284
+ },
+ "https://github.com/ryanontheinside/ComfyUI-MineWorld": {
+ "stars": 2,
+ "last_update": "2025-04-16 18:59:09",
+ "author_account_age_days": 4284
+ },
+ "https://github.com/ryanontheinside/ComfyUI_YoloNasObjectDetection_Tensorrt": {
+ "stars": 1,
+ "last_update": "2024-12-31 17:43:33",
+ "author_account_age_days": 4284
+ },
+ "https://github.com/sahibalejandro/comfyui-sahib-nodes": {
+ "stars": 0,
+ "last_update": "2025-11-22 02:23:41",
+ "author_account_age_days": 5289
+ },
+ "https://github.com/saltchicken/ComfyUI-Identity-Mixer": {
+ "stars": 0,
+ "last_update": "2025-12-21 21:36:16",
+ "author_account_age_days": 4715
+ },
+ "https://github.com/saltchicken/ComfyUI-Interactive-Cropper": {
+ "stars": 0,
+ "last_update": "2026-01-09 18:13:44",
+ "author_account_age_days": 4715
+ },
+ "https://github.com/saltchicken/ComfyUI-Local-Loader": {
+ "stars": 0,
+ "last_update": "2026-01-11 02:53:54",
+ "author_account_age_days": 4715
+ },
+ "https://github.com/saltchicken/ComfyUI-Output-Plucker": {
+ "stars": 0,
+ "last_update": "2025-12-28 21:24:19",
+ "author_account_age_days": 4715
+ },
+ "https://github.com/saltchicken/ComfyUI-Prompter": {
+ "stars": 0,
+ "last_update": "2026-01-07 21:47:56",
+ "author_account_age_days": 4715
+ },
+ "https://github.com/saltchicken/ComfyUI-Selector": {
+ "stars": 0,
+ "last_update": "2025-12-18 00:06:56",
+ "author_account_age_days": 4715
+ },
+ "https://github.com/saltchicken/ComfyUI-Video-Utils": {
+ "stars": 0,
+ "last_update": "2025-12-30 20:07:03",
+ "author_account_age_days": 4715
+ },
+ "https://github.com/sangeet/testui": {
+ "stars": 2,
+ "last_update": "2024-05-15 00:55:17",
+ "author_account_age_days": 5674
+ },
+ "https://github.com/satyam-fp/ComfyUI-GeminiImage": {
+ "stars": 0,
+ "last_update": "2026-01-19 06:10:30",
+ "author_account_age_days": 1363
+ },
+ "https://github.com/satyasairazole/ComfyUI-Turbandetection": {
+ "stars": 0,
+ "last_update": "2025-12-18 11:26:23",
+ "author_account_age_days": 1617
+ },
+ "https://github.com/saulchiu/comfy_saul_plugin": {
+ "stars": 0,
+ "last_update": "2025-08-27 05:20:07",
+ "author_account_age_days": 856
+ },
+ "https://github.com/seancheung/comfyui-creative-nodes": {
+ "stars": 0,
+ "last_update": "2024-09-13 06:22:45",
+ "author_account_age_days": 4532
+ },
+ "https://github.com/sh570655308/Comfyui-RayNodes": {
+ "stars": 3,
+ "last_update": "2025-07-19 11:32:53",
+ "author_account_age_days": 3096
+ },
+ "https://github.com/shadowcz007/ComfyUI-PuLID-Test": {
+ "stars": 9,
+ "last_update": "2024-05-12 14:37:28",
+ "author_account_age_days": 3909
+ },
+ "https://github.com/shadowcz007/Comfyui-EzAudio": {
+ "stars": 1,
+ "last_update": "2024-09-22 03:17:40",
+ "author_account_age_days": 3909
+ },
+ "https://github.com/shadowcz007/comfyui-CLIPSeg": {
+ "stars": 3,
+ "last_update": "2024-02-08 02:16:24",
+ "author_account_age_days": 3909
+ },
+ "https://github.com/shadowcz007/comfyui-hydit-lowvram": {
+ "stars": 1,
+ "last_update": "2024-07-31 10:04:09",
+ "author_account_age_days": 3909
+ },
+ "https://github.com/shadowcz007/comfyui-sd-prompt-mixlab": {
+ "stars": 16,
+ "last_update": "2024-05-21 19:47:56",
+ "author_account_age_days": 3909
+ },
+ "https://github.com/shenymce/ComfyUI-JsonViewer": {
+ "stars": 0,
+ "last_update": "2026-01-09 09:04:19",
+ "author_account_age_days": 3889
+ },
+ "https://github.com/shin131002/ComfyUI-Prompt-Preset-Selector": {
+ "stars": 0,
+ "last_update": "2026-01-20 14:03:47",
+ "author_account_age_days": 355
+ },
+ "https://github.com/shinich39/comfyui-run-js": {
+ "stars": 0,
+ "last_update": "2025-10-16 09:22:23",
+ "author_account_age_days": 907
+ },
+ "https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4": {
+ "stars": 1,
+ "last_update": "2024-04-27 13:25:08",
+ "author_account_age_days": 4556
+ },
+ "https://github.com/shuanshuan/ComfyUI_CheckPointLoader_Ext": {
+ "stars": 0,
+ "last_update": "2024-08-27 02:24:05",
+ "author_account_age_days": 4712
+ },
+ "https://github.com/sickbraintwo/WextraX": {
+ "stars": 0,
+ "last_update": "2025-11-14 04:32:12",
+ "author_account_age_days": 138
+ },
+ "https://github.com/silent-rain/ComfyUI-SilentRain": {
+ "stars": 3,
+ "last_update": "2026-02-08 16:40:41",
+ "author_account_age_days": 2737
+ },
+ "https://github.com/silveroxides/ComfyUI_CondsUtils": {
+ "stars": 5,
+ "last_update": "2025-10-21 08:37:47",
+ "author_account_age_days": 2096
+ },
+ "https://github.com/silveroxides/ComfyUI_LoHalo": {
+ "stars": 1,
+ "last_update": "2025-11-28 16:45:43",
+ "author_account_age_days": 2096
+ },
+ "https://github.com/silveroxides/ComfyUI_LogicMath": {
+ "stars": 0,
+ "last_update": "2025-11-03 04:18:17",
+ "author_account_age_days": 2096
+ },
+ "https://github.com/silveroxides/ComfyUI_PromptAttention": {
+ "stars": 1,
+ "last_update": "2025-11-14 19:22:01",
+ "author_account_age_days": 2096
+ },
+ "https://github.com/silveroxides/ComfyUI_ReduxEmbedToolkit": {
+ "stars": 5,
+ "last_update": "2025-10-21 08:37:47",
+ "author_account_age_days": 2096
+ },
+ "https://github.com/silveroxides/ComfyUI_SamplingUtils": {
+ "stars": 3,
+ "last_update": "2026-02-05 21:39:29",
+ "author_account_age_days": 2096
+ },
+ "https://github.com/simonjaq/ComfyUI-sjnodes": {
+ "stars": 0,
+ "last_update": "2025-06-20 08:23:01",
+ "author_account_age_days": 3129
+ },
+ "https://github.com/simonri/ComfyUI-SimonNodes": {
+ "stars": 0,
+ "last_update": "2026-01-31 00:30:24",
+ "author_account_age_days": 3281
+ },
+ "https://github.com/siyonomicon/ComfyUI-Pin": {
+ "stars": 0,
+ "last_update": "2025-07-21 18:06:00",
+ "author_account_age_days": 205
+ },
+ "https://github.com/sk-palani/ComfyUI_Simpler": {
+ "stars": 0,
+ "last_update": "2025-12-20 11:17:49",
+ "author_account_age_days": 1661
+ },
+ "https://github.com/slezica/comfyui-personal": {
+ "stars": 0,
+ "last_update": "2025-12-16 23:17:17",
+ "author_account_age_days": 5700
+ },
+ "https://github.com/smthemex/ComfyUI_GPT_SoVITS_Lite": {
+ "stars": 8,
+ "last_update": "2025-12-06 08:28:36",
+ "author_account_age_days": 949
+ },
+ "https://github.com/sofakid/dandy": {
+ "stars": 54,
+ "last_update": "2025-12-15 01:40:01",
+ "author_account_age_days": 4648
+ },
+ "https://github.com/songtianhui/ComfyUI-DMM": {
+ "stars": 2,
+ "last_update": "2025-04-27 12:38:20",
+ "author_account_age_days": 1840
+ },
+ "https://github.com/sorption-dev/mycraft-comfyui": {
+ "stars": 4,
+ "last_update": "2026-01-30 23:25:33",
+ "author_account_age_days": 317
+ },
+ "https://github.com/sourceful-official/ComfyUI_InstructPixToPixConditioningLatent": {
+ "stars": 3,
+ "last_update": "2025-01-03 13:20:33",
+ "author_account_age_days": 2077
+ },
+ "https://github.com/sourceful-official/comfyui-sourceful-official": {
+ "stars": 0,
+ "last_update": "2025-01-27 14:58:03",
+ "author_account_age_days": 2077
+ },
+ "https://github.com/spawner1145/comfyui-spawner-schedulers": {
+ "stars": 9,
+ "last_update": "2025-09-06 13:59:29",
+ "author_account_age_days": 532
+ },
+ "https://github.com/springjk/ComfyUI-Psutil-Container-Memory-Patch": {
+ "stars": 1,
+ "last_update": "2025-04-23 15:12:34",
+ "author_account_age_days": 4255
+ },
+ "https://github.com/sprited-ai/sprited-comfyui-nodes": {
+ "stars": 0,
+ "last_update": "2026-01-20 05:29:18",
+ "author_account_age_days": 250
+ },
+ "https://github.com/squarewulf/ComfyUI-ModelFrisk": {
+ "stars": 8,
+ "last_update": "2025-12-21 13:00:47",
+ "author_account_age_days": 1987
+ },
+ "https://github.com/sschleis/sschl-comfyui-notes": {
+ "stars": 1,
+ "last_update": "2026-01-23 09:30:42",
+ "author_account_age_days": 5181
+ },
+ "https://github.com/sswink/comfyui-lingshang": {
+ "stars": 0,
+ "last_update": "2024-11-06 15:04:22",
+ "author_account_age_days": 3130
+ },
+ "https://github.com/stalkervr/ComfyUI-StalkerVr": {
+ "stars": 0,
+ "last_update": "2025-12-22 11:51:19",
+ "author_account_age_days": 2961
+ },
+ "https://github.com/stalkervr/comfyui-custom-path-nodes": {
+ "stars": 1,
+ "last_update": "2025-12-08 01:31:25",
+ "author_account_age_days": 2961
+ },
+ "https://github.com/starsFriday/ComfyUI-Audio-Subtitle": {
+ "stars": 0,
+ "last_update": "2025-12-02 10:00:50",
+ "author_account_age_days": 2833
+ },
+ "https://github.com/starsFriday/ComfyUI-KLingAI-OmniVideo": {
+ "stars": 0,
+ "last_update": "2025-12-23 07:58:12",
+ "author_account_age_days": 2833
+ },
+ "https://github.com/starsFriday/ComfyUI-LongCat-Image": {
+ "stars": 3,
+ "last_update": "2025-12-08 05:41:46",
+ "author_account_age_days": 2833
+ },
+ "https://github.com/starsFriday/ComfyUI-Qwen3-TTS": {
+ "stars": 2,
+ "last_update": "2026-01-23 06:43:51",
+ "author_account_age_days": 2833
+ },
+ "https://github.com/starsFriday/ComfyUI-Tracker-Person": {
+ "stars": 1,
+ "last_update": "2025-12-08 08:56:09",
+ "author_account_age_days": 2833
+ },
+ "https://github.com/stavsap/ComfyUI-React-SDK": {
+ "stars": 14,
+ "last_update": "2024-03-17 21:54:21",
+ "author_account_age_days": 4678
+ },
+ "https://github.com/steelan9199/ComfyUI-Teeth": {
+ "stars": 10,
+ "last_update": "2025-03-03 01:44:23",
+ "author_account_age_days": 1448
+ },
+ "https://github.com/stevanisya/comfyui_txt_selector": {
+ "stars": 7,
+ "last_update": "2025-11-21 17:55:04",
+ "author_account_age_days": 765
+ },
+ "https://github.com/sthao42/comfyui-melodkeet-tts": {
+ "stars": 0,
+ "last_update": "2025-08-30 22:41:26",
+ "author_account_age_days": 4450
+ },
+ "https://github.com/strhwste/comfyui_csv_utils": {
+ "stars": 0,
+ "last_update": "2025-06-03 23:04:43",
+ "author_account_age_days": 1067
+ },
+ "https://github.com/stutya/ComfyUI-Terminal": {
+ "stars": 0,
+ "last_update": "2025-05-11 21:29:49",
+ "author_account_age_days": 4432
+ },
+ "https://github.com/subnet99/ComfyUI-URLLoader": {
+ "stars": 2,
+ "last_update": "2025-11-17 11:54:44",
+ "author_account_age_days": 217
+ },
+ "https://github.com/sugarkwork/comfyui-trtools": {
+ "stars": 0,
+ "last_update": "2026-01-26 15:22:22",
+ "author_account_age_days": 1470
+ },
+ "https://github.com/sugarkwork/comfyui_image_crop": {
+ "stars": 0,
+ "last_update": "2025-03-14 01:43:03",
+ "author_account_age_days": 1470
+ },
+ "https://github.com/sugarkwork/comfyui_my_img_util": {
+ "stars": 2,
+ "last_update": "2026-01-31 04:06:07",
+ "author_account_age_days": 1470
+ },
+ "https://github.com/sugarkwork/comfyui_psd": {
+ "stars": 6,
+ "last_update": "2025-01-14 04:33:37",
+ "author_account_age_days": 1470
+ },
+ "https://github.com/suncat2ps/ComfyUI-SaveImgNextcloud": {
+ "stars": 0,
+ "last_update": "2025-06-23 04:03:38",
+ "author_account_age_days": 4719
+ },
+ "https://github.com/supaidauen/ComfyUI-supaidauen": {
+ "stars": 0,
+ "last_update": "2025-12-17 21:25:26",
+ "author_account_age_days": 3846
+ },
+ "https://github.com/svyatojdismas/ComfyUI-StDismas": {
+ "stars": 0,
+ "last_update": "2026-01-26 11:20:43",
+ "author_account_age_days": 2638
+ },
+ "https://github.com/synchronicity-labs/sync-comfyui": {
+ "stars": 5,
+ "last_update": "2025-09-25 20:48:28",
+ "author_account_age_days": 925
+ },
+ "https://github.com/system-out-cho/displayHistory_ComfyUI": {
+ "stars": 1,
+ "last_update": "2025-08-01 19:26:59",
+ "author_account_age_days": 1823
+ },
+ "https://github.com/systemaiofinterest-wq/ComfyUI-GoogleFX": {
+ "stars": 0,
+ "last_update": "2025-10-06 00:36:33",
+ "author_account_age_days": 152
+ },
+ "https://github.com/tackcrypto1031/tk_comfyui_SimpleSize": {
+ "stars": 0,
+ "last_update": "2026-01-14 09:25:17",
+ "author_account_age_days": 626
+ },
+ "https://github.com/takoyaki1118/ComfyUI-Kakimoji-Layer": {
+ "stars": 0,
+ "last_update": "2025-10-05 09:09:15",
+ "author_account_age_days": 2694
+ },
+ "https://github.com/takoyaki1118/ComfyUI_PromptExtractor": {
+ "stars": 0,
+ "last_update": "2025-08-28 17:57:59",
+ "author_account_age_days": 2694
+ },
+ "https://github.com/talesofai/comfyui-supersave": {
+ "stars": 2,
+ "last_update": "2025-10-10 09:14:27",
+ "author_account_age_days": 1150
+ },
+ "https://github.com/talon468/ComfyUI-Rpg-Architect": {
+ "stars": 4,
+ "last_update": "2024-08-31 14:47:47",
+ "author_account_age_days": 1012
+ },
+ "https://github.com/tankenyuen-ola/comfyui-env-variable-reader": {
+ "stars": 1,
+ "last_update": "2025-06-19 06:21:23",
+ "author_account_age_days": 398
+ },
+ "https://github.com/tankenyuen-ola/comfyui-wanvideo-scheduler-loop": {
+ "stars": 2,
+ "last_update": "2025-08-04 03:17:39",
+ "author_account_age_days": 398
+ },
+ "https://github.com/tanmoy-it/comfyuiCustomNode": {
+ "stars": 0,
+ "last_update": "2025-08-11 06:37:32",
+ "author_account_age_days": 526
+ },
+ "https://github.com/tasdawg/comfyui-mini": {
+ "stars": 0,
+ "last_update": "2025-12-14 06:32:10",
+ "author_account_age_days": 4559
+ },
+ "https://github.com/tc888/ComfyUI_Save_Flux_Image": {
+ "stars": 0,
+ "last_update": "2025-02-09 17:21:22",
+ "author_account_age_days": 2854
+ },
+ "https://github.com/tdrminglin/ComfyUI_SceneSplitter": {
+ "stars": 0,
+ "last_update": "2026-01-07 07:19:13",
+ "author_account_age_days": 895
+ },
+ "https://github.com/tdrminglin/Comfyui-hymotionbridge": {
+ "stars": 0,
+ "last_update": "2026-01-14 11:31:11",
+ "author_account_age_days": 895
+ },
+ "https://github.com/techidsk/comfyui_molook_nodes": {
+ "stars": 0,
+ "last_update": "2025-03-31 02:17:02",
+ "author_account_age_days": 2783
+ },
+ "https://github.com/techtruth/ComfyUI-Dreambooth": {
+ "stars": 0,
+ "last_update": "2025-04-06 02:57:20",
+ "author_account_age_days": 3226
+ },
+ "https://github.com/techzuhaib/ComfyUI-CacheImageNode": {
+ "stars": 0,
+ "last_update": "2024-11-29 07:31:49",
+ "author_account_age_days": 764
+ },
+ "https://github.com/teskor-hub/comfyui-teskors-utils": {
+ "stars": 0,
+ "last_update": "2026-02-08 18:28:06",
+ "author_account_age_days": 1939
+ },
+ "https://github.com/tfernd/ComfyUI-AutoCPUOffload": {
+ "stars": 1,
+ "last_update": "2025-09-09 15:57:56",
+ "author_account_age_days": 2950
+ },
+ "https://github.com/tg-tjmitchell/comfyui-custom-node-lister": {
+ "stars": 0,
+ "last_update": "2025-08-11 22:48:12",
+ "author_account_age_days": 1353
+ },
+ "https://github.com/tg-tjmitchell/comfyui-rsync-plugin": {
+ "stars": 0,
+ "last_update": "2025-08-22 18:31:15",
+ "author_account_age_days": 1353
+ },
+ "https://github.com/thaakeno/comfyui-universal-asset-downloader": {
+ "stars": 4,
+ "last_update": "2025-08-05 06:54:27",
+ "author_account_age_days": 533
+ },
+ "https://github.com/thavocado/comfyui-danbooru-lookup": {
+ "stars": 0,
+ "last_update": "2025-07-26 16:00:54",
+ "author_account_age_days": 1169
+ },
+ "https://github.com/thderoo/ComfyUI-_topfun_s_nodes": {
+ "stars": 6,
+ "last_update": "2024-07-03 14:39:28",
+ "author_account_age_days": 3461
+ },
+ "https://github.com/theshubzworld/ComfyUI-NvidiaVision": {
+ "stars": 0,
+ "last_update": "2025-12-21 07:05:49",
+ "author_account_age_days": 565
+ },
+ "https://github.com/thot-experiment/comfy-live-preview": {
+ "stars": 2,
+ "last_update": "2025-02-19 20:30:13",
+ "author_account_age_days": 1546
+ },
+ "https://github.com/threadedblue/MLXnodes": {
+ "stars": 2,
+ "last_update": "2025-02-15 13:41:14",
+ "author_account_age_days": 4559
+ },
+ "https://github.com/threecrowco/ComfyUI-FlowMatchScheduler": {
+ "stars": 0,
+ "last_update": "2025-09-10 04:59:28",
+ "author_account_age_days": 2380
+ },
+ "https://github.com/tiange-tree/BLUEAI_ComfyUI_OpenAI": {
+ "stars": 0,
+ "last_update": "2025-11-25 10:38:46",
+ "author_account_age_days": 1994
+ },
+ "https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes": {
+ "stars": 0,
+ "last_update": "2024-03-05 13:31:31",
+ "author_account_age_days": 707
+ },
+ "https://github.com/tnil25/ComfyUI-TJNodes": {
+ "stars": 1,
+ "last_update": "2025-09-19 20:21:06",
+ "author_account_age_days": 827
+ },
+ "https://github.com/tom-doerr/dspy_nodes": {
+ "stars": 202,
+ "last_update": "2024-12-01 20:14:37",
+ "author_account_age_days": 3374
+ },
+ "https://github.com/tony-zn/comfyui-zn-pycode": {
+ "stars": 0,
+ "last_update": "2025-09-08 02:54:04",
+ "author_account_age_days": 3453
+ },
+ "https://github.com/tori29umai0123/ComfyUI-SDXLGenerateFromTextFile": {
+ "stars": 0,
+ "last_update": "2025-11-16 10:32:39",
+ "author_account_age_days": 1956
+ },
+ "https://github.com/tpc2233/ComfyUI-TP-IMtalker": {
+ "stars": 6,
+ "last_update": "2025-12-01 18:57:15",
+ "author_account_age_days": 1333
+ },
+ "https://github.com/tracerstar/comfyui-p5js-node": {
+ "stars": 39,
+ "last_update": "2024-07-05 23:47:57",
+ "author_account_age_days": 5793
+ },
+ "https://github.com/trampolin/comfy-ui-scryfall": {
+ "stars": 0,
+ "last_update": "2025-05-20 11:46:54",
+ "author_account_age_days": 4839
+ },
+ "https://github.com/trashgraphicard/Albedo-Sampler-for-ComfyUI": {
+ "stars": 5,
+ "last_update": "2025-09-19 21:22:49",
+ "author_account_age_days": 1270
+ },
+ "https://github.com/trashkollector/TKVideoZoom": {
+ "stars": 1,
+ "last_update": "2025-09-05 16:26:54",
+ "author_account_age_days": 365
+ },
+ "https://github.com/truebillyblue/lC.ComfyUI_epistemic_nodes": {
+ "stars": 0,
+ "last_update": "2025-05-29 14:43:38",
+ "author_account_age_days": 350
+ },
+ "https://github.com/tuckerdarby/ComfyUI-TDNodes": {
+ "stars": 3,
+ "last_update": "2024-02-19 17:00:55",
+ "author_account_age_days": 3533
+ },
+ "https://github.com/turskeli/comfyui-SetWallpaper": {
+ "stars": 0,
+ "last_update": "2025-04-23 22:46:46",
+ "author_account_age_days": 5212
+ },
+ "https://github.com/tuxiansheng-ld/Comfyui-tuxiansheng-nodes": {
+ "stars": 0,
+ "last_update": "2025-12-10 12:40:33",
+ "author_account_age_days": 96
+ },
+ "https://github.com/twdockery/ComfyUI_Prompt_Batch_Generator": {
+ "stars": 0,
+ "last_update": "2025-12-02 11:39:43",
+ "author_account_age_days": 2158
+ },
+ "https://github.com/twj515895394/ComfyUI-LowMemVideoSuite": {
+ "stars": 0,
+ "last_update": "2025-08-15 08:27:44",
+ "author_account_age_days": 4140
+ },
+ "https://github.com/tzsoulcap/ComfyUI-SaveImg-W-MetaData": {
+ "stars": 0,
+ "last_update": "2025-04-11 15:28:03",
+ "author_account_age_days": 2417
+ },
+ "https://github.com/u5dev/ComfyUI_u5_EasyScripter": {
+ "stars": 1,
+ "last_update": "2025-12-11 01:12:06",
+ "author_account_age_days": 140
+ },
+ "https://github.com/unanan/ComfyUI-Dist": {
+ "stars": 7,
+ "last_update": "2024-02-28 10:03:50",
+ "author_account_age_days": 3492
+ },
+ "https://github.com/unphased/code-nodes": {
+ "stars": 6,
+ "last_update": "2025-11-18 22:33:43",
+ "author_account_age_days": 5077
+ },
+ "https://github.com/usman2003/ComfyUI-Classifiers": {
+ "stars": 0,
+ "last_update": "2025-05-21 12:44:01",
+ "author_account_age_days": 2131
+ },
+ "https://github.com/usman2003/ComfyUI-Gender-Classifier": {
+ "stars": 0,
+ "last_update": "2025-05-21 12:44:01",
+ "author_account_age_days": 2131
+ },
+ "https://github.com/usrname0/ComfyUI-AllergicPack": {
+ "stars": 0,
+ "last_update": "2025-08-13 09:11:40",
+ "author_account_age_days": 3008
+ },
+ "https://github.com/vadimcro/External-Image-Revised-with-MASK": {
+ "stars": 0,
+ "last_update": "2025-11-24 08:41:48",
+ "author_account_age_days": 3230
+ },
+ "https://github.com/vadimcro/string_by_index": {
+ "stars": 0,
+ "last_update": "2025-11-12 15:23:30",
+ "author_account_age_days": 3230
+ },
+ "https://github.com/vasilmitov/ComfyUI-SeedSnapShotManager": {
+ "stars": 0,
+ "last_update": "2025-09-04 23:50:37",
+ "author_account_age_days": 4468
+ },
+ "https://github.com/viik420/AdvancedModelDownloader": {
+ "stars": 1,
+ "last_update": "2025-08-18 10:31:02",
+ "author_account_age_days": 2489
+ },
+ "https://github.com/virallover/comfyui-virallover": {
+ "stars": 0,
+ "last_update": "2025-09-14 07:57:07",
+ "author_account_age_days": 287
+ },
+ "https://github.com/visualbruno/ComfyUI-QRemeshify": {
+ "stars": 11,
+ "last_update": "2026-01-19 10:14:21",
+ "author_account_age_days": 5634
+ },
+ "https://github.com/vito0131/ComfyUI_SmartContentCrop": {
+ "stars": 0,
+ "last_update": "2026-01-28 03:26:09",
+ "author_account_age_days": 1062
+ },
+ "https://github.com/vjumpkung/comfyui-mosaic-blur": {
+ "stars": 0,
+ "last_update": "2026-01-25 19:44:11",
+ "author_account_age_days": 3944
+ },
+ "https://github.com/vladp0727/Comfyui-with-Furniture": {
+ "stars": 0,
+ "last_update": "2025-04-18 08:58:04",
+ "author_account_age_days": 324
+ },
+ "https://github.com/vovler/ComfyUI-vovlerTools": {
+ "stars": 0,
+ "last_update": "2025-06-25 17:36:07",
+ "author_account_age_days": 2322
+ },
+ "https://github.com/vunguyen-oss/ComfyUI-ccsrv2": {
+ "stars": 0,
+ "last_update": "2025-10-01 11:18:59",
+ "author_account_age_days": 361
+ },
+ "https://github.com/w3rc/lpips-similarity-comfyui": {
+ "stars": 0,
+ "last_update": "2026-01-06 13:47:32",
+ "author_account_age_days": 2665
+ },
+ "https://github.com/wTechArtist/ComfyUI-VVL-Tools": {
+ "stars": 1,
+ "last_update": "2025-10-21 14:51:31",
+ "author_account_age_days": 1955
+ },
+ "https://github.com/wTechArtist/ComfyUI_VVL_Segmentation": {
+ "stars": 0,
+ "last_update": "2025-05-29 05:25:00",
+ "author_account_age_days": 1955
+ },
+ "https://github.com/wTechArtist/ComfyUI_VVL_VideoCamera": {
+ "stars": 0,
+ "last_update": "2025-06-12 02:11:03",
+ "author_account_age_days": 1955
+ },
+ "https://github.com/wTechArtist/ComfyUI_vvl_BBOX": {
+ "stars": 0,
+ "last_update": "2025-05-21 12:14:07",
+ "author_account_age_days": 1955
+ },
+ "https://github.com/walterFeng/ComfyUI-Image-Utils": {
+ "stars": 3,
+ "last_update": "2025-03-25 14:36:37",
+ "author_account_age_days": 3370
+ },
+ "https://github.com/wandaijin/ComfyUI-PaddleOCR": {
+ "stars": 0,
+ "last_update": "2025-12-31 05:41:25",
+ "author_account_age_days": 4014
+ },
+ "https://github.com/warshanks/Shank-Tools": {
+ "stars": 0,
+ "last_update": "2025-01-26 03:39:09",
+ "author_account_age_days": 4078
+ },
+ "https://github.com/wasilone11/comfyui-sync-translate-node": {
+ "stars": 0,
+ "last_update": "2025-07-19 03:26:55",
+ "author_account_age_days": 2800
+ },
+ "https://github.com/watarika/ComfyUI-Text-Utility": {
+ "stars": 2,
+ "last_update": "2025-11-29 09:12:35",
+ "author_account_age_days": 2327
+ },
+ "https://github.com/watarika/ComfyUI-exit": {
+ "stars": 0,
+ "last_update": "2025-09-28 23:38:02",
+ "author_account_age_days": 2327
+ },
+ "https://github.com/waynepimpzhang/comfyui-opencv-brightestspot": {
+ "stars": 0,
+ "last_update": "2025-01-05 06:04:53",
+ "author_account_age_days": 4385
+ },
+ "https://github.com/wciq1208/even-comfyui-plugin": {
+ "stars": 0,
+ "last_update": "2025-11-22 08:49:45",
+ "author_account_age_days": 4174
+ },
+ "https://github.com/whmc76/ComfyUI-AudioSuiteAdvanced": {
+ "stars": 24,
+ "last_update": "2026-01-10 15:04:49",
+ "author_account_age_days": 1046
+ },
+ "https://github.com/wildminder/ComfyUI-MagCache": {
+ "stars": 7,
+ "last_update": "2025-06-13 20:56:49",
+ "author_account_age_days": 4827
+ },
+ "https://github.com/wildminder/ComfyUI-VoxCPM": {
+ "stars": 381,
+ "last_update": "2025-12-17 19:14:57",
+ "author_account_age_days": 4827
+ },
+ "https://github.com/willblaschko/ComfyUI-Unload-Models": {
+ "stars": 25,
+ "last_update": "2024-06-30 10:07:40",
+ "author_account_age_days": 5186
+ },
+ "https://github.com/wilzamguerrero/Comfyui-zZzZz": {
+ "stars": 2,
+ "last_update": "2026-01-31 12:38:39",
+ "author_account_age_days": 1282
+ },
+ "https://github.com/woitec/ComfyUI_ImageDimensions": {
+ "stars": 0,
+ "last_update": "2025-10-26 19:13:31",
+ "author_account_age_days": 3461
+ },
+ "https://github.com/wordbrew/comfyui-wan-control-nodes": {
+ "stars": 6,
+ "last_update": "2025-06-19 23:37:04",
+ "author_account_age_days": 1207
+ },
+ "https://github.com/wormley/comfyui-wormley-nodes": {
+ "stars": 0,
+ "last_update": "2023-11-12 19:05:11",
+ "author_account_age_days": 3068
+ },
+ "https://github.com/x3bits/ComfyUI-Power-Flow": {
+ "stars": 3,
+ "last_update": "2025-01-14 14:20:35",
+ "author_account_age_days": 3977
+ },
+ "https://github.com/xgfone/ComfyUI_FaceToMask": {
+ "stars": 1,
+ "last_update": "2025-08-05 05:25:47",
+ "author_account_age_days": 4852
+ },
+ "https://github.com/xgfone/ComfyUI_PromptLogoCleaner": {
+ "stars": 0,
+ "last_update": "2025-07-28 05:28:42",
+ "author_account_age_days": 4852
+ },
+ "https://github.com/xgfone/ComfyUI_RasterCardMaker": {
+ "stars": 0,
+ "last_update": "2025-08-06 03:31:46",
+ "author_account_age_days": 4852
+ },
+ "https://github.com/xiaoxidashen/comfyui_my_utils": {
+ "stars": 0,
+ "last_update": "2025-12-02 05:58:50",
+ "author_account_age_days": 3127
+ },
+ "https://github.com/xiaoyumu/ComfyUI-XYNodes": {
+ "stars": 0,
+ "last_update": "2024-12-05 07:07:30",
+ "author_account_age_days": 4611
+ },
+ "https://github.com/xinyiSS/CombineMasksNode": {
+ "stars": 0,
+ "last_update": "2025-02-08 04:35:18",
+ "author_account_age_days": 1046
+ },
+ "https://github.com/xqqe/honey_nodes": {
+ "stars": 0,
+ "last_update": "2026-01-19 22:13:19",
+ "author_account_age_days": 2296
+ },
+ "https://github.com/xsai-collab/ComfyUI-CombineVideoAndSubtitle": {
+ "stars": 1,
+ "last_update": "2025-08-19 12:58:37",
+ "author_account_age_days": 920
+ },
+ "https://github.com/xtanqn/comfyui-xishen": {
+ "stars": 0,
+ "last_update": "2025-12-11 08:31:37",
+ "author_account_age_days": 2226
+ },
+ "https://github.com/xuchenxu168/ComfyUI-Gemini-3": {
+ "stars": 4,
+ "last_update": "2025-11-20 09:43:19",
+ "author_account_age_days": 427
+ },
+ "https://github.com/xuchenxu168/ComfyUI_Qwen3-VL": {
+ "stars": 12,
+ "last_update": "2025-11-15 16:46:04",
+ "author_account_age_days": 427
+ },
+ "https://github.com/xuchenxu168/Comfyui_Prompt_Edit": {
+ "stars": 65,
+ "last_update": "2025-11-11 09:42:32",
+ "author_account_age_days": 427
+ },
+ "https://github.com/xuchenxu168/comfyui_meituan_image": {
+ "stars": 1,
+ "last_update": "2025-12-11 03:39:03",
+ "author_account_age_days": 427
+ },
+ "https://github.com/xzuyn/ComfyUI-xzuynodes": {
+ "stars": 0,
+ "last_update": "2026-01-31 19:04:32",
+ "author_account_age_days": 3715
+ },
+ "https://github.com/y4my4my4m/ComfyUI_Direct3DS2": {
+ "stars": 6,
+ "last_update": "2025-06-01 04:29:47",
+ "author_account_age_days": 4229
+ },
+ "https://github.com/yamanacn/ComfyUI-ImageMask-Random-Sync-Picker": {
+ "stars": 0,
+ "last_update": "2025-12-30 14:41:25",
+ "author_account_age_days": 1914
+ },
+ "https://github.com/yamanacn/ComfyUI-QwenVL3-image": {
+ "stars": 8,
+ "last_update": "2025-10-23 01:57:46",
+ "author_account_age_days": 1914
+ },
+ "https://github.com/yamanacn/comfyui_qwen_object": {
+ "stars": 0,
+ "last_update": "2025-06-20 12:24:28",
+ "author_account_age_days": 1914
+ },
+ "https://github.com/yamanacn/comfyui_qwenbbox": {
+ "stars": 0,
+ "last_update": "2025-06-21 03:00:01",
+ "author_account_age_days": 1914
+ },
+ "https://github.com/yanhuifair/ComfyUI-FairLab": {
+ "stars": 2,
+ "last_update": "2026-01-22 03:12:25",
+ "author_account_age_days": 4156
+ },
+ "https://github.com/yanhuifair/comfyui-deepseek": {
+ "stars": 4,
+ "last_update": "2025-04-08 09:14:25",
+ "author_account_age_days": 4156
+ },
+ "https://github.com/yichengup/ComfyUI-Transition": {
+ "stars": 3,
+ "last_update": "2025-07-12 07:15:38",
+ "author_account_age_days": 719
+ },
+ "https://github.com/yichengup/ComfyUI-YCNodes_Advance": {
+ "stars": 19,
+ "last_update": "2026-01-04 18:27:21",
+ "author_account_age_days": 719
+ },
+ "https://github.com/yichengup/Comfyui-NodeSpark": {
+ "stars": 6,
+ "last_update": "2025-01-20 14:20:36",
+ "author_account_age_days": 719
+ },
+ "https://github.com/yincangshiwei/ComfyUI-SEQLToolNode": {
+ "stars": 0,
+ "last_update": "2025-05-28 10:06:17",
+ "author_account_age_days": 4225
+ },
+ "https://github.com/yojimbodayne/ComfyUI-Dropbox-API": {
+ "stars": 0,
+ "last_update": "2024-08-30 05:29:07",
+ "author_account_age_days": 545
+ },
+ "https://github.com/yuvraj108c/ComfyUI-HYPIR": {
+ "stars": 3,
+ "last_update": "2025-08-18 06:04:36",
+ "author_account_age_days": 2747
+ },
+ "https://github.com/yuyu0218yu/comfyui-NXCM-tool": {
+ "stars": 0,
+ "last_update": "2025-12-22 02:54:56",
+ "author_account_age_days": 1160
+ },
+ "https://github.com/z604159435g/comfyui_random_prompt_plugin": {
+ "stars": 0,
+ "last_update": "2025-09-08 15:15:23",
+ "author_account_age_days": 462
+ },
+ "https://github.com/zRich/ComfyUI-zRich-ObjectCutter": {
+ "stars": 0,
+ "last_update": "2025-11-07 03:49:30",
+ "author_account_age_days": 4840
+ },
+ "https://github.com/zRich/sam2_layer_node": {
+ "stars": 0,
+ "last_update": "2025-10-25 06:00:16",
+ "author_account_age_days": 4840
+ },
+ "https://github.com/zackabrams/ComfyUI-KeySyncWrapper": {
+ "stars": 3,
+ "last_update": "2025-06-21 17:46:04",
+ "author_account_age_days": 2924
+ },
+ "https://github.com/zhaorishuai/ComfyUI-StoryboardDistributor": {
+ "stars": 7,
+ "last_update": "2025-04-01 08:10:16",
+ "author_account_age_days": 2833
+ },
+ "https://github.com/zhengxyz123/ComfyUI-CLIPSeg": {
+ "stars": 3,
+ "last_update": "2025-05-20 12:40:03",
+ "author_account_age_days": 2249
+ },
+ "https://github.com/zhongpei/Comfyui_image2prompt": {
+ "stars": 370,
+ "last_update": "2025-06-06 23:41:46",
+ "author_account_age_days": 4053
+ },
+ "https://github.com/zhu733756/Comfyui-Anything-Converter": {
+ "stars": 1,
+ "last_update": "2025-09-10 08:24:29",
+ "author_account_age_days": 2847
+ },
+ "https://github.com/zhu798542746/comfyui_model": {
+ "stars": 0,
+ "last_update": "2026-01-05 11:44:52",
+ "author_account_age_days": 3122
+ },
+ "https://github.com/zhuanvi/ComfyUI-ZVNodes": {
+ "stars": 0,
+ "last_update": "2026-01-05 08:47:20",
+ "author_account_age_days": 3752
+ },
+ "https://github.com/zhupeter010903/ComfyUI-prompt-library": {
+ "stars": 0,
+ "last_update": "2025-11-17 21:25:52",
+ "author_account_age_days": 2629
+ },
+ "https://github.com/zjkhurry/comfyui_MetalFX": {
+ "stars": 1,
+ "last_update": "2025-03-05 07:07:17",
+ "author_account_age_days": 3575
+ },
+ "https://github.com/zl9739379/comfyui-qwen-vl-api": {
+ "stars": 0,
+ "last_update": "2025-07-02 12:53:51",
+ "author_account_age_days": 1175
+ },
+ "https://github.com/zml-ai/comfyui-hydit": {
+ "stars": 3,
+ "last_update": "2024-08-07 09:37:09",
+ "author_account_age_days": 2577
+ },
+ "https://github.com/zopieux/ComfyUI-zopi": {
+ "stars": 0,
+ "last_update": "2025-07-27 02:50:44",
+ "author_account_age_days": 6123
+ },
+ "https://github.com/zxq790909-maker/ComfyUI-wangyi-OLED": {
+ "stars": 1,
+ "last_update": "2026-01-24 05:04:40",
+ "author_account_age_days": 181
+ },
+ "https://github.com/zyd232/ComfyUI-zyd232-Nodes": {
+ "stars": 1,
+ "last_update": "2025-12-14 12:53:28",
+ "author_account_age_days": 4219
+ },
+ "https://github.com/zyquon/ComfyUI-Stash": {
+ "stars": 0,
+ "last_update": "2025-06-21 03:32:52",
+ "author_account_age_days": 314
+ },
+ "ttps://github.com/GraftingRayman/Border-Distance-Mapper": {
+ "stars": 0,
+ "last_update": "2025-11-17 17:49:31",
+ "author_account_age_days": 757
+ }
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/dev/model-list.json b/custom_nodes/ComfyUI-Manager/node_db/dev/model-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..8e3e1dc4858a08aa46190aa53ba320d565206cf4
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/dev/model-list.json
@@ -0,0 +1,3 @@
+{
+ "models": []
+}
diff --git a/custom_nodes/ComfyUI-Manager/node_db/dev/scan.sh b/custom_nodes/ComfyUI-Manager/node_db/dev/scan.sh
new file mode 100644
index 0000000000000000000000000000000000000000..ac8c4255b608064f5a362e01532f97a733fbc67b
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/dev/scan.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+rm ~/.tmp/dev/*.py > /dev/null 2>&1
+python ../../scanner.py ~/.tmp/dev $*
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/forked/custom-node-list.json b/custom_nodes/ComfyUI-Manager/node_db/forked/custom-node-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..589243083120e4ffeb706e61e7d3c74e4db3462a
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/forked/custom-node-list.json
@@ -0,0 +1,194 @@
+{
+ "custom_nodes": [
+ {
+ "author": "Fossiel",
+ "title": "ComfyUI-MultiGPU-Patched",
+ "reference": "https://github.com/Fossiel/ComfyUI-MultiGPU-Patched",
+ "files": [
+ "https://github.com/Fossiel/ComfyUI-MultiGPU-Patched"
+ ],
+ "install_type": "git-clone",
+ "description": "Patched fork of ComfyUI-MultiGPU providing universal .safetensors and GGUF multi-GPU distribution with DisTorch 2.0 engine, model-driven allocation options (bytes/ratio modes), WanVideoWrapper integration, and up to 10% faster GGUF inference. (Description by CC)"
+ },
+ {
+ "author": "synchronicity-labs",
+ "title": "ComfyUI Sync Lipsync Node",
+ "reference": "https://github.com/synchronicity-labs/sync-comfyui",
+ "files": [
+ "https://github.com/synchronicity-labs/sync-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node allows you to perform audio-video lip synchronization inside ComfyUI using a simple interface."
+ },
+ {
+ "author": "joaomede",
+ "title": "ComfyUI-Unload-Model-Fork",
+ "reference": "https://github.com/joaomede/ComfyUI-Unload-Model-Fork",
+ "files": [
+ "https://github.com/joaomede/ComfyUI-Unload-Model-Fork"
+ ],
+ "install_type": "git-clone",
+ "description": "For unloading a model or all models, using the memory management that is already present in ComfyUI. Copied from [a/https://github.com/willblaschko/ComfyUI-Unload-Models](https://github.com/willblaschko/ComfyUI-Unload-Models) but without the unnecessary extra stuff."
+ },
+ {
+ "author": "SanDiegoDude",
+ "title": "ComfyUI-HiDream-Sampler [WIP]",
+ "reference": "https://github.com/SanDiegoDude/ComfyUI-HiDream-Sampler",
+ "files": [
+ "https://github.com/SanDiegoDude/ComfyUI-HiDream-Sampler"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of enhanced nodes for ComfyUI that provide powerful additional functionality to your workflows.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "PramaLLC",
+ "title": "ComfyUI BEN - Background Erase Network",
+ "reference": "https://github.com/PramaLLC/BEN2_ComfyUI",
+ "files": [
+ "https://github.com/PramaLLC/BEN2_ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "Remove backgrounds from images with [a/BEN2](https://huggingface.co/PramaLLC/BEN2) in ComfyUI\nOriginal repo: [a/https://github.com/DoctorDiffusion/ComfyUI-BEN](https://github.com/DoctorDiffusion/ComfyUI-BEN)"
+ },
+ {
+ "author": "BlenderNeko",
+ "title": "ltdrdata/ComfyUI_TiledKSampler",
+ "reference": "https://github.com/ltdrdata/ComfyUI_TiledKSampler",
+ "files": [
+ "https://github.com/ltdrdata/ComfyUI_TiledKSampler"
+ ],
+ "install_type": "git-clone",
+ "description": "PR for [a/https://github.com/BlenderNeko/ComfyUI_TiledKSampler/pull/59](https://github.com/BlenderNeko/ComfyUI_TiledKSampler/pull/59)"
+ },
+ {
+ "author": "leeooo001",
+ "title": "ComfyUI-leo-Hamer",
+ "reference": "https://github.com/leeooo001/ComfyUI-leo-Hamer",
+ "files": [
+ "https://github.com/leeooo001/ComfyUI-leo-Hamer"
+ ],
+ "install_type": "git-clone",
+ "description": "Unoffice Hamer-ComfyUI by leo\nNOTE:base on [a/hamer](https://github.com/geopavlakos/hamer)"
+ },
+ {
+ "author": "leeooo001",
+ "title": "ComfyUI-leo-GVHMR",
+ "reference": "https://github.com/leeooo001/ComfyUI-leo-GVHMR",
+ "files": [
+ "https://github.com/leeooo001/ComfyUI-leo-GVHMR"
+ ],
+ "install_type": "git-clone",
+ "description": "Unoffice Hamer-ComfyUI by leo\nNOTE:base on [a/GVHMR](https://github.com/zju3dv/GVHMR)"
+ },
+ {
+ "author": "leeooo001",
+ "title": "RealisDance-ComfyUI",
+ "reference": "https://github.com/leeooo001/ComfyUI-leo-RealisDance",
+ "files": [
+ "https://github.com/leeooo001/ComfyUI-leo-RealisDance"
+ ],
+ "install_type": "git-clone",
+ "description": "Unoffice RealisDance-ComfyUI by leo\nNOTE:base on [a/RealisDance](https://github.com/damo-cv/RealisDance), modified on [a/RealisDanceComfyui](https://github.com/AIFSH/RealisDance-ComfyUI)"
+ },
+ {
+ "author": "jags111",
+ "title": "NyaamZ/efficiency-nodes-ED",
+ "reference": "https://github.com/NyaamZ/efficiency-nodes-ED",
+ "files": [
+ "https://github.com/NyaamZ/efficiency-nodes-ED"
+ ],
+ "install_type": "git-clone",
+ "description": "This forked repo supports efficiency-nodes-comfyui. Additional features."
+ },
+ {
+ "author": "SeaArtLab",
+ "title": "zer0int/ComfyUI-Long-CLIP",
+ "reference": "https://github.com/zer0int/ComfyUI-Long-CLIP",
+ "files": [
+ "https://github.com/zer0int/ComfyUI-Long-CLIP"
+ ],
+ "install_type": "git-clone",
+ "description": "This forked repo supports FLUX.1 not only SD1.5, SDXL."
+ },
+ {
+ "author": "meimeilook",
+ "title": "ComfyUI_IPAdapter_plus.old [backward compatbility]",
+ "reference": "https://github.com/meimeilook/ComfyUI_IPAdapter_plus.old",
+ "files": [
+ "https://github.com/meimeilook/ComfyUI_IPAdapter_plus.old"
+ ],
+ "install_type": "git-clone",
+ "description": "This repo is created to provide backward compatibility for workflows configured with the old IPAdapter."
+ },
+ {
+ "author": "ZHO-ZHO-ZHO",
+ "title": "Dr.Lt.Data/ComfyUI-YoloWorld-EfficientSAM",
+ "reference": "https://github.com/ltdrdata/ComfyUI-YoloWorld-EfficientSAM",
+ "files": [
+ "https://github.com/ltdrdata/ComfyUI-YoloWorld-EfficientSAM"
+ ],
+ "install_type": "git-clone",
+ "description": "This fork includes [a/PR32](https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM/pull/32)"
+ },
+ {
+ "author": "ertu110",
+ "title": "sdxl_prompt_style",
+ "reference": "https://github.com/ertu110/sdxl_prompt_style",
+ "files": [
+ "https://github.com/ertu110/sdxl_prompt_style"
+ ],
+ "install_type": "git-clone",
+ "description": "This project is a complete benchmark [a/https://github.com/twri/sdxl_prompt_styler](https://github.com/twri/sdxl_prompt_styler) A large amount of code inside comes from https://github.com/twri/sdxl_prompt_styler Project and [a/https://www.nodecafe.org/package/pythongosssss_ComfyUI-Custom-Scripts](https://www.nodecafe.org/package/pythongosssss_ComfyUI-Custom-Scripts) project\nThe functionality of this project is related to https://github.com/twri/sdxl_prompt_styler Highly overlapping, the only purpose of creating this project is because there are too many styles when selecting, resulting in a long and inconvenient dropdown box. Therefore, To address this issue, this project has added a secondary menu to the style."
+ },
+ {
+ "author": "gustproof",
+ "title": "ComfyUI_IPAdapter_plus_Style_Components",
+ "reference": "https://github.com/gustproof/ComfyUI_IPAdapter_plus_Style_Components",
+ "files": [
+ "https://github.com/gustproof/ComfyUI_IPAdapter_plus_Style_Components"
+ ],
+ "install_type": "git-clone",
+ "description": "Style Components is an IP-Adapter model conditioned on anime styles. The style embeddings can either be extracted from images or created manually. This repo currently only supports the SDXL model trained on AutismmixPony."
+ },
+ {
+ "author": "gameltb",
+ "title": "comfyui-stablsr",
+ "reference": "https://github.com/gameltb/Comfyui-StableSR",
+ "files": [
+ "https://github.com/gameltb/Comfyui-StableSR"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a development respository for debugging migration of StableSR to ComfyUI\n\nNOTE:Forked from [https://github.com/gameltb/Comfyui-StableSR]\nPut the StableSR [a/webui_786v_139.ckpt](https://huggingface.co/Iceclear/StableSR/resolve/main/webui_768v_139.ckpt) model into Comyfui/models/stablesr/, Put the StableSR [a/stablesr_768v_000139.ckpt](https://huggingface.co/Iceclear/StableSR/resolve/main/stablesr_768v_000139.ckpt) model into Comyfui/models/checkpoints/"
+ },
+ {
+ "author": "city96",
+ "title": "Efficient-Large-Model/Extra Models for ComfyUI",
+ "reference": "https://github.com/Efficient-Large-Model/ComfyUI_ExtraModels",
+ "files": [
+ "https://github.com/Efficient-Large-Model/ComfyUI_ExtraModels"
+ ],
+ "install_type": "git-clone",
+ "description": "A forked version of ComfyUI_ExtraModels. (modified by Efficient-Large-Model)"
+ },
+ {
+ "author": "Pablerdo",
+ "title": "ComfyUI-PSNodes",
+ "reference": "https://github.com/Pablerdo/ComfyUI-PSNodes",
+ "files": [
+ "https://github.com/Pablerdo/ComfyUI-PSNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A fork of KJNodes for ComfyUI.\nVarious quality of life -nodes for ComfyUI, mostly just visual stuff to improve usability"
+ },
+ {
+ "author": "huixingyun",
+ "title": "ComfyUI-SoundFlow",
+ "reference": "https://github.com/huixingyun/ComfyUI-SoundFlow",
+ "files": [
+ "https://github.com/huixingyun/ComfyUI-SoundFlow"
+ ],
+ "install_type": "git-clone",
+ "description": "forked from https://github.com/fredconex/ComfyUI-SoundFlow (removed)"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/forked/extension-node-map.json b/custom_nodes/ComfyUI-Manager/node_db/forked/extension-node-map.json
new file mode 100644
index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/forked/extension-node-map.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/forked/model-list.json b/custom_nodes/ComfyUI-Manager/node_db/forked/model-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..8e3e1dc4858a08aa46190aa53ba320d565206cf4
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/forked/model-list.json
@@ -0,0 +1,3 @@
+{
+ "models": []
+}
diff --git a/custom_nodes/ComfyUI-Manager/node_db/forked/scan.sh b/custom_nodes/ComfyUI-Manager/node_db/forked/scan.sh
new file mode 100644
index 0000000000000000000000000000000000000000..5d8d8c48b6e3f48dc1491738c1226f574909c05d
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/forked/scan.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+source ../../../../venv/bin/activate
+rm .tmp/*.py > /dev/null
+python ../../scanner.py
diff --git a/custom_nodes/ComfyUI-Manager/node_db/legacy/alter-list.json b/custom_nodes/ComfyUI-Manager/node_db/legacy/alter-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/legacy/alter-list.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/legacy/custom-node-list.json b/custom_nodes/ComfyUI-Manager/node_db/legacy/custom-node-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..41a23710f12f31462bd6ffed42fc9a6c732915fd
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/legacy/custom-node-list.json
@@ -0,0 +1,4460 @@
+{
+ "custom_nodes": [
+ {
+ "author": "patientx",
+ "title": "CFZ-SwitchMenu [REMOVED]",
+ "reference": "https://github.com/patientx/CFZ-SwitchMenu",
+ "files": [
+ "https://github.com/patientx/CFZ-SwitchMenu"
+ ],
+ "install_type": "git-clone",
+ "description": "Adds a menu button that switches between old and new style ComfyUI menus."
+ },
+ {
+ "author": "ved-gaur",
+ "title": "ComfyUI-Sink-Nodes [REMOVED]",
+ "reference": "https://github.com/ved-gaur/ComfyUI-Sink-Nodes",
+ "files": [
+ "https://github.com/ved-gaur/ComfyUI-Sink-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI sink nodes that accept inputs and intentionally do nothing, forcing models to load into memory without running inference. (Description by CC)"
+ },
+ {
+ "author": "A043-studios",
+ "title": "ComfyUI Deforum-X-Flux Nodes [REMOVED]",
+ "reference": "https://github.com/A043-studios/comfyui-deforum-x-flux-nodes",
+ "files": [
+ "https://github.com/A043-studios/comfyui-deforum-x-flux-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Professional video animation nodes for ComfyUI based on Deforum-X-Flux research"
+ },
+ {
+ "author": "linksluckytime",
+ "title": "comfyui_snacknodes [REMOVED]",
+ "reference": "https://github.com/linksluckytime/comfyui_snacknodes",
+ "files": [
+ "https://github.com/linksluckytime/comfyui_snacknodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A comprehensive collection of ComfyUI nodes designed to reduce reliance on multiple third-party node packages."
+ },
+ {
+ "author": "Nynxz",
+ "title": "ComfyUI_DiffsynthPause [REMOVED]",
+ "reference": "https://github.com/Nynxz/ComfyUI_DiffsynthPause",
+ "files": [
+ "https://github.com/Nynxz/ComfyUI_DiffsynthPause"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for controlling Diffsynth checkpoint pausing behavior during image generation workflows. (Description by CC)"
+ },
+ {
+ "author": "Angelsan720",
+ "title": "attention_bench [REMOVED]",
+ "reference": "https://github.com/Angelsan720/attention_bench",
+ "files": [
+ "https://github.com/Angelsan720/attention_bench"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple ComfyUI node example project to help beginners learn how to develop ComfyUI nodes."
+ },
+ {
+ "author": "balu112121",
+ "title": "Comfyui_Hivision_ID_photo_layout [REMOVED]",
+ "reference": "https://github.com/balu112121/Comfyui_Hivision_ID_photo_layout",
+ "files": [
+ "https://github.com/balu112121/Comfyui_Hivision_ID_photo_layout"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for ID photo layout with support for custom paper sizes, orientation, rows/columns, spacing, margins, and grid display. (Description by CC)"
+ },
+ {
+ "author": "ainewsto",
+ "title": "Comfyui_Comfly_v2 [REMOVED]",
+ "reference": "https://github.com/ainewsto/Comfyui_Comfly_v2",
+ "files": [
+ "https://github.com/ainewsto/Comfyui_Comfly_v2"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Comfly_Mj, Comfly_mjstyle, Comfly_upload, Comfly_Mju, Comfly_Mjv, Comfly_kling_text2video, Comfly_kling_image2video, Comfly_video_extend, Comfly_lip_sync, Comfly_kling_videoPreview, Comfly Gemini API, Comfly Doubao SeedEdit, Comfly ChatGPT Api,Comfly Jimeng API, Comfly_gpt_image_1_edit, Comfly_gpt_image_1"
+ },
+ {
+ "author": "thoddnn",
+ "title": "ComfyUI MLX Nodes [REMOVED]",
+ "reference": "https://github.com/thoddnn/ComfyUI-MLX",
+ "files": [
+ "https://github.com/thoddnn/ComfyUI-MLX"
+ ],
+ "install_type": "git-clone",
+ "description": "Faster workflows for ComfyUI users on Mac with Apple silicon"
+ },
+ {
+ "author": "90cube",
+ "title": "CBCanvas Node for ComfyUI [REMOVED]",
+ "reference": "https://github.com/90cube/Comfyui-CBcanvas",
+ "files": [
+ "https://github.com/90cube/Comfyui-CBcanvas"
+ ],
+ "install_type": "git-clone",
+ "description": "Canvas node with intelligent aspect ratio control - 13 preset aspect ratios from ultra-wide (21:9) to ultra-tall (9:21).\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "inflamously",
+ "title": "comfyui-prompt-enhancer [DEPRECATED]",
+ "reference": "https://github.com/inflamously/comfyui-prompt-enhancer",
+ "files": [
+ "https://github.com/inflamously/comfyui-prompt-enhancer"
+ ],
+ "install_type": "git-clone",
+ "description": "A crazy node that pragmatically just enhances a given prompt with various descriptions in the hope that the image quality just increase and prompting just gets easier."
+ },
+ {
+ "author": "tudal",
+ "title": "Hakkun-ComfyUI-nodes [REMOVED]",
+ "reference": "https://github.com/tudal/Hakkun-ComfyUI-nodes",
+ "files": [
+ "https://raw.githubusercontent.com/tudal/Hakkun-ComfyUI-nodes/main/hakkun_nodes.py"
+ ],
+ "install_type": "copy",
+ "description": "Mainly its prompt generating by custom syntax. Prompt Parser, Prompt tags, Random Line, Calculate Upscale, Image size to string, Type Converter, Image Resize To Height/Width, Load Random Image, Load Text"
+ },
+ {
+ "author": "huyl3-cpu",
+ "title": "comfyui_segment_anything_a100 [REMOVED]",
+ "reference": "https://github.com/huyl3-cpu/comfyui_segment_anything_a100",
+ "files": [
+ "https://github.com/huyl3-cpu/comfyui_segment_anything_a100"
+ ],
+ "install_type": "git-clone",
+ "description": "Heavily optimized A100 GPU fork of ComfyUI Segment Anything using BF16 precision, VRAM Locking, and Zero-Copy GPU processing for massive batch processing."
+ },
+ {
+ "author": "PauldeLavallaz",
+ "title": "comfyui_morpheus_model_management [REMOVED]",
+ "reference": "https://github.com/PauldeLavallaz/comfyui_morpheus_model_management",
+ "files": [
+ "https://github.com/PauldeLavallaz/comfyui_morpheus_model_management"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodo personalizzato per ComfyUI che consente di sfogliare una libreria locale di immagini di talent con interfaccia gallery, filtri avanzati e output multipli. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "laboratoiresonore",
+ "title": "ComfyUI_PerformanceLab [REMOVED]",
+ "reference": "https://github.com/laboratoiresonore/ComfyUI_PerformanceLab",
+ "files": [
+ "https://github.com/laboratoiresonore/ComfyUI_PerformanceLab"
+ ],
+ "install_type": "git-clone",
+ "description": "Make any ComfyUI workflow faster, use less VRAM, or produce better quality - with AI assistance"
+ },
+ {
+ "author": "Linsoo",
+ "title": "ComfyUI-Linsoo-Custom-Nodes [REMOVED]",
+ "reference": "https://github.com/Linsoo/ComfyUI-Linsoo-Custom-Nodes",
+ "files": [
+ "https://github.com/Linsoo/ComfyUI-Linsoo-Custom-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Linsoo Save Image, Linsoo Load Image (In development.. not working), Linsoo Empty Latent Image, Linsoo Multi Inputs, Linsoo Multi Outputs"
+ },
+ {
+ "author": "PauldeLavallaz",
+ "title": "ComfyUI-concat_images_to_api_gemini [REMOVED]",
+ "reference": "https://github.com/PauldeLavallaz/ComfyUI-concat_images_to_api_gemini",
+ "files": [
+ "https://github.com/PauldeLavallaz/ComfyUI-concat_images_to_api_gemini"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Concat Images → Gemini (MP only), Concat Two Images (RAW passthrough), Grid Collage AR Cols, ..."
+ },
+ {
+ "author": "aistudynow",
+ "title": "comfyui-wilddragon-nodes [REMOVED]",
+ "reference": "https://github.com/aistudynow/comfyui-wilddragon-nodes",
+ "files": [
+ "https://github.com/aistudynow/comfyui-wilddragon-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Image Face Crop (2025), Person Selector, Pose Face Filter, Person BBox Tracker, Face Restore & Blend, ...\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "Wladimir Palant",
+ "title": "image-resize-comfyui [REMOVED]",
+ "reference": "https://github.com/ussoewwin/image_resize_comfyui",
+ "files": [
+ "https://github.com/ussoewwin/image_resize_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Advanced image resizing node for ComfyUI with aspect ratio preservation and mask support"
+ },
+ {
+ "author": "umisetokikaze",
+ "title": "comfyui_mergekit [REMOVED]",
+ "reference": "https://github.com/umisetokikaze/comfyui_mergekit",
+ "files": [
+ "https://github.com/umisetokikaze/comfyui_mergekit"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:DefineSaveName, SetModels, get_skip, LoadLR, LoadTarget, SetTokenizer, Merge, SetLayer, SetModels"
+ },
+ {
+ "author": "LSDJesus",
+ "title": "ComfyUI-Luna-Collection [REMOVED]",
+ "reference": "https://github.com/LSDJesus/ComfyUI-Luna-Collection",
+ "files": [
+ "https://github.com/LSDJesus/ComfyUI-Luna-Collection"
+ ],
+ "install_type": "git-clone",
+ "description": "Collection of finetuned and custom nodes for Pyrite and I\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "r3dial",
+ "title": "Redial Discomphy - Discord Integration for ComfyUI [REMOVED]",
+ "reference": "https://github.com/r3dial/redial-discomphy",
+ "files": [
+ "https://github.com/r3dial/redial-discomphy"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that enables direct posting of images, videos, and messages to Discord channels. This node seamlessly integrates your ComfyUI workflows with Discord communication, allowing you to automatically share your generated content."
+ },
+ {
+ "author": "EricRorich",
+ "title": "ComfyUI-Parametric-Face-Canvas [REMOVED]",
+ "reference": "https://github.com/EricRorich/ComfyUI-Parametric-Face-Canvas",
+ "files": [
+ "https://github.com/EricRorich/ComfyUI-Parametric-Face-Canvas"
+ ],
+ "install_type": "git-clone",
+ "description": "Generates a parametric 3D face wireframe and renders it as a 2D image with adjustable facial proportions and camera orientation for use in AI pipelines.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "pixixai",
+ "title": "ComfyUI_Pixix-Tools [UNSAFE/REMOVED]",
+ "reference": "https://github.com/pixixai/ComfyUI_pixixTools",
+ "files": [
+ "https://github.com/pixixai/ComfyUI_pixixTools"
+ ],
+ "install_type": "git-clone",
+ "description": "Load Text (from folder)\nNOTE: The files in the repo are not organized.[w/The contents of files from arbitrary paths can be read remotely through this node.]"
+ },
+ {
+ "author": "fllywaay",
+ "title": "Comfyui-TextLine-counter [REMOVED]",
+ "reference": "https://github.com/zpengcom/Comfyui-TextLine-counter",
+ "files": [
+ "https://github.com/zpengcom/Comfyui-TextLine-counter"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple multi-line text processing tool, such as line count statistics, ignoring blank lines, etc."
+ },
+ {
+ "author": "daveand",
+ "title": "ComfyUI-daveand-utils [REMOVED]",
+ "reference": "https://github.com/daveand/ComfyUI-daveand-utils",
+ "files": [
+ "https://github.com/daveand/ComfyUI-daveand-utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Utility nodes including ModelConfigSelector for saving checkpoint configurations and managing manual sampler overrides. (Description by CC)"
+ },
+ {
+ "author": "tristanvdb",
+ "title": "ComfyUI-toolset [REMOVED]",
+ "reference": "https://github.com/tristanvdb/ComfyUI-toolset",
+ "files": [
+ "https://github.com/tristanvdb/ComfyUI-toolset"
+ ],
+ "install_type": "git-clone",
+ "description": "Human-in-the-loop image selection tool for ComfyUI workflows using a Flask web server, enabling users to pause workflows and interactively select images via a web browser interface."
+ },
+ {
+ "author": "chuchu114514",
+ "title": "comfyui_proportion_solver [REMOVED]",
+ "reference": "https://github.com/chuchu114514/comfyui_proportion_solver",
+ "files": [
+ "https://github.com/chuchu114514/comfyui_proportion_solver"
+ ],
+ "install_type": "git-clone",
+ "description": "This plugin includes two core nodes designed to handle proportion optimization tasks of varying complexity"
+ },
+ {
+ "author": "chuchu114514",
+ "title": "comfyui_text_list_stepper [REMOVED]",
+ "reference": "https://github.com/chuchu114514/comfyui_text_list_stepper",
+ "files": [
+ "https://github.com/chuchu114514/comfyui_text_list_stepper"
+ ],
+ "install_type": "git-clone",
+ "description": "Used for batch extraction of prompt words."
+ },
+ {
+ "author": "balu112121",
+ "title": "ComfyUI URL Image Loader [REMOVED]",
+ "reference": "https://github.com/balu112121/comfyui-LoadImageFromURL",
+ "files": [
+ "https://github.com/balu112121/comfyui-LoadImageFromURL"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node for loading images directly from URLs for AI image generation workflows."
+ },
+ {
+ "author": "huyl3-cpu",
+ "title": "ComfyUI_A100_Ultimate_Optimizer [REMOVED]",
+ "reference": "https://github.com/huyl3-cpu/ComfyUI_A100_Ultimate_Optimizer",
+ "files": [
+ "https://github.com/huyl3-cpu/ComfyUI_A100_Ultimate_Optimizer"
+ ],
+ "install_type": "git-clone",
+ "description": "A100 GPU batch processing and optimization node for ComfyUI. (Description by CC)"
+ },
+ {
+ "author": "BlackVortexAI",
+ "title": "BV Nodes [DEPRECATED]",
+ "reference": "https://github.com/BlackVortexAI/ComfyUI-BVortexNodes",
+ "files": [
+ "https://github.com/BlackVortexAI/ComfyUI-BVortexNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository contains a user-defined node for ComfyUI, currently there are nodes for capturing captions. But will be expanded in the future."
+ },
+ {
+ "author": "scott-createplay",
+ "title": "ComfyUI_frontend_tools [REMOVED]",
+ "reference": "https://github.com/scott-createplay/ComfyUI_frontend_tools",
+ "files": [
+ "https://github.com/scott-createplay/ComfyUI_frontend_tools"
+ ],
+ "install_type": "git-clone",
+ "description": "A comprehensive utility suite for ComfyUI that helps maintain clean, organized workflows with node cleaner, layout tools, HUD projection, and wireless connection management.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "yutrodimitri-ship-it",
+ "title": "ComfyUI-YUTRO-CastingStudio-v2 [REMOVED]",
+ "reference": "https://github.com/yutrodimitri-ship-it/ComfyUI-YUTRO-CastingStudio-v2",
+ "files": [
+ "https://github.com/yutrodimitri-ship-it/ComfyUI-YUTRO-CastingStudio-v2"
+ ],
+ "install_type": "git-clone",
+ "description": "A professional modular suite of nodes for ComfyUI designed for virtual casting agencies, professional photographers, and content creators to generate high-quality model portfolios efficiently. (Description by CC)\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "amamisonlyuser",
+ "title": "MixvtonComfyui [REMOVED]",
+ "reference": "https://github.com/amamisonlyuser/MixvtonComfyui",
+ "files": [
+ "https://github.com/amamisonlyuser/MixvtonComfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CXH_Leffa_Viton_Load, CXH_Leffa_Viton_Run\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "AhBumm",
+ "title": "ComfyUI_MangaLineExtraction [REMOVED]",
+ "reference": "https://github.com/AhBumm/ComfyUI_MangaLineExtraction-hf",
+ "files": [
+ "https://github.com/AhBumm/ComfyUI_MangaLineExtraction-hf"
+ ],
+ "description": "p1atdev/MangaLineExtraction-hf as a node in comfyui",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "danieljanata",
+ "title": "ComfyUI-QwenVL-Override [REMOVED]",
+ "reference": "https://github.com/danieljanata/ComfyUI-QwenVL-Override",
+ "files": [
+ "https://github.com/danieljanata/ComfyUI-QwenVL-Override"
+ ],
+ "install_type": "git-clone",
+ "description": "Adds two nodes that reuse upstream ComfyUI-QwenVL presets but add a runtime override that can be wired/unwired without getting stuck."
+ },
+ {
+ "author": "Futureversecom",
+ "title": "ComfyUI-JEN [REMOVED]",
+ "reference": "https://github.com/futureversecom/ComfyUI-JEN",
+ "files": [
+ "https://github.com/futureversecom/ComfyUI-JEN"
+ ],
+ "install_type": "git-clone",
+ "description": "Comfy UI custom nodes for JEN music generation powered by Futureverse"
+ },
+ {
+ "author": "TheBill2001",
+ "title": "comfyui-upscale-by-model [REMOVED]",
+ "reference": "https://github.com/TheBill2001/comfyui-upscale-by-model",
+ "files": [
+ "https://github.com/TheBill2001/comfyui-upscale-by-model"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node allow upscaling an image by a factor using a model."
+ },
+ {
+ "author": "XYMikky12138",
+ "title": "ComfyUI-NanoBanana-inpaint [REMOVED]",
+ "reference": "https://github.com/XYMikky12138/ComfyUI-NanoBanana-inpaint",
+ "files": [
+ "https://github.com/XYMikky12138/ComfyUI-NanoBanana-inpaint"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for API-based inpainting (Gemini, Imagen) with aspect ratio constraints, smart cropping, resize fitting, intelligent paste-back with transparency support. (Description by CC)"
+ },
+ {
+ "author": "Blonicx",
+ "title": "ComfyUI-Rework-X [REMOVED]",
+ "id": "rework-x",
+ "reference": "https://github.com/Blonicx/ComfyUI-X-Rework",
+ "files": [
+ "https://github.com/Blonicx/ComfyUI-X-Rework"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a plugin for ComfyUI that adds new Util Nodes and Nodes for easier image creation and sharing."
+ },
+ {
+ "author": "scott-createplay",
+ "title": "ComfyUI_video_essentials [REMOVED]",
+ "reference": "https://github.com/scott-createplay/ComfyUI_video_essentials",
+ "files": [
+ "https://github.com/scott-createplay/ComfyUI_video_essentials"
+ ],
+ "install_type": "git-clone",
+ "description": "Essential video processing nodes for ComfyUI"
+ },
+ {
+ "author": "thnikk",
+ "title": "comfyui-thnikk-utils [REMOVED]",
+ "reference": "https://github.com/thnikk/comfyui-thnikk-utils",
+ "files": [
+ "https://github.com/thnikk/comfyui-thnikk-utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes to clean up your workflow."
+ },
+ {
+ "author": "Tr1dae",
+ "title": "LoRA Matcher Nodes for ComfyUI [REMOVED]",
+ "reference": "https://github.com/Tr1dae/ComfyUI-LoraPromptMatcher",
+ "files": [
+ "https://github.com/Tr1dae/ComfyUI-LoraPromptMatcher"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node provides two different approaches to automatically match text prompts with LoRA models using their descriptions."
+ },
+
+ {
+ "author": "jkhayiying",
+ "title": "ImageLoadFromLocalOrUrl Node for ComfyUI [REMOVED]",
+ "id": "JkhaImageLoaderPathOrUrl",
+ "reference": "https://gitee.com/yyh915/jkha-load-img",
+ "files": [
+ "https://gitee.com/yyh915/jkha-load-img"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a node to load an image from local path or url."
+ },
+ {
+ "author": "pizurny",
+ "title": "ComfyUI-Just-DWPose [REMOVED]",
+ "reference": "https://github.com/pizurny/ComfyUI-Just-DWPose",
+ "files": [
+ "https://github.com/pizurny/ComfyUI-Just-DWPose"
+ ],
+ "install_type": "git-clone",
+ "description": "An advanced DWPose annotator for ComfyUI with TorchScript and ONNX backends, featuring comprehensive pose detection, bone validation, temporal smoothing, and custom visualization tools."
+ },
+ {
+ "author": "lfelipegg",
+ "title": "lfgg_custom_nodes [REMOVED]",
+ "reference": "https://github.com/lfelipegg/lfgg_custom_nodes",
+ "files": [
+ "https://github.com/lfelipegg/lfgg_custom_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: ModelMergeCombos\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "AndSni",
+ "title": "Comfy-FL-Nodes [REMOVED]",
+ "reference": "https://github.com/AndSni/Comfy-FL-Nodes",
+ "files": [
+ "https://github.com/AndSni/Comfy-FL-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Generates human characters for commerce applications in ComfyUI. (Description by CC)"
+ },
+ {
+ "author": "neeltheninja",
+ "title": "ComfyUI-ControlNeXt [REMOVED]",
+ "reference": "https://github.com/neverbiasu/ComfyUI-ControlNeXt",
+ "files": [
+ "https://github.com/neverbiasu/ComfyUI-ControlNeXt"
+ ],
+ "install_type": "git-clone",
+ "description": "In progress🚧"
+ },
+ {
+ "author": "TheArtOfficial",
+ "title": "ComfyUI-Nitra [REMOVED]",
+ "reference": "https://github.com/TheArtOfficial/ComfyUI-Nitra",
+ "files": [
+ "https://github.com/TheArtOfficial/ComfyUI-Nitra"
+ ],
+ "install_type": "git-clone",
+ "description": "Nitra custom node for ComfyUI"
+ },
+ {
+ "author": "AngelCookies",
+ "title": "ComfyUI-Seed-Tracker [REMOVED]",
+ "reference": "https://github.com/AngelCookies/ComfyUI-Seed-Tracker",
+ "files": [
+ "https://github.com/AngelCookies/ComfyUI-Seed-Tracker"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI extension that tracks random seeds throughout your image generation workflows"
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-nothing-happened [REMOVED]",
+ "reference": "httphttps://github.com/shinich39/comfyui-nothing-happened",
+ "files": [
+ "https://github.com/shinich39/comfyui-nothing-happened"
+ ],
+ "description": "Save image and keep metadata.",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "ashtar1984",
+ "title": "comfyui-switch-bypass-mute-by-group [REMOVED]",
+ "reference": "https://github.com/ashtar1984/comfyui-switch-bypass-mute-by-group",
+ "files": [
+ "https://github.com/ashtar1984/comfyui-switch-bypass-mute-by-group"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for group-based node switching, bypassing, and muting control. (Description by CC)"
+ },
+ {
+ "author": "wallen0322",
+ "title": "ComfyUI-TTM-WAN22 [REMOVED]",
+ "reference": "https://github.com/wallen0322/ComfyUI-TTM-WAN22",
+ "files": [
+ "https://github.com/wallen0322/ComfyUI-TTM-WAN22"
+ ],
+ "install_type": "git-clone",
+ "description": "TTM (Time-to-Move) node for ComfyUI enabling motion-controlled video generation with Wan2.2 models using dual-clock denoising for independent background and object animation control."
+ },
+ {
+ "author": "cdanielp",
+ "title": "COMFYUI_PROMPTMODELS [REMOVED]",
+ "reference": "https://github.com/cdanielp/COMFYUI_PROMPTMODELS",
+ "files": [
+ "https://github.com/cdanielp/COMFYUI_PROMPTMODELS"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for ComfyUI by PROMPTMODELS."
+ },
+ {
+ "author": "mcrataobrabo",
+ "title": "comfyui-smart-lora-downloader - Automatically Fetch Missing LoRAs [REMOVED]",
+ "reference": "https://github.com/mcrataobrabo/comfyui-smart-lora-downloader",
+ "files": [
+ "https://github.com/mcrataobrabo/comfyui-smart-lora-downloader"
+ ],
+ "install_type": "git-clone",
+ "description": "Automatically detect and download missing LoRAs for ComfyUI workflows"
+ },
+ {
+ "author": "KANAsho34636",
+ "title": "ComfyUI-NaturalSort-ImageLoader [REMOVED]",
+ "reference": "https://github.com/KANAsho34636/ComfyUI-NaturalSort-ImageLoader",
+ "files": [
+ "https://github.com/KANAsho34636/ComfyUI-NaturalSort-ImageLoader"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom image loader node supporting natural number sorting with multiple sort modes (natural, lexicographic, modification time, creation time, reverse natural). (Description by CC)"
+ },
+ {
+ "author": "johninthewinter",
+ "title": "comfyui-fal-flux-2-John [REMOVED]",
+ "reference": "https://github.com/johninthewinter/comfyui-fal-flux-2-John",
+ "files": [
+ "https://github.com/johninthewinter/comfyui-fal-flux-2-John"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for ComfyUI that integrate with fal.ai's FLUX 2 and FLUX 1 LoRA APIs for text-to-image generation."
+ },
+ {
+ "author": "LargeModGames",
+ "title": "ComfyUI LoRA Auto Downloader [REMOVED]",
+ "reference": "https://github.com/LargeModGames/comfyui-smart-lora-downloader",
+ "files": [
+ "https://github.com/LargeModGames/comfyui-smart-lora-downloader"
+ ],
+ "install_type": "git-clone",
+ "description": "Automatically download missing LoRAs from CivitAI and detect missing LoRAs in workflows. Features smart directory detection and easy installation."
+ },
+ {
+ "author": "DiffusionWave",
+ "title": "PickResolution_DiffusionWave [DEPRECATED]",
+ "reference": "https://github.com/DiffusionWave/PickResolution_DiffusionWave",
+ "files": [
+ "https://github.com/DiffusionWave/PickResolution_DiffusionWave"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that allows selecting a base resolution, applying a custom scaling value based on FLOAT (up to 10 decimal places), and adding an extra integer value. Outputs include both INT and FLOAT resolutions, making it perfect for you to play around with."
+ },
+ {
+ "author": "geltz",
+ "title": "ComfyUI-geltz [REMOVED]",
+ "reference": "https://github.com/geltz/ComfyUI-geltz",
+ "files": [
+ "https://github.com/geltz/ComfyUI-geltz"
+ ],
+ "install_type": "git-clone",
+ "description": "Various custom nodes; guidance, latents, sampling, tokenization, etc."
+ },
+ {
+ "author": "anilsathyan7",
+ "title": "ComfyUI-Crystal-Upscaler [REMOVED]",
+ "reference": "https://github.com/anilsathyan7/ComfyUI-Crystal-Upscaler",
+ "files": [
+ "https://github.com/anilsathyan7/ComfyUI-Crystal-Upscaler"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for image upscaling using crystal upscaling technology. (Description by CC)"
+ },
+ {
+ "author": "nohikomiso",
+ "title": "ComfyUI-ImageFolderPicker [REMOVED/UNSAFE]",
+ "reference": "https://github.com/nohikomiso/ComfyUI-ImageFolderPicker",
+ "files": [
+ "https://github.com/nohikomiso/ComfyUI-ImageFolderPicker"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI node for browsing local server folders and selecting images via thumbnail display in a grid interface. (Description by CC)[w/This nodepack has a vulnerability that allows it to retrieve a list of files from arbitrary paths.]"
+ },
+ {
+ "author": "rzasharp79",
+ "title": "ComfyUI--SolarFlare [REMOVED]",
+ "reference": "https://github.com/rzasharp79/ComfyUI--SolarFlare",
+ "files": [
+ "https://github.com/rzasharp79/ComfyUI--SolarFlare"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Qwen Image, ..."
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-no-one-above-me [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-no-one-above-me",
+ "files": [
+ "https://github.com/shinich39/comfyui-no-one-above-me"
+ ],
+ "install_type": "git-clone",
+ "description": "Fix node to top."
+ },
+ {
+ "author": "octapus8085",
+ "title": "OpenAI-comfyui-O [REMOVED]",
+ "reference": "https://github.com/Spicely/Comfyui-File-Utils",
+ "files": [
+ "https://github.com/Spicely/Comfyui-File-Utils"
+ ],
+ "install_type": "git-clone",
+ "description": "This plugin provides multiple file-handling and utility nodes for ComfyUI, including: image saving, audio saving, video saving, video composition, audio-to-subtitle conversion, and random number generation nodes. These nodes not only process files but also return their absolute file paths.\nNOTE: The files in the repo are not organized.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "yemanou",
+ "title": "NABA Image (Gemini REST) Node [REMOVED]",
+ "reference": "https://github.com/yemanou/ComfyUI-NABA",
+ "files": [
+ "https://github.com/yemanou/ComfyUI-NABA"
+ ],
+ "install_type": "git-clone",
+ "description": "Simplified Gemini 2.5 Flash Image Preview node for ComfyUI. REST-only for stability, two optional reference images, padded aspect ratio resizing (no stretching), and basic sampling controls. All extra debug layers, SDK path, multi-seed, and legacy compatibility code removed to avoid crashes."
+ },
+ {
+ "author": "comrender",
+ "title": "ComfyUI-Nano-Banana-Resizer [REMOVED]",
+ "reference": "https://github.com/comrender/ComfyUI-Nano-Banana-Resizer",
+ "files": [
+ "https://github.com/comrender/ComfyUI-Nano-Banana-Resizer"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node that automatically calculates optimal output dimensions for Google's Nano Banana image editing model, supporting 22 aspect ratio buckets and ensuring pixel-perfect outputs without shifting or cropping."
+ },
+ {
+ "author": "comrender",
+ "title": "ComfyUI-edge-match-checker [REMOVED]",
+ "reference": "https://github.com/comrender/ComfyUI-edge-match-checker",
+ "files": [
+ "https://github.com/comrender/ComfyUI-edge-match-checker"
+ ],
+ "install_type": "git-clone",
+ "description": "Node comparing two image masks or images with adjustable overlap threshold (default 95%) for detecting minor shifts and mismatches in proportions, suitable for automated post-processing validation. (Description by CC)"
+ },
+ {
+ "author": "comrender",
+ "title": "ComfyUI-gpt5_image_text [REMOVED]",
+ "reference": "https://github.com/comrender/ComfyUI-gpt5_image_text",
+ "files": [
+ "https://github.com/comrender/ComfyUI-gpt5_image_text"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node for vision + text analysis using GPT-5 and GPT-4o with direct API key input, system prompt, temperature, max tokens, and multi-image support."
+ },
+ {
+ "author": "PozzettiAndrea",
+ "title": "ComfyUI-CameraAnalysis [REMOVED]",
+ "reference": "https://github.com/PozzettiAndrea/ComfyUI-CameraAnalysis",
+ "files": [
+ "https://github.com/PozzettiAndrea/ComfyUI-CameraAnalysis"
+ ],
+ "install_type": "git-clone",
+ "description": "Extracts camera intrinsic parameters from image EXIF data."
+ },
+ {
+ "author": "fuzr0dah",
+ "title": "comfyui-sceneassembly [REMOVED]",
+ "reference": "https://github.com/fuzr0dah/comfyui-sceneassembly",
+ "files": [
+ "https://github.com/fuzr0dah/comfyui-sceneassembly"
+ ],
+ "install_type": "git-clone",
+ "description": "A bunch of nodes I created that I also find useful."
+ },
+ {
+ "author": "rslosch",
+ "title": "ComfyUI-EZ_Prompts [REMOVED]",
+ "reference": "https://github.com/rslosch/ComfyUI-EZ_Prompts",
+ "files": [
+ "https://github.com/rslosch/ComfyUI-EZ_Prompts"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node extension that provides easy-to-use prompt templates and wildcards for AI image generation."
+ },
+ {
+ "author": "hvppycoding",
+ "title": "hvppyflow [REMOVED]",
+ "reference": "https://github.com/hvppycoding/hvppyflow",
+ "files": [
+ "https://github.com/hvppycoding/hvppyflow"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for Automated Workflow"
+ },
+ {
+ "author": "cedarconnor",
+ "title": "ComfyUI-GEN3C-Gsplat [REMOVED]",
+ "reference": "https://github.com/cedarconnor/ComfyUI-GEN3C-Gsplat",
+ "files": [
+ "https://github.com/cedarconnor/ComfyUI-GEN3C-Gsplat"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node pack that bridges Cosmos/GEN3C video generation with in-graph Gaussian Splat (3DGS) training. It adds camera/trajectory tooling, dataset exporters, and two training backends (Nerfstudio CLI wrapper and an in-process gsplat optimizer) so artists can go from prompt to splat entirely inside ComfyUI.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "dowa-git",
+ "title": "comfyui-dowa [REMOVED]",
+ "reference": "https://github.com/dowa-git/comfyui-dowa",
+ "files": [
+ "https://github.com/dowa-git/comfyui-dowa"
+ ],
+ "install_type": "git-clone",
+ "description": "Professional navigation bar widget for ComfyUI with JWT-based user authentication, workflow templates, and team collaboration features in a purple gradient design."
+ },
+ {
+ "author": "Fablestarexpanse",
+ "title": "Timer-Node-Comfyui [REMOVED]",
+ "reference": "https://github.com/Fablestarexpanse/Timer-Node-Comfyui",
+ "files": [
+ "https://github.com/Fablestarexpanse/Timer-Node-Comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node that displays live processing time in a red digital countdown clock format, perfect for monitoring image generation times and tracking performance between workflow nodes."
+ },
+ {
+ "author": "cedarconnor",
+ "title": "ComfyUI-OmniX [REMOVED]",
+ "reference": "https://github.com/cedarconnor/ComfyUI-OmniX",
+ "files": [
+ "https://github.com/cedarconnor/ComfyUI-OmniX"
+ ],
+ "install_type": "git-clone",
+ "description": "Extract comprehensive scene properties from 360-degree equirectangular panoramas, including depth, normals, and PBR materials, using OmniX adapters with Flux."
+ },
+ {
+ "author": "cedarconnor",
+ "title": "ComfyUI-DiT360 [REMOVED]",
+ "reference": "https://github.com/cedarconnor/ComfyUI-DiT360",
+ "files": [
+ "https://github.com/cedarconnor/ComfyUI-DiT360"
+ ],
+ "install_type": "git-clone",
+ "description": "Generate high-fidelity 360-degree panoramic images using the DiT360 diffusion transformer model in ComfyUI."
+ },
+ {
+ "author": "PozzettiAndrea",
+ "title": "ComfyUI-AnyTop [REMOVED]",
+ "reference": "https://github.com/PozzettiAndrea/ComfyUI-AnyTop",
+ "files": [
+ "https://github.com/PozzettiAndrea/ComfyUI-AnyTop"
+ ],
+ "install_type": "git-clone",
+ "description": "Standalone ComfyUI custom nodes for AnyTop - Universal Motion Generation for Any Skeleton Topology."
+ },
+ {
+ "author": "penposs",
+ "title": "ComfyUI-Banana-Node [REMOVED]",
+ "reference": "https://github.com/penposs/ComfyUI-Banana-Node",
+ "files": [
+ "https://github.com/penposs/ComfyUI-Banana-Node"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that generates images using Google’s Gemini 2.5 Flash Image Preview API."
+ },
+ {
+ "author": "spiralmountain",
+ "title": "ComfyUI_HDNodes [REMOVED]",
+ "reference": "https://github.com/spiralmountain/ComfyUI_HDNodes",
+ "files": [
+ "https://github.com/spiralmountain/ComfyUI_HDNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for ComfyUI that enable video generation using ByteDance's Seedance model via [a/Fal.ai](https://fal.ai/)."
+ },
+ {
+ "author": "fredconex",
+ "title": "Sync Edit [REMOVED]",
+ "reference": "https://github.com/fredconex/ComfyUI-SyncEdit",
+ "files": [
+ "https://github.com/fredconex/ComfyUI-SyncEdit"
+ ],
+ "install_type": "git-clone",
+ "description": "This node allow to intercept changes on the input string and choose between use the current one or sync with incoming new one."
+ },
+ {
+ "author": "fredconex",
+ "title": "ComfyUI-SoundFlow [REMOVED]",
+ "reference": "https://github.com/fredconex/ComfyUI-SoundFlow",
+ "files": [
+ "https://github.com/fredconex/ComfyUI-SoundFlow"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a bunch of nodes for ComfyUI to help with sound work."
+ },
+ {
+ "author": "fredconex",
+ "title": "SongBloom [REMOVED]",
+ "reference": "https://github.com/fredconex/ComfyUI-SongBloom",
+ "files": [
+ "https://github.com/fredconex/ComfyUI-SongBloom"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Nodes for SongBloom"
+ },
+ {
+ "author": "EQXai",
+ "title": "ComfyUI_EQX [REMOVED]",
+ "reference": "https://github.com/EQXai/ComfyUI_EQX",
+ "files": [
+ "https://github.com/EQXai/ComfyUI_EQX"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: SaveImage_EQX, File Image Selector, Load Prompt From File - EQX, LoraStackEQX_random, Extract Filename - EQX, Extract LORA name - EQX, NSFW Detector EQX, NSFW Detector Advanced EQX"
+ },
+ {
+ "author": "wizdroid",
+ "title": "Wizdroid ComfyUI Outfit Selection [REMOVED]",
+ "reference": "https://github.com/wizdroid/wizdroid-fashionista",
+ "files": [
+ "https://github.com/wizdroid/wizdroid-fashionista"
+ ],
+ "install_type": "git-clone",
+ "description": "A comprehensive outfit generation system for ComfyUI with AI-powered prompt enhancement and dynamic outfit composition."
+ },
+ {
+ "author": "enternalsaga",
+ "title": "NBA-ComfyUINode [REMOVED]",
+ "reference": "https://github.com/enternalsaga/NBA-ComfyUINode-public",
+ "files": [
+ "https://github.com/enternalsaga/NBA-ComfyUINode-public"
+ ],
+ "install_type": "git-clone",
+ "description": "Version 1.2.1 - Dependency cleanup and archived LineSelector node\nA comprehensive collection of custom nodes for ComfyUI, providing advanced image processing, workflow control, and utility functions to enhance your AI image generation workflows."
+ },
+ {
+ "author": "sselpah",
+ "title": "ComfyUI-sselpah-nodes [REMOVED]",
+ "reference": "https://github.com/sselpah/ComfyUI-sselpah-nodes",
+ "files": [
+ "https://github.com/sselpah/ComfyUI-sselpah-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Extension of IPAdapter implementation by cubiq and whoever contributed to that repository"
+ },
+ {
+ "author": "vsaan212",
+ "title": "ComfyUI Text Split Node [REMOVED]",
+ "reference": "https://github.com/vsaan212/Comfy-ui-textsplit",
+ "files": [
+ "https://github.com/vsaan212/Comfy-ui-textsplit"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node that splits text into multiple outputs for feeding complex multi-scene renders. This node allows you to dynamically control the number of splits and use custom separators."
+ },
+ {
+ "author": "EnragedAntelope",
+ "title": "ComfyUI-Doubutsu-Describer [DEPRECATED]",
+ "reference": "https://github.com/EnragedAntelope/ComfyUI-Doubutsu-Describer",
+ "files": [
+ "https://github.com/EnragedAntelope/ComfyUI-Doubutsu-Describer"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node for ComfyUI allows you to use the Doubutsu small VLM model to describe images. Credit and further information on Doubutsu: [a/https://huggingface.co/qresearch/doubutsu-2b-pt-756](https://huggingface.co/qresearch/doubutsu-2b-pt-756)"
+ },
+ {
+ "author": "vsaan212",
+ "title": "ComfyUI Subject Selector [DEPRECATED]",
+ "reference": "https://github.com/vsaan212/ComfyUI_subjectselector",
+ "files": [
+ "https://github.com/vsaan212/ComfyUI_subjectselector"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI_subjectselector is a custom ComfyUI node that allows you to manage and select text-based subject descriptions directly from the workflow UI. This node was designed to pair seamlessly with [a/ComfyUI-textsplit](https://github.com/vsaan212/Comfy-ui-textsplit), providing a clean, modular way to feed descriptive text prompts into your generation pipeline."
+ },
+ {
+ "author": "agxagi",
+ "title": "Autoregressive Transformer and Rolling Diffusion Sampler for ComfyUI [REMOVED]",
+ "reference": "https://github.com/agxagi/ComfyUI-GPT4o-Image-Gen-FLUX-DEV",
+ "files": [
+ "https://github.com/agxagi/ComfyUI-GPT4o-Image-Gen-FLUX-DEV"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node that implements an Autoregressive Transformer and Rolling Diffusion-like Decoder using Black Forest Lab's Flux-Dev model for accurate text-to-image generation, similar to GPT-4o's image generation approach.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "walke2019",
+ "title": "ComfyUI-GGUF-VisionLM [REMOVED]",
+ "reference": "https://github.com/walke2019/ComfyUI-GGUF-VisionLM",
+ "files": [
+ "https://github.com/walke2019/ComfyUI-GGUF-VisionLM"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for running GGUF quantized Qwen2.5-VL models using llama.cpp"
+ },
+ {
+ "author": "neocrz",
+ "title": "comfyui-tinyae [REMOVED]",
+ "reference": "https://github.com/neocrz/comfyui-tinyae",
+ "files": [
+ "https://github.com/neocrz/comfyui-tinyae"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: TinyAE Encode (Image/Video), TinyAE Decode (Image/Video), TinyAE Encode Tiled (Image), TinyAE Decode Tiled (Image)"
+ },
+ {
+ "author": "Laser-one",
+ "title": "ComfyUI-align-pose [REMOVED]",
+ "reference": "https://github.com/Laser-one/ComfyUI-align-pose",
+ "files": [
+ "https://github.com/Laser-one/ComfyUI-align-pose"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:align pose"
+ },
+ {
+ "author": "nomadoor",
+ "title": "ComfyUI Video Stabilizer",
+ "reference": "https://github.com/nomadoor/ComfyUI-Video-Stabilizer",
+ "files": [
+ "https://github.com/nomadoor/ComfyUI-Video-Stabilizer"
+ ],
+ "install_type": "git-clone",
+ "description": "Two complementary stabiliser nodes for ComfyUI: Video Stabilizer (Classic), Video Stabilizer (Flow)"
+ },
+ {
+ "author": "0xhappydev",
+ "title": "comfyui-qwen-image-tools",
+ "reference": "https://github.com/0xhappydev/comfyui-qwen-image-tools",
+ "files": [
+ "https://github.com/0xhappydev/comfyui-qwen-image-tools"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for Qwen-Image-Edit with multi-image support, more flexibility around the vision transformer (qwen2.5-vl), custom system prompts, and some other experimental things to come."
+ },
+ {
+ "author": "Rathius-Saranoth",
+ "title": "Rathius ComfyUI Nodes",
+ "reference": "https://github.com/Rathius-Saranoth/rathius-comfyui-nodes",
+ "files": [
+ "https://github.com/Rathius-Saranoth/rathius-comfyui-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for ComfyUI by Rathius"
+ },
+ {
+ "author": "Hiero207",
+ "title": "Hiero-Nodes [REMOVED]",
+ "id": "hiero",
+ "reference": "https://github.com/Hiero207/ComfyUI-Hiero-Nodes",
+ "files": [
+ "https://github.com/Hiero207/ComfyUI-Hiero-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Post to Discord w/ Webhook"
+ },
+ {
+ "author": "NeoDroleDeGueule",
+ "title": "comfyui-image-mixer",
+ "reference": "https://github.com/NeoDroleDeGueule/comfyui-image-mixer [REMOVED]",
+ "files": [
+ "https://github.com/NeoDroleDeGueule/comfyui-image-mixer"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node that blends two images in latent space using a mix factor slider."
+ },
+ {
+ "author": "Glarus-akash",
+ "title": "ComfyUI_Image_Upscaler [REMOVED]",
+ "reference": "https://github.com/Glarus-akash/ComfyUI_Image_Upscaler",
+ "files": [
+ "https://github.com/Glarus-akash/ComfyUI_Image_Upscaler"
+ ],
+ "install_type": "git-clone",
+ "description": "Welcome to the Image Upscaler & Restorer project! This tool utilizes the [a/GFPGAN](https://github.com/TencentARC/GFPGAN) algorithm to enhance and restore images, providing a seamless way to improve image quality."
+ },
+ {
+ "author": "styletransfer",
+ "title": "Sequential Group Controller for ComfyUI [REMOVED]",
+ "reference": "https://github.com/styletransfer/ComfyUI_SequentialGroupController",
+ "files": [
+ "https://github.com/styletransfer/ComfyUI_SequentialGroupController"
+ ],
+ "install_type": "git-clone",
+ "description": "Control which groups execute based on iteration ranges - a simplified alternative to complex conditional branching workflows."
+ },
+ {
+ "author": "xl0",
+ "title": "q_tools [REMOVED]",
+ "reference": "https://github.com/xl0/q_tools",
+ "files": [
+ "https://github.com/xl0/q_tools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: QLoadLatent, QLinearScheduler, QPreviewLatent, QGaussianLatent, QUniformLatent, QKSampler"
+ },
+ {
+ "author": "tmode-1960",
+ "title": "comfyui-ta-nodes-pack [REMOVED]",
+ "reference": "https://github.com/tmode-1960/comfyui-ta-nodes-pack",
+ "files": [
+ "https://github.com/tmode-1960/comfyui-ta-nodes-pack"
+ ],
+ "install_type": "git-clone",
+ "description": "Model loaders with an additional model name output"
+ },
+ {
+ "author": "Shadetail",
+ "title": "Eagleshadow Custom Nodes [REMOVED]",
+ "id": "eagleshadow",
+ "reference": "https://github.com/Shadetail/ComfyUI_Eagleshadow",
+ "files": [
+ "https://github.com/Shadetail/ComfyUI_Eagleshadow"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for ComfyUI by Eagleshadow."
+ },
+ {
+ "author": "manycore-maas",
+ "title": "ComfyUI-SpatialGen [REMOVED]",
+ "reference": "https://github.com/manycore-maas/ComfyUI-SpatialGen",
+ "files": [
+ "https://github.com/manycore-maas/ComfyUI-SpatialGen"
+ ],
+ "install_type": "git-clone",
+ "description": "Scene Viewer of SpatialGen"
+ },
+ {
+ "author": "YinBailiang",
+ "title": "MergeBlockWeighted_fo_ComfyUI [REMOVED]",
+ "id": "mergeblockweighted_fo_comfyui",
+ "reference": "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI",
+ "files": [
+ "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: MergeBlockWeighted"
+ },
+ {
+ "author": "facok",
+ "title": "ComfyUI-FokToolset [REMOVED]",
+ "reference": "https://github.com/facok/ComfyUI-FokToolset",
+ "files": [
+ "https://github.com/facok/ComfyUI-FokToolset"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Fok Preprocess Ref Image (Phantom)"
+ },
+ {
+ "author": "Elawphant",
+ "title": "ComfyUI-MusicGen [WIP]",
+ "id": "musicgen",
+ "reference": "https://github.com/Elawphant/ComfyUI-MusicGen",
+ "files": [
+ "https://github.com/Elawphant/ComfyUI-MusicGen"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI for Meta MusicGen."
+ },
+ {
+ "author": "isaac-mcfadyen",
+ "title": "ComfyUI-QwenClip [REMOVED]",
+ "reference": "https://github.com/isaac-mcfadyen/ComfyUI-QwenClip",
+ "files": [
+ "https://github.com/isaac-mcfadyen/ComfyUI-QwenClip"
+ ],
+ "install_type": "git-clone",
+ "description": "A variety of random text encoder tools intended for use with ComfyUI and Qwen Image/Qwen Image Edit. More (may) be added as I try out various modifications to Qwen Image."
+ },
+ {
+ "author": "Gaotian",
+ "title": "KLComfyUI-Nodes [REMOVED]",
+ "reference": "https://github.com/Gaotian-cpu/KLComfyUI-Nodes",
+ "files": [
+ "https://github.com/Gaotian-cpu/KLComfyUI-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Single Video_Img Callback"
+ },
+ {
+ "author": "geltz",
+ "title": "Momentum Guidance for ComfyUI [REMOVED]",
+ "reference": "https://github.com/geltz/ComfyUI-MomentumGuidance",
+ "files": [
+ "https://github.com/geltz/ComfyUI-MomentumGuidance"
+ ],
+ "install_type": "git-clone",
+ "description": "Momentum Guidance (MG) is a training-free guidance method that reduces computational cost by 40% compared to standard guidance techniques like CFG or PAG."
+ },
+ {
+ "author": "GeekyGhost",
+ "title": "Studio42 Image, Audio, and Video Editing Suite for ComfyUI [REMOVED]",
+ "reference": "https://github.com/GeekyGhost/24oiduts-ComfyUI",
+ "files": [
+ "https://github.com/GeekyGhost/24oiduts-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "Studio42 is a comprehensive suite of advanced custom nodes that brings professional-grade image and video editing capabilities to ComfyUI. Designed for efficiency, quality, and creative flexibility, this suite provides cutting-edge background removal, layer composition, and patch manipulation tools used in modern VFX and content creation workflows."
+ },
+ {
+ "author": "rvage",
+ "title": "ComfyUI-RvTools-X [REMOVED]",
+ "reference": "https://github.com/r-vage/ComfyUI-RvTools-X",
+ "files": [
+ "https://github.com/r-vage/ComfyUI-RvTools-X"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes and utilities for workflow building, type conversions, checkpoint/pipe loaders and file utilities."
+ },
+ {
+ "author": "heyburns",
+ "title": "LinxUtil [REMOVED]",
+ "reference": "https://github.com/heyburns/LinxUtil",
+ "files": [
+ "https://github.com/heyburns/LinxUtil"
+ ],
+ "install_type": "git-clone",
+ "description": "Utility nodes for ComfyUI. Created solely for my own use case, shared as a courtesy only.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "fcanfora",
+ "title": "comfyui-camera-tools [REMOVED]",
+ "reference": "https://github.com/fcanfora/comfyui-camera-tools",
+ "files": [
+ "https://github.com/fcanfora/comfyui-camera-tools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load Camera From File, Load 3D, Load 3D - Animation, Preview 3D, Preview 3D - Animation"
+ },
+ {
+ "author": "ziwang-com",
+ "title": "comfyui-deepseek-r1 [REMOVED]",
+ "reference": "https://github.com/ziwang-com/comfyui-deepseek-r1",
+ "files": [
+ "https://github.com/ziwang-com/comfyui-deepseek-r1"
+ ],
+ "install_type": "git-clone",
+ "description": "Comfyui-deepseek-r1 Node Plugin"
+ },
+ {
+ "author": "leeguandong",
+ "title": "ComfyUI nodes to use Xverse [REMOVED]",
+ "reference": "https://github.com/leeguandong/ComfyUI_Xverse",
+ "files": [
+ "https://github.com/leeguandong/ComfyUI_Xverse"
+ ],
+ "install_type": "git-clone",
+ "description": "The ComfyUI version of [a/XVerse](https://github.com/bytedance/XVerse)"
+ },
+ {
+ "author": "Dehypnotic",
+ "title": "Dehypnotic Save nodes [REMOVED]",
+ "reference": "https://github.com/Dehypnotic/comfyui-dehypnotic-save-nodes",
+ "files": [
+ "https://github.com/Dehypnotic/comfyui-dehypnotic-save-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Save toolkit for audio, image, and video: MP3 audio export with VBR/CBR options, multi-format image saving with workflow/thumbnail metadata, and video + frame encoding (MP4/MKV/WEBM/MOV) — all sharing whitelist-safe paths and rich placeholder templating."
+ },
+ {
+ "author": "znuost10",
+ "title": "comfyui-multi-float-output [REMOVED]",
+ "reference": "https://github.com/znuost10/comfyui-multi-float-output",
+ "files": [
+ "https://github.com/znuost10/comfyui-multi-float-output"
+ ],
+ "install_type": "git-clone",
+ "description": "System monitoring API endpoints for ComfyUI by otoy SKW"
+ },
+ {
+ "author": "rakki194",
+ "title": "ComfyUI_WolfSigmas [UNSAFE/REMOVED]",
+ "reference": "https://github.com/rakki194/ComfyUI_WolfSigmas",
+ "files": [
+ "https://github.com/rakki194/ComfyUI_WolfSigmas"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom nodepack for ComfyUI provides a suite of tools for generating and manipulating sigma schedules for diffusion models. These nodes are particularly useful for fine-tuning the sampling process, experimenting with different step counts, and adapting schedules for specific models.[w/Security Warning: Remote Code Execution]"
+ },
+ {
+ "author": "Maff3u",
+ "title": "MattiaNodes - Points Editor On Cropped [REMOVED]",
+ "reference": "https://github.com/Maff3u/MattiaNodes",
+ "files": [
+ "https://github.com/Maff3u/MattiaNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A standalone ComfyUI custom node for interactive coordinate editing with crop factor correction.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "rakki194",
+ "title": "ComfyUI-ImageCompare [REMOVED]",
+ "reference": "https://github.com/rakki194/ComfyUI-ImageCompare",
+ "files": [
+ "https://github.com/rakki194/ComfyUI-ImageCompare"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple custom node for ComfyUI that allows you to compare two images (or batches of images) side-by-side within the UI."
+ },
+ {
+ "author": "APZmedia",
+ "title": "NormalMapLightEstimator [REMOVED]",
+ "reference": "https://github.com/APZmedia/Comfyui-LightDirection-estimation",
+ "files": [
+ "https://github.com/APZmedia/Comfyui-LightDirection-estimation"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node for estimating light direction and quality from normal maps using luma masking. The system analyzes surface normals to infer lighting information for downstream tasks like adaptive relighting, directional masking, or stylized effects."
+ },
+ {
+ "author": "APZmedia",
+ "title": "ComfyUI APZmedia PSD Tools [REMOVED]",
+ "reference": "https://github.com/APZmedia/APZmedia-ComfyUI-PSDtools",
+ "files": [
+ "https://github.com/APZmedia/APZmedia-ComfyUI-PSDtools"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension provides PSD layer saving functionalities with mask support for ComfyUI."
+ },
+ {
+ "author": "huixingyun",
+ "title": "ComfyUI-HX-Pimg [REMOVED]",
+ "reference": "https://github.com/huixingyun/ComfyUI-HX-Pimg",
+ "files": [
+ "https://github.com/huixingyun/ComfyUI-HX-Pimg"
+ ],
+ "install_type": "git-clone",
+ "description": "Some custom nodes used for pimg (a comfyui controller deployed in huixingyun)."
+ },
+ {
+ "author": "rvage",
+ "title": "ComfyUI-RvToolsX [REMOVED]",
+ "reference": "https://github.com/r-vage/ComfyUI-RvToolsX",
+ "files": [
+ "https://github.com/r-vage/ComfyUI-RvToolsX"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes and utilities for workflow building, type conversions, checkpoint/pipe loaders and file utilities."
+ },
+ {
+ "author": "usman2003",
+ "title": "ComfyUI-RaceDetect [REMOVED]",
+ "reference": "https://github.com/usman2003/ComfyUI-RaceDetect",
+ "files": [
+ "https://github.com/usman2003/ComfyUI-RaceDetect"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Race Detection V2"
+ },
+ {
+ "author": "lihaoyun6",
+ "title": "ComfyUI-CSV-Random-Picker [REMOVED]",
+ "reference": "https://github.com/lihaoyun6/ComfyUI-CSV-Random-Picker",
+ "files": [
+ "https://github.com/lihaoyun6/ComfyUI-CSV-Random-Picker"
+ ],
+ "install_type": "git-clone",
+ "description": "String random picker for ComfyUI"
+ },
+ {
+ "author": "r-vage",
+ "title": "ComfyUI-RvTools_v2 [REMOVED]",
+ "reference": "https://github.com/r-vage/ComfyUI-RvTools_v2",
+ "files": [
+ "https://github.com/r-vage/ComfyUI-RvTools_v2"
+ ],
+ "install_type": "git-clone",
+ "description": "this node contains a lot of small little helpers like switches, passers and selectors that i use a lot to build my workflows."
+ },
+ {
+ "author": "Yuxi Liu",
+ "title": "comfyui-ddu [REMOVED]",
+ "reference": "https://github.com/YL-Lyx/Comfyui-ddu-toolchain",
+ "files": [
+ "https://github.com/YL-Lyx/Comfyui-ddu-toolchain"
+ ],
+ "install_type": "git-clone",
+ "description": "ai-driven toolchain for digital design and fabrication "
+ },
+ {
+ "author": "lu64k",
+ "title": "SK-Nodes [REMOVED]",
+ "reference": "https://github.com/lu64k/SK-Nodes",
+ "files": [
+ "https://github.com/lu64k/SK-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:image select, Load AnyLLM, Ask LLM, OpenAI DAlle Node, SK Text_String, SK Random File Name"
+ },
+ {
+ "author": "SiggEye",
+ "title": "FaceCanon — Consistent Faces at Any Resolution [REMOVED]",
+ "reference": "https://github.com/SiggEye/FaceCanon",
+ "files": [
+ "https://github.com/SiggEye/FaceCanon"
+ ],
+ "install_type": "git-clone",
+ "description": "FaceCanon scales a detected face to a canonical pixel size, lets you run your favorite face detailer at that sweet spot, then maps the result back into the original image with seamless blending. The payoff is consistent face style no matter the input resolution or framing."
+ },
+ {
+ "author": "AlfredClark",
+ "title": "ComfyUI-ModelSpec [REMOVED]",
+ "reference": "https://github.com/AlfredClark/ComfyUI-ModelSpec",
+ "files": [
+ "https://github.com/AlfredClark/ComfyUI-ModelSpec"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI model metadata editing nodes."
+ },
+ {
+ "author": "VraethrDalkr",
+ "title": "ComfyUI-ProgressiveBlend [REMOVED]",
+ "reference": "https://github.com/VraethrDalkr/ComfyUI-ProgressiveBlend",
+ "files": [
+ "https://github.com/VraethrDalkr/ComfyUI-ProgressiveBlend"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI that enable progressive blending and color matching effects across image batches/video frames."
+ },
+ {
+ "author": "xmarked-ai",
+ "title": "ComfyUI_misc [REMOVED]",
+ "reference": "https://github.com/xmarked-ai/ComfyUI_misc",
+ "files": [
+ "https://github.com/xmarked-ai/ComfyUI_misc"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Ace IntegerX, Ace FloatX, Ace Color FixX, White Balance X, Depth Displace X, Empty Latent X, KSampler Combo X, ..."
+ },
+ {
+ "author": "sm079",
+ "title": "ComfyUI-Face-Detection [REMOVED]",
+ "reference": "https://github.com/sm079/ComfyUI-Face-Detection",
+ "files": [
+ "https://github.com/sm079/ComfyUI-Face-Detection"
+ ],
+ "install_type": "git-clone",
+ "description": "face detection nodes for comfyui"
+ },
+ {
+ "author": "42lux",
+ "title": "ComfyUI-42lux [REMOVED]",
+ "reference": "https://github.com/42lux/ComfyUI-42lux",
+ "files": [
+ "https://github.com/42lux/ComfyUI-42lux"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI focused on enhanced sampling, model optimization, and quality improvements."
+ },
+ {
+ "author": "lucak5s",
+ "title": "ComfyUI GFPGAN [REMOVED]",
+ "reference": "https://github.com/lucak5s/comfyui_gfpgan",
+ "files": [
+ "https://github.com/lucak5s/comfyui_gfpgan"
+ ],
+ "install_type": "git-clone",
+ "description": "Face restoration with GFPGAN."
+ },
+ {
+ "author": "impactframes",
+ "title": "IF_AI_tools [DEPRECATED]",
+ "id": "impactframes-tools",
+ "reference": "https://github.com/if-ai/ComfyUI-IF_AI_tools",
+ "files": [
+ "https://github.com/if-ai/ComfyUI-IF_AI_tools"
+ ],
+ "install_type": "git-clone",
+ "description": "Various AI tools to use in Comfy UI. Starting with VL and prompt making tools using Ollma as backend will evolve as I find time."
+ },
+ {
+ "author": "netroxin",
+ "title": "comfyui_netro [REMOVED]",
+ "reference": "https://github.com/netroxin/comfyui_netro",
+ "files": [
+ "https://github.com/netroxin/comfyui_netro"
+ ],
+ "install_type": "git-clone",
+ "description": "#Camera Movement Prompt Node for ComfyUI\nThis custom node script for ComfyUI generates descriptive camera movement prompts based on user-selected movement options for Wan2.2"
+ },
+ {
+ "author": "aistudynow",
+ "title": "comfyui-HunyuanImage-2.1 [REMOVED]",
+ "reference": "https://github.com/aistudynow/comfyui-HunyuanImage-2.1",
+ "files": [
+ "https://github.com/aistudynow/comfyui-HunyuanImage-2.1"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load HunyuanImage DiT, Load HunyuanImage VAE, Load HunyuanImage Dual Text Encoder, HunyuanImage Sampler, HunyuanImage VAE Decode, HunyuanImage CLIP Text Encode, Empty HunyuanImage Latent Image"
+ },
+ {
+ "author": "SlackinJack",
+ "title": "distrifuser_comfyui [DEPRECATED]",
+ "reference": "https://github.com/SlackinJack/distrifuser_comfyui",
+ "files": [
+ "https://github.com/SlackinJack/distrifuser_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "[a/Distrifuser](https://github.com/mit-han-lab/distrifuser) sampler node for ComfyUI\n"
+ },
+ {
+ "author": "SlackinJack",
+ "title": "asyncdiff_comfyui [DEPRECATED]",
+ "reference": "https://github.com/SlackinJack/asyncdiff_comfyui",
+ "files": [
+ "https://github.com/SlackinJack/asyncdiff_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "AsyncDiff node for ComfyUI"
+ },
+ {
+ "author": "TheBill2001",
+ "title": "Save Images with Captions [REMOVED]",
+ "reference": "https://github.com/TheBill2001/ComfyUI-Save-Image-Caption",
+ "files": [
+ "https://github.com/TheBill2001/ComfyUI-Save-Image-Caption"
+ ],
+ "install_type": "git-clone",
+ "description": "Provide two custom nodes to load and save images with captions as separate files."
+ },
+ {
+ "author": "ShmuelRonen",
+ "title": "ComfyUI Flux 1.1 Ultra & Raw Node [REMOVED]",
+ "reference": "https://github.com/ShmuelRonen/ComfyUI_Flux_1.1_RAW_API",
+ "files": [
+ "https://github.com/ShmuelRonen/ComfyUI_Flux_1.1_RAW_API"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI custom node for Black Forest Labs' FLUX 1.1 [pro] API, supporting both regular and Ultra modes with optional Raw mode."
+ },
+ {
+ "author": "mattwilliamson",
+ "title": "ComfyUI AI GameDev Nodes [UNSAFE/REMOVED]",
+ "reference": "https://github.com/mattwilliamson/comfyui-ai-gamedev",
+ "files": [
+ "https://github.com/mattwilliamson/comfyui-ai-gamedev"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes for AI-powered game asset generation, providing a comprehensive toolkit for game developers to create 3D models, animations, and audio assets using state-of-the-art AI models.[w/This node pack has an implementation that dynamically generates scripts.]"
+ },
+ {
+ "author": "manifestations",
+ "title": "ComfyUI Outfit Nodes [DEPRECATED]",
+ "reference": "https://github.com/manifestations/comfyui-outfit",
+ "files": [
+ "https://github.com/manifestations/comfyui-outfit"
+ ],
+ "install_type": "git-clone",
+ "description": "Advanced, professional outfit and makeup generation nodes for ComfyUI, with dynamic UI and AI-powered prompt formatting."
+ },
+ {
+ "author": "Poukpalaova",
+ "title": "ComfyUI-FRED-Nodes [DEPRECATED]",
+ "reference": "https://github.com/Poukpalaova/ComfyUI-FRED-Nodes",
+ "files": [
+ "https://github.com/Poukpalaova/ComfyUI-FRED-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Multiple nodes that ease the process.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "cwebbi1",
+ "title": "VoidCustomNodes [REMOVED]",
+ "reference": "https://github.com/cwebbi1/VoidCustomNodes",
+ "files": [
+ "https://github.com/cwebbi1/VoidCustomNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Prompt Parser, String Combiner"
+ },
+ {
+ "author": "Shellishack",
+ "title": "ComfyUI Remote Media Loaders [REMOVED]",
+ "reference": "https://github.com/Shellishack/comfyui-remote-media-loaders",
+ "files": [
+ "https://github.com/Shellishack/comfyui-remote-media-loaders"
+ ],
+ "install_type": "git-clone",
+ "description": "Load media (image/video/audio) from remote URL"
+ },
+ {
+ "author": "D3lUX3I",
+ "title": "VideoPromptEnhancer [REMOVED]",
+ "reference": "https://github.com/D3lUX3I/ComfyUI-VideoPromptEnhancer",
+ "files": [
+ "https://github.com/D3lUX3I/ComfyUI-VideoPromptEnhancer"
+ ],
+ "install_type": "git-clone",
+ "description": "This node generates a professional prompt from an input text for modern video AI models (e.g., Alibaba Wan 2.2) via the OpenRouter API."
+ },
+ {
+ "author": "perilli",
+ "title": "apw_nodes [REMOVED]",
+ "reference": "https://github.com/alessandroperilli/APW_Nodes",
+ "files": [
+ "https://github.com/alessandroperilli/APW_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node suite to augment the capabilities of the [a/AP Workflows for ComfyUI](https://perilli.com/ai/comfyui/)\nNOTE: See [a/Open Creative Studio Nodes](https://github.com/alessandroperilli/OCS_Nodes)"
+ },
+ {
+ "author": "greengerong",
+ "title": "ComfyUI-Lumina-Video [REMOVED]",
+ "reference": "https://github.com/greengerong/ComfyUI-Lumina-Video",
+ "files": [
+ "https://github.com/greengerong/ComfyUI-Lumina-Video"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a video generation plugin implementation for ComfyUI based on the Lumina Video model."
+ },
+ {
+ "author": "SatadalAI",
+ "title": "Combined Upscale Node for ComfyUI [REMOVED]",
+ "reference": "https://github.com/SatadalAI/SATA_UtilityNode",
+ "files": [
+ "https://github.com/SatadalAI/SATA_UtilityNode"
+ ],
+ "install_type": "git-clone",
+ "description": "Combined_Upscale is a custom ComfyUI node designed for high-quality image enhancement workflows. It intelligently combines model-based upscaling with efficient CPU-based resizing, offering granular control over output dimensions and quality. Ideal for asset pipelines, UI prototyping, and generative workflows.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "netroxin",
+ "title": "Netro_wildcards [REMOVED]",
+ "reference": "https://github.com/netroxin/comfyui_netro_wildcards",
+ "files": [
+ "https://github.com/netroxin/comfyui_netro_wildcards"
+ ],
+ "install_type": "git-clone",
+ "description": "Since I used 'simple wildcards' from Vanilla and it no longer works with the new Comfy UI version for me, I created an alternative. This CustomNode takes the entire contents of your wildcards-folder(comfyui wildcards) and creates a node for each one."
+ },
+ {
+ "author": "takoyaki1118",
+ "title": "ComfyUI-MangaTools [REMOVED]",
+ "reference": "https://github.com/takoyaki1118/ComfyUI-MangaTools",
+ "files": [
+ "https://github.com/takoyaki1118/ComfyUI-MangaTools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Manga Panel Detector, Manga Panel Dispatcher, GateImage, MangaPageAssembler"
+ },
+ {
+ "author": "lucasgattas",
+ "title": "comfyui-egregora-regional [REMOVED]",
+ "reference": "https://github.com/lucasgattas/comfyui-egregora-regional",
+ "files": [
+ "https://github.com/lucasgattas/comfyui-egregora-regional"
+ ],
+ "install_type": "git-clone",
+ "description": "Image Tile Split with Region-Aware Prompting for ComfyUI"
+ },
+ {
+ "author": "lucasgattas",
+ "title": "comfyui-egregora-tiled [REMOVED]",
+ "reference": "https://github.com/lucasgattas/comfyui-egregora-tiled",
+ "files": [
+ "https://github.com/lucasgattas/comfyui-egregora-tiled"
+ ],
+ "install_type": "git-clone",
+ "description": "Tiled regional prompting + tiled VAE decode with seam-free blending for ComfyUI"
+ },
+ {
+ "author": "Seedsa",
+ "title": "ComfyUI Fooocus Nodes [REMOVED]",
+ "id": "fooocus-nodes",
+ "reference": "https://github.com/Seedsa/Fooocus_Nodes",
+ "files": [
+ "https://github.com/Seedsa/Fooocus_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension provides image generation features based on Fooocus."
+ },
+ {
+ "author": "zhilemann",
+ "title": "ComfyUI-moondream2 [REMOVED]",
+ "reference": "https://github.com/zhilemann/ComfyUI-moondream2",
+ "files": [
+ "https://github.com/zhilemann/ComfyUI-moondream2"
+ ],
+ "install_type": "git-clone",
+ "description": "nodes for nightly moondream2 VLM inference\nsupports only captioning and visual queries at the moment"
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-textarea-is-shit [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-textarea-is-shit",
+ "files": [
+ "https://github.com/shinich39/comfyui-textarea-is-shit"
+ ],
+ "description": "HTML gives me a textarea like piece of shit.",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-poor-textarea [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-poor-textarea",
+ "files": [
+ "https://github.com/shinich39/comfyui-poor-textarea"
+ ],
+ "install_type": "git-clone",
+ "description": "Add commentify, indentation, auto-close brackets in textarea."
+ },
+ {
+ "author": "InfiniNode",
+ "title": "Comfyui-InfiniNode-Model-Suite [UNSAFE/REMOVED]",
+ "reference": "https://github.com/InfiniNode/Comfyui-InfiniNode-Model-Suite",
+ "files": [
+ "https://github.com/InfiniNode/Comfyui-InfiniNode-Model-Suite"
+ ],
+ "install_type": "git-clone",
+ "description": "Welcome to the InfiniNode Model Suite, a custom node pack for ComfyUI that transforms the process of manipulating generative AI models. Our suite is a direct implementation of the 'GUI-Based Key Converter Development Plan,' designed to remove technical barriers for advanced AI practitioners and integrate seamlessly with existing image generation pipelines.[w/This node pack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
+ },
+ {
+ "author": "Avalre",
+ "title": "ComfyUI-avaNodes [REMOVED]",
+ "reference": "https://github.com/Avalre/ComfyUI-avaNodes",
+ "files": [
+ "https://github.com/Avalre/ComfyUI-avaNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "These nodes were created to personalize/optimize several ComfyUI nodes for my own use. You can replicate the functionality of most of my nodes by some combination of default ComfyUI nodes and custom nodes from other developers."
+ },
+ {
+ "author": "Alectriciti",
+ "title": "comfyui-creativeprompts [REMOVED]",
+ "reference": "https://github.com/Alectriciti/comfyui-creativeprompts",
+ "files": [
+ "https://github.com/Alectriciti/comfyui-creativeprompts"
+ ],
+ "install_type": "git-clone",
+ "description": "A creative alternative to dynamicprompts"
+ },
+ {
+ "author": "flybirdxx",
+ "title": "ComfyUI Sliding Window [REMOVED]",
+ "reference": "https://github.com/PixWizardry/ComfyUI_Sliding_Window",
+ "files": [
+ "https://github.com/PixWizardry/ComfyUI_Sliding_Window"
+ ],
+ "install_type": "git-clone",
+ "description": "This set of nodes provides a powerful sliding window or 'tiling' technique for processing long videos and animations in ComfyUI. It allows you to work on animations that are longer than your VRAM would typically allow by breaking the job into smaller, overlapping chunks and seamlessly blending them back together."
+ },
+ {
+ "author": "SykkoAtHome",
+ "title": "Sykko Tools for ComfyUI [REMOVED]",
+ "reference": "https://github.com/SykkoAtHome/ComfyUI_SykkoTools",
+ "files": [
+ "https://github.com/SykkoAtHome/ComfyUI_SykkoTools"
+ ],
+ "install_type": "git-clone",
+ "description": "Utilities for working with camera animations inside ComfyUI. The repository currently provides a node for loading camera motion from ASCII FBX files and a corresponding command line helper for debugging."
+ },
+ {
+ "author": "hananbeer",
+ "title": "node_dev - ComfyUI Node Development Helper [REMOVED]",
+ "reference": "https://github.com/hananbeer/node_dev",
+ "files": [
+ "https://github.com/hananbeer/node_dev"
+ ],
+ "install_type": "git-clone",
+ "description": "Browse to this endpoint to reload custom nodes for more streamlined development:\nhttp://127.0.0.1:8188/node_dev/reload/"
+ },
+ {
+ "author": "Charonartist",
+ "title": "Comfyui_gemini_tts_node [REMOVED]",
+ "reference": "https://github.com/Charonartist/Comfyui_gemini_tts_node",
+ "files": [
+ "https://github.com/Charonartist/Comfyui_gemini_tts_node"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node is a ComfyUI node for generating speech from text using the Gemini 2.5 Flash Preview TTS API."
+ },
+ {
+ "author": "squirrel765",
+ "title": "lorasubdirectory [REMOVED]",
+ "reference": "https://github.com/andrewsthomasj/lorasubdirectory",
+ "files": [
+ "https://github.com/andrewsthomasj/lorasubdirectory"
+ ],
+ "install_type": "git-clone",
+ "description": "only show dropdown of loras ina a given subdirectory"
+ },
+ {
+ "author": "shingo1228",
+ "title": "ComfyUI-send-Eagle(slim) [REVMOED]",
+ "id": "send-eagle",
+ "reference": "https://github.com/shingo1228/ComfyUI-send-eagle-slim",
+ "files": [
+ "https://github.com/shingo1228/ComfyUI-send-eagle-slim"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Send Webp Image to Eagle. This is an extension node for ComfyUI that allows you to send generated images in webp format to Eagle. This extension node is a re-implementation of the Eagle linkage functions of the previous ComfyUI-send-Eagle node, focusing on the functions required for this node."
+ },
+ {
+ "author": "shingo1228",
+ "title": "ComfyUI-SDXL-EmptyLatentImage [REVMOED]",
+ "id": "sdxl-emptylatent",
+ "reference": "https://github.com/shingo1228/ComfyUI-SDXL-EmptyLatentImage",
+ "files": [
+ "https://github.com/shingo1228/ComfyUI-SDXL-EmptyLatentImage"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:SDXL Empty Latent Image. An extension node for ComfyUI that allows you to select a resolution from the pre-defined json files and output a Latent Image."
+ },
+ {
+ "author": "chaunceyyann",
+ "title": "ComfyUI Image Processing Nodes [REMOVED]",
+ "reference": "https://github.com/chaunceyyann/comfyui-image-processing-nodes",
+ "files": [
+ "https://github.com/chaunceyyann/comfyui-image-processing-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI focused on image processing operations."
+ },
+ {
+ "author": "OgreLemonSoup",
+ "title": "Gallery&Tabs [DEPRECATED]",
+ "id": "LoadImageGallery",
+ "reference": "https://github.com/OgreLemonSoup/ComfyUI-Load-Image-Gallery",
+ "files": [
+ "https://github.com/OgreLemonSoup/ComfyUI-Load-Image-Gallery"
+ ],
+ "install_type": "git-clone",
+ "description": "Adds a gallery to the Load Image node and tabs for Load Checkpoint/Lora/etc nodes"
+ },
+ {
+ "author": "11dogzi",
+ "title": "Qwen-Image ComfyUI [REMOVED]",
+ "reference": "https://github.com/11dogzi/Comfyui-Qwen-Image",
+ "files": [
+ "https://github.com/11dogzi/Comfyui-Qwen-Image"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a custom node package that integrates the Qwen-Image model into ComfyUI."
+ },
+ {
+ "author": "BAIS1C",
+ "title": "ComfyUI-AudioDuration [REMOVED]",
+ "reference": "https://github.com/BAIS1C/ComfyUI_BASICDancePoser",
+ "files": [
+ "https://github.com/BAIS1C/ComfyUI_BASICDancePoser"
+ ],
+ "install_type": "git-clone",
+ "description": "Node to extract Dance poses from Music to control Video Generations.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "BAIS1C",
+ "title": "ComfyUI_BASICSAdvancedDancePoser [REMOVED]",
+ "reference": "https://github.com/BAIS1C/ComfyUI_BASICSAdvancedDancePoser",
+ "files": [
+ "https://github.com/BAIS1C/ComfyUI_BASICSAdvancedDancePoser"
+ ],
+ "install_type": "git-clone",
+ "description": "Professional COCO-WholeBody 133-keypoint dance animation system for ComfyUI"
+ },
+ {
+ "author": "fablestudio",
+ "title": "ComfyUI-Showrunner-Utils [REMOVED]",
+ "reference": "https://github.com/fablestudio/ComfyUI-Showrunner-Utils",
+ "files": [
+ "https://github.com/fablestudio/ComfyUI-Showrunner-Utils"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Align Face, Generate Timestamp, GetMostCommonColors, Alpha Crop and Position Image, Shrink Image"
+ },
+ {
+ "author": "skayka",
+ "title": "ComfyUI-DreamFit [REMOVED]",
+ "reference": "https://github.com/skayka/ComfyUI-DreamFit",
+ "files": [
+ "https://github.com/skayka/ComfyUI-DreamFit"
+ ],
+ "install_type": "git-clone",
+ "description": "Garment-centric human generation nodes for ComfyUI using DreamFit with Flux.\nDreamFit is a powerful adapter system that enhances Flux models with garment-aware generation capabilities, enabling high-quality fashion and clothing generation."
+ },
+ {
+ "author": "domenecmiralles",
+ "title": "obobo_nodes [REMOVED]",
+ "reference": "https://github.com/domenecmiralles/obobo_nodes",
+ "files": [
+ "https://github.com/domenecmiralles/obobo_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI that provide various input and output capabilities."
+ },
+ {
+ "author": "NicholasKao1029",
+ "title": "comfyui-pixxio [REMOVED]",
+ "reference": "https://github.com/NicholasKao1029/comfyui-pixxio",
+ "files": [
+ "https://github.com/NicholasKao1029/comfyui-pixxio"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Auto-Upload Image to Pixxio Collection, Load Image from Pixx.io"
+ },
+ {
+ "author": "ComfyUI-Workflow",
+ "title": "ComfyUI OpenAI Nodes [REMOVED]",
+ "reference": "https://github.com/ComfyUI-Workflow/ComfyUI-OpenAI",
+ "files": [
+ "https://github.com/ComfyUI-Workflow/ComfyUI-OpenAI"
+ ],
+ "install_type": "git-clone",
+ "description": "By utilizing OpenAI's powerful vision models, this node enables you to incorporate state-of-the-art image understanding into your ComfyUI projects with minimal setup."
+ },
+ {
+ "author": "dionren",
+ "title": "Export Workflow With Cyuai Api Available Nodes [REMOVED]",
+ "id": "comfyUI-Pro-Export-Tool",
+ "reference": "https://github.com/dionren/ComfyUI-Pro-Export-Tool",
+ "files": [
+ "https://github.com/dionren/ComfyUI-Pro-Export-Tool"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a node to convert workflows to cyuai api available nodes."
+ },
+ {
+ "author": "1H-hobit",
+ "title": "ComfyUI_InternVL3 [REMOVED]",
+ "reference": "https://github.com/1H-hobit/ComfyUI_InternVL3",
+ "files": [
+ "https://github.com/1H-hobit/ComfyUI_InternVL3"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI for [a/InternVL](https://github.com/OpenGVLab/InternVL)"
+ },
+ {
+ "author": "spacepxl",
+ "title": "ComfyUI-Florence-2 [DEPRECATED]",
+ "id": "florence2-spacepxl",
+ "reference": "https://github.com/spacepxl/ComfyUI-Florence-2",
+ "files": [
+ "https://github.com/spacepxl/ComfyUI-Florence-2"
+ ],
+ "install_type": "git-clone",
+ "description": "[a/https://huggingface.co/microsoft/Florence-2-large-ft](https://huggingface.co/microsoft/Florence-2-large-ft)\nLarge or base model, support for captioning and bbox task modes, more coming soon."
+ },
+ {
+ "author": "xxxxxxxxxxxc",
+ "title": "flux-kontext-diff-merge [REMOVED]",
+ "reference": "https://github.com/xxxxxxxxxxxc/flux-kontext-diff-merge",
+ "files": [
+ "https://github.com/xxxxxxxxxxxc/flux-kontext-diff-merge"
+ ],
+ "install_type": "git-clone",
+ "description": "Preserve image quality with flux-kontext-diff-merge. This ComfyUI node merges only changed areas from AI edits, ensuring clarity and detail."
+ },
+ {
+ "author": "TechnoByteJS",
+ "title": "TechNodes [REMOVED]",
+ "id": "technodes",
+ "reference": "https://github.com/TechnoByteJS/ComfyUI-TechNodes",
+ "files": [
+ "https://github.com/TechnoByteJS/ComfyUI-TechNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for merging, testing and more.\nNOTE: SDNext Merge, VAE Merge, MBW Layers, Repeat VAE, Quantization."
+ },
+ {
+ "author": "DDDDEEP",
+ "title": "ComfyUI-DDDDEEP [REMOVED]",
+ "reference": "https://github.com/DDDDEEP/ComfyUI-DDDDEEP",
+ "files": [
+ "https://github.com/DDDDEEP/ComfyUI-DDDDEEP"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: AutoWidthHeight, ReturnIntSeed, OppositeBool, PromptItemCollection"
+ },
+ {
+ "author": "manifestations",
+ "title": "ComfyUI Ethnic Outfits Custom Nodes [REMOVED]",
+ "reference": "https://github.com/manifestations/comfyui-outfits",
+ "files": [
+ "https://github.com/manifestations/comfyui-outfits"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes for generating outfit prompts representing diverse ethnicities, cultures, and regions. Uses extensible JSON data for clothing, accessories, and poses, with “random/disabled” dropdowns for flexibility. Advanced prompt engineering is supported via Ollama LLM integration. Easily add new regions, ethnicities, or cultures by updating data files and creating lightweight node wrappers. Designed for artists, researchers, and developers seeking culturally rich, customizable prompt generation in ComfyUI workflows."
+ },
+ {
+ "author": "MitoshiroPJ",
+ "title": "ComfyUI Slothful Attention [REMOVED]",
+ "reference": "https://github.com/MitoshiroPJ/comfyui_slothful_attention",
+ "files": [
+ "https://github.com/MitoshiroPJ/comfyui_slothful_attention"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node allow controlling output without training. The reducing method is similar to [a/Spatial-Reduction Attention](https://paperswithcode.com/method/spatial-reduction-attention)."
+ },
+ {
+ "author": "MitoshiroPJ",
+ "title": "comfyui_focal_sampler [REMOVED]",
+ "reference": "https://github.com/MitoshiroPJ/comfyui_focal_sampler",
+ "files": [
+ "https://github.com/MitoshiroPJ/comfyui_focal_sampler"
+ ],
+ "install_type": "git-clone",
+ "description": "Apply additional sampling to specific area"
+ },
+ {
+ "author": "manifestations",
+ "title": "ComfyUI Ethnic Outfit & Prompt Enhancer Nodes [REMOVED]",
+ "reference": "https://github.com/manifestations/comfyui-indian-outfit",
+ "files": [
+ "https://github.com/manifestations/comfyui-indian-outfit"
+ ],
+ "install_type": "git-clone",
+ "description": "Features:\n* Extensive options for Indian, Indonesian, and international clothing, jewelry, accessories, and styles\n* Multiple jewelry and accessory fields (with material support: gold, diamond, silver, leather, beads, etc.)\n* Support for tattoos, henna, hair styles, poses, shot types, lighting, and photography genres\n* Seamless prompt expansion using your own Ollama LLM instance\n* Modular, extensible JSON data files for easy customization"
+ },
+ {
+ "author": "coVISIONSld",
+ "title": "ComfyUI-OmniGen2 [REMOVED]",
+ "reference": "https://github.com/coVISIONSld/ComfyUI-OmniGen2",
+ "files": [
+ "https://github.com/coVISIONSld/ComfyUI-OmniGen2"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI-OmniGen2 is a custom node package for the OmniGen2 model, enabling advanced text-to-image generation and visual understanding."
+ },
+ {
+ "author": "S4MUEL-404",
+ "title": "ComfyUI-S4Tool-Image-Overlay [REMOVED]",
+ "reference": "https://github.com/S4MUEL-404/ComfyUI-S4Tool-Image-Overlay",
+ "files": [
+ "https://github.com/S4MUEL-404/ComfyUI-S4Tool-Image-Overlay"
+ ],
+ "install_type": "git-clone",
+ "description": "Quickly set up image overlay effects"
+ },
+ {
+ "author": "akspa0",
+ "title": "ComfyUI-FapMixPlus [REMOVED]",
+ "reference": "https://github.com/akspa0/ComfyUI-FapMixPlus",
+ "files": [
+ "https://github.com/akspa0/ComfyUI-FapMixPlus"
+ ],
+ "install_type": "git-clone",
+ "description": "This is an audio processing script that applies soft limiting, optional loudness normalization, and optional slicing for transcription. It can also produce stereo-mixed outputs with optional audio appended to the end. The script organizes processed files into structured folders with sanitized filenames and retains original timestamps for continuity."
+ },
+ {
+ "author": "RedmondAI",
+ "title": "comfyui-tools [UNSAFE]",
+ "reference": "https://github.com/RedmondAI/comfyui-tools",
+ "files": [
+ "https://github.com/RedmondAI/comfyui-tools"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom extensions for ComfyUI used by the Redmond3D VFX team.[w/This node pack has a vulnerability that allows it to create files at arbitrary paths.]"
+ },
+ {
+ "author": "S4MUEL-404",
+ "title": "Image Position Blend [REMOVED]",
+ "id": "ComfyUI-Image-Position-Blend",
+ "version": "1.1",
+ "reference": "https://github.com/S4MUEL-404/ComfyUI-Image-Position-Blend",
+ "files": [
+ "https://github.com/S4MUEL-404/ComfyUI-Image-Position-Blend"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for conveniently adjusting the overlay position of two images."
+ },
+ {
+ "author": "S4MUEL-404",
+ "title": "ComfyUI-Text-On-Image [REMOVED]",
+ "id": "ComfyUI-Text-On-Image",
+ "reference": "https://github.com/S4MUEL-404/ComfyUI-Text-On-Image",
+ "files": [
+ "https://github.com/S4MUEL-404/ComfyUI-Text-On-Image"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for ComfyUI that allows users to add text overlays to images with customizable size, font, position, and shadow."
+ },
+ {
+ "author": "S4MUEL-404",
+ "title": "ComfyUI-Prompts-Selector [REMOVED]",
+ "reference": "https://github.com/S4MUEL-404/ComfyUI-Prompts-Selector",
+ "files": [
+ "https://github.com/S4MUEL-404/ComfyUI-Prompts-Selector"
+ ],
+ "install_type": "git-clone",
+ "description": "Quickly select preset prompts and merge them"
+ },
+ {
+ "author": "juntaosun",
+ "title": "ComfyUI_open_nodes [REMOVED]",
+ "reference": "https://github.com/juntaosun/ComfyUI_open_nodes",
+ "files": [
+ "https://github.com/juntaosun/ComfyUI_open_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI open nodes by juntaosun."
+ },
+ {
+ "author": "perilli",
+ "title": "apw_nodes [DEPRECATED]",
+ "reference": "https://github.com/alessandroperilli/apw_nodes",
+ "files": [
+ "https://github.com/alessandroperilli/apw_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node suite to augment the capabilities of the [a/AP Workflows for ComfyUI](https://perilli.com/ai/comfyui/)[w/'APW_Nodes' has been newly added in place of 'apw_nodes'.]"
+ },
+ {
+ "author": "markuryy",
+ "title": "ComfyUI Spiritparticle Nodes [REMOVED]",
+ "reference": "https://github.com/markuryy/comfyui-spiritparticle",
+ "files": [
+ "https://github.com/markuryy/comfyui-spiritparticle"
+ ],
+ "install_type": "git-clone",
+ "description": "A node pack by spiritparticle."
+ },
+ {
+ "author": "SpaceKendo",
+ "title": "Text to video for Stable Video Diffusion in ComfyUI [REMOVED]",
+ "id": "svd-txt2vid",
+ "reference": "https://github.com/SpaceKendo/ComfyUI-svd_txt2vid",
+ "files": [
+ "https://github.com/SpaceKendo/ComfyUI-svd_txt2vid"
+ ],
+ "install_type": "git-clone",
+ "description": "This is node replaces the init_image conditioning for the [a/Stable Video Diffusion](https://github.com/Stability-AI/generative-models) image to video model with text embeds, together with a conditioning frame. The conditioning frame is a set of latents."
+ },
+ {
+ "author": "vovler",
+ "title": "ComfyUI Civitai Helper Extension [REMOVED]",
+ "reference": "https://github.com/vovler/comfyui-civitaihelper",
+ "files": [
+ "https://github.com/vovler/comfyui-civitaihelper"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI extension for parsing Civitai PNG workflows and automatically downloading missing models"
+ },
+ {
+ "author": "DriftJohnson",
+ "title": "DJZ-Nodes [REMOVED]",
+ "id": "DJZ-Nodes",
+ "reference": "https://github.com/MushroomFleet/DJZ-Nodes",
+ "files": [
+ "https://github.com/MushroomFleet/DJZ-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "AspectSize and other nodes"
+ },
+ {
+ "author": "DriftJohnson",
+ "title": "KokoroTTS Node [REMOVED]",
+ "reference": "https://github.com/MushroomFleet/DJZ-KokoroTTS",
+ "files": [
+ "https://github.com/MushroomFleet/DJZ-KokoroTTS"
+ ],
+ "install_type": "git-clone",
+ "description": "This node provides advanced text-to-speech functionality powered by KokoroTTS. Follow the instructions below to install, configure, and use the node within your portable ComfyUI installation."
+ },
+ {
+ "author": "MushroomFleet",
+ "title": "SVG Suite for ComfyUI [REMOVED]",
+ "reference": "https://github.com/MushroomFleet/svg-suite",
+ "files": [
+ "https://github.com/MushroomFleet/svg-suite"
+ ],
+ "install_type": "git-clone",
+ "description": "SVG Suite is an advanced set of nodes for converting images to SVG in ComfyUI, expanding upon the functionality of ComfyUI-ToSVG."
+ },
+ {
+ "author": "joeriben",
+ "title": "AI4ArtsEd Ollama Prompt Node [DEPRECATED]",
+ "reference": "https://github.com/joeriben/ai4artsed_comfyui",
+ "files": [
+ "https://github.com/joeriben/ai4artsed_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Experimental nodes for ComfyUI. For more, see [a/https://kubi-meta.de/ai4artsed](https://kubi-meta.de/ai4artsed) A custom ComfyUI node for stylistic and cultural transformation of input text using local LLMs served via Ollama. This node allows you to combine a free-form prompt (e.g. translation, poetic recoding, genre shift) with externally supplied text in the ComfyUI graph. The result is processed via an Ollama-hosted model and returned as plain text."
+ },
+ {
+ "author": "bento234",
+ "title": "ComfyUI-bento-toolbox [REMOVED]",
+ "reference": "https://github.com/bento234/ComfyUI-bento-toolbox",
+ "files": [
+ "https://github.com/bento234/ComfyUI-bento-toolbox"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Tile Prompt Distributor"
+ },
+ {
+ "author": "yichengup",
+ "title": "ComfyUI-VideoBlender [REMOVED]",
+ "reference": "https://github.com/yichengup/ComfyUI-VideoBlender",
+ "files": [
+ "https://github.com/yichengup/ComfyUI-VideoBlender"
+ ],
+ "install_type": "git-clone",
+ "description": "Video clip mixing"
+ },
+ {
+ "author": "xl0",
+ "title": "latent-tools [REMOVED]",
+ "reference": "https://github.com/xl0/latent-tools",
+ "files": [
+ "https://github.com/xl0/latent-tools"
+ ],
+ "install_type": "git-clone",
+ "description": "Visualize and manipulate the latent space in ComfyUI"
+ },
+ {
+ "author": "Conor-Collins",
+ "title": "ComfyUI-CoCoTools [REMOVED]",
+ "reference": "https://github.com/Conor-Collins/coco_tools",
+ "files": [
+ "https://github.com/Conor-Collins/coco_tools"
+ ],
+ "install_type": "git-clone",
+ "description": "A set of custom nodes for ComfyUI providing advanced image processing, file handling, and utility functions."
+ },
+ {
+ "author": "theUpsider",
+ "title": "ComfyUI-Logic [DEPRECATED]",
+ "id": "comfy-logic",
+ "reference": "https://github.com/theUpsider/ComfyUI-Logic",
+ "files": [
+ "https://github.com/theUpsider/ComfyUI-Logic"
+ ],
+ "install_type": "git-clone",
+ "description": "An extension to ComfyUI that introduces logic nodes and conditional rendering capabilities."
+ },
+ {
+ "author": "Malloc-pix",
+ "title": "comfyui_qwen2.4_vl_node [REMOVED]",
+ "reference": "https://github.com/Malloc-pix/comfyui_qwen2.4_vl_node",
+ "files": [
+ "https://github.com/Malloc-pix/comfyui_qwen2.4_vl_node"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: CogVLM2 Captioner, CLIP Dynamic Text Encode(cy)"
+ },
+ {
+ "author": "inyourdreams-studio",
+ "title": "ComfyUI-RBLM [REMOVED]",
+ "reference": "https://github.com/inyourdreams-studio/comfyui-rblm",
+ "files": [
+ "https://github.com/inyourdreams-studio/comfyui-rblm"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node pack for ComfyUI that provides text manipulation nodes."
+ },
+ {
+ "author": "dream-computing",
+ "title": "SyntaxNodes - Image Processing Effects for ComfyUI [REMOVED]",
+ "reference": "https://github.com/dream-computing/syntax-nodes",
+ "files": [
+ "https://github.com/dream-computing/syntax-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI designed to apply various image processing effects, stylizations, and analyses."
+ },
+ {
+ "author": "UD1sto",
+ "title": "plugin-utils-nodes [DEPRECATED]",
+ "reference": "https://github.com/its-DeFine/plugin-utils-nodes",
+ "files": [
+ "https://github.com/its-DeFine/plugin-utils-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Compare Images (SimHash), Image Selector, Temporal Consistency, Update Image Reference, Frame Blend."
+ },
+ {
+ "author": "hanyingcho",
+ "title": "ComfyUI LLM Promp [REMOVED]",
+ "reference": "https://github.com/hanyingcho/comfyui-llmprompt",
+ "files": [
+ "https://github.com/hanyingcho/comfyui-llmprompt"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Load llm, Generate Text with LLM, Inference Qwen2VL, Inference Qwen2"
+ },
+ {
+ "author": "WASasquatch",
+ "title": "WAS Node Suite [DEPRECATED]",
+ "id": "was",
+ "reference": "https://github.com/WASasquatch/was-node-suite-comfyui",
+ "pip": ["numba"],
+ "files": [
+ "https://github.com/WASasquatch/was-node-suite-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "A node suite for ComfyUI with many new nodes, such as image processing, text processing, and more."
+ },
+ {
+ "author": "TOM1063",
+ "title": "ComfyUI-SamuraiTools [REMOVED]",
+ "reference": "https://github.com/TOM1063/ComfyUI-SamuraiTools",
+ "files": [
+ "https://github.com/TOM1063/ComfyUI-SamuraiTools"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for switching integer values based on boolean conditions"
+ },
+ {
+ "author": "whitemoney293",
+ "title": "ComfyUI-MediaUtilities [REMOVED]",
+ "reference": "https://github.com/ThanaritKanjanametawatAU/ComfyUI-MediaUtilities",
+ "files": [
+ "https://github.com/ThanaritKanjanametawatAU/ComfyUI-MediaUtilities"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for loading and previewing media from URLs in ComfyUI."
+ },
+ {
+ "author": "pureexe",
+ "title": "DiffusionLight-ComfyUI [REMOVED]",
+ "reference": "https://github.com/pureexe/DiffusionLight-ComfyUI",
+ "files": [
+ "https://github.com/pureexe/DiffusionLight-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "DiffusionLight (Turbo) implemented in ComfyUI"
+ },
+ {
+ "author": "gondar-software",
+ "title": "comfyui-custom-padding [REMOVED]",
+ "reference": "https://github.com/gondar-software/comfyui-custom-padding",
+ "files": [
+ "https://github.com/gondar-software/comfyui-custom-padding"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Adaptive image padding, Adaptive image unpadding"
+ },
+ {
+ "author": "Charonartist",
+ "title": "ComfyUI-EagleExporter [REMOVED]",
+ "reference": "https://github.com/Charonartist/ComfyUI-EagleExporter",
+ "files": [
+ "https://github.com/Charonartist/ComfyUI-EagleExporter"
+ ],
+ "install_type": "git-clone",
+ "description": "This is an extension that automatically saves video files generated with ComfyUI's 'video combine' extension to the Eagle library."
+ },
+ {
+ "author": "pomePLaszlo-collablyu",
+ "title": "comfyui_ejam [REMOVED]",
+ "reference": "https://github.com/PLaszlo-collab/comfyui_ejam",
+ "files": [
+ "https://github.com/PLaszlo-collab/comfyui_ejam"
+ ],
+ "install_type": "git-clone",
+ "description": "Ejam nodes for comfyui"
+ },
+ {
+ "author": "jonnydolake",
+ "title": "ComfyUI-AIR-Nodes [REMOVED]",
+ "reference": "https://github.com/jonnydolake/ComfyUI-AIR-Nodes",
+ "files": [
+ "https://github.com/jonnydolake/ComfyUI-AIR-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: String List To Prompt Schedule, Force Minimum Batch Size, Target Location (Crop), Target Location (Paste), Image Composite Chained, Match Image Count To Mask Count, Random Character Prompts, Parallax Test, Easy Parallax, Parallax GPU Test"
+ },
+ {
+ "author": "solution9th",
+ "title": "Comfyui_mobilesam [REMOVED]",
+ "reference": "https://github.com/solution9th/Comfyui_mobilesam",
+ "files": [
+ "https://github.com/solution9th/Comfyui_mobilesam"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Mobile SAM Model Loader, Mobile SAM Detector, Mobile SAM Predictor"
+ },
+ {
+ "author": "syaofox",
+ "title": "ComfyUI_fnodes [REMOVED]",
+ "reference": "https://github.com/syaofox/ComfyUI_fnodes",
+ "files": [
+ "https://github.com/syaofox/ComfyUI_fnodes"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI_fnodes is a collection of custom nodes designed for ComfyUI. These nodes provide additional functionality that can enhance your ComfyUI workflows.\nFile manipulation tools, Image resizing tools, IPAdapter tools, Image processing tools, Mask tools, Face analysis tools, Sampler tools, Miscellaneous tools"
+ },
+ {
+ "author": "Hangover3832",
+ "title": "ComfyUI-Hangover-Moondream [DEPRECATED]",
+ "reference": "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream",
+ "files": [
+ "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream"
+ ],
+ "install_type": "git-clone",
+ "description": "Moondream is a lightweight multimodal large language model.\n[w/WARN:Additional python code will be downloaded from huggingface and executed. You have to trust this creator if you want to use this node!]"
+ },
+ {
+ "author": "Hangover3832",
+ "title": "Recognize Anything Model (RAM) for ComfyUI [DEPRECATED]",
+ "reference": "https://github.com/Hangover3832/ComfyUI-Hangover-Recognize_Anything",
+ "files": [
+ "https://github.com/Hangover3832/ComfyUI-Hangover-Recognize_Anything"
+ ],
+ "install_type": "git-clone",
+ "description": "This is an image recognition node for ComfyUI based on the RAM++ model from [a/xinyu1205](https://huggingface.co/xinyu1205).\nThis node outputs a string of tags with all the recognized objects and elements in the image in English or Chinese language.\nFor image tagging and captioning."
+ },
+ {
+ "author": "Hangover3832",
+ "title": "ComfyUI-Hangover-Nodes [DEPRECATED]",
+ "reference": "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes",
+ "files": [
+ "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: MS kosmos-2 Interrogator, Save Image w/o Metadata, Image Scale Bounding Box. An implementation of Microsoft [a/kosmos-2](https://huggingface.co/microsoft/kosmos-2-patch14-224) image to text transformer."
+ },
+ {
+ "author": "SirLatore",
+ "title": "ComfyUI-IPAdapterWAN [REMOVED]",
+ "reference": "https://github.com/SirLatore/ComfyUI-IPAdapterWAN",
+ "files": [
+ "https://github.com/SirLatore/ComfyUI-IPAdapterWAN"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension adapts the [a/InstantX IP-Adapter for SD3.5-Large](https://huggingface.co/InstantX/SD3.5-Large-IP-Adapter) to work with Wan 2.1 and other UNet-based video/image models in ComfyUI.\nUnlike the original SD3 version (which depends on joint_blocks from MMDiT), this version performs sampling-time identity conditioning by dynamically injecting into attention layers — making it compatible with models like Wan 2.1, AnimateDiff, and other non-SD3 pipelines."
+ },
+ {
+ "author": "Jpzz",
+ "title": "ComfyUI-VirtualInteraction [UNSAFE/REMOVED]",
+ "reference": "https://github.com/Jpzz/ComfyUI-VirtualInteraction",
+ "files": [
+ "https://github.com/Jpzz/ComfyUI-VirtualInteraction"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: virtual interaction custom node when using generative movie\n[w/This nodepack contains a node which is reading arbitrary excel file.]"
+ },
+ {
+ "author": "satche",
+ "title": "Prompt Factory [REMOVED]",
+ "reference": "https://github.com/satche/comfyui-prompt-factory",
+ "files": [
+ "https://github.com/satche/comfyui-prompt-factory"
+ ],
+ "install_type": "git-clone",
+ "description": "A modular system that adds randomness to prompt generation"
+ },
+ {
+ "author": "MITCAP",
+ "title": "ComfyUI OpenAI DALL-E 3 Node [REMOVED]",
+ "reference": "https://github.com/MITCAP/OpenAI-ComfyUI",
+ "files": [
+ "https://github.com/MITCAP/OpenAI-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "This project provides custom nodes for ComfyUI that integrate with OpenAI's DALL-E 3 and GPT-4o models. The nodes allow users to generate images and describe images using OpenAI's API.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "raspie10032",
+ "title": "ComfyUI NAI Prompt Converter [REMOVED]",
+ "reference": "https://github.com/raspie10032/ComfyUI_RS_NAI_Local_Prompt_converter",
+ "files": [
+ "https://github.com/raspie10032/ComfyUI_RS_NAI_Local_Prompt_converter"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node extension for ComfyUI that enables conversion between different prompt formats: NovelAI V4, ComfyUI, and old NovelAI."
+ },
+ {
+ "author": "holchan",
+ "title": "ComfyUI-ModelDownloader [REMOVED]",
+ "reference": "https://github.com/holchan/ComfyUI-ModelDownloader",
+ "files": [
+ "https://github.com/holchan/ComfyUI-ModelDownloader"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI node to download models(Checkpoints and LoRA) from external links and act as an output standalone node."
+ },
+ {
+ "author": "Kur0butiMegane",
+ "title": "Comfyui-StringUtils [DEPRECATED]",
+ "reference": "https://github.com/Kur0butiMegane/Comfyui-StringUtils",
+ "files": [
+ "https://github.com/Kur0butiMegane/Comfyui-StringUtils"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Prompt Normalizer, String Splitter, String Line Selector, Extract Markup Value"
+ },
+ {
+ "author": "Apache0ne",
+ "title": "ComfyUI-LantentCompose [REMOVED]",
+ "reference": "https://github.com/Apache0ne/ComfyUI-LantentCompose",
+ "files": [
+ "https://github.com/Apache0ne/ComfyUI-LantentCompose"
+ ],
+ "install_type": "git-clone",
+ "description": "Interpolate sdxl latents using slerp with and without a mask. use with unsample nodes for best effect.\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "jax-explorer",
+ "title": "ComfyUI-H-flow [REMOVED]",
+ "reference": "https://github.com/jax-explorer/ComfyUI-H-flow",
+ "files": [
+ "https://github.com/jax-explorer/ComfyUI-H-flow"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Wan2-1 Image To Video, LLM Task, Save Image, Save Video, Show Text, FluxPro Ultra, IdeogramV2 Turbo, Runway Image To Video, Kling Image To Video, Replace Text, Join Text, Test Image, Test Text"
+ },
+ {
+ "author": "Apache0ne",
+ "title": "SambaNova [REMOVED]",
+ "id": "SambaNovaAPI",
+ "reference": "https://github.com/Apache0ne/SambaNova",
+ "files": [
+ "https://github.com/Apache0ne/SambaNova"
+ ],
+ "install_type": "git-clone",
+ "description": "Super Fast LLM's llama3.1-405B,70B,8B and more"
+ },
+ {
+ "author": "Apache0ne",
+ "title": "ComfyUI-EasyUrlLoader [REMOVED]",
+ "id": "easy-url-loader",
+ "reference": "https://github.com/Apache0ne/ComfyUI-EasyUrlLoader",
+ "files": [
+ "https://github.com/Apache0ne/ComfyUI-EasyUrlLoader"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple YT downloader node for ComfyUI using video Urls. Can be used with VHS nodes etc."
+ },
+ {
+ "author": "nxt5656",
+ "title": "ComfyUI-Image2OSS [REMOVED]",
+ "reference": "https://github.com/nxt5656/ComfyUI-Image2OSS",
+ "files": [
+ "https://github.com/nxt5656/ComfyUI-Image2OSS"
+ ],
+ "install_type": "git-clone",
+ "description": "Upload the image to Alibaba Cloud OSS."
+ },
+ {
+ "author": "ainewsto",
+ "title": "Comfyui_Comfly",
+ "reference": "https://github.com/ainewsto/Comfyui_Comfly",
+ "files": [
+ "https://github.com/ainewsto/Comfyui_Comfly"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Comfly_Mj, Comfly_mjstyle, Comfly_upload, Comfly_Mju, Comfly_Mjv, Comfly_kling_videoPreview\nNOTE: Comfyui_Comfly_v2 is introduced."
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-to-inpaint",
+ "reference": "https://github.com/shinich39/comfyui-to-inpaint",
+ "files": [
+ "https://github.com/shinich39/comfyui-to-inpaint"
+ ],
+ "install_type": "git-clone",
+ "description": "Send preview image to inpaint workflow."
+ },
+ {
+ "author": "magic-quill",
+ "title": "ComfyUI_MagicQuill [NOT MAINTAINED]",
+ "id": "MagicQuill",
+ "reference": "https://github.com/magic-quill/ComfyUI_MagicQuill",
+ "files": [
+ "https://github.com/magic-quill/ComfyUI_MagicQuill"
+ ],
+ "install_type": "git-clone",
+ "description": "Towards GPT-4 like large language and visual assistant.\nNOTE: The current version has not been maintained for a long time and does not work. Please use https://github.com/brantje/ComfyUI_MagicQuill instead."
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-event-handler [USAFE/REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-event-handler",
+ "files": [
+ "https://github.com/shinich39/comfyui-event-handler"
+ ],
+ "install_type": "git-clone",
+ "description": "Javascript code will run when an event fires. [w/This node allows you to execute arbitrary JavaScript code as input for the workflow.]"
+ },
+ {
+ "author": "Moooonet",
+ "title": "ComfyUI-ArteMoon [REMOVED]",
+ "reference": "https://github.com/Moooonet/ComfyUI-ArteMoon",
+ "files": [
+ "https://github.com/Moooonet/ComfyUI-ArteMoon"
+ ],
+ "install_type": "git-clone",
+ "description": "This plugin works with [a/IF_AI_Tools](https://github.com/if-ai/ComfyUI-IF_AI_tools) to build a workflow in ComfyUI that uses AI to assist in generating prompts."
+ },
+ {
+ "author": "ryanontheinside",
+ "title": "ComfyUI-MediaPipe-Vision [REMOVED]",
+ "reference": "https://github.com/ryanontheinside/ComfyUI-MediaPipe-Vision",
+ "files": [
+ "https://github.com/ryanontheinside/ComfyUI-MediaPipe-Vision"
+ ],
+ "install_type": "git-clone",
+ "description": "A centralized wrapper of all MediaPipe vision tasks for ComfyUI."
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-textarea-command [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-textarea-command",
+ "files": [
+ "https://github.com/shinich39/comfyui-textarea-command"
+ ],
+ "install_type": "git-clone",
+ "description": "Add command and comment in textarea. (e.g. // Disabled line)"
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-parse-image [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-parse-image",
+ "files": [
+ "https://github.com/shinich39/comfyui-parse-image"
+ ],
+ "install_type": "git-clone",
+ "description": "Extract metadata from image."
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-put-image [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-put-image",
+ "files": [
+ "https://github.com/shinich39/comfyui-put-image"
+ ],
+ "install_type": "git-clone",
+ "description": "Load image from directory."
+ },
+ {
+ "author": "fredconex",
+ "title": "TripoSG Nodes for ComfyUI [REMOVED]",
+ "reference": "https://github.com/fredconex/ComfyUI-TripoSG",
+ "files": [
+ "https://github.com/fredconex/ComfyUI-TripoSG"
+ ],
+ "install_type": "git-clone",
+ "description": "Created by Alfredo Fernandes inspired by Hunyuan3D nodes by Kijai. This extension adds TripoSG 3D mesh generation capabilities to ComfyUI, allowing you to generate 3D meshes from a single image using the TripoSG model."
+ },
+ {
+ "author": "fredconex",
+ "title": "ComfyUI-PaintTurbo [REMOVED]",
+ "reference": "https://github.com/fredconex/ComfyUI-PaintTurbo",
+ "files": [
+ "https://github.com/fredconex/ComfyUI-PaintTurbo"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Hunyuan3D Texture Mesh"
+ },
+ {
+ "author": "zhuanqianfish",
+ "title": "TaesdDecoder [REMOVED]",
+ "reference": "https://github.com/zhuanqianfish/TaesdDecoder",
+ "files": [
+ "https://github.com/zhuanqianfish/TaesdDecoder"
+ ],
+ "install_type": "git-clone",
+ "description": "use TAESD decoded image.you need donwload taesd_decoder.pth and taesdxl_decoder.pth to vae_approx folder first.\n It will result in a slight loss of image quality and a significant decrease in peak video memory during decoding."
+ },
+ {
+ "author": "myAiLemon",
+ "title": "MagicAutomaticPicture [REMOVED]",
+ "reference": "https://github.com/myAiLemon/MagicAutomaticPicture",
+ "files": [
+ "https://github.com/myAiLemon/MagicAutomaticPicture"
+ ],
+ "install_type": "git-clone",
+ "description": "A comfyui node package that can generate pictures and automatically save positive prompts and eliminate unwanted prompts"
+ },
+ {
+ "author": "thisiseddy-ab",
+ "title": "ComfyUI-Edins-Ultimate-Pack [REMOVED]",
+ "reference": "https://github.com/thisiseddy-ab/ComfyUI-Edins-Ultimate-Pack",
+ "files": [
+ "https://github.com/thisiseddy-ab/ComfyUI-Edins-Ultimate-Pack"
+ ],
+ "install_type": "git-clone",
+ "description": "Well i needet a Tiled Ksampler that still works for Comfy UI there were none so i made one, in this Package i will put all Nodes i will develop for Comfy Ui still in beta alot will change.."
+ },
+ {
+ "author": "Davros666",
+ "title": "safetriggers [REMOVED]",
+ "reference": "https://github.com/Davros666/safetriggers",
+ "files": [
+ "https://github.com/Davros666/safetriggers"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Nodes for READING TRIGGERS, TRIGGER-WORDS, TRIGGER-PHRASES FROM LoRAs"
+ },
+ {
+ "author": "cubiq",
+ "title": "Simple Math [REMOVED]",
+ "id": "simplemath",
+ "reference": "https://github.com/cubiq/ComfyUI_SimpleMath",
+ "files": [
+ "https://github.com/cubiq/ComfyUI_SimpleMath"
+ ],
+ "install_type": "git-clone",
+ "description": "custom node for ComfyUI to perform simple math operations"
+ },
+ {
+ "author": "lucafoscili",
+ "title": "LF Nodes [DEPRECATED]",
+ "reference": "https://github.com/lucafoscili/comfyui-lf",
+ "files": [
+ "https://github.com/lucafoscili/comfyui-lf"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes with a touch of extra UX, including: history for primitives, JSON manipulation, logic switches with visual feedback, LLM chat... and more!"
+ },
+ {
+ "author": "AI2lab",
+ "title": "comfyUI-tool-2lab [REMOVED]",
+ "id": "tool-2lab",
+ "reference": "https://github.com/AI2lab/comfyUI-tool-2lab",
+ "files": [
+ "https://github.com/AI2lab/comfyUI-tool-2lab"
+ ],
+ "install_type": "git-clone",
+ "description": "tool set for developing workflow and publish to web api server"
+ },
+ {
+ "author": "AI2lab",
+ "title": "comfyUI-DeepSeek-2lab [REMOVED]",
+ "id": "deepseek",
+ "reference": "https://github.com/AI2lab/comfyUI-DeepSeek-2lab",
+ "files": [
+ "https://github.com/AI2lab/comfyUI-DeepSeek-2lab"
+ ],
+ "install_type": "git-clone",
+ "description": "Unofficial implementation of DeepSeek for ComfyUI"
+ },
+ {
+ "author": "AI2lab",
+ "title": "comfyUI-kling-api-2lab [REMOVED]",
+ "reference": "https://github.com/AI2lab/comfyUI-kling-api-2lab",
+ "files": [
+ "https://github.com/AI2lab/comfyUI-kling-api-2lab"
+ ],
+ "install_type": "git-clone",
+ "description": "Unofficial implementation of KLing for ComfyUI"
+ },
+ {
+ "author": "ZhiHui6",
+ "title": "comfyui_zhihui_nodes [REMOVED]",
+ "reference": "https://github.com/ZhiHui6/comfyui_zhihui_nodes",
+ "files": [
+ "https://github.com/ZhiHui6/comfyui_zhihui_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Prompt Preset, Video Batch Loader, Video Combiner"
+ },
+ {
+ "author": "ImagineerNL",
+ "title": "comfyui_potrace_svg [REMOVED]",
+ "reference": "https://github.com/ImagineerNL/comfyui_potrace_svg",
+ "files": [
+ "https://github.com/ImagineerNL/comfyui_potrace_svg"
+ ],
+ "install_type": "git-clone",
+ "description": "This project converts raster images into SVG format using the Potrace library."
+ },
+ {
+ "author": "kayselmecnun",
+ "title": "ComfyUI-Qwen-25-VL [REMOVED]",
+ "reference": "https://github.com/kayselmecnun/ComfyUI-Qwen-25-VL",
+ "files": [
+ "https://github.com/kayselmecnun/ComfyUI-Qwen-25-VL"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom Comfy UI node for using Qwen2.5-VL-3B/7B-Instruct models"
+ },
+ {
+ "author": "IfnotFr",
+ "title": "⚡ ComfyUI Connect [REMOVED]",
+ "reference": "https://github.com/IfnotFr/ComfyUI-Connect",
+ "files": [
+ "https://github.com/IfnotFr/ComfyUI-Connect"
+ ],
+ "install_type": "git-clone",
+ "description": "Transform your ComfyUI into a powerful API, exposing all your saved workflows as ready-to-use HTTP endpoints."
+ },
+ {
+ "author": "ginlov",
+ "title": "segment_to_mask_comfyui [REMOVED]",
+ "reference": "https://github.com/ginlov/segment_to_mask_comfyui",
+ "files": [
+ "https://github.com/ginlov/segment_to_mask_comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:SegToMask"
+ },
+ {
+ "author": "TGu-97",
+ "title": "TGu Utilities [REMOVED]",
+ "id": "tgu",
+ "reference": "https://github.com/TGu-97/ComfyUI-TGu-utils",
+ "files": [
+ "https://github.com/TGu-97/ComfyUI-TGu-utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: MPN Switch, MPN Reroute, PN Switch. This is a set of custom nodes for ComfyUI. Mainly focus on control switches."
+ },
+ {
+ "author": "IfnotFr",
+ "title": "ComfyUI-Connect [REMOVED]",
+ "reference": "https://github.com/IfnotFr/ComfyUI-Connect",
+ "files": [
+ "https://github.com/IfnotFr/ComfyUI-Connect"
+ ],
+ "install_type": "git-clone",
+ "description": "Transform your ComfyUI into a powerful API, exposing all your saved workflows as ready-to-use HTTP endpoints."
+ },
+ {
+ "author": "KurtHokke",
+ "title": "ComfyUI_KurtHokke-Nodes [REMOVED]",
+ "reference": "https://github.com/KurtHokke/ComfyUI_KurtHokke-Nodes",
+ "files": [
+ "https://github.com/KurtHokke/ComfyUI_KurtHokke-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI_KurtHokke-Nodes"
+ },
+ {
+ "author": "SpatialDeploy",
+ "title": "ComfyUI-Voxels [REMOVED]",
+ "reference": "https://github.com/SpatialDeploy/ComfyUI-Voxels",
+ "files": [
+ "https://github.com/SpatialDeploy/ComfyUI-Voxels"
+ ],
+ "install_type": "git-clone",
+ "description": "Tools for creating voxel based videos"
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-group-selection [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-group-selection",
+ "files": [
+ "https://github.com/shinich39/comfyui-group-selection"
+ ],
+ "install_type": "git-clone",
+ "description": "Create a new group of nodes."
+ },
+ {
+ "author": "shinich39",
+ "title": "connect-from-afar [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-connect-from-afar",
+ "files": [
+ "https://github.com/shinich39/comfyui-connect-from-afar"
+ ],
+ "install_type": "git-clone",
+ "description": "Connect a new link from out of screen."
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-local-db [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-local-db",
+ "files": [
+ "https://github.com/shinich39/comfyui-local-db"
+ ],
+ "install_type": "git-clone",
+ "description": "Store text to Key-Values pair json."
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-model-db [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-model-db",
+ "files": [
+ "https://github.com/shinich39/comfyui-model-db"
+ ],
+ "install_type": "git-clone",
+ "description": "Store settings by model."
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-target-search [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-target-search",
+ "files": [
+ "https://github.com/shinich39/comfyui-target-search"
+ ],
+ "install_type": "git-clone",
+ "description": "Move canvas to target on dragging connection."
+ },
+ {
+ "author": "chrisgoringe",
+ "title": "Image chooser [DEPRECATED]",
+ "id": "image-chooser",
+ "reference": "https://github.com/chrisgoringe/cg-image-picker",
+ "files": [
+ "https://github.com/chrisgoringe/cg-image-picker"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node that pauses the flow while you choose which image (or latent) to pass on to the rest of the workflow."
+ },
+ {
+ "author": "weilin9999",
+ "title": "WeiLin-ComfyUI-prompt-all-in-one [DEPRECATED]",
+ "id": "prompt-all-in-one",
+ "reference": "https://github.com/weilin9999/WeiLin-ComfyUI-prompt-all-in-one",
+ "files": [
+ "https://github.com/weilin9999/WeiLin-ComfyUI-prompt-all-in-one"
+ ],
+ "install_type": "git-clone",
+ "description": "Write prompt words like WebUI"
+ },
+ {
+ "author": "svetozarov",
+ "title": "AS_GeminiCaptioning Node [REMOVED]",
+ "reference": "https://github.com/svetozarov/AS_GeminiCaptioning",
+ "files": [
+ "https://github.com/svetozarov/AS_GeminiCaptioning"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI node that combines an image with simple text parameters to create a prompt, sends it to the Google Gemini API via the google-generativeai SDK, and returns the generated text response along with the original prompt and an execution log"
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-load-image-in-seq [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-load-image-in-seq",
+ "files": [
+ "https://github.com/shinich39/comfyui-load-image-in-seq"
+ ],
+ "install_type": "git-clone",
+ "description": "This node is load png image sequentially with metadata. Only supported for PNG format that has been created by ComfyUI.[w/renamed from comfyui-load-image-39. You need to remove previous one and reinstall to this.]"
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-model-metadata [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-model-metadata",
+ "files": [
+ "https://github.com/shinich39/comfyui-model-metadata"
+ ],
+ "install_type": "git-clone",
+ "description": "Print model metadata on note node"
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-view-recommendations [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-view-recommendations",
+ "files": [
+ "https://github.com/shinich39/comfyui-view-recommendations"
+ ],
+ "install_type": "git-clone",
+ "description": "Load model generation data from civitai."
+ },
+ {
+ "author": "jonstreeter",
+ "title": "Comfyui-PySceneDetect [REMOVED]",
+ "reference": "https://github.com/jonstreeter/Comfyui-PySceneDetect",
+ "files": [
+ "https://github.com/jonstreeter/Comfyui-PySceneDetect"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: PySceneDetect Video Processor"
+ },
+ {
+ "author": "muxueChen",
+ "title": "ComfyUI-NTQwen25-VL [REMOVED]",
+ "reference": "https://github.com/muxueChen/ComfyUI-NTQwen25-VL",
+ "files": [
+ "https://github.com/muxueChen/ComfyUI-NTQwen25-VL"
+ ],
+ "install_type": "git-clone",
+ "description": "Qwen25-VL is a plugin for ComfyU"
+ },
+ {
+ "author": "Makki_Shizu",
+ "title": "ComfyUI-SaveAnimatedGIF [DEPRECATED]",
+ "id": "SaveAnimatedGIF",
+ "reference": "https://github.com/MakkiShizu/ComfyUI-SaveAnimatedGIF",
+ "files": [
+ "https://github.com/MakkiShizu/ComfyUI-SaveAnimatedGIF"
+ ],
+ "install_type": "git-clone",
+ "description": "Save animated GIF format nodes in ComfyUI"
+ },
+ {
+ "author": "l1yongch1",
+ "title": "ComfyUI_PhiCaption [REMOVED]",
+ "reference": "https://github.com/l1yongch1/ComfyUI_PhiCaption",
+ "files": [
+ "https://github.com/l1yongch1/ComfyUI_PhiCaption"
+ ],
+ "install_type": "git-clone",
+ "description": "In addition to achieving conventional single-image, single-round reverse engineering, it can also achieve single-image multi-round and multi-image single-round reverse engineering. Moreover, the Phi model has a better understanding of prompts."
+ },
+ {
+ "author": "nova-florealis",
+ "title": "comfyui-alien [REMOVED]",
+ "reference": "https://github.com/nova-florealis/comfyui-alien",
+ "files": [
+ "https://github.com/nova-florealis/comfyui-alien"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Text to Text (LLM), Text Output, Convert to Markdown, List Display (Debug)"
+ },
+ {
+ "author": "PluMaZero",
+ "title": "ComfyUI-SpaceFlower [REMOVED]",
+ "reference": "https://github.com/PluMaZero/ComfyUI-SpaceFlower",
+ "files": [
+ "https://github.com/PluMaZero/ComfyUI-SpaceFlower"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: SpaceFlower_Prompt, SpaceFlower_HangulPrompt, ..."
+ },
+ {
+ "author": "vahidzxc",
+ "title": "ComfyUI-My-Handy-Nodes [REMOVED]",
+ "reference": "https://github.com/vahidzxc/ComfyUI-My-Handy-Nodes",
+ "files": [
+ "https://github.com/vahidzxc/ComfyUI-My-Handy-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:VahCropImage"
+ },
+ {
+ "author": "Samulebotin",
+ "title": "ComfyUI-FreeVC_wrapper [REMOVED]",
+ "reference": "https://github.com/Samulebotin/ComfyUI-FreeVC_wrapper",
+ "files": [
+ "https://github.com/Samulebotin/ComfyUI-FreeVC_wrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "A voice conversion extension node for ComfyUI based on FreeVC, enabling high-quality voice conversion capabilities within the ComfyUI framework."
+ },
+ {
+ "author": "GoingAI1998",
+ "title": "ComfyUI Web Canvas Node [REMOVED]",
+ "reference": "https://github.com/GoingAI1998/Comfyui_imgcanvas",
+ "files": [
+ "https://github.com/GoingAI1998/Comfyui_imgcanvas"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI_imgcanvas At present, I have not used the useful comfyui custom node about layer mixing, and I have written a comfyui runtime automatic pop-up window for layer editing node"
+ },
+ {
+ "author": "807502278",
+ "title": "ComfyUI_TensorRT_Merge [REMOVED]",
+ "reference": "https://github.com/807502278/ComfyUI_TensorRT_Merge",
+ "files": [
+ "https://github.com/807502278/ComfyUI_TensorRT_Merge"
+ ],
+ "install_type": "git-clone",
+ "description": "Non diffusion models supported by TensorRT, merged Comfyui plugin, added onnx automatic download and trt model conversion nodes."
+ },
+ {
+ "author": "logtd",
+ "title": "ComfyUI-LTXTricks [DEPRECATED]",
+ "reference": "https://github.com/logtd/ComfyUI-LTXTricks",
+ "files": [
+ "https://github.com/logtd/ComfyUI-LTXTricks"
+ ],
+ "install_type": "git-clone",
+ "description": "A set of nodes that provide additional controls for the LTX Video model"
+ },
+ {
+ "author": "JichaoLiang",
+ "title": "Immortal_comfyUI [REMOVED]",
+ "reference": "https://github.com/JichaoLiang/Immortal_comfyUI",
+ "files": [
+ "https://github.com/JichaoLiang/Immortal_comfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:ImNewNode, ImAppendNode, MergeNode, SetProperties, SaveToDirectory, batchNodes, redirectToNode, SetEvent, ..."
+ },
+ {
+ "author": "Rvage0815",
+ "title": "ComfyUI-RvTools [REMOVED]",
+ "reference": "https://github.com/Rvage0815/ComfyUI-RvTools",
+ "files": [
+ "https://github.com/Rvage0815/ComfyUI-RvTools"
+ ],
+ "install_type": "git-clone",
+ "description": "this node contains a lot of small little helpers like switches, passers and selectors that i use a lot to build my workflows."
+ },
+ {
+ "author": "Rvage0815",
+ "title": "RvTComfyUI-RvTools_v2 [REMOVED]",
+ "reference": "https://github.com/Rvage0815/ComfyUI-RvTools_v2",
+ "files": [
+ "https://github.com/Rvage0815/ComfyUI-RvTools_v2"
+ ],
+ "install_type": "git-clone",
+ "description": "this node contains a lot of small little helpers like switches, passers and selectors that i use a lot to build my workflows."
+ },
+ {
+ "author": "scottmudge",
+ "title": "ComfyUI_BiscuitNodes [REMOVED]",
+ "reference": "https://github.com/scottmudge/ComfyUI_BiscuitNodes",
+ "files": [
+ "https://github.com/scottmudge/ComfyUI_BiscuitNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Load Image From Path Using File Selector"
+ },
+ {
+ "author": "thanhduong0213929",
+ "title": "ComfyUI-DeepUnlock [REMOVED]",
+ "reference": "https://github.com/thanhduong0213929/ComfyUI-DeepUnlock",
+ "files": [
+ "https://github.com/thanhduong0213929/ComfyUI-DeepUnlock"
+ ],
+ "install_type": "git-clone",
+ "description": "DeepFuze is a state-of-the-art deep learning tool that seamlessly integrates with ComfyUI to revolutionize facial transformations, lipsyncing, video generation, voice cloning, face swapping, and lipsync translation. Leveraging advanced algorithms, DeepFuze enables users to combine audio and video with unparalleled realism, ensuring perfectly synchronized facial movements. This innovative solution is ideal for content creators, animators, developers, and anyone seeking to elevate their video editing projects with sophisticated AI-driven features."
+ },
+ {
+ "author": "pathway8-sudo",
+ "title": "RMBG [REMOVED]",
+ "reference": "https://github.com/pathway8-sudo/RMBG",
+ "files": [
+ "https://github.com/pathway8-sudo/RMBG"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository provides a custom node for ComfyUI, leveraging the BriaRMBG model to remove backgrounds from images and output a transparent PNG."
+ },
+ {
+ "author": "iris-Neko",
+ "title": "ComfyUI_ascii_art [REMOVED]",
+ "reference": "https://github.com/iris-Neko/ComfyUI_ascii_art",
+ "files": [
+ "https://github.com/iris-Neko/ComfyUI_ascii_art"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI node for [a/ASCII art controlnet](https://civitai.com/models/986392)"
+ },
+ {
+ "author": "apesplat",
+ "title": "ezXY scripts and nodes [NOT MAINTAINED]",
+ "id": "ezxy",
+ "reference": "https://github.com/GMapeSplat/ComfyUI_ezXY",
+ "files": [
+ "https://github.com/GMapeSplat/ComfyUI_ezXY"
+ ],
+ "install_type": "git-clone",
+ "description": "Extensions/Patches: Enables linking float and integer inputs and ouputs. Values are automatically cast to the correct type and clamped to the correct range. Works with both builtin and custom nodes.[w/NOTE: This repo patches ComfyUI's validate_inputs and map_node_over_list functions while running. May break depending on your version of ComfyUI. Can be deactivated in config.yaml.]Nodes: A collection of nodes for facilitating the generation of XY plots. Capable of plotting changes over most primitive values.[w/Does not work with current version of Comfyui]"
+ },
+ {
+ "author": "mie",
+ "title": "ComfyUI_JanusProCaption [REMOVED]",
+ "reference": "https://github.com/MieMieeeee/ComfyUI-JanusProCaption",
+ "files": [
+ "https://github.com/MieMieeeee/ComfyUI-JanusProCaption"
+ ],
+ "install_type": "git-clone",
+ "description": "Describe image or create caption files using Janus Pro Model"
+ },
+ {
+ "author": "Njbx",
+ "title": "ComfyUI-blockswap [REMOVED]",
+ "reference": "https://github.com/Njbx/ComfyUI-blockswap",
+ "files": [
+ "https://github.com/Njbx/ComfyUI-blockswap"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Block Swap"
+ },
+ {
+ "author": "T8star1984",
+ "title": "comfyui-purgevram [REMOVED]",
+ "reference": "https://github.com/T8star1984/comfyui-purgevram",
+ "files": [
+ "https://github.com/T8star1984/comfyui-purgevram"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:PurgeVRAM.\nCan be added after any node to clean up vram and memory"
+ },
+ {
+ "author": "zmwv823",
+ "title": "ComfyUI-VideoDiffusion [REMOVED]",
+ "reference": "https://github.com/zmwv823/ComfyUI-VideoDiffusion",
+ "files": [
+ "https://github.com/zmwv823/ComfyUI-VideoDiffusion"
+ ],
+ "install_type": "git-clone",
+ "description": "[a/LatentSync](https://github.com/bytedance/LatentSync) and [a/Sonic](https://github.com/jixiaozhong/Sonic). [w/Just for study purpose. It's not for directly use, u should know how to fix issues.]"
+ },
+ {
+ "author": "NyaamZ",
+ "title": "Get Booru Tag ExtendeD [REMOVED]",
+ "reference": "https://github.com/NyaamZ/ComfyUI-GetBooruTag-ED",
+ "files": [
+ "https://github.com/NyaamZ/ComfyUI-GetBooruTag-ED"
+ ],
+ "description": "Get tag from Booru site.",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "lingha",
+ "title": "comfyui_kj [REMOVED]",
+ "id": "comfyui_kj",
+ "reference": "https://github.com/XieChengYuan/comfyui_kj",
+ "files": [
+ "https://github.com/XieChengYuan/comfyui_kj"
+ ],
+ "install_type": "git-clone",
+ "description": "comfyui_kj, A tool that can package workflows into projects and publish them to a WeChat Mini Program named Kaji, allowing charges to be collected from users."
+ },
+ {
+ "author": "myAiLemon",
+ "title": "MagicGetPromptAutomatically [REMOVED]",
+ "reference": "https://github.com/myAiLemon/MagicGetPromptAutomatically",
+ "files": [
+ "https://github.com/myAiLemon/MagicGetPromptAutomatically"
+ ],
+ "install_type": "git-clone",
+ "description": "A plug-in that can automatically generate pictures and save txt files in comfyui"
+ },
+ {
+ "author": "ryanontheinside",
+ "title": "ComfyUI_ScavengerHunt [REMOVED]",
+ "reference": "https://github.com/ryanontheinside/ComfyUI_ScavengerHunt",
+ "files": [
+ "https://github.com/ryanontheinside/ComfyUI_ScavengerHunt"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Compare Image Similarity (ResNet), Compare Image Similarity (CLIP), Compare Image Types\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "vpakarinen",
+ "title": "ComfyUI-GenerationTimer [REMOVED]",
+ "reference": "https://github.com/vpakarinen/ComfyUI-GenerationTimer",
+ "files": [
+ "https://github.com/vpakarinen/ComfyUI-GenerationTimer"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Generation Timer, Image Timer, Timer Display"
+ },
+ {
+ "author": "RedRayz",
+ "title": "ComfyUI-Danbooru-To-WD [REMOVED]",
+ "id": "danbooru2wd",
+ "reference": "https://github.com/RedRayz/ComfyUI-Danbooru-To-WD",
+ "files": [
+ "https://github.com/RedRayz/ComfyUI-Danbooru-To-WD"
+ ],
+ "install_type": "git-clone",
+ "description": "Converts booru tags to a format suitable for Waifu Diffusion(or Danbooru based models)."
+ },
+ {
+ "author": "alexgenovese",
+ "title": "comfyui_CfgPlusPlus [REMOVED]",
+ "id": "cfgpp",
+ "reference": "https://gitea.com/NotEvilGirl/cfgpp",
+ "files": [
+ "https://gitea.com/NotEvilGirl/cfgpp"
+ ],
+ "install_type": "git-clone",
+ "description": "CFG++ implemented according to [a/https://cfgpp-diffusion.github.io](https://cfgpp-diffusion.github.io). Basically modified DDIM sampler that makes sampling work at low CFG values (0 ~ 2). Read the CFG++ paper for more details"
+ },
+ {
+ "author": "hosterosi",
+ "title": "ComfyUI OpenAI Node",
+ "reference": "https://github.com/hosterosi/ComfyUI_OpenAI [REMOVED]",
+ "files": [
+ "https://github.com/hosterosi/ComfyUI_OpenAI"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node for ComfyUI allows users to input multiline text and select a specific line by its number. The node processes the input and returns the selected line along with its index."
+ },
+ {
+ "author": "Gourieff",
+ "title": "ReActor Node for ComfyUI [DISABLED]",
+ "id": "reactor",
+ "reference": "https://github.com/Gourieff/comfyui-reactor-node",
+ "files": [
+ "https://github.com/Gourieff/comfyui-reactor-node"
+ ],
+ "install_type": "git-clone",
+ "description": "The Fast and Simple 'roop-like' Face Swap Extension Node for ComfyUI, based on ReActor (ex Roop-GE) SD-WebUI Face Swap Extension"
+ },
+ {
+ "author": "prismwastaken",
+ "title": "prism-tools [REMOVED]",
+ "reference": "https://github.com/prismwastaken/prism-comfyui-tools",
+ "files": [
+ "https://github.com/prismwastaken/prism-comfyui-tools"
+ ],
+ "install_type": "git-clone",
+ "description": "prism-tools"
+ },
+ {
+ "author": "42lux",
+ "title": "ComfyUI-safety-checker [DEPRECATED]",
+ "reference": "https://github.com/42lux/ComfyUI-safety-checker",
+ "files": [
+ "https://github.com/42lux/ComfyUI-safety-checker"
+ ],
+ "install_type": "git-clone",
+ "description": "A NSFW/Safety Checker Node for ComfyUI."
+ },
+ {
+ "author": "riverolls",
+ "title": "ComfyUI-FJDH",
+ "reference": "https://github.com/riverolls/ComfyUI-FJDH [REMOVED]",
+ "files": [
+ "https://github.com/riverolls/ComfyUI-FJDH"
+ ],
+ "install_type": "git-clone",
+ "description": "bbox tools, image tools, mask generators, point tools"
+ },
+ {
+ "author": "jetchopper",
+ "title": "ComfyUI-GeneraNodes",
+ "id": "genera",
+ "reference": "https://github.com/evolox/ComfyUI-GeneraNodes [REMOVED]",
+ "files": [
+ "https://github.com/evolox/ComfyUI-GeneraNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Genera custom nodes and extensions"
+ },
+ {
+ "author": "Pos13",
+ "title": "Cyclist [DEPRECATED]",
+ "id": "cyclist",
+ "reference": "https://github.com/Pos13/comfyui-cyclist",
+ "files": [
+ "https://github.com/Pos13/comfyui-cyclist"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension provides tools to iterate generation results between runs. In general, it's for cycles."
+ },
+ {
+ "author": "leiweiqiang",
+ "title": "ComfyUI-TRA",
+ "id": "tra",
+ "reference": "https://github.com/leiweiqiang/ComfyUI-TRA",
+ "files": [
+ "https://github.com/leiweiqiang/ComfyUI-TRA"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:TCL EbSynth, TCL Extract Frames (From File), TCL Extract Frames (From Video), TCL Combine Frames, TCL Save Video (From Frames)"
+ },
+ {
+ "author": "ai-business-hql",
+ "title": "comfyUIAgent [REMOVED]",
+ "reference": "https://github.com/ai-business-hql/comfyUIAgent",
+ "files": [
+ "https://github.com/ai-business-hql/comfyUIAgent"
+ ],
+ "install_type": "git-clone",
+ "description": "test"
+ },
+ {
+ "author": "daqingliu",
+ "title": "ComfyUI-SaveImageOSS [REMOVED]",
+ "reference": "https://github.com/daqingliu/ComfyUI-SaveImageOSS",
+ "files": [
+ "https://github.com/daqingliu/ComfyUI-SaveImageOSS"
+ ],
+ "install_type": "git-clone",
+ "description": "Save images directly to URL, e.g., OSS. Just input the url in the text box!"
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-textarea-keybindings [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-textarea-keybindings",
+ "files": [
+ "https://github.com/shinich39/comfyui-textarea-keybindings"
+ ],
+ "install_type": "git-clone",
+ "description": "Add keybindings to textarea."
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-load-image-with-cmd [REMOVED]",
+ "reference": "https://github.com/shinich39/comfyui-load-image-with-cmd",
+ "files": [
+ "https://github.com/shinich39/comfyui-load-image-with-cmd"
+ ],
+ "install_type": "git-clone",
+ "description": "Load image and partially workflow with javascript."
+ },
+ {
+ "author": "neuratech-ai",
+ "title": "ComfyUI-MultiGPU [NOT MAINTAINED]",
+ "reference": "https://github.com/neuratech-ai/ComfyUI-MultiGPU",
+ "files": [
+ "https://github.com/neuratech-ai/ComfyUI-MultiGPU"
+ ],
+ "install_type": "git-clone",
+ "description": "Experimental nodes for using multiple GPUs in a single ComfyUI workflow.\nThis extension adds new nodes for model loading that allow you to specify the GPU to use for each model. It monkey patches the memory management of ComfyUI in a hacky way and is neither a comprehensive solution nor a well-tested one. Use at your own risk.\nNote that this does not add parallelism. The workflow steps are still executed sequentially just on different GPUs. Any potential speedup comes from not having to constantly load and unload models from VRAM."
+ },
+ {
+ "author": "jefferyharrell",
+ "title": "ComfyUI-JHXMP [REMOVED]",
+ "reference": "https://github.com/jefferyharrell/ComfyUI-JHXMP",
+ "files": [
+ "https://github.com/jefferyharrell/ComfyUI-JHXMP"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: Save Image With XMP Metadata"
+ },
+ {
+ "author": "viperyl",
+ "title": "ComfyUI-BiRefNet [NOT MAINTAINED]",
+ "id": "comfyui-birefnet",
+ "reference": "https://github.com/viperyl/ComfyUI-BiRefNet",
+ "files": [
+ "https://github.com/viperyl/ComfyUI-BiRefNet"
+ ],
+ "install_type": "git-clone",
+ "description": "Bilateral Reference Network achieves SOTA result in multi Salient Object Segmentation dataset, this repo pack BiRefNet as ComfyUI nodes, and make this SOTA model easier use for everyone."
+ },
+ {
+ "author": "asagi4",
+ "title": "ComfyUI prompt control (LEGACY VERSION)",
+ "reference": "https://github.com/asagi4/comfyui-prompt-control-legacy",
+ "files": [
+ "https://github.com/asagi4/comfyui-prompt-control-legacy"
+ ],
+ "install_type": "git-clone",
+ "description": "WARNING: These nodes exist only to reproduce old workflows. They are unmaintained See https://github.com/asagi4/comfyui-prompt-control for the revised, current version of prompt control."
+ },
+ {
+ "author": "doomy23",
+ "title": "ComfyUI-D00MYsNodes [REMOVED]",
+ "reference": "https://github.com/doomy23/ComfyUI-D00MYsNodes",
+ "files": [
+ "https://github.com/doomy23/ComfyUI-D00MYsNodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: Images_Converter, Show_Text, Strings_From_List, Save_Text, Random_Images, Load_Images_From_Paths, JSPaint."
+ },
+ {
+ "author": "kadirnar",
+ "title": "comfyui_hub [REMOVED]",
+ "reference": "https://github.com/kadirnar/comfyui_hub",
+ "files": [
+ "https://github.com/kadirnar/comfyui_hub"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of nodes randomly selected and gathered, related to noise. NOTE: SD-Advanced-Noise, noise_latent_perlinpinpin, comfy-plasma"
+ },
+ {
+ "author": "SaltAI",
+ "title": "SaltAI_AudioViz [REMOVED]",
+ "id": "saltai-audioviz",
+ "reference": "https://github.com/get-salt-AI/SaltAI_AudioViz",
+ "files": [
+ "https://github.com/get-salt-AI/SaltAI_AudioViz"
+ ],
+ "install_type": "git-clone",
+ "description": "SaltAI AudioViz contains ComfyUI nodes for generating complex audio reactive visualizations"
+ },
+ {
+ "author": "SaltAI",
+ "title": "SaltAI-Open-Resources [REMOVED]",
+ "id": "saltai-open-resource",
+ "reference": "https://github.com/get-salt-AI/SaltAI",
+ "pip": ["numba"],
+ "files": [
+ "https://github.com/get-salt-AI/SaltAI"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository is a collection of open-source nodes and workflows for ComfyUI, a dev tool that allows users to create node-based workflows often powered by various AI models to do pretty much anything.\nOur mission is to seamlessly connect people and organizations with the world’s foremost AI innovations, anywhere, anytime. Our vision is to foster a flourishing AI ecosystem where the world’s best developers can build and share their work, thereby redefining how software is made, pushing innovation forward, and ensuring as many people as possible can benefit from the positive promise of AI technologies.\nWe believe that ComfyUI is a powerful tool that can help us achieve our mission and vision, by enabling anyone to explore the possibilities and limitations of AI models in a visual and interactive way, without coding if desired.\nWe hope that by sharing our nodes and workflows, we can inspire and empower more people to create amazing AI-powered content with ComfyUI."
+ },
+ {
+ "author": "SaltAI",
+ "title": "SaltAI_Language_Toolkit [REMOVED]",
+ "id": "saltai_language_toolkit",
+ "reference": "https://github.com/get-salt-AI/SaltAI_Language_Toolkit",
+ "files": [
+ "https://github.com/get-salt-AI/SaltAI_Language_Toolkit"
+ ],
+ "install_type": "git-clone",
+ "description": "The project integrates the Retrieval Augmented Generation (RAG) tool [a/Llama-Index](https://www.llamaindex.ai/), [a/Microsoft's AutoGen](https://microsoft.github.io/autogen/), and [a/LlaVA-Next](https://github.com/LLaVA-VL/LLaVA-NeXT) with ComfyUI's adaptable node interface, enhancing the functionality and user experience of the platform."
+ },
+ {
+ "author": "zmwv823",
+ "title": "ComfyUI-Sana [DEPRECATED]",
+ "reference": "https://github.com/zmwv823/ComfyUI-Sana",
+ "files": [
+ "https://github.com/zmwv823/ComfyUI-Sana"
+ ],
+ "install_type": "git-clone",
+ "description": "Unofficial custom-node for [a/SANA: Efficient High-Resolution Image Synthesis with Linear Diffusion Transformer](https://github.com/NVlabs/Sana)\n[w/A init node with lots of bugs, do not try unless interested.]"
+ },
+ {
+ "author": "ACE-innovate",
+ "title": "seg-node [REMOVED]",
+ "reference": "https://github.com/ACE-innovate/seg-node",
+ "files": [
+ "https://github.com/ACE-innovate/seg-node"
+ ],
+ "install_type": "git-clone",
+ "description": "hf cloth seg custom node for comfyui\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "zefu-lu",
+ "title": "ComfyUI_InstantX_SD35_Large_IPAdapter [REMOVED]",
+ "id": "comfyui-instantx-sd3-5-large-ipadapter",
+ "reference": "https://github.com/zefu-lu/ComfyUI-InstantX-SD3_5-Large-IPAdapter",
+ "files": [
+ "https://github.com/zefu-lu/ComfyUI-InstantX-SD3_5-Large-IPAdapter"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI node for using InstantX SD3.5-Large IPAdapter"
+ },
+ {
+ "author": "HentaiGirlfriendDotCom",
+ "title": "comfyui-highlight-connections [REMOVED]",
+ "reference": "https://github.com/HentaiGirlfriendDotCom/comfyui-highlight-connections",
+ "files": [
+ "https://github.com/HentaiGirlfriendDotCom/comfyui-highlight-connections"
+ ],
+ "install_type": "git-clone",
+ "description": "A node that can be dropped into a group. When a node is then clicked within that group, all nodes and connections in that group get greyed out and the connections from the clicked node go bright red."
+ },
+ {
+ "author": "huangyangke",
+ "title": "ComfyUI-Kolors-IpadapterFaceId [DEPRECATED]",
+ "reference": "https://github.com/huangyangke/ComfyUI-Kolors-IpadapterFaceId",
+ "files": [
+ "https://github.com/huangyangke/ComfyUI-Kolors-IpadapterFaceId"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:kolors_ipadapter_faceid\nNOTE: The files in the repo are not organized."
+ },
+ {
+ "author": "zmwv823",
+ "title": "ComfyUI_Ctrlora [DEPRECATED]",
+ "reference": "https://github.com/zmwv823/ComfyUI_Ctrlora",
+ "files": [
+ "https://github.com/zmwv823/ComfyUI_Ctrlora"
+ ],
+ "install_type": "git-clone",
+ "description": "Unofficial custom_node for [a/xyfJASON/ctrlora](https://github.com/xyfJASON/ctrlora)."
+ },
+ {
+ "author": "Fannovel16",
+ "title": "ComfyUI Loopchain [DEPRECATED]",
+ "id": "loopchain",
+ "reference": "https://github.com/Fannovel16/ComfyUI-Loopchain",
+ "files": [
+ "https://github.com/Fannovel16/ComfyUI-Loopchain"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of nodes which can be useful for animation in ComfyUI. The main focus of this extension is implementing a mechanism called loopchain. A loopchain in this case is the chain of nodes only executed repeatly in the workflow. If a node chain contains a loop node from this extension, it will become a loop chain."
+ },
+ {
+ "author": "DonBaronFactory",
+ "title": "ComfyUI-Cre8it-Nodes [DEPRECATED]",
+ "reference": "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes",
+ "files": [
+ "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:CRE8IT Serial Prompter, CRE8IT Apply Serial Prompter, CRE8IT Image Sizer. A few simple nodes to facilitate working wiht ComfyUI Workflows"
+ },
+ {
+ "author": "thecooltechguy",
+ "title": "ComfyUI-ComfyRun [DEPRECATED/UNSAFE]",
+ "reference": "https://github.com/thecooltechguy/ComfyUI-ComfyRun",
+ "files": [
+ "https://github.com/thecooltechguy/ComfyUI-ComfyRun"
+ ],
+ "install_type": "git-clone",
+ "description": "The easiest way to run & share any ComfyUI workflow [a/https://comfyrun.com](https://comfyrun.com)\nNOTE: Vulnerability discovered. Not being managed."
+ },
+ {
+ "author": "Cardoso-topdev",
+ "title": "comfyui_meshanything_v1 [REMOVED]",
+ "reference": "https://github.com/Cardoso-topdev/comfyui_meshanything_v1",
+ "files": [
+ "https://github.com/Cardoso-topdev/comfyui_meshanything_v1"
+ ],
+ "install_type": "git-clone",
+ "description": "MeshAnything V2: Artist-Created Mesh Generation With Adjacent Mesh Tokenization"
+ },
+ {
+ "author": "palant",
+ "title": "Extended Save Image for ComfyUI [DEPRECATED]",
+ "reference": "https://github.com/palant/extended-saveimage-comfyui",
+ "files": [
+ "https://github.com/palant/extended-saveimage-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node is largely identical to the usual Save Image but allows saving images also in JPEG and WEBP formats, the latter with both lossless and lossy compression. Metadata is embedded in the images as usual, and the resulting images can be used to load a workflow."
+ },
+ {
+ "author": "1038lab",
+ "title": "ComfyUI-GPT2P [REMOVED]",
+ "id": "gpt2p",
+ "reference": "https://github.com/1038lab/ComfyUI-GPT2P",
+ "files": [
+ "https://github.com/1038lab/ComfyUI-GPT2P"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Node - Hugging Face repositories GTP2 Prompt"
+ },
+ {
+ "author": "yushan777",
+ "title": "Y7 Nodes for ComfyUI [REMOVED]",
+ "id": "y7nodes",
+ "reference": "https://github.com/yushan777/ComfyUI-Y7Nodes",
+ "files": [
+ "https://github.com/yushan777/ComfyUI-Y7Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Count_Tokens_(Y7)"
+ },
+ {
+ "author": "city96",
+ "title": "SD-Advanced-Noise [DEPRECATED]",
+ "id": "adv-noise",
+ "reference": "https://github.com/city96/SD-Advanced-Noise",
+ "files": [
+ "https://github.com/city96/SD-Advanced-Noise"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: LatentGaussianNoise, MathEncode. An experimental custom node that generates latent noise directly by utilizing the linear characteristics of the latent space."
+ },
+ {
+ "author": "shockz0rz",
+ "title": "InterpolateEverything [DEPRECATED]",
+ "id": "interpolate-everything",
+ "reference": "https://github.com/shockz0rz/ComfyUI_InterpolateEverything",
+ "files": [
+ "https://github.com/shockz0rz/ComfyUI_InterpolateEverything"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: Interpolate Poses, Interpolate Lineart, ... Custom nodes for interpolating between, well, everything in the Stable Diffusion ComfyUI."
+ },
+ {
+ "author": "svdC1",
+ "title": "LoRa Dataset Tools [REMOVED]",
+ "reference": "https://github.com/svdC1/comfy-ui-lora-dataset-tools",
+ "files": [
+ "https://github.com/svdC1/comfy-ui-lora-dataset-tools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Directory Loader, Filter Images Without Faces, Detect Faces and Draw Detection Box"
+ },
+ {
+ "author": "MiddleKD",
+ "title": "ComfyUI-default-workflow-setter [REMOVED]",
+ "reference": "https://github.com/MiddleKD/ComfyUI-default-workflow-setter",
+ "files": [
+ "https://github.com/MiddleKD/ComfyUI-default-workflow-setter"
+ ],
+ "install_type": "git-clone",
+ "description": "Default workflow setter"
+ },
+ {
+ "author": "Firetheft",
+ "title": "ComfyUI-Flux-Prompt-Tools [REMOVED]",
+ "reference": "https://github.com/Firetheft/ComfyUI-Flux-Prompt-Tools",
+ "files": [
+ "https://github.com/Firetheft/ComfyUI-Flux-Prompt-Tools"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Flux Prompt Enhance, Flux Prompt Gemini Flash, Flux Prompt Generator, MiniCPM V2.6 Int4"
+ },
+ {
+ "author": "jtydhr88",
+ "title": "ComfyUI Unique3D [DEPRECATED]",
+ "id": "unique3d",
+ "reference": "https://github.com/jtydhr88/ComfyUI-Unique3D",
+ "files": [
+ "https://github.com/jtydhr88/ComfyUI-Unique3D"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Unique3D is custom nodes that running AiuniAI/Unique3D into ComfyUI[w/Please follow readme to install with ComfyUI embedded python.]"
+ },
+ {
+ "author": "mpiquero7164",
+ "title": "SaveImgPrompt [DEPRECATED]",
+ "id": "save-imgprompt",
+ "reference": "https://github.com/mpiquero7164/ComfyUI-SaveImgPrompt",
+ "files": [
+ "https://github.com/mpiquero7164/ComfyUI-SaveImgPrompt"
+ ],
+ "install_type": "git-clone",
+ "description": "Save a png or jpeg and option to save prompt/workflow in a text or json file for each image in Comfy + Workflow loading."
+ },
+ {
+ "author": "guoyk93",
+ "title": "y.k.'s ComfyUI node suite [DEPRECATED]",
+ "id": "yks",
+ "reference": "https://github.com/yankeguo-deprecated/yk-node-suite-comfyui",
+ "files": [
+ "https://github.com/yankeguo-deprecated/yk-node-suite-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: YKImagePadForOutpaint, YKMaskToImage"
+ },
+ {
+ "author": "adityathiru",
+ "title": "ComfyUI LLMs [REMOVED]",
+ "reference": "https://github.com/adityathiru/ComfyUI-LLMs",
+ "files": [
+ "https://github.com/adityathiru/ComfyUI-LLMs"
+ ],
+ "install_type": "git-clone",
+ "description": "Goal: To enable folks to rapidly build complex workflows with LLMs\nNOTE:☠️ This is experimental and not recommended to use in a production environment (yet!)"
+ },
+ {
+ "author": "DannyStone1999",
+ "title": "ComfyUI-Depth2Mask [REMOVED]",
+ "reference": "https://github.com/DannyStone1999/ComfyUI-Depth2Mask",
+ "files": [
+ "https://github.com/DannyStone1999/ComfyUI-Depth2Mask/raw/main/Depth2Mask.py"
+ ],
+ "install_type": "copy",
+ "description": "Nodes:Depth2Mask"
+ },
+ {
+ "author": "syaofox",
+ "title": "ComfyUI_FoxTools [REMOVED]",
+ "reference": "https://github.com/syaofox/ComfyUI_FoxTools",
+ "files": [
+ "https://github.com/syaofox/ComfyUI_FoxTools"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:BatchImageFromList, Load Face Occlusion Model, Create Face Mask, Simple FaceAlign, Cacul FaceAlign, Gen Blurbord, Face Align, Face Rotate, ImageAdd, LoadImageList, SaveImage Plus, RegTextFind"
+ },
+ {
+ "author": "AIFSH",
+ "title": "SeedVC-ComfyUI [REMOVED]",
+ "reference": "https://github.com/AIFSH/SeedVC-ComfyUI",
+ "files": [
+ "https://github.com/AIFSH/SeedVC-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "a custom node for [a/seed-vc](https://github.com/Plachtaa/seed-vc)"
+ },
+ {
+ "author": "jazhang00",
+ "title": "ComfyUI Node for Slicedit [REMOVED]",
+ "reference": "https://github.com/jazhang00/ComfyUI-Slicedit",
+ "files": [
+ "https://github.com/jazhang00/ComfyUI-Slicedit"
+ ],
+ "install_type": "git-clone",
+ "description": "Slicedit main page: [a/https://matankleiner.github.io/slicedit/](https://matankleiner.github.io/slicedit/). Use Slicedit with ComfyUI."
+ },
+ {
+ "author": "rklaffehn",
+ "title": "rk-comfy-nodes [REMOVED]",
+ "id": "rknodes",
+ "reference": "https://github.com/rklaffehn/rk-comfy-nodes",
+ "files": [
+ "https://github.com/rklaffehn/rk-comfy-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: RK_CivitAIMetaChecker, RK_CivitAIAddHashes."
+ },
+ {
+ "author": "Extraltodeus",
+ "title": "CLIP-Token-Injection [REMOVED]",
+ "reference": "https://github.com/Extraltodeus/CLIP-Token-Injection",
+ "files": [
+ "https://github.com/Extraltodeus/CLIP-Token-Injection"
+ ],
+ "install_type": "git-clone",
+ "description": "These nodes are to edit the text vectors of CLIP models, so to customize how the prompts will be interpreted. You could see it as either customisation, 'one token prompt' up to some limitation and a way to mess with how the text will be interpreted. The edited CLIP can then be saved, or as well the edited tokens themselves. The shared example weights does not contain any image-knowledge but the text vector of the words affected."
+ },
+ {
+ "author": "openart",
+ "title": "openart-comfyui-deploy [REMOVED]",
+ "id": "openart-comfyui-deploy",
+ "reference": "https://github.com/kulsisme/openart-comfyui-deploy",
+ "files": [
+ "https://github.com/kulsisme/openart-comfyui-deploy"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES: External Boolean (ComfyUI Deploy), External Checkpoint (ComfyUI Deploy), External Image (ComfyUI Deploy), External Video (ComfyUI Deploy x VHS), OpenArt Text, Image Websocket Output (ComfyDeploy), ..."
+ },
+ {
+ "author": "mittimi",
+ "title": "ComfyUI_mittimiLoadPreset [DEPRECATED]",
+ "id": "comfyui-mittimi-load-preset",
+ "reference": "https://github.com/mittimi/ComfyUI_mittimiLoadPreset",
+ "files": [
+ "https://github.com/mittimi/ComfyUI_mittimiLoadPreset"
+ ],
+ "install_type": "git-clone",
+ "description": "The system selects and loads preset."
+ },
+ {
+ "author": "jinljin",
+ "title": "ComfyUI-Talking-Head [REMOVED]",
+ "reference": "https://github.com/jinljin/ComfyUI-ElevenlabsAndDID-Combine",
+ "files": [
+ "https://github.com/jinljin/ComfyUI-ElevenlabsAndDID-Combine"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI-Talking-Head"
+ },
+ {
+ "author": "jh-leon-kim",
+ "title": "ComfyUI-JHK-utils [REMOVED]",
+ "id": "jhk",
+ "reference": "https://github.com/jh-leon-kim/ComfyUI-JHK-utils",
+ "files": [
+ "https://github.com/jh-leon-kim/ComfyUI-JHK-utils"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:JHK_Utils_LoadEmbed, JHK_Utils_string_merge, JHK_Utils_ImageRemoveBackground"
+ },
+ {
+ "author": "ilovejohnwhite",
+ "title": "TatToolkit [REMOVED]",
+ "reference": "https://github.com/ilovejohnwhite/UncleBillyGoncho",
+ "files": [
+ "https://github.com/ilovejohnwhite/UncleBillyGoncho"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:UWU TTK Preprocessor, Pixel Perfect Resolution, Generation Resolution From Image, Generation Resolution From Latent, Enchance And Resize Hint Images, ..."
+ },
+ {
+ "author": "hzchet",
+ "title": "ComfyUI_QueueGeneration [REMOVED]",
+ "reference": "https://github.com/hzchet/ComfyUI_QueueGeneration",
+ "files": [
+ "https://github.com/hzchet/ComfyUI_QueueGeneration"
+ ],
+ "install_type": "git-clone",
+ "description": "NODES:Queue Img2Vid Generation"
+ },
+ {
+ "author": "ader47",
+ "title": "ComfyUI-MeshHamer [REMOVED]",
+ "reference": "https://github.com/ader47/comfyui_meshhamer",
+ "files": [
+ "https://github.com/ader47/comfyui_meshhamer"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:MeshHamer Hand Refiner. See also: [a/HaMeR: Hand Mesh Recovery](https://github.com/geopavlakos/hamer/tree/main)"
+ },
+ {
+ "author": "SEkINVR",
+ "title": "ComfyUI-Animator",
+ "reference": "https://github.com/SEkINVR/ComfyUI-Animator [REMOVED]",
+ "files": [
+ "https://github.com/SEkINVR/ComfyUI-Animator"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom node for ComfyUI provides full-body animation capabilities, including facial rigging, various lighting styles, and green screen output."
+ },
+ {
+ "author": "ZHO-ZHO-ZHO",
+ "title": "ComfyUI-AnyText [NOT MAINTAINED]",
+ "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText",
+ "files": [
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText"
+ ],
+ "install_type": "git-clone",
+ "description": "Unofficial implementation of [a/AnyText](https://github.com/tyxsspa/AnyText/tree/825bcc54687206b15bd7e28ba1a8b095989d58e3) for ComfyUI(EXP)"
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-pkg39 [DEPRECATED]",
+ "reference": "https://github.com/shinich39/comfyui-pkg39",
+ "files": [
+ "https://github.com/shinich39/comfyui-pkg39"
+ ],
+ "install_type": "git-clone",
+ "description": "This package has created for generate image from generated image and embedded workflow."
+ },
+ {
+ "author": "dnl13",
+ "title": "ComfyUI-dnl13-seg [DEPRECATED]",
+ "reference": "https://github.com/dnl13/ComfyUI-dnl13-seg",
+ "files": [
+ "https://github.com/dnl13/ComfyUI-dnl13-seg"
+ ],
+ "install_type": "git-clone",
+ "description": "After discovering @storyicon implementation here of Segment Anything, I realized its potential as a powerful tool for ComfyUI if implemented correctly. I delved into the SAM and Dino models. The following is my own adaptation of sam_hq for ComfyUI."
+ },
+ {
+ "author": "1038lab",
+ "title": "ComfyUI-latentSizeSelector [REMOVED]",
+ "id": "ComfyUI-latentSizeSelector",
+ "reference": "https://github.com/1038lab/ComfyUI_LatentSizeSelector",
+ "files": [
+ "https://github.com/1038lab/ComfyUI_LatentSizeSelector"
+ ],
+ "install_type": "git-clone",
+ "description": "You'll get a new node Latent Size Selector, you can pick the x and y sizes from a list."
+ },
+ {
+ "author": "hy134300",
+ "title": "ComfyUI-PhotoMaker-V2 [REMOVED]",
+ "reference": "https://github.com/hy134300/ComfyUI-PhotoMaker-V2",
+ "files": [
+ "https://github.com/hy134300/ComfyUI-PhotoMaker-V2"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes for PhotoMaker-V2"
+ },
+ {
+ "author": "neverbiasu",
+ "title": "ComfyUI ImageCaptioner [REMOVED]",
+ "reference": "https://github.com/neverbiasu/ComfyUI-ImageCaptioner",
+ "files": [
+ "https://github.com/neverbiasu/ComfyUI-ImageCaptioner"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI extension for generating captions for your images. Runs on your own system, no external services used, no filter."
+ },
+ {
+ "author": "mingqizhang",
+ "title": "ComfyUI_InSPyResNet_zmq [REMOVED]",
+ "id": "inspy",
+ "reference": "https://github.com/mingqizhang/ComfyUI_InSPyResNet_zmq",
+ "files": [
+ "https://github.com/mingqizhang/ComfyUI_InSPyResNet_zmq"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:INSPY removebg ModelLoader, INSPY RMBG"
+ },
+ {
+ "author": "mingqizhang",
+ "title": "ComfyUI_AEMatter_zmq [REMOVED]",
+ "id": "aematter",
+ "reference": "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq",
+ "files": [
+ "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:AEMatter_ModelLoader, Create_Trimap, AEMatter_Apply, Mask_Transfor, Replace_Background, Gaussian_Filter, Guide_Filter, Improved_Aplha_Composite"
+ },
+ {
+ "author": "bradsec",
+ "title": "ComfyUI_StringTools [REMOVED]",
+ "id": "stringtools",
+ "reference": "https://github.com/bradsec/ComfyUI_StringTools",
+ "files": [
+ "https://github.com/bradsec/ComfyUI_StringTools"
+ ],
+ "install_type": "git-clone",
+ "description": "Some simple string tools to modify text and strings in ComfyUI."
+ },
+ {
+ "author": "Millyarde",
+ "title": "Pomfy - Photoshop and ComfyUI 2-way sync [REMOVED]",
+ "reference": "https://github.com/Millyarde/Pomfy",
+ "files": [
+ "https://github.com/Millyarde/Pomfy"
+ ],
+ "install_type": "git-clone",
+ "description": "Photoshop custom nodes inside of ComfyUi, send and get data via Photoshop UXP plugin for cross platform support"
+ },
+ {
+ "author": "turkyden",
+ "title": "ComfyUI-Sticker [REMOVED]",
+ "reference": "https://github.com/turkyden/ComfyUI-Sticker",
+ "files": [
+ "https://github.com/turkyden/ComfyUI-Sticker"
+ ],
+ "install_type": "git-clone",
+ "description": "image to sticker"
+ },
+ {
+ "author": "turkyden",
+ "title": "ComfyUI-Comic [REMOVED]",
+ "id": "comic",
+ "reference": "https://github.com/turkyden/ComfyUI-Comic",
+ "files": [
+ "https://github.com/turkyden/ComfyUI-Comic"
+ ],
+ "install_type": "git-clone",
+ "description": "a comfyui plugin for image to comic"
+ },
+ {
+ "author": "turkyden",
+ "title": "ComfyUI-Avatar [REMOVED]",
+ "id": "avatar",
+ "reference": "https://github.com/turkyden/ComfyUI-Avatar",
+ "files": [
+ "https://github.com/turkyden/ComfyUI-Avatar"
+ ],
+ "install_type": "git-clone",
+ "description": "a comfyui plugin for image to avatar"
+ },
+ {
+ "author": "bvhari",
+ "title": "LatentToRGB [DEPRECATED]",
+ "id": "latent2rgb",
+ "reference": "https://github.com/bvhari/ComfyUI_LatentToRGB",
+ "files": [
+ "https://github.com/bvhari/ComfyUI_LatentToRGB"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node to convert latent to RGB.\nNOTE:This repo has been archived because ComfyUI natively has similar functionality now"
+ },
+ {
+ "author": "Kaharos94",
+ "title": "ComfyUI-Saveaswebp [DEPRECATED]",
+ "id": "save-webp",
+ "reference": "https://github.com/Kaharos94/ComfyUI-Saveaswebp",
+ "files": [
+ "https://github.com/Kaharos94/ComfyUI-Saveaswebp"
+ ],
+ "install_type": "git-clone",
+ "description": "Save a picture as Webp file in Comfy + Workflow loading"
+ },
+ {
+ "author": "udi0510",
+ "title": "comfyui-slicer [REMOVED]",
+ "id": "slicer",
+ "reference": "https://github.com/udi0510/comfyui-slicer",
+ "files": [
+ "https://github.com/udi0510/comfyui-slicer"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:SlicerNode"
+ },
+ {
+ "author": "logtd",
+ "title": "ComfyUI-FLATTEN [REMOVED]",
+ "id": "flatten",
+ "reference": "https://github.com/logtd/ComfyUI-FlattenFlow",
+ "files": [
+ "https://github.com/logtd/ComfyUI-FlattenFlow"
+ ],
+ "install_type": "git-clone",
+ "description": "An alternate trajectory processor for ComfyUI-FLATTEN\nNOTE:When using this trajectory type FLATTEN will use roughly 1/4 VRAM and be ~20% faster at the cost of some consistency (especially when injection_steps are low)."
+ },
+ {
+ "author": "MackinationsAi",
+ "title": "ComfyUi_Stuctured-Outputs [REMOVED]",
+ "id": "struct-output",
+ "reference": "https://github.com/MackinationsAi/ComfyUi_Stuctured-Outputs",
+ "files": [
+ "https://github.com/MackinationsAi/ComfyUi_Stuctured-Outputs"
+ ],
+ "install_type": "git-clone",
+ "description": "This repository contains a custom node for ComfyUI that allows users to save generative image outputs with custom filenames and folder structures. The filenames are padded to four digits, and the positive and negative prompts are embedded in the image metadata."
+ },
+ {
+ "author": "laksjdjf",
+ "title": "attention-couple-ComfyUI [DEPRECATED]",
+ "id": "attention-couple",
+ "reference": "https://github.com/laksjdjf/attention-couple-ComfyUI",
+ "files": [
+ "https://github.com/laksjdjf/attention-couple-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Attention couple. This is a custom node that manipulates region-specific prompts. While vanilla ComfyUI employs an area specification method based on latent couples, this node divides regions using attention layers within UNet.\nNOTE: This has been integrated with cgem156-ComfyUI."
+ },
+ {
+ "author": "phineas-pta",
+ "title": "comfy-trt-test [DEPRECATED]",
+ "reference": "https://github.com/phineas-pta/comfy-trt-test",
+ "files": [
+ "https://github.com/phineas-pta/comfy-trt-test"
+ ],
+ "install_type": "git-clone",
+ "description": "Test project for ComfyUI TensorRT Support.\nNOT WORKING YET.\nnot automatic yet, do not use ComfyUI-Manager to install !!!.\nnot beginner-friendly yet, still intended to technical users\nNOTE: The reason for registration in the Manager is for guidance, and for detailed installation instructions, please visit the repository.\nNOTE: Use 'TensorRT Node for ComfyUI' instead of this."
+ },
+ {
+ "author": "dezi-ai",
+ "title": "ComfyUI Animate LCM [NOT MAINTAINED]",
+ "reference": "https://github.com/dezi-ai/ComfyUI-AnimateLCM",
+ "files": [
+ "https://github.com/dezi-ai/ComfyUI-AnimateLCM"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI implementation for [a/AnimateLCM](https://animatelcm.github.io/) [[a/paper](https://arxiv.org/abs/2402.00769)].\b[w/This extension includes a large number of nodes imported from the existing custom nodes, increasing the likelihood of conflicts.]"
+ },
+ {
+ "author": "christian-byrne",
+ "title": "elimination-nodes [REMOVED]",
+ "reference": "https://github.com/christian-byrne/elimination-nodes",
+ "files": [
+ "https://github.com/christian-byrne/elimination-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Paste Cutout on Base Image"
+ },
+ {
+ "author": "Levy1417",
+ "title": "Universal-Data-Processing-Kit [UNSAFE] [REMOVED]",
+ "reference": "https://github.com/Levy1417/Universal-Data-Processing-Kit",
+ "files": [
+ "https://github.com/Levy1417/Universal-Data-Processing-Kit"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:DPK - Any Eval, DPK - Extract Array, DPK - Run External Program, DPK - Any Literals, DPK - Set Node States, DPK - Realtime Text Preview, DPK - Dynamic Action, DPK - Object To Json, DPK - Json To Object\n[w/This extension includes the ability to execute arbitrary code and programs.]"
+ },
+ {
+ "author": "liusida",
+ "title": "ComfyUI-Sida-Remove-Image [UNSAFE] [REMOVED]",
+ "reference": "https://github.com/liusida/ComfyUI-Sida-Remove-Image",
+ "files": [
+ "https://github.com/liusida/ComfyUI-Sida-Remove-Image"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: LoadImageWithPrivacy, RemoveImage.[w/This extension is not secure because it provides the capability to delete files from arbitrary paths.]"
+ },
+ {
+ "author": "88IO",
+ "title": "ComfyUI Image Reordering Plugins [REMOVED]",
+ "reference": "https://github.com/88IO/ComfyUI-ImageReorder",
+ "files": [
+ "https://github.com/88IO/ComfyUI-ImageReorder"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node reorder multiple image frames based on indexes or curves."
+ },
+ {
+ "author": "jtydhr88",
+ "title": "ComfyUI-InstantMesh [DEPRECATED]",
+ "id": "instant-mesh",
+ "reference": "https://github.com/jtydhr88/ComfyUI-InstantMesh",
+ "files": [
+ "https://github.com/jtydhr88/ComfyUI-InstantMesh"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI InstantMesh is custom nodes that running TencentARC/InstantMesh into ComfyUI, this extension depends on ComfyUI-3D-Pack. Please refer to Readme carefully to install.\nNOTE: This repo is archived due to ComfyUI-3D-Pack supports InstantMesh, please check 3D-Pack directly if you need it"
+ },
+ {
+ "author": "biegert",
+ "title": "CLIPSeg [NOT MAINTAINED]",
+ "id": "clipseg",
+ "reference": "https://github.com/biegert/ComfyUI-CLIPSeg",
+ "files": [
+ "https://github.com/biegert/ComfyUI-CLIPSeg/raw/main/custom_nodes/clipseg.py"
+ ],
+ "install_type": "copy",
+ "description": "The CLIPSeg node generates a binary mask for a given input image and text prompt."
+ },
+ {
+ "author": "tankucc1no",
+ "title": "ComfyUI-Dragdiffusion [REMOVED]",
+ "id": "dragdiffusion",
+ "reference": "https://github.com/tankucc1no/ComfyUI-Dragdiffusion",
+ "files": [
+ "https://github.com/tankucc1no/ComfyUI-Dragdiffusion"
+ ],
+ "install_type": "git-clone",
+ "description": "Implementation of [a/Dragdiffusion](https://github.com/Yujun-Shi/DragDiffusion) in ComfyUI."
+ },
+ {
+ "author": "wibur0620",
+ "title": "ComfyUI Ollama (wibur) [REMOVED]",
+ "id": "ollama-wibur",
+ "reference": "https://github.com/wibur0620/comfyui-ollama-wibur",
+ "files": [
+ "https://github.com/wibur0620/comfyui-ollama-wibur"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI Nodes for interacting with [a/Ollama](https://ollama.com/) using the ollama python client.\nIntegrate the power of LLMs into ComfyUI workflows easily or just experiment with GPT.\nNOTE: To use this properly, you would need a running Ollama server reachable from the host that is running ComfyUI."
+ },
+ {
+ "author": "IKHOR",
+ "title": "ikhor-nodes [REMOVED]",
+ "reference": "https://github.com/IKHOR/ComfyUI-IKHOR-Jam-Nodes",
+ "files": [
+ "https://github.com/IKHOR/ComfyUI-IKHOR-Jam-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:LoadFromS3, LoadBatchFromS3, SaveToS3, SaveBatchToS3"
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI wrapper nodes for IC-light [DEPRECATED]",
+ "reference": "https://github.com/kijai/ComfyUI-IC-Light-Wrapper",
+ "files": [
+ "https://github.com/kijai/ComfyUI-IC-Light-Wrapper"
+ ],
+ "install_type": "git-clone",
+ "description": "Stopped. Original repo: [a/https://github.com/lllyasviel/IC-Light](https://github.com/lllyasviel/IC-Light)"
+ },
+ {
+ "author": "thedyze",
+ "title": "Save Image Extended for ComfyUI",
+ "reference": "https://github.com/thedyze/save-image-extended-comfyui",
+ "files": [
+ "https://github.com/thedyze/save-image-extended-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Customize the information saved in file- and folder names. Use the values of sampler parameters as part of file or folder names. Save your positive & negative prompt as entries in a JSON (text) file, in each folder.\n[w/This custom node has not been maintained for a long time. Please use an alternative node from the default channel.]"
+ },
+ {
+ "author": "ExponentialML",
+ "title": "ComfyUI_ELLA [DEPRECATED]",
+ "reference": "https://github.com/ExponentialML/ComfyUI_ELLA",
+ "files": [
+ "https://github.com/ExponentialML/ComfyUI_ELLA"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Implementaion of ELLA: Equip Diffusion Models with LLM for Enhanced Semantic Alignment.[w/Officially implemented here: [a/https://github.com/TencentQQGYLab/ComfyUI-ELLA](https://github.com/TencentQQGYLab/ComfyUI-ELLA)]"
+ },
+ {
+ "author": "shinich39",
+ "title": "comfyui-text-pipe-39 [DEPRECATED]",
+ "reference": "https://github.com/shinich39/comfyui-text-pipe-39",
+ "files": [
+ "https://github.com/shinich39/comfyui-text-pipe-39"
+ ],
+ "install_type": "git-clone",
+ "description": "Modify text by condition."
+ },
+ {
+ "author": "Big Idea Technology",
+ "title": "Image Text Overlay Node for ComfyUI [DEPRECATED]",
+ "reference": "https://github.com/Big-Idea-Technology/ComfyUI_Image_Text_Overlay",
+ "files": [
+ "https://github.com/Big-Idea-Technology/ComfyUI_Image_Text_Overlay"
+ ],
+ "install_type": "git-clone",
+ "description": "Please note that the ImageTextOverlay project is no longer supported and has been moved to a new repository. For ongoing developments, contributions, and issues, please refer to the new repository at: [a/https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools](https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools)"
+ },
+ {
+ "author": "mlinmg",
+ "title": "LaMa Preprocessor [DEPRECATED]",
+ "reference": "https://github.com/mlinmg/ComfyUI-LaMA-Preprocessor",
+ "files": [
+ "https://github.com/mlinmg/ComfyUI-LaMA-Preprocessor"
+ ],
+ "install_type": "git-clone",
+ "description": "A LaMa prerocessor for ComfyUI. This preprocessor finally enable users to generate coherent inpaint and outpaint prompt-free. The best results are given on landscapes, not so much in drawings/animation."
+ },
+ {
+ "author": "CapsAdmin",
+ "title": "ComfyUI-Euler-Smea-Dyn-Sampler [DEPRECATED]",
+ "reference": "https://github.com/CapsAdmin/ComfyUI-Euler-Smea-Dyn-Sampler",
+ "files": [
+ "https://github.com/CapsAdmin/ComfyUI-Euler-Smea-Dyn-Sampler"
+ ],
+ "install_type": "git-clone",
+ "description": "Just a comfyui version of [a/Euler Smea Dyn Sampler](https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler). It adds the sampler directly to existing samplers."
+ },
+ {
+ "author": "BlakeOne",
+ "title": "ComfyUI FastImageListToImageBatch [REMOVED]",
+ "reference": "https://github.com/BlakeOne/ComfyUI-FastImageListToImageBatch",
+ "files": [
+ "https://github.com/BlakeOne/ComfyUI-FastImageListToImageBatch"
+ ],
+ "install_type": "git-clone",
+ "description": "Quickly convert a list of images to a batch of images. All images must be the same size. Great for long videos."
+ },
+ {
+ "author": "ggpid",
+ "title": "idpark_custom_node [REMOVED]",
+ "reference": "https://github.com/ggpid/idpark_custom_node",
+ "files": [
+ "https://github.com/ggpid/idpark_custom_node"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Load Image from S3, Save Image to S3, Generate SAM, Generate FastSAM, Cut by Mask fixed"
+ },
+ {
+ "author": "Davemane42",
+ "title": "Visual Area Conditioning / Latent composition [DEPRECATED]",
+ "reference": "https://github.com/Davemane42/ComfyUI_Dave_CustomNode",
+ "files": [
+ "https://github.com/Davemane42/ComfyUI_Dave_CustomNode"
+ ],
+ "install_type": "git-clone",
+ "description": "This tool provides custom nodes that allow visualization and configuration of area conditioning and latent composite."
+ },
+ {
+ "author": "laksjdjf",
+ "title": "LoRA-Merger-ComfyUI [DEPRECATED]",
+ "reference": "https://github.com/laksjdjf/LoRA-Merger-ComfyUI",
+ "files": [
+ "https://github.com/laksjdjf/LoRA-Merger-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Load LoRA Weight Only, Load LoRA from Weight, Merge LoRA, Save LoRA. This extension provides nodes for merging LoRA."
+ },
+ {
+ "author": "kinfolk0117",
+ "title": "TiledIPAdapter [DEPRECATED]",
+ "reference": "https://github.com/kinfolk0117/ComfyUI_TiledIPAdapter",
+ "files": [
+ "https://github.com/kinfolk0117/ComfyUI_TiledIPAdapter"
+ ],
+ "install_type": "git-clone",
+ "description": "Proof of concent on how to use IPAdapter to control tiled upscaling. NOTE: You need to have 'ComfyUI_IPAdapter_plus' installed."
+ },
+ {
+ "author": "XINZHANG-ops",
+ "title": "comfyui-xin-nodes [REMOVED]",
+ "reference": "https://github.com/XINZHANG-ops/comfyui-xin-nodes",
+ "files": [
+ "https://github.com/XINZHANG-ops/comfyui-xin-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:ImageSizeClassifer, RandomInt, ShowValue"
+ },
+ {
+ "author": "ssitu",
+ "title": "NestedNodeBuilder [DEPRECATED]",
+ "reference": "https://github.com/ssitu/ComfyUI_NestedNodeBuilder",
+ "files": [
+ "https://github.com/ssitu/ComfyUI_NestedNodeBuilder"
+ ],
+ "install_type": "git-clone",
+ "description": "This extension provides the ability to combine multiple nodes into a single node.\nNOTE:An identical feature now exists in ComfyUI. Additionally, this extension is largely broken with the recent versions of the codebase, so please use the built-in feature for group nodes."
+ },
+ {
+ "author": "ccvv804",
+ "title": "ComfyUI StableCascade using diffusers for Low VRAM [DEPRECATED]",
+ "reference": "https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM",
+ "files": [
+ "https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM"
+ ],
+ "install_type": "git-clone",
+ "description": "Works with RTX 4070ti 12GB.\nSimple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
+ },
+ {
+ "author": "kijai",
+ "title": "ComfyUI StableCascade using diffusers [DEPRECATED]",
+ "reference": "https://github.com/kijai/ComfyUI-DiffusersStableCascade",
+ "files": [
+ "https://github.com/kijai/ComfyUI-DiffusersStableCascade"
+ ],
+ "install_type": "git-clone",
+ "description": "Simple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
+ },
+ {
+ "author": "solarpush",
+ "title": "comfyui_sendimage_node [REMOVED]",
+ "reference": "https://github.com/solarpush/comfyui_sendimage_node",
+ "files": [
+ "https://github.com/solarpush/comfyui_sendimage_node"
+ ],
+ "install_type": "git-clone",
+ "description": "Send images to the pod."
+ },
+ {
+ "author": "azazeal04",
+ "title": "ComfyUI-Styles",
+ "reference": "https://github.com/azazeal04/ComfyUI-Styles",
+ "files": [
+ "https://github.com/azazeal04/ComfyUI-Styles"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Anime_Styler, Fantasy_Styler, Gothic_Styler, Line_Art_Styler, Movie_Poster_Styler, Punk_Styler, Travel_Poster_Styler. This extension offers 8 art style nodes, each of which includes approximately 50 individual style variations.\n\nNOTE: Due to the dynamic nature of node name definitions, ComfyUI-Manager cannot recognize the node list from this extension. The Missing nodes and Badge features are not available for this extension.\nNOTE: This extension is removed. Users who were previously using this node should install ComfyUI-styles-all instead."
+ },
+ {
+ "author": "hnmr293",
+ "title": "ComfyUI-nodes-hnmr",
+ "reference": "https://github.com/hnmr293/ComfyUI-nodes-hnmr",
+ "files": [
+ "https://github.com/hnmr293/ComfyUI-nodes-hnmr"
+ ],
+ "install_type": "git-clone",
+ "description": "Provide various custom nodes for Latent, Sampling, Model, Loader, Image, Text"
+ },
+ {
+ "author": "bvhari",
+ "title": "ComfyUI_PerpNeg [WIP]",
+ "reference": "https://github.com/bvhari/ComfyUI_PerpNeg",
+ "files": [
+ "https://github.com/bvhari/ComfyUI_PerpNeg"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: KSampler (Advanced + Perp-Neg). Implementation of [a/Perp-Neg](https://perp-neg.github.io/)\nIncludes Tonemap and CFG Rescale optionsComfyUI custom node to convert latent to RGB.[w/WARNING: Experimental code, might have incompatibilities and edge cases.]\nNOTE: In the latest version of ComfyUI, this extension is included as built-in."
+ },
+ {
+ "author": "laksjdjf",
+ "title": "IPAdapter-ComfyUI",
+ "reference": "https://github.com/laksjdjf/IPAdapter-ComfyUI",
+ "files": [
+ "https://github.com/laksjdjf/IPAdapter-ComfyUI"
+ ],
+ "install_type": "git-clone",
+ "description": "This custom nodes provides loader of the IP-Adapter model.[w/NOTE: To use this extension node, you need to download the [a/ip-adapter_sd15.bin](https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15.bin) file and place it in the %%**custom_nodes/IPAdapter-ComfyUI/models**%% directory. Additionally, you need to download the 'Clip vision model' from the 'Install models' menu as well.]\nNOTE: Use ComfyUI_IPAdapter_plus instead of this."
+ },
+ {
+ "author": "RockOfFire",
+ "title": "CR Animation Nodes",
+ "reference": "https://github.com/RockOfFire/CR_Animation_Nodes",
+ "files": [
+ "https://github.com/RockOfFire/CR_Animation_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A comprehensive suite of nodes to enhance your animations. These nodes include some features similar to Deforum, and also some new ideas. NOTE: This node is merged into Comfyroll Custom Nodes."
+ },
+ {
+ "author": "tkoenig89",
+ "title": "Load Image with metadata",
+ "reference": "https://github.com/tkoenig89/ComfyUI_Load_Image_With_Metadata",
+ "files": [
+ "https://github.com/tkoenig89/ComfyUI_Load_Image_With_Metadata"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom node for comfy ui to read generation data from images (prompt, seed, size...). This could be used when upscaling generated images to use the original prompt and seed."
+ },
+ {
+ "author": "LucianoCirino",
+ "title": "Efficiency Nodes for ComfyUI [LEGACY]",
+ "reference": "https://github.com/LucianoCirino/efficiency-nodes-comfyui",
+ "files": [
+ "https://github.com/LucianoCirino/efficiency-nodes-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of ComfyUI custom nodes to help streamline workflows and reduce total node count. NOTE: This repository is the original repository but is no longer maintained. Please use the forked version by jags."
+ },
+ {
+ "author": "GeLi1989",
+ "title": "roop nodes for ComfyUI",
+ "reference": "https://github.com/GeLi1989/GK-beifen-ComfyUI_roop",
+ "files": [
+ "https://github.com/GeLi1989/GK-beifen-ComfyUI_roop"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for the roop A1111 webui script. NOTE: Need to download model to use this node. NOTE: This is removed."
+ },
+ {
+ "author": "ProDALOR",
+ "title": "comfyui_u2net",
+ "reference": "https://github.com/ProDALOR/comfyui_u2net",
+ "files": [
+ "https://github.com/ProDALOR/comfyui_u2net"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: Load U2Net model, U2Net segmentation, To mask, Segmentation to mask, U2NetBaseNormalization, U2NetMaxNormalization. NOTE: This is removed."
+ },
+ {
+ "author": "FizzleDorf",
+ "title": "AIT",
+ "reference": "https://github.com/FizzleDorf/AIT",
+ "files": [
+ "https://github.com/FizzleDorf/AIT"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: Load AITemplate, Load AITemplate (ControlNet), VAE Decode (AITemplate), VAE Encode (AITemplate), VAE Encode (AITemplate, Inpaint). Experimental usage of AITemplate. NOTE: This is deprecated extension. Use ComfyUI-AIT instead of this."
+ },
+ {
+ "author": "chenbaiyujason",
+ "title": "sc-node-comfyui",
+ "reference": "https://github.com/chenbaiyujason/sc-node-comfyui",
+ "files": [
+ "https://github.com/chenbaiyujason/sc-node-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes for GPT interaction and text manipulation"
+ },
+ {
+ "author": "asd417",
+ "title": "CheckpointTomeLoader",
+ "reference": "https://github.com/asd417/tomeSD_for_Comfy",
+ "files": [
+ "https://github.com/ltdrdata/ComfyUI-tomeSD-installer"
+ ],
+ "install_type": "git-clone",
+ "description": "tomeSD(https://github.com/dbolya/tomesd) applied to ComfyUI stable diffusion UI using custom node. Note:In vanilla ComfyUI, the TomePatchModel node is provided as a built-in feature. "
+ },
+ {
+ "author": "gamert",
+ "title": "ComfyUI_tagger",
+ "reference": "https://github.com/gamert/ComfyUI_tagger",
+ "pip": ["gradio"],
+ "files": [
+ "https://github.com/gamert/ComfyUI_tagger"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes: CLIPTextEncodeTaggerDD, ImageTaggerDD. WARNING: Installing the current version is causing an issue where ComfyUI fails to start.
"
+ },
+ {
+ "author": "Fannovel16",
+ "title": "ControlNet Preprocessors",
+ "reference": "https://github.com/Fannovel16/comfy_controlnet_preprocessors",
+ "files": [
+ "https://github.com/Fannovel16/comfy_controlnet_preprocessors"
+ ],
+ "install_type": "git-clone",
+ "description": "ControlNet Preprocessors. (To use this extension, you need to download the required model file from Install Models ) NOTE: Please uninstall this custom node and instead install 'ComfyUI's ControlNet Auxiliary Preprocessors' from the default channel. To use nodes belonging to controlnet v1 such as Canny_Edge_Preprocessor, MIDAS_Depth_Map_Preprocessor, Uniformer_SemSegPreprocessor, etc. , you need to copy the config.yaml.example file to config.yaml and change skip_v1: True to skip_v1: False .
"
+ },
+ {
+ "author": "comfyanonymous",
+ "title": "ComfyUI_experiments/sampler_tonemap",
+ "reference": "https://github.com/comfyanonymous/ComfyUI_experiments",
+ "files": [
+ "https://github.com/comfyanonymous/ComfyUI_experiments/raw/master/sampler_tonemap.py"
+ ],
+ "install_type": "copy",
+ "description": "ModelSamplerTonemapNoiseTest a node that makes the sampler use a simple tonemapping algorithm to tonemap the noise. It will let you use higher CFG without breaking the image. To using higher CFG lower the multiplier value. Similar to Dynamic Thresholding extension of A1111. "
+ },
+ {
+ "author": "comfyanonymous",
+ "title": "ComfyUI_experiments/sampler_rescalecfg",
+ "reference": "https://github.com/comfyanonymous/ComfyUI_experiments",
+ "files": [
+ "https://github.com/comfyanonymous/ComfyUI_experiments/raw/master/sampler_rescalecfg.py"
+ ],
+ "install_type": "copy",
+ "description": "RescaleClassifierFreeGuidance improves the problem of images being degraded by high CFG.To using higher CFG lower the multiplier value. Similar to Dynamic Thresholding extension of A1111. ( reference paper)It is recommended to use the integrated custom nodes in the default channel for update support rather than installing individual nodes.
"
+ },
+ {
+ "author": "comfyanonymous",
+ "title": "ComfyUI_experiments/advanced_model_merging",
+ "reference": "https://github.com/comfyanonymous/ComfyUI_experiments",
+ "files": [
+ "https://github.com/comfyanonymous/ComfyUI_experiments/raw/master/advanced_model_merging.py"
+ ],
+ "install_type": "copy",
+ "description": "This provides a detailed model merge feature based on block weight. ModelMergeBlock, in vanilla ComfyUI, allows for adjusting the ratios of input/middle/output layers, but this node provides ratio adjustments for all blocks within each layer.It is recommended to use the integrated custom nodes in the default channel for update support rather than installing individual nodes.
"
+ },
+ {
+ "author": "comfyanonymous",
+ "title": "ComfyUI_experiments/sdxl_model_merging",
+ "reference": "https://github.com/comfyanonymous/ComfyUI_experiments",
+ "files": [
+ "https://github.com/comfyanonymous/ComfyUI_experiments/raw/master/sdxl_model_merging.py"
+ ],
+ "install_type": "copy",
+ "description": "These nodes provide the capability to merge SDXL base models.It is recommended to use the integrated custom nodes in the default channel for update support rather than installing individual nodes.
"
+ },
+ {
+ "author": "comfyanonymous",
+ "title": "ComfyUI_experiments/reference_only",
+ "reference": "https://github.com/comfyanonymous/ComfyUI_experiments",
+ "files": [
+ "https://github.com/comfyanonymous/ComfyUI_experiments/raw/master/reference_only.py"
+ ],
+ "install_type": "copy",
+ "description": "This node provides functionality corresponding to Reference only in Controlnet.It is recommended to use the integrated custom nodes in the default channel for update support rather than installing individual nodes.
"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/legacy/extension-node-map.json b/custom_nodes/ComfyUI-Manager/node_db/legacy/extension-node-map.json
new file mode 100644
index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/legacy/extension-node-map.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/legacy/model-list.json b/custom_nodes/ComfyUI-Manager/node_db/legacy/model-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..1f870f11f31e0ea8162e386a9e61ad0f6ddb64d4
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/legacy/model-list.json
@@ -0,0 +1,148 @@
+{
+ "models": [
+ {
+ "name": "Inswapper-fp16 (face swap) [REMOVED]",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface",
+ "description": "Checkpoint of the insightface swapper model\n(used by ComfyUI-FaceSwap, comfyui-reactor-node, CharacterFaceSwap,\nComfyUI roop and comfy_mtb)",
+ "reference": "https://github.com/facefusion/facefusion-assets",
+ "filename": "inswapper_128_fp16.onnx",
+ "url": "https://github.com/facefusion/facefusion-assets/releases/download/models/inswapper_128_fp16.onnx",
+ "size": "277.7MB"
+ },
+ {
+ "name": "Inswapper (face swap) [REMOVED]",
+ "type": "insightface",
+ "base": "inswapper",
+ "save_path": "insightface",
+ "description": "Checkpoint of the insightface swapper model\n(used by ComfyUI-FaceSwap, comfyui-reactor-node, CharacterFaceSwap,\nComfyUI roop and comfy_mtb)",
+ "reference": "https://github.com/facefusion/facefusion-assets",
+ "filename": "inswapper_128.onnx",
+ "url": "https://github.com/facefusion/facefusion-assets/releases/download/models/inswapper_128.onnx",
+ "size": "555.3MB"
+ },
+ {
+ "name": "pfg-novel-n10.pt",
+ "type": "PFG",
+ "base": "SD1.5",
+ "save_path": "custom_nodes/pfg-ComfyUI/models",
+ "description": "Pressing 'install' directly downloads the model from the pfg-ComfyUI/models extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
+ "reference": "https://huggingface.co/furusu/PFG",
+ "filename": "pfg-novel-n10.pt",
+ "url": "https://huggingface.co/furusu/PFG/resolve/main/pfg-novel-n10.pt",
+ "size": "23.6MB"
+ },
+ {
+ "name": "pfg-wd14-n10.pt",
+ "type": "PFG",
+ "base": "SD1.5",
+ "save_path": "custom_nodes/pfg-ComfyUI/models",
+ "description": "Pressing 'install' directly downloads the model from the pfg-ComfyUI/models extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
+ "reference": "https://huggingface.co/furusu/PFG",
+ "filename": "pfg-wd14-n10.pt",
+ "url": "https://huggingface.co/furusu/PFG/resolve/main/pfg-wd14-n10.pt",
+ "size": "31.5MB"
+ },
+ {
+ "name": "pfg-wd15beta2-n10.pt",
+ "type": "PFG",
+ "base": "SD1.5",
+ "save_path": "custom_nodes/pfg-ComfyUI/models",
+ "description": "Pressing 'install' directly downloads the model from the pfg-ComfyUI/models extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
+ "reference": "https://huggingface.co/furusu/PFG",
+ "filename": "pfg-wd15beta2-n10.pt",
+ "url": "https://huggingface.co/furusu/PFG/resolve/main/pfg-wd15beta2-n10.pt",
+ "size": "31.5MB"
+ },
+ {
+ "name": "shape_predictor_68_face_landmarks.dat [Face Analysis]",
+ "type": "Shape Predictor",
+ "base": "DLIB",
+ "save_path": "custom_nodes/comfyui_faceanalysis/dlib",
+ "description": "To use the Face Analysis for ComfyUI custom node, installation of this model is needed.",
+ "reference": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/tree/main",
+ "filename": "shape_predictor_68_face_landmarks.dat",
+ "url": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/resolve/main/shape_predictor_68_face_landmarks.dat",
+ "size": "99.7MB"
+ },
+ {
+ "name": "dlib_face_recognition_resnet_model_v1.dat [Face Analysis]",
+ "type": "Face Recognition",
+ "base": "DLIB",
+ "save_path": "custom_nodes/comfyui_faceanalysis/dlib",
+ "description": "To use the Face Analysis for ComfyUI custom node, installation of this model is needed.",
+ "reference": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/tree/main",
+ "filename": "dlib_face_recognition_resnet_model_v1.dat",
+ "url": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/resolve/main/dlib_face_recognition_resnet_model_v1.dat",
+ "size": "22.5MB"
+ },
+ {
+ "name": "ID-Animator/animator.ckpt",
+ "type": "ID-Animator",
+ "base": "SD1.5",
+ "save_path": "custom_nodes/comfyui_id_animator/models",
+ "description": "ID-Animator checkpoint",
+ "reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
+ "filename": "animator.ckpt",
+ "url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/animator.ckpt",
+ "size": "247.3MB"
+ },
+ {
+ "name": "ID-Animator/mm_sd_v15_v2.ckpt",
+ "type": "ID-Animator",
+ "base": "SD1.5",
+ "save_path": "custom_nodes/comfyui_id_animator/models/animatediff_models",
+ "description": "AnimateDiff checkpoint for ID-Animator",
+ "reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
+ "filename": "mm_sd_v15_v2.ckpt",
+ "url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/mm_sd_v15_v2.ckpt",
+ "size": "1.82GB"
+ },
+ {
+ "name": "ID-Animator/image_encoder",
+ "type": "ID-Animator",
+ "base": "SD1.5",
+ "save_path": "custom_nodes/comfyui_id_animator/models/image_encoder",
+ "description": "CLIP Image encoder for ID-Animator",
+ "reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
+ "filename": "model.safetensors",
+ "url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/image_encoder/model.safetensors",
+ "size": "2.53GB"
+ },
+ {
+ "name": "Doubiiu/ToonCrafter model checkpoint",
+ "type": "checkpoint",
+ "base": "ToonCrafter",
+ "save_path": "custom_nodes/comfyui-tooncrafter/ToonCrafter/checkpoints/tooncrafter_512_interp_v1",
+ "description": "ToonCrafter checkpoint model for ComfyUI-ToonCrafter",
+ "reference": "https://huggingface.co/Doubiiu/ToonCrafter/tree/main",
+ "filename": "model.ckpt",
+ "url": "https://huggingface.co/Doubiiu/ToonCrafter/resolve/main/model.ckpt",
+ "size": "10.5GB"
+ },
+
+ {
+ "name": "BAAI/SegGPT",
+ "type": "SegGPT",
+ "base": "SegGPT",
+ "save_path": "custom_nodes/comfyui-seggpt",
+ "description": "SegGPT",
+ "reference": "https://huggingface.co/BAAI/SegGPT",
+ "filename": "seggpt_vit_large.pth",
+ "url": "https://huggingface.co/BAAI/SegGPT/resolve/main/seggpt_vit_large.pth",
+ "size": "1.48GB"
+ },
+ {
+ "name": "kohya-ss/ControlNet-LLLite: SDXL Canny Anime",
+ "type": "controlnet",
+ "base": "SDXL",
+ "save_path": "custom_nodes/ControlNet-LLLite-ComfyUI/models",
+ "description": "An extremely compactly designed controlnet model (a.k.a. ControlNet-LLLite). Note: The model structure is highly experimental and may be subject to change in the future.",
+ "reference": "https://huggingface.co/kohya-ss/controlnet-lllite",
+ "filename": "controllllite_v01032064e_sdxl_canny_anime.safetensors",
+ "url": "https://huggingface.co/kohya-ss/controlnet-lllite/resolve/main/controllllite_v01032064e_sdxl_canny_anime.safetensors",
+ "size": "46.2MB"
+ }
+ ]
+}
diff --git a/custom_nodes/ComfyUI-Manager/node_db/new/alter-list.json b/custom_nodes/ComfyUI-Manager/node_db/new/alter-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..072c3bb5e8bd05b6f14f6df25386dc1e1010a137
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/new/alter-list.json
@@ -0,0 +1,4 @@
+{
+ "items": [
+ ]
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/new/custom-node-list.json b/custom_nodes/ComfyUI-Manager/node_db/new/custom-node-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..d48c4ef33f2171e4c08ead2ca5f366c2538779f7
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/new/custom-node-list.json
@@ -0,0 +1,847 @@
+{
+ "custom_nodes": [
+ {
+ "author": "HappyOnigiri",
+ "title": "ComfyUI-Meld",
+ "reference": "https://github.com/HappyOnigiri/ComfyUI-Meld",
+ "files": [
+ "https://github.com/HappyOnigiri/ComfyUI-Meld"
+ ],
+ "install_type": "git-clone",
+ "description": "The ultimate Image Manager & Gallery for ComfyUI. Automatically catalog generations, track lineage, and restore workflows with a single click."
+ },
+ {
+ "author": "robomello",
+ "title": "ComfyUI Prompt Saver",
+ "id": "prompt-saver",
+ "reference": "https://github.com/robomello/comfyui-prompt-saver",
+ "files": [
+ "https://github.com/robomello/comfyui-prompt-saver"
+ ],
+ "install_type": "git-clone",
+ "description": "Saves images with prompt reference cards - thumbnail + formatted prompt side-by-side with JSON syntax highlighting for easy browsing and organization."
+ },
+ {
+ "author": "boredcoderyt",
+ "title": "Fibo Edit Node for ComfyUI",
+ "id": "fiboedit",
+ "reference": "https://github.com/boredcoderyt/ComfyUI-Fibo-Edit",
+ "files": [
+ "https://github.com/boredcoderyt/ComfyUI-Fibo-Edit"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for BriaAI Fibo Edit image model."
+ },
+ {
+ "author": "zavatmotion",
+ "title": "ComfyUI Workflow Backup",
+ "reference": "https://github.com/zavatmotion/ComfyUI-Workflow-Backup",
+ "files": [
+ "https://github.com/zavatmotion/ComfyUI-Workflow-Backup"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI Custom Node to backup workflows and their required models locally."
+ },
+ {
+ "author": "DVA",
+ "title": "DVA_Qwen_TTS",
+ "reference": "https://github.com/SLVGITHUB/QWEN3_TTS_DVA",
+ "files": [
+ "https://github.com/SLVGITHUB/QWEN3_TTS_DVA"
+ ],
+ "install_type": "git-clone",
+ "description": "High-quality multilingual TTS with voice cloning, emotion control, and support for Qwen3-TTS models (CustomVoice, VoiceDesign, Base)."
+ },
+ {
+ "author": "smthemex",
+ "title": "ComfyUI_InteractAvatar",
+ "reference": "https://github.com/smthemex/ComfyUI_InteractAvatar",
+ "files": [
+ "https://github.com/smthemex/ComfyUI_InteractAvatar"
+ ],
+ "install_type": "git-clone",
+ "description": "Making Avatars InteractTowards Text-Driven Human-Object Interaction for Controllable Talking Avatars"
+ },
+ {
+ "author": "DN2048",
+ "title": "dn_little_helpers",
+ "reference": "https://github.com/DN2048/dn_little_helpers",
+ "files": [
+ "https://github.com/DN2048/dn_little_helpers"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of little custom nodes for ComfyUI to help in simple/specific tasks"
+ },
+ {
+ "author": "SparknightLLC",
+ "title": "ComfyUI-CrosshairGuidelines",
+ "reference": "https://github.com/SparknightLLC/ComfyUI-CrosshairGuidelines",
+ "files": [
+ "https://github.com/SparknightLLC/ComfyUI-CrosshairGuidelines"
+ ],
+ "install_type": "git-clone",
+ "description": "Crosshair guidelines to help align nodes and groups while moving or resizing."
+ },
+ {
+ "author": "cosmicbuffalo",
+ "title": "ComfyUI Mobile Frontend",
+ "id": "comfyui-mobile-frontend",
+ "reference": "https://github.com/cosmicbuffalo/comfyui-mobile-frontend",
+ "files": [
+ "https://github.com/cosmicbuffalo/comfyui-mobile-frontend"
+ ],
+ "install_type": "git-clone",
+ "description": "A mobile-friendly user interface for ComfyUI mounted in parallel with the main frontend at /mobile/."
+ },
+ {
+ "author": "FearL0rd",
+ "title": "ComfyUI-ParallelAnything",
+ "reference": "https://github.com/FearL0rd/ComfyUI-ParallelAnything",
+ "files": [
+ "https://github.com/FearL0rd/ComfyUI-ParallelAnything"
+ ],
+ "install_type": "git-clone",
+ "description": "This suite of nodes unlocks high-performance parallel processing in ComfyUI by utilizing **Model Replication**. Unlike standard offloading which moves a single model instance between devices, these nodes create independent replicas of the model on each selected GPU/CPU, allowing for true simultaneous batch processing."
+ },
+ {
+ "author": "1038lab",
+ "title": "ComfyUI-Youtu-VL",
+ "reference": "https://github.com/1038lab/ComfyUI-Youtu-VL",
+ "files": [
+ "https://github.com/1038lab/ComfyUI-Youtu-VL"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom nodes for Tencent Youtu-VL vision-language model"
+ },
+ {
+ "author": "MushroomFleet",
+ "title": "ComfyUI-DJZ-Offsquare",
+ "reference": "https://github.com/MushroomFleet/ComfyUI-DJZ-Offsquare",
+ "files": [
+ "https://github.com/MushroomFleet/ComfyUI-DJZ-Offsquare"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node that creates optimized image collages from batches of 2-6 images"
+ },
+ {
+ "author": "ttulttul",
+ "title": "ComfyUI-Taylor-Attention",
+ "reference": "https://github.com/ttulttul/ComfyUI-Taylor-Attention",
+ "files": [
+ "https://github.com/ttulttul/ComfyUI-Taylor-Attention"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI Taylor attention custom node"
+ },
+ {
+ "author": "MushroomFleet",
+ "title": "ComfyUI_PromptExtractor_nodes",
+ "reference": "https://github.com/MushroomFleet/ComfyUI_PromptExtractor_nodes",
+ "files": [
+ "https://github.com/MushroomFleet/ComfyUI_PromptExtractor_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom nodes for ComfyUI that extract text prompts from PNG image metadata"
+ },
+
+ {
+ "author": "Meisoftcoltd",
+ "title": "ComfyUI-Demucs-AudioSeparator",
+ "reference": "https://github.com/Meisoftcoltd/ComfyUI-Demucs-AudioSeparator",
+ "files": [
+ "https://github.com/Meisoftcoltd/ComfyUI-Demucs-AudioSeparator"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI node for audio source separation using Meta Demucs v4 technology to extract voices, drums, bass, and other instruments with high fidelity. (Description by CC)"
+ },
+ {
+ "author": "franciscotorrado",
+ "title": "ComfyUI-Automation",
+ "reference": "https://github.com/franciscotorrado/ComfyUI-Automation",
+ "files": [
+ "https://github.com/franciscotorrado/ComfyUI-Automation"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI designed to facilitate complex looping and iteration workflows, specialized in media batch processing."
+ },
+ {
+ "author": "Mexes1978",
+ "title": "comfyui-comfysketch",
+ "reference": "https://github.com/Mexes1978/comfyui-comfysketch",
+ "files": [
+ "https://github.com/Mexes1978/comfyui-comfysketch"
+ ],
+ "install_type": "git-clone",
+ "description": "A drawing and sketching node for ComfyUI with layers, multiple brush types, and a focused, professional interface."
+ },
+ {
+ "author": "neurodanzelus-cmd",
+ "title": "ComfyUI-TeleStyle",
+ "reference": "https://github.com/neurodanzelus-cmd/ComfyUI-TeleStyle",
+ "files": [
+ "https://github.com/neurodanzelus-cmd/ComfyUI-TeleStyle"
+ ],
+ "install_type": "git-clone",
+ "description": "An unofficial, streamlined, and highly optimized ComfyUI implementation of TeleStyle for video style transfer. (Description by CC)"
+ },
+ {
+ "author": "kreonxv",
+ "title": "ComfyUI-Whiteboard",
+ "reference": "https://github.com/kreonxv/ComfyUI-Whiteboard",
+ "files": [
+ "https://github.com/kreonxv/ComfyUI-Whiteboard"
+ ],
+ "install_type": "git-clone",
+ "description": "A simple ComfyUI node that creates a white canvas for freehand drawing and automatically runs inference for sketch-to-image workflows."
+ },
+ {
+ "author": "kreonxv",
+ "title": "ComfyUI-GroupBypasser",
+ "reference": "https://github.com/kreonxv/ComfyUI-GroupBypasser",
+ "files": [
+ "https://github.com/kreonxv/ComfyUI-GroupBypasser"
+ ],
+ "install_type": "git-clone",
+ "description": "A small ComfyUI custom node that provides a lightweight bypass for grouped nodes."
+ },
+ {
+ "author": "kreonxv",
+ "title": "ComfyUI-ForgeAPI",
+ "reference": "https://github.com/kreonxv/ComfyUI-ForgeAPI",
+ "files": [
+ "https://github.com/kreonxv/ComfyUI-ForgeAPI"
+ ],
+ "install_type": "git-clone",
+ "description": "Lightweight custom nodes that integrate ComfyUI with ForgeUI-style samplers and provide convenient ControlNet and LoRA stack helpers."
+ },
+ {
+ "author": "kreonxv",
+ "title": "ComfyUI-LoraControls",
+ "reference": "https://github.com/kreonxv/ComfyUI-LoraControls",
+ "files": [
+ "https://github.com/kreonxv/ComfyUI-LoraControls"
+ ],
+ "install_type": "git-clone",
+ "description": "A set of ComfyUI custom nodes to control LoRA (Low-Rank Adaptation) strength programmatically during the sampling process."
+ },
+ {
+ "author": "xufengbo1993",
+ "title": "ComfyUI-ZFL-JSON-Extractor",
+ "reference": "https://github.com/xufengbo1993/ComfyUI-ZFL-JSON-Extractor",
+ "files": [
+ "https://github.com/xufengbo1993/ComfyUI-ZFL-JSON-Extractor"
+ ],
+ "install_type": "git-clone",
+ "description": "A powerful tool for AI dynamic comic creators and scriptwriters extracting up to 4 specific keys from JSON scripts."
+ },
+ {
+ "author": "ohmygoobness",
+ "title": "ComfyUI-ImageResolutionFixer",
+ "reference": "https://github.com/ohmygoobness/ComfyUI-ImageResolutionFixer",
+ "files": [
+ "https://github.com/ohmygoobness/ComfyUI-ImageResolutionFixer"
+ ],
+ "install_type": "git-clone",
+ "description": "A lightweight ComfyUI node that intelligently rounds image dimensions to compatible resolutions using smart reflection mirroring."
+ },
+ {
+ "author": "AnastasiyaW",
+ "title": "ComfyUI-SmartScreenshotCleaner",
+ "reference": "https://github.com/AnastasiyaW/ComfyUI-SmartScreenshotCleaner",
+ "files": [
+ "https://github.com/AnastasiyaW/ComfyUI-SmartScreenshotCleaner"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes for removing UI elements from screenshots by detecting and masking icons, buttons, and text. (Description by CC)"
+ },
+ {
+ "author": "kreonxv",
+ "title": "ComfyUI-T2I_StyleApply",
+ "reference": "https://github.com/kreonxv/ComfyUI-T2I_StyleApply",
+ "files": [
+ "https://github.com/kreonxv/ComfyUI-T2I_StyleApply"
+ ],
+ "install_type": "git-clone",
+ "description": "Simple node for ComfyUI that applies a text-to-image (T2I) style to an image or embedding with support for start/end frame control and a weight parameter."
+ },
+ {
+ "author": "luoq24",
+ "title": "ydem_nodes",
+ "reference": "https://github.com/luoq24/ydem_nodes",
+ "files": [
+ "https://github.com/luoq24/ydem_nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node collection including face direction detection, image processing, and example nodes. (Description by CC)"
+ },
+ {
+ "author": "Devourer56",
+ "title": "ComfyUI-Impact-BIGdetector-BBOX-SEGS",
+ "reference": "https://github.com/Devourer56/ComfyUI-Impact-BIGdetector-BBOX-SEGS",
+ "files": [
+ "https://github.com/Devourer56/ComfyUI-Impact-BIGdetector-BBOX-SEGS"
+ ],
+ "install_type": "git-clone",
+ "description": "A ComfyUI node implementing cascade object detection system (bbox/segm) using YOLO models with multi-stage processing. (Description by CC)"
+ },
+ {
+ "author": "sugarkwork",
+ "title": "comfyui-trtools",
+ "reference": "https://github.com/sugarkwork/comfyui-trtools",
+ "files": [
+ "https://github.com/sugarkwork/comfyui-trtools"
+ ],
+ "install_type": "git-clone",
+ "description": "TensorRT Tools for ComfyUI"
+ },
+ {
+ "author": "LDNKS094",
+ "title": "ComfyUI-Painter-I2V-AIO",
+ "reference": "https://github.com/LDNKS094/ComfyUI-Painter-I2V-AIO",
+ "files": [
+ "https://github.com/LDNKS094/ComfyUI-Painter-I2V-AIO"
+ ],
+ "install_type": "git-clone",
+ "description": "All-in-One collection of Painter's ComfyUI nodes for video generation"
+ },
+ {
+ "author": "Nakamura2828",
+ "title": "ComfyUI-JK-ToRetro",
+ "reference": "https://github.com/Nakamura2828/ComfyUI-JK-ToRetro",
+ "files": [
+ "https://github.com/Nakamura2828/ComfyUI-JK-ToRetro"
+ ],
+ "install_type": "git-clone",
+ "description": "Retro graphics converter node for ComfyUI. Converts modern images to authentic retro computing styles (VGA, EGA, CGA, PC-98) with proper color palettes, dithering, and resolution constraints."
+ },
+
+ {
+ "author": "kana112233",
+ "title": "ComfyUI-kaola-ace-step",
+ "reference": "https://github.com/kana112233/ComfyUI-kaola-ace-step",
+ "files": [
+ "https://github.com/kana112233/ComfyUI-kaola-ace-step"
+ ],
+ "install_type": "git-clone",
+ "description": "ACE-Step 1.5 music generation nodes for ComfyUI - Generate high-quality music from text"
+ },
+
+ {
+ "author": "MechaBabyAi",
+ "title": "ComfyUI-MechaBaby-WorkflowTracer",
+ "reference": "https://github.com/MechaBabyAi/ComfyUI-MechaBaby-WorkflowTracer",
+ "files": [
+ "https://github.com/MechaBabyAi/ComfyUI-MechaBaby-WorkflowTracer"
+ ],
+ "install_type": "git-clone",
+ "description": "An enhanced extension for ComfyUI that records, visualizes, and extracts the actual execution path of a workflow."
+ },
+ {
+ "author": "pytraveler",
+ "title": "comfyui-darkil-nodes",
+ "reference": "https://github.com/pytraveler/comfyui-darkil-nodes",
+ "files": [
+ "https://github.com/pytraveler/comfyui-darkil-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Various custom nodes for improved usability."
+ },
+ {
+ "author": "kadevin",
+ "title": "ComfyUI-Active-Node-Highlighter",
+ "reference": "https://github.com/kadevin/ComfyUI-Active-Node-Highlighter",
+ "files": [
+ "https://github.com/kadevin/ComfyUI-Active-Node-Highlighter"
+ ],
+ "install_type": "git-clone",
+ "description": "A lightweight ComfyUI extension that highlights the currently executing node by inverting its colors."
+ },
+ {
+ "author": "JamesDanielDoss",
+ "title": "JamesDossAI-EnhancedLinks",
+ "reference": "https://github.com/JamesDanielDoss/JamesDossAI-EnhancedLinks",
+ "files": [
+ "https://github.com/JamesDanielDoss/JamesDossAI-EnhancedLinks"
+ ],
+ "install_type": "git-clone",
+ "description": "Simple animated arrows traveling along workflow links (input → output)"
+ },
+ {
+ "author": "Shan2L",
+ "title": "ComfyUI-Simple-Profiler",
+ "reference": "https://github.com/Shan2L/ComfyUI-Simple-Profiler",
+ "files": [
+ "https://github.com/Shan2L/ComfyUI-Simple-Profiler"
+ ],
+ "install_type": "git-clone",
+ "description": "A pure backend custom node/plugin for ComfyUI that records execution time for each node in a workflow and maximum device usage statistics."
+ },
+ {
+ "author": "Malkalypse",
+ "title": "ComfyUI-MouseCoords",
+ "id": "mousecoords",
+ "reference": "https://github.com/Malkalypse/ComfyUI-MouseCoords",
+ "files": [
+ "https://github.com/Malkalypse/ComfyUI-MouseCoords"
+ ],
+ "install_type": "git-clone",
+ "description": "Display real-time mouse coordinates in graph space. Shows the current mouse position in the top-right corner of the canvas, useful for positioning nodes precisely, debugging layouts, and measuring distances."
+ },
+ {
+ "author": "MechaBabyAi",
+ "title": "ComfyUI-MechaBaby-NodeLayout",
+ "reference": "https://github.com/MechaBabyAi/ComfyUI-MechaBaby-NodeLayout",
+ "files": [
+ "https://github.com/MechaBabyAi/ComfyUI-MechaBaby-NodeLayout"
+ ],
+ "install_type": "git-clone",
+ "description": "A node layout helper extension for ComfyUI. Assists in arranging and aligning nodes on the canvas without modifying workflow files — all operations are frontend-only."
+ },
+ {
+ "author": "kreonxv",
+ "title": "ComfyUI-Infinity-Canvas",
+ "reference": "https://github.com/kreonxv/ComfyUI-Infinity-Canvas",
+ "files": [
+ "https://github.com/kreonxv/ComfyUI-Infinity-Canvas"
+ ],
+ "install_type": "git-clone",
+ "description": "A powerful infinite canvas inpainting extension for ComfyUI inspired by InvokeAI Canvas and Painthua.com, enabling boundless painting and seamless iterative workflows."
+ },
+
+ {
+ "author": "kaushiknishchay",
+ "title": "ComfyUI-Qwen3-ASR",
+ "reference": "https://github.com/kaushiknishchay/ComfyUI-Qwen3-ASR",
+ "files": [
+ "https://github.com/kaushiknishchay/ComfyUI-Qwen3-ASR"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI nodes for Qwen3-ASR (0.6B/1.7B) and ForcedAligner. Supports high-accuracy ASR and language identification for 52 languages/dialects, including 22 Chinese dialects and various English accents. Features word-level timestamps, long audio transcription, and VRAM-optimized inference."
+ },
+ {
+ "author": "SparknightLLC",
+ "title": "ComfyUI-MakeSeamlessTexture",
+ "reference": "https://github.com/SparknightLLC/ComfyUI-MakeSeamlessTexture",
+ "files": [
+ "https://github.com/SparknightLLC/ComfyUI-MakeSeamlessTexture"
+ ],
+ "install_type": "git-clone",
+ "description": "Turn images into seamless textures and build tiled previews. Unique radial mask method available."
+ },
+ {
+ "author": "1038lab",
+ "title": "ComfyUI-QwenASR",
+ "reference": "https://github.com/1038lab/ComfyUI-QwenASR",
+ "files": [
+ "https://github.com/1038lab/ComfyUI-QwenASR"
+ ],
+ "install_type": "git-clone",
+ "description": "A lightweight ComfyUI custom node pack for Qwen3-ASR, providing simple speech‑to‑text workflows with local model caching and optional timestamp output. Supports Qwen/Qwen3‑ASR‑1.7B and 0.6B, with HuggingFace/ModelScope download options and clean integration for ComfyUI pipelines."
+ },
+ {
+ "author": "Ugleh",
+ "title": "ComfyUI-ugleh-OpenAI",
+ "reference": "https://github.com/Ugleh/ComfyUI-ugleh-OpenAI",
+ "files": [
+ "https://github.com/Ugleh/ComfyUI-ugleh-OpenAI"
+ ],
+ "install_type": "git-clone",
+ "description": "Minimal OpenAI API nodes for ComfyUI."
+ },
+ {
+ "author": "remingtonspaz",
+ "title": "Reference Chain Conditioning",
+ "reference": "https://github.com/remingtonspaz/ComfyUI-ReferenceChain",
+ "files": [
+ "https://github.com/remingtonspaz/ComfyUI-ReferenceChain"
+ ],
+ "install_type": "git-clone",
+ "description": "Chain multiple images as reference conditionings for Flux Klein, Kontext etc. with one node"
+ },
+ {
+ "author": "SidDays",
+ "title": "ComfyUI-YuGiOh",
+ "reference": "https://github.com/SidDays/ComfyUI-YuGiOh",
+ "files": [
+ "https://github.com/SidDays/ComfyUI-YuGiOh"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes to help with creating custom Yu-Gi-Oh! cards and modding the video games"
+ },
+ {
+ "author": "facok",
+ "title": "comfyui-meancache-z",
+ "reference": "https://github.com/facok/comfyui-meancache-z",
+ "files": [
+ "https://github.com/facok/comfyui-meancache-z"
+ ],
+ "install_type": "git-clone",
+ "description": "MeanCache: Training-free inference acceleration for Z-Image Flow Matching models"
+ },
+
+
+ {
+ "author": "NidAll",
+ "title": "ComfyUI_PromptStyler",
+ "reference": "https://github.com/NidAll/ComfyUI_PromptStyler",
+ "files": [
+ "https://github.com/NidAll/ComfyUI_PromptStyler"
+ ],
+ "install_type": "git-clone",
+ "description": "PromptStyler is a custom ComfyUI node that helps you keep your prompts consistent by applying a selected style template to your positive prompt, then outputting CONDITIONING for KSampler."
+ },
+ {
+ "author": "peter119lee",
+ "title": "ComfyUI-BananaForge",
+ "reference": "https://github.com/peter119lee/ComfyUI-BananaForge",
+ "files": [
+ "https://github.com/peter119lee/ComfyUI-BananaForge"
+ ],
+ "install_type": "git-clone",
+ "description": "Gemini-powered image generation for ComfyUI supporting text-to-image, image-to-image, and batch processing with flexible API configuration. (Description by CC)"
+ },
+ {
+ "author": "petmycat",
+ "title": "ComfyUI-gen2",
+ "reference": "https://github.com/petmycat/ComfyUI-gen2",
+ "files": [
+ "https://github.com/petmycat/ComfyUI-gen2"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI nodes for QwenImage ControlNet achieving 100% output compatibility with VideoX-Fun's diffusers pipeline while leveraging ComfyUI's efficient model loading system."
+ },
+ {
+ "author": "aligjahed",
+ "title": "comfy-flow",
+ "reference": "https://github.com/aligjahed/comfy-flow",
+ "files": [
+ "https://github.com/aligjahed/comfy-flow"
+ ],
+ "install_type": "git-clone",
+ "description": "Comfy Flow - A flow manager for ComfyUI. (Description by CC)"
+ },
+ {
+ "author": "shumoLR",
+ "title": "Comfyui_SynVow_TeleStyle",
+ "reference": "https://github.com/shumoLR/Comfyui_SynVow_TeleStyle",
+ "files": [
+ "https://github.com/shumoLR/Comfyui_SynVow_TeleStyle"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI video style transfer plugin based on TeleStyle for applying reference image styles to source videos. (Description by CC)"
+ },
+ {
+ "author": "bkpaine1",
+ "title": "HALO Debug Pack",
+ "id": "halo-pack",
+ "reference": "https://github.com/bkpaine1/halo_pack",
+ "files": [
+ "https://github.com/bkpaine1/halo_pack"
+ ],
+ "install_type": "git-clone",
+ "description": "AMD ROCm bf16 diagnostic tools for ComfyUI. Fixes black image issues caused by numpy's lack of bfloat16 support. Includes FP32 VAE decode/encode and debug nodes for latent, conditioning, and model inspection. Useful for AMD Strix Halo, older NVIDIA cards, Apple Silicon, and unified memory systems."
+ },
+ {
+ "author": "shootthesound",
+ "title": "comfyui-wan-i2v-control",
+ "reference": "https://github.com/shootthesound/comfyui-wan-i2v-control",
+ "files": [
+ "https://github.com/shootthesound/comfyui-wan-i2v-control"
+ ],
+ "install_type": "git-clone",
+ "description": "A user-friendly way to selectively transform parts of your starting image in WAN Image-to-Video generation with advanced masking and person detection."
+ },
+ {
+ "author": "harishcmgit",
+ "title": "comfyui_ds",
+ "reference": "https://github.com/harishcmgit/comfyui_ds",
+ "files": [
+ "https://github.com/harishcmgit/comfyui_ds"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node that implements advanced document scanning with automatic perspective correction and multiple enhancement options."
+ },
+ {
+ "author": "errew",
+ "title": "ComfyUI-Wireless",
+ "reference": "https://github.com/errew/ComfyUI-Wireless",
+ "files": [
+ "https://github.com/errew/ComfyUI-Wireless"
+ ],
+ "install_type": "git-clone",
+ "description": "A clean, lightweight ComfyUI plugin to transmit data wirelessly between nodes using a global key-value store."
+ },
+ {
+ "author": "Shiba-2-shiba",
+ "title": "ComfyUI-HSWQ-Quantizer",
+ "reference": "https://github.com/Shiba-2-shiba/ComfyUI-HSWQ-Quantizer",
+ "files": [
+ "https://github.com/Shiba-2-shiba/ComfyUI-HSWQ-Quantizer"
+ ],
+ "install_type": "git-clone",
+ "description": "Unofficial ComfyUI reference implementation of Hybrid Sensitivity Weighted Quantization (HSWQ) for model optimization."
+ },
+ {
+ "author": "domprosys",
+ "title": "ComfyUI-LTXVideo-Extra",
+ "reference": "https://github.com/domprosys/ComfyUI-LTXVideo-Extra",
+ "files": [
+ "https://github.com/domprosys/ComfyUI-LTXVideo-Extra"
+ ],
+ "install_type": "git-clone",
+ "description": "Extra nodes for LTX-2 video generation in ComfyUI."
+ },
+ {
+ "author": "sugarkwork",
+ "title": "comfyui_smart_character_detailer",
+ "reference": "https://github.com/sugarkwork/comfyui_smart_character_detailer",
+ "files": [
+ "https://github.com/sugarkwork/comfyui_smart_character_detailer"
+ ],
+ "install_type": "git-clone",
+ "description": "Extended ComfyUI node with WD14 Tagger-based image analysis and automatic character identification to apply optimized prompts dynamically. (Description by CC)"
+ },
+ {
+ "author": "engineer6980",
+ "title": "ComfyUI-Image-Cipher",
+ "reference": "https://github.com/engineer6980/ComfyUI-Image-Cipher",
+ "files": [
+ "https://github.com/engineer6980/ComfyUI-Image-Cipher"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node for image privacy protection using RGB channel independent differential bit-shifting encryption. (Description by CC)"
+ },
+ {
+ "author": "MushroomFleet",
+ "title": "ComfyUI-Zero2JSON",
+ "reference": "https://github.com/MushroomFleet/ComfyUI-Zero2JSON",
+ "files": [
+ "https://github.com/MushroomFleet/ComfyUI-Zero2JSON"
+ ],
+ "install_type": "git-clone",
+ "description": "ZeroPrompt integration for FLUX2-JSON providing deterministic, profile-based procedural text generation for structured prompt building."
+ },
+ {
+ "author": "thezveroboy",
+ "title": "ComfyUI-klein4-9multiangle",
+ "reference": "https://github.com/thezveroboy/ComfyUI-klein4-9multiangle",
+ "files": [
+ "https://github.com/thezveroboy/ComfyUI-klein4-9multiangle"
+ ],
+ "install_type": "git-clone",
+ "description": "Klein4&9 MultiAngle Prompt is a ComfyUI node that lets you quickly set the camera angle and distance to the subject in your prompt without typing long descriptions manually."
+ },
+ {
+ "author": "huyl3-cpu",
+ "title": "ComfyUI-PyTorch210Patcher",
+ "reference": "https://github.com/huyl3-cpu/ComfyUI-PyTorch210Patcher",
+ "files": [
+ "https://github.com/huyl3-cpu/ComfyUI-PyTorch210Patcher"
+ ],
+ "install_type": "git-clone",
+ "description": "Auto-fixes WanVideoModel for PyTorch 2.10.0+ compatibility by automatically patching the model class to work with both PyTorch 2.9.0 and 2.10.0+."
+ },
+ {
+ "author": "DanPli",
+ "title": "ComfyUI-Flux2LatentPresets",
+ "reference": "https://github.com/DanPli/ComfyUI-Flux2LatentPresets",
+ "files": [
+ "https://github.com/DanPli/ComfyUI-Flux2LatentPresets"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node that provides Flux 2–recommended resolution presets for quickly creating empty latents, without manually entering width and height values."
+ },
+ {
+ "author": "SnJake",
+ "title": "SnJake_Sapsan-VFI",
+ "reference": "https://github.com/SnJake/SnJake_Sapsan-VFI",
+ "files": [
+ "https://github.com/SnJake/SnJake_Sapsan-VFI"
+ ],
+ "install_type": "git-clone",
+ "description": "SnJake Sapsan-VFI is a custom ComfyUI node for x2 video frame interpolation. It inserts one in-between frame for every input pair, doubling the FPS."
+ },
+ {
+ "author": "knishika62",
+ "title": "ComfyUI-DualLoraStack",
+ "reference": "https://github.com/knishika62/ComfyUI-DualLoraStack",
+ "files": [
+ "https://github.com/knishika62/ComfyUI-DualLoraStack"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node that applies the same Lora to two models while sharing a CLIP, supporting up to 6 Lora models with independent strength control. (Description by CC)"
+ },
+ {
+ "author": "Shiba-2-shiba",
+ "title": "ComfyUI-Unofficial-HSWQ-QuantizerHSWQ-Quantizer",
+ "reference": "https://github.com/Shiba-2-shiba/ComfyUI-Unofficial-HSWQ-QuantizerHSWQ-Quantizer",
+ "files": [
+ "https://github.com/Shiba-2-shiba/ComfyUI-Unofficial-HSWQ-QuantizerHSWQ-Quantizer"
+ ],
+ "install_type": "git-clone",
+ "description": "Unofficial reference implementation of Hybrid Sensitivity Weighted Quantization (HSWQ) for ComfyUI, providing calibration and FP8 conversion nodes for model optimization."
+ },
+
+ {
+ "author": "filliptm",
+ "title": "ComfyUI-FL-DiffVSR",
+ "reference": "https://github.com/filliptm/ComfyUI-FL-DiffVSR",
+ "files": [
+ "https://github.com/filliptm/ComfyUI-FL-DiffVSR"
+ ],
+ "install_type": "git-clone",
+ "description": "FL DiffVSR - Diffusion-based video super-resolution nodes for ComfyUI. Features 4x upscaling with temporal coherence using Stream-DiffVSR for smooth, artifact-free video enhancement. Supports text-guided upscaling, chunked processing for memory efficiency, and automatic model downloading from HuggingFace."
+ },
+ {
+ "author": "molbal",
+ "title": "ComfyUI-LLM-CLIP",
+ "reference": "https://github.com/molbal/ComfyUI-LLM-CLIP",
+ "files": [
+ "https://github.com/molbal/ComfyUI-LLM-CLIP"
+ ],
+ "install_type": "git-clone",
+ "description": "These nodes allow you to use a distilled Qwen3-4B model as your text encoder in Stable Diffusion XL."
+ },
+ {
+ "author": "relhamdi",
+ "title": "ComfyUI-RE-CustomUtils",
+ "reference": "https://github.com/relhamdi/ComfyUI-RE-CustomUtils",
+ "files": [
+ "https://github.com/relhamdi/ComfyUI-RE-CustomUtils"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of custom nodes for ComfyUI."
+ },
+ {
+ "author": "tritant",
+ "title": "ComfyUI_Kitchen_nvfp4_Converter",
+ "reference": "https://github.com/tritant/ComfyUI_Kitchen_nvfp4_Converter",
+ "files": [
+ "https://github.com/tritant/ComfyUI_Kitchen_nvfp4_Converter"
+ ],
+ "install_type": "git-clone",
+ "description": "Convert to nvfp4, support Z-image-turbo, flux.1 and more"
+ },
+ {
+ "author": "PozzettiAndrea",
+ "title": "ComfyUI-CameraPack",
+ "reference": "https://github.com/PozzettiAndrea/ComfyUI-CameraPack",
+ "files": [
+ "https://github.com/PozzettiAndrea/ComfyUI-CameraPack"
+ ],
+ "install_type": "git-clone",
+ "description": "Camera utilities for ComfyUI. Convert between camera formats (DA3 extrinsics/intrinsics to Load3DCamera for Preview3D)."
+ },
+ {
+ "author": "BobRandomNumber",
+ "title": "ComfyUI-Calculator",
+ "reference": "https://github.com/BobRandomNumber/ComfyUI-Calculator",
+ "files": [
+ "https://github.com/BobRandomNumber/ComfyUI-Calculator"
+ ],
+ "install_type": "git-clone",
+ "description": "Calculator"
+ },
+ {
+ "author": "D-Ogi",
+ "title": "ComfyUI-Attention-Optimizer",
+ "reference": "https://github.com/D-Ogi/ComfyUI-Attention-Optimizer",
+ "files": [
+ "https://github.com/D-Ogi/ComfyUI-Attention-Optimizer"
+ ],
+ "install_type": "git-clone",
+ "description": "Automatically benchmark and optimize attention in diffusion models. 1.5-2x speedup on RTX 4090, up to 4x on video models."
+ },
+ {
+ "author": "capitan01R",
+ "title": "ComfyUI-ZImageTurbo-FlowSampler",
+ "reference": "https://github.com/capitan01R/ComfyUI-ZImageTurbo-FlowSampler",
+ "files": [
+ "https://github.com/capitan01R/ComfyUI-ZImageTurbo-FlowSampler"
+ ],
+ "install_type": "git-clone",
+ "description": "Rectified-flow samplers for Z-Image-Turbo. Clean interpolation formula without sigma division, linear schedulers, higher-order variants. Fixes built-in euler/euler_ancestral instability issues"
+ },
+ {
+ "author": "DevDuckFace",
+ "title": "KsamplerDF",
+ "reference": "https://github.com/DevDuckFace/KsamplerDF",
+ "files": [
+ "https://github.com/DevDuckFace/KsamplerDF"
+ ],
+ "install_type": "git-clone",
+ "description": "A custom ComfyUI node that splits sampling steps between a main sampler and a refiner sampler, with independent denoise control for each phase, with upscalers now"
+ },
+ {
+ "author": "rockerBOO",
+ "title": "pixel-sorting",
+ "reference": "https://github.com/rockerBOO/pixel-sorting",
+ "files": [
+ "https://github.com/rockerBOO/pixel-sorting"
+ ],
+ "install_type": "git-clone",
+ "description": "ASDF-style pixel sorting implementation in Python with extended features"
+ },
+
+ {
+ "author": "xela-io",
+ "title": "ComfyUI-HairDetailer",
+ "reference": "https://github.com/xela-io/ComfyUI-HairDetailer",
+ "files": [
+ "https://github.com/xela-io/ComfyUI-HairDetailer"
+ ],
+ "install_type": "git-clone",
+ "description": "Comprehensive custom node pack for detecting hair regions, creating precise masks, and enhancing hair details in images with 6 specialized nodes for various hair processing workflows. (Description by CC)"
+ },
+ {
+ "author": "kakachiex2",
+ "title": "comfyui-ltx2-efficient",
+ "reference": "https://github.com/kakachiex2/comfyui-ltx2-efficient",
+ "files": [
+ "https://github.com/kakachiex2/comfyui-ltx2-efficient"
+ ],
+ "install_type": "git-clone",
+ "description": "High-performance custom node for LTX2 video generation designed to reduce GPU usage, VRAM requirements, and temperature on consumer GPUs."
+ },
+ {
+ "author": "SlothHole",
+ "title": "Imitatoes",
+ "reference": "https://github.com/SlothHole/Imitatoes",
+ "files": [
+ "https://github.com/SlothHole/Imitatoes"
+ ],
+ "install_type": "git-clone",
+ "description": "Build a ComfyUI \"self-improving\" workflow where each render is evaluated by a local vision LLM, which then edits the prompt/parameters and triggers another run."
+ },
+ {
+ "author": "BobJohnson24",
+ "title": "ComfyUI-Flux2-INT8",
+ "reference": "https://github.com/BobJohnson24/ComfyUI-Flux2-INT8",
+ "files": [
+ "https://github.com/BobJohnson24/ComfyUI-Flux2-INT8"
+ ],
+ "install_type": "git-clone",
+ "description": "This node speeds up Flux2, Chroma, Z-Image in ComfyUI by using INT8 quantization, delivering ~2x faster inference on my 3090, but it should work on any NVIDIA GPU with enough INT8 TOPS."
+ },
+ {
+ "author": "smartvain",
+ "title": "ComfyUI-PromptComment",
+ "reference": "https://github.com/smartvain/ComfyUI-PromptComment",
+ "files": [
+ "https://github.com/smartvain/ComfyUI-PromptComment"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom ComfyUI node providing comment stripping functionality for prompts with multiple marker styles. (Description by CC)"
+ },
+ {
+ "author": "kayorlian",
+ "title": "ComfyuiSmartColorMatch",
+ "reference": "https://github.com/kayorlian/ComfyuiSmartColorMatch",
+ "files": [
+ "https://github.com/kayorlian/ComfyuiSmartColorMatch"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom node for ComfyUI that performs color matching between reference and generated images with support for masking."
+ }
+ ]
+}
diff --git a/custom_nodes/ComfyUI-Manager/node_db/new/extension-node-map.json b/custom_nodes/ComfyUI-Manager/node_db/new/extension-node-map.json
new file mode 100644
index 0000000000000000000000000000000000000000..57cd8e12fb48ad4fd15cb79815e4665ce8c7cd79
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/new/extension-node-map.json
@@ -0,0 +1,59442 @@
+{
+ "https://gist.githubusercontent.com/alkemann/7361b8eb966f29c8238fd323409efb68/raw/f9605be0b38d38d3e3a2988f89248ff557010076/alkemann.py": [
+ [
+ "Int to Text",
+ "Save A1 Image",
+ "Seed With Text"
+ ],
+ {
+ "title_aux": "alkemann nodes"
+ }
+ ],
+ "https://git.mmaker.moe/mmaker/sd-webui-color-enhance": [
+ [
+ "MMakerColorBlend",
+ "MMakerColorEnhance"
+ ],
+ {
+ "title_aux": "mmaker/Color Enhance"
+ }
+ ],
+ "https://github.com/0nikod/ComfyUI-Metadata-Tools": [
+ [
+ "ImageGetMetadata",
+ "ImageSetMetadata",
+ "LoadImageWithMetadata",
+ "SaveImageWithMetadata"
+ ],
+ {
+ "title_aux": "ComfyUI-Metadata-Tools"
+ }
+ ],
+ "https://github.com/0nikod/ComfyUI-Simple-Prompt": [
+ [
+ "SimplePrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-Simple-Prompt"
+ }
+ ],
+ "https://github.com/0x-jerry/comfyui-rembg": [
+ [
+ "Load Rembg Model",
+ "Rembg Remove background"
+ ],
+ {
+ "title_aux": "0x-jerry/Rembg Background Removal Node for ComfyUI"
+ }
+ ],
+ "https://github.com/0xRavenBlack/ComfyUI-OOP": [
+ [
+ "OOPAnimalNode",
+ "OOPClothingNode",
+ "OOPEnvironmentNode",
+ "OOPEyesNode",
+ "OOPHairNode",
+ "OOPLocationNode",
+ "OOPMouthNode",
+ "OOPNode",
+ "OOPPersonNode",
+ "OOPPoseNode",
+ "OOPStyleNode",
+ "OOPViewNode"
+ ],
+ {
+ "title_aux": "ComfyUI-OOP"
+ }
+ ],
+ "https://github.com/0xbitches/ComfyUI-LCM": [
+ [
+ "LCM_Sampler",
+ "LCM_Sampler_Advanced",
+ "LCM_img2img_Sampler",
+ "LCM_img2img_Sampler_Advanced"
+ ],
+ {
+ "title_aux": "Latent Consistency Model for ComfyUI"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-EdgeTTS": [
+ [
+ "EdgeTTS",
+ "Save_Audio",
+ "WhisperSTT"
+ ],
+ {
+ "title_aux": "ComfyUI-EdgeTTS"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-FireRedTTS": [
+ [
+ "FireRedTTS2MonologueNode",
+ "FireRedTTS2_Dialogue"
+ ],
+ {
+ "title_aux": "ComfyUI-FireRedTTS"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-FlashVSR": [
+ [
+ "AILab_FlashVSR",
+ "AILab_FlashVSR_Advanced"
+ ],
+ {
+ "title_aux": "ComfyUI-FlashVSR"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-JoyCaption": [
+ [
+ "CaptionSaver",
+ "ImageBatchPath",
+ "JC",
+ "JC_ExtraOptions",
+ "JC_GGUF",
+ "JC_GGUF_adv",
+ "JC_adv"
+ ],
+ {
+ "title_aux": "ComfyUI-JoyCaption"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-LBM": [
+ [
+ "LBM_DepthNormal",
+ "LBM_Relighting"
+ ],
+ {
+ "title_aux": "ComfyUI-LBM"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-MegaTTS": [
+ [
+ "MegaTTS3",
+ "MegaTTS3S",
+ "MegaTTS_VoiceMaker"
+ ],
+ {
+ "title_aux": "ComfyUI-MegaTTS"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-MiniCPM": [
+ [
+ "AILab_MiniCPM_V",
+ "AILab_MiniCPM_V_Advanced",
+ "AILab_MiniCPM_V_GGUF",
+ "AILab_MiniCPM_V_GGUF_Advanced"
+ ],
+ {
+ "title_aux": "ComfyUI-MiniCPM"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-MiniMax-Remover": [
+ [
+ "ImageSizeAdjuster",
+ "MinimaxImageRemover",
+ "MinimaxModelLoader",
+ "MinimaxVideoLoader",
+ "MinimaxVideoRemover"
+ ],
+ {
+ "title_aux": "ComfyUI-MiniMax-Remover"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-Mosaic": [
+ [
+ "MosaicCreator",
+ "MosaicDetector"
+ ],
+ {
+ "title_aux": "ComfyUI-Mosaic"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-OmniGen": [
+ [
+ "ailab_OmniGen"
+ ],
+ {
+ "title_aux": "ComfyUI-OmniGen"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-QwenASR": [
+ [
+ "AILab_Qwen3ASR",
+ "AILab_Qwen3ASRSubtitle"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenASR"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-QwenVL": [
+ [
+ "AILab_QwenVL",
+ "AILab_QwenVL_Advanced",
+ "AILab_QwenVL_GGUF",
+ "AILab_QwenVL_GGUF_Advanced",
+ "AILab_QwenVL_GGUF_PromptEnhancer",
+ "AILab_QwenVL_PromptEnhancer"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenVL"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-RMBG": [
+ [
+ "AILab_ColorInput",
+ "AILab_ColorToMask",
+ "AILab_CropObject",
+ "AILab_Florence2",
+ "AILab_Florence2ToCoordinates",
+ "AILab_ICLoRAConcat",
+ "AILab_ImageCombiner",
+ "AILab_ImageCompare",
+ "AILab_ImageCrop",
+ "AILab_ImageMaskConvert",
+ "AILab_ImageMaskToList",
+ "AILab_ImagePreview",
+ "AILab_ImageResize",
+ "AILab_ImageStitch",
+ "AILab_ImageToList",
+ "AILab_LamaRemover",
+ "AILab_LoadImage",
+ "AILab_LoadImageAdvanced",
+ "AILab_LoadImageBatch",
+ "AILab_LoadImageSimple",
+ "AILab_MaskCombiner",
+ "AILab_MaskEnhancer",
+ "AILab_MaskExtractor",
+ "AILab_MaskOverlay",
+ "AILab_MaskPreview",
+ "AILab_MaskToList",
+ "AILab_Preview",
+ "AILab_ReferenceLatentMask",
+ "AILab_SDMatte",
+ "AILab_UnbatchImages",
+ "AILab_YoloV8",
+ "AILab_YoloV8Adv",
+ "BiRefNetRMBG",
+ "BodySegment",
+ "ClothesSegment",
+ "FaceSegment",
+ "FashionSegmentAccessories",
+ "FashionSegmentClothing",
+ "RMBG",
+ "SAM2Segment",
+ "SAM3Segment",
+ "Segment",
+ "SegmentV2"
+ ],
+ {
+ "title_aux": "ComfyUI-RMBG"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-ReduxFineTune": [
+ [
+ "ClipVisionStyleLoader",
+ "ReduxFineTune",
+ "ReduxFineTuneAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-ReduxFineTune"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-SparkTTS": [
+ [
+ "SparkTTS_AdvVoiceClone",
+ "SparkTTS_AudioRecorder",
+ "SparkTTS_VoiceClone",
+ "SparkTTS_VoiceCreator"
+ ],
+ {
+ "title_aux": "Comfyui-Spark-TTS"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-VoxCPMTTS": [
+ [
+ "AILab_VoxCPMTTS",
+ "AILab_VoxCPMTTS_Advanced"
+ ],
+ {
+ "title_aux": "ComfyUI-VoxCPMTTS"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-WildPromptor": [
+ [
+ "CustomListManager",
+ "KeywordPicker",
+ "PromptBuilder",
+ "PromptConcat",
+ "WildPromptor_AllInOne",
+ "WildPromptor_AllInOneList",
+ "WildPromptor_DataToPromptList",
+ "WildPromptor_Enhancer",
+ "WildPromptor_Generator",
+ "WildPromptor_Minicpm",
+ "WildPromptor_ShowPrompt",
+ "WildPromptor_TextInput"
+ ],
+ {
+ "title_aux": "ComfyUI-WildPromptor"
+ }
+ ],
+ "https://github.com/1038lab/ComfyUI-Youtu-VL": [
+ [
+ "AILab_YoutuVL",
+ "AILab_YoutuVL_Advanced",
+ "AILab_YoutuVL_GGUF",
+ "AILab_YoutuVL_GGUF_Advanced"
+ ],
+ {
+ "title_aux": "ComfyUI-Youtu-VL"
+ }
+ ],
+ "https://github.com/111496583yzy/comfyui-PuzzleCrack-Effect": [
+ [
+ "MyJigsawPuzzleEffect",
+ "MyRegionBoundaryEffect"
+ ],
+ {
+ "title_aux": "Jigsaw Puzzle Effect Plugin"
+ }
+ ],
+ "https://github.com/11dogzi/CYBERPUNK-STYLE-DIY": [
+ [
+ "CYBERPUNKHT"
+ ],
+ {
+ "title_aux": "CYBERPUNK-STYLE-DIY"
+ }
+ ],
+ "https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant": [
+ [
+ "EGIPAdapter_Mad_Assistant",
+ "EGIPAdapter_Mad_AssistantV1",
+ "EGIPAdapter_Mad_AssistantV2",
+ "EGIPAdapter_Mad_AssistantV3",
+ "EGIPAdapter_Mad_AssistantV4",
+ "EGIPAdapter_Mad_AssistantV5",
+ "EGIPAdapter_Mad_AssistantV6"
+ ],
+ {
+ "title_aux": "ComfUI-EGAdapterMadAssistant"
+ }
+ ],
+ "https://github.com/11dogzi/Comfyui-HYPIR": [
+ [
+ "HYPIRAdvancedRestoration"
+ ],
+ {
+ "title_aux": "HYPIR ComfyUI Plugin"
+ }
+ ],
+ "https://github.com/11dogzi/Comfyui-ergouzi-Nodes": [
+ [
+ "EG-YSZT-ZT",
+ "EG_CPSYTJ",
+ "EG_FX_BDAPI",
+ "EG_HT_YSTZ",
+ "EG_JF_ZZSC",
+ "EG_JXFZ_node",
+ "EG_K_LATENT",
+ "EG_RY_HT",
+ "EG_SCQY_BHDQY",
+ "EG_SCQY_QBQY",
+ "EG_SCQY_SXQY",
+ "EG_SJ",
+ "EG_SJPJ_Node",
+ "EG_SS_RYZH",
+ "EG_SZ_JDYS",
+ "EG_TC_Node",
+ "EG_TSCDS_CJ",
+ "EG_TSCDS_DG",
+ "EG_TSCDS_FG",
+ "EG_TSCDS_JT",
+ "EG_TSCDS_QT",
+ "EG_TSCDS_RW",
+ "EG_TSCDS_WP",
+ "EG_TSCDS_ZL",
+ "EG_TSCMB_GL",
+ "EG_TXZZ_ZH",
+ "EG_TX_CCHQ",
+ "EG_TX_CJPJ",
+ "EG_TX_JZRY",
+ "EG_TX_LJ",
+ "EG_TX_LJBC",
+ "EG_TX_SFBLS",
+ "EG_TX_WHLJ",
+ "EG_WB_KSH",
+ "EG_WXZ_QH",
+ "EG_XZ_QH",
+ "EG_YSQY_BBLLD",
+ "EG_YSQY_BLLD",
+ "EG_ZY_WBK",
+ "EG_ZZHBCJ",
+ "EG_ZZKZ_HT_node",
+ "EG_ZZ_BSYH",
+ "EG_ZZ_BYYH",
+ "EG_ZZ_HSYH",
+ "EG_ZZ_MHHT",
+ "EG_ZZ_SSKZ",
+ "ER_JBCH",
+ "ER_TX_ZZCJ"
+ ],
+ {
+ "title_aux": "Comfyui-ergouzi-Nodes"
+ }
+ ],
+ "https://github.com/11dogzi/Comfyui-ergouzi-kaiguan": [
+ [
+ "ALLty",
+ "EGRWGL",
+ "EGRYDZQHNode",
+ "EGSEED",
+ "GroupSwitchNode",
+ "GroupSwitchNodee",
+ "GroupSwitchNodeee",
+ "GroupSwitchNodeeee",
+ "GroupSwitchNodi",
+ "hulue",
+ "jinyong"
+ ],
+ {
+ "title_aux": "Comfyui-ergouzi-kaiguan"
+ }
+ ],
+ "https://github.com/11dogzi/Comfyui-ergouzi-samplers": [
+ [
+ "EGBYZZCYQ",
+ "EGCYQJB",
+ "EGCYQJBCJ"
+ ],
+ {
+ "title_aux": "Comfyui-ergouzi-samplers"
+ }
+ ],
+ "https://github.com/18yz153/ComfyUI-Persona-Director": [
+ [
+ "PersonaDirector",
+ "PersonaDirectorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Persona-Director"
+ }
+ ],
+ "https://github.com/1hew/ComfyUI-1hewNodes": [
+ [
+ "1hew_AnyEmptyBool",
+ "1hew_AnyEmptyInt",
+ "1hew_AnySwitchBool",
+ "1hew_AnySwitchInt",
+ "1hew_AudioDuration",
+ "1hew_DetectGuideLine",
+ "1hew_DetectYolo",
+ "1hew_GetFileCount",
+ "1hew_ImageAddLabel",
+ "1hew_ImageBBoxOverlayByMask",
+ "1hew_ImageBatchExtract",
+ "1hew_ImageBatchGroup",
+ "1hew_ImageBatchRange",
+ "1hew_ImageBatchSplit",
+ "1hew_ImageBatchToList",
+ "1hew_ImageBlendModeByAlpha",
+ "1hew_ImageBlendModeByCSS",
+ "1hew_ImageCropSquare",
+ "1hew_ImageCropWithBBoxMask",
+ "1hew_ImageEdgeCropPad",
+ "1hew_ImageEditStitch",
+ "1hew_ImageGridSplit",
+ "1hew_ImageHLFreqCombine",
+ "1hew_ImageHLFreqSeparate",
+ "1hew_ImageHLFreqTransform",
+ "1hew_ImageListAppend",
+ "1hew_ImageListToBatch",
+ "1hew_ImageMainStitch",
+ "1hew_ImageMaskBlend",
+ "1hew_ImageMaskCrop",
+ "1hew_ImagePasteByBBoxMask",
+ "1hew_ImagePingPong",
+ "1hew_ImagePlot",
+ "1hew_ImageResizeFluxKontext",
+ "1hew_ImageResizeJimeng",
+ "1hew_ImageResizeQwenImage",
+ "1hew_ImageResizeUniversal",
+ "1hew_ImageRotateWithMask",
+ "1hew_ImageSolid",
+ "1hew_ImageStrokeByMask",
+ "1hew_ImageTileMerge",
+ "1hew_ImageTileSplit",
+ "1hew_IntImageSideLength",
+ "1hew_IntImageSize",
+ "1hew_IntMaskSideLength",
+ "1hew_IntSplit",
+ "1hew_IntWan",
+ "1hew_ListCustomFloat",
+ "1hew_ListCustomInt",
+ "1hew_ListCustomSeed",
+ "1hew_ListCustomString",
+ "1hew_LoadImage",
+ "1hew_LoadVideo",
+ "1hew_LoadVideoToImage",
+ "1hew_MaskBatchMathOps",
+ "1hew_MaskBatchRange",
+ "1hew_MaskBatchSplit",
+ "1hew_MaskBatchToList",
+ "1hew_MaskCropByBBoxMask",
+ "1hew_MaskFillHole",
+ "1hew_MaskListToBatch",
+ "1hew_MaskMathOps",
+ "1hew_MaskPasteByBBoxMask",
+ "1hew_MaskRepeat",
+ "1hew_MaskToSam3Box",
+ "1hew_MatchBrightnessContrast",
+ "1hew_MultiImageBatch",
+ "1hew_MultiImageStitch",
+ "1hew_MultiMaskBatch",
+ "1hew_MultiStringJoin",
+ "1hew_RangeMapping",
+ "1hew_SaveImage",
+ "1hew_SaveVideo",
+ "1hew_SaveVideoByImage",
+ "1hew_StringCoordinateToBBoxMask",
+ "1hew_StringCoordinateToBBoxes",
+ "1hew_StringFilter",
+ "1hew_StringJoinMulti",
+ "1hew_TextCustomExtract",
+ "1hew_TextEncodeQwenImageEdit",
+ "1hew_TextListToString",
+ "1hew_TextPrefixSuffix",
+ "1hew_TextToAny",
+ "1hew_URLToVideo",
+ "1hew_VideoCutGroup",
+ "1hew_WorkflowName"
+ ],
+ {
+ "title_aux": "ComfyUI 1hewNodes"
+ }
+ ],
+ "https://github.com/1mckw/Comfyui-Gelbooru": [
+ [
+ "Gelbooru (ID)",
+ "Gelbooru (Random)",
+ "GelbooruID",
+ "GelbooruRandom",
+ "UrlsToImage"
+ ],
+ {
+ "title_aux": "Comfyui-Gelbooru"
+ }
+ ],
+ "https://github.com/1x1r/comfyui-upscale-by-model": [
+ [
+ "UpscaleImageByUsingModel"
+ ],
+ {
+ "title_aux": "comfyui-upscale-by-model"
+ }
+ ],
+ "https://github.com/1zhangyy1/comfyui-vidu-nodes": [
+ [
+ "Character2Video",
+ "Image2Video",
+ "StartEnd2Video",
+ "Text2Video",
+ "UpscaleVideo",
+ "VideoDownloader"
+ ],
+ {
+ "title_aux": "ComfyUI VIDU"
+ }
+ ],
+ "https://github.com/2frames/ComfyUI-AQnodes": [
+ [
+ "AQ_BatchAverageImage",
+ "AQ_BlendImages",
+ "AQ_CLIPSetLastLayer",
+ "AQ_ColorMatchImage",
+ "AQ_Gemini",
+ "AQ_Gemini_acstep15",
+ "AQ_ImageMaskSwitch",
+ "AQ_Image_DetailTransfer",
+ "AQ_Image_Pad",
+ "AQ_Increment",
+ "AQ_LoadImageBase64",
+ "AQ_MasksAndImagesAsList",
+ "AQ_OpenAI_acstep15",
+ "AQ_Qwen",
+ "AQ_QwenLoader",
+ "AQ_Random",
+ "AQ_SaveImageWebpReturnBase64",
+ "AQ_SendImageToAPI",
+ "AQ_TextEncodeQwenImageEdit",
+ "AQ_TextEncodeQwenImageEditPlus",
+ "AQ_multiface_ApplyPulidFlux"
+ ],
+ {
+ "title_aux": "AQnodes for ComfyUI"
+ }
+ ],
+ "https://github.com/2kpr/ComfyUI-PMRF": [
+ [
+ "PMRF"
+ ],
+ {
+ "title_aux": "ComfyUI-PMRF"
+ }
+ ],
+ "https://github.com/2kpr/ComfyUI-UltraPixel": [
+ [
+ "UltraPixelLoad",
+ "UltraPixelProcess"
+ ],
+ {
+ "author": "italo",
+ "title_aux": "ComfyUI-UltraPixel"
+ }
+ ],
+ "https://github.com/311-code/ComfyUI-MagicClip_Strength": [
+ [
+ "CLIPTextEncodeSDXL_311_code"
+ ],
+ {
+ "title_aux": "ComfyUI MagicClip_Strength for SDXL"
+ }
+ ],
+ "https://github.com/31702160136/ComfyUI-GrsAI": [
+ [
+ "GPTImage_ImageToImage",
+ "GPTImage_TextToImage",
+ "GrsaiFluxKontext_ImageToImage",
+ "GrsaiFluxKontext_MultiImageToImage",
+ "GrsaiFluxKontext_TextToImage",
+ "Grsai_NanoBanana"
+ ],
+ {
+ "title_aux": "GrsAI api in ComfyUI"
+ }
+ ],
+ "https://github.com/3R3BOS/ComfyUI-3R3BOS-Pack": [
+ [
+ "Aspect Ratio Master (3R3BOS)",
+ "Batch Selector (3R3BOS)",
+ "Image Comparer (3R3BOS)"
+ ],
+ {
+ "title_aux": "ComfyUI-3R3BOS-Pack"
+ }
+ ],
+ "https://github.com/3dgopnik/comfyui-arena-suite": [
+ [
+ "Arena_MakeTilesSegs",
+ "\ud83c\udd70\ufe0f Arena AutoCache v6.1.2"
+ ],
+ {
+ "title_aux": "ComfyUI Arena Suite"
+ }
+ ],
+ "https://github.com/438443467/ComfyUI-GPT4V-Image-Captioner": [
+ [
+ "GPT4VCaptioner"
+ ],
+ {
+ "title_aux": "ComfyUI-GPT4V-Image-Captioner"
+ }
+ ],
+ "https://github.com/45uee/ComfyUI-Color_Transfer": [
+ [
+ "ColorPalette",
+ "ColorTransferReinhard",
+ "ExtractPalette",
+ "PaletteOptimalTransportTransfer",
+ "PaletteRbfTransfer",
+ "PaletteTransfer",
+ "PaletteTransferReinhard",
+ "PalleteTransferClustering",
+ "PalletteSoftTransfer"
+ ],
+ {
+ "title_aux": "ComfyUI-Color_Transfer"
+ }
+ ],
+ "https://github.com/54rt1n/ComfyUI-DareMerge": [
+ [
+ "DM_AdvancedDareModelMerger",
+ "DM_AdvancedModelMerger",
+ "DM_AttentionGradient",
+ "DM_BlockGradient",
+ "DM_BlockModelMerger",
+ "DM_DareClipMerger",
+ "DM_DareModelMergerBlock",
+ "DM_DareModelMergerElement",
+ "DM_DareModelMergerMBW",
+ "DM_GradientEdit",
+ "DM_GradientOperations",
+ "DM_GradientReporting",
+ "DM_InjectNoise",
+ "DM_LoRALoaderTags",
+ "DM_LoRAReporting",
+ "DM_MBWGradient",
+ "DM_MagnitudeMasker",
+ "DM_MaskEdit",
+ "DM_MaskOperations",
+ "DM_MaskReporting",
+ "DM_ModelReporting",
+ "DM_NormalizeModel",
+ "DM_QuadMasker",
+ "DM_ShellGradient",
+ "DM_SimpleMasker"
+ ],
+ {
+ "title_aux": "ComfyUI-DareMerge"
+ }
+ ],
+ "https://github.com/552023587/comfyui_character_selector": [
+ [
+ "CharacterSelector"
+ ],
+ {
+ "title_aux": "comfyui_character_selector"
+ }
+ ],
+ "https://github.com/5agado/ComfyUI-Sagado-Nodes": [
+ [
+ "SGD_Call_Ollama",
+ "SGD_Film_Grain",
+ "SGD_Get_Num_Frames",
+ "SGD_Get_Resolution",
+ "SGD_Image_Loader",
+ "SGD_Video_Loader"
+ ],
+ {
+ "title_aux": "Sagado Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/5x00/ComfyUI-PiAPI-Faceswap": [
+ [
+ "Face Swapper"
+ ],
+ {
+ "title_aux": "ComfyUI-PiAPI-Faceswap"
+ }
+ ],
+ "https://github.com/5x00/ComfyUI-VLM-Captions": [
+ [
+ "Image To Caption"
+ ],
+ {
+ "title_aux": "ComfyUI-VLM_Captions"
+ }
+ ],
+ "https://github.com/6174/comflowy-nodes": [
+ [
+ "Comflowy_Clarity_Upscale",
+ "Comflowy_Extract_JSON",
+ "Comflowy_Flux",
+ "Comflowy_Flux_Dev_Lora",
+ "Comflowy_Flux_Pro_Ultra",
+ "Comflowy_Hailuo",
+ "Comflowy_Http_Request",
+ "Comflowy_Ideogram",
+ "Comflowy_Kling",
+ "Comflowy_LLM",
+ "Comflowy_Load_JSON",
+ "Comflowy_Luma",
+ "Comflowy_Omost_LLM",
+ "Comflowy_Omost_Load_Canvas_Conditioning",
+ "Comflowy_Omost_Load_Canvas_Python_Code",
+ "Comflowy_Omost_Preview",
+ "Comflowy_Omost_To_Conditioning",
+ "Comflowy_Preview_JSON",
+ "Comflowy_Preview_Video",
+ "Comflowy_Recraft",
+ "Comflowy_Set_API_Key"
+ ],
+ {
+ "title_aux": "Comflowy's Custom Nodes"
+ }
+ ],
+ "https://github.com/7BEII/comfyui-PD_comfy-api-node": [
+ [
+ "PDGeminiImageGenAPIKey",
+ "PDGeminiImageGenAuthToken",
+ "PDGeminiProImageGenAPIKey",
+ "PDGeminiProImageGenAuthToken",
+ "PDOpenAIGPTImageAPIKey",
+ "PDOpenAIGPTImageAuthToken"
+ ],
+ {
+ "title_aux": "comfyui-PD_comfy-api-node"
+ }
+ ],
+ "https://github.com/807502278/ComfyUI-3D-MeshTool": [
+ [
+ "Auto_Normal",
+ "List_to_Tensor",
+ "Load_OBJ",
+ "Mesh_Clean_Data",
+ "Mesh_Cleanup",
+ "Mesh_Data_Get",
+ "Mesh_Data_Set",
+ "Mesh_Data_Statistics",
+ "Mesh_Optimization",
+ "Mesh_Subdivide",
+ "RT-to-camposes",
+ "Tensor_to_List",
+ "UV_options",
+ "UnwrapUV_xatlas",
+ "array-append",
+ "array-attribute",
+ "array-convert",
+ "array-end-increment",
+ "array-end-step",
+ "array-is-null",
+ "array-number-to-angle",
+ "array-select-element",
+ "array-step",
+ "array-step-increment",
+ "array-t",
+ "array-to-camposes",
+ "get-tensor-shape",
+ "img-bath-rotationZ",
+ "img-to-tensor",
+ "json-to-campos",
+ "ply_load",
+ "ply_normalize",
+ "ply_save",
+ "string-to-array",
+ "tensor-new",
+ "tensor-shape",
+ "tensor-to-img"
+ ],
+ {
+ "author": "807502278",
+ "description": "A simple 3D model processing tool within ComfyUI",
+ "nickname": "3D Mesh Tool",
+ "title": "3D Mesh Tool",
+ "title_aux": "ComfyUI-3D-MeshTool"
+ }
+ ],
+ "https://github.com/807502278/ComfyUI-WJNodes": [
+ [
+ "Accurate_mask_clipping",
+ "Any_Pipe",
+ "ApplyEasyOCR_batch",
+ "AudioDuration_wan",
+ "Audio_Batch_Edit",
+ "Audio_Crop_Batch",
+ "Audio_MergeBatch_To_Channel",
+ "Batch_Average",
+ "Bilateral_Filter",
+ "Color_Data_Break",
+ "Color_check_Name",
+ "ComfyUI_Path_Out",
+ "Composite_Application_pro",
+ "Composite_Basic",
+ "Composite_Batch",
+ "Composite_Canvas_adv",
+ "Composite_Coordinate",
+ "Composite_Global_adv",
+ "Composite_Mask",
+ "Composite_Merge_pro",
+ "Composite_Other",
+ "Composite_Scale",
+ "Cutting_video",
+ "Detecting_videos_mask",
+ "Determine_Type",
+ "Folder_Operations_CH",
+ "Graphics_Detection_Reference",
+ "ImageCompositeMask_Adv",
+ "ListMerger",
+ "Load_Image_Adv",
+ "Load_Image_From_Path",
+ "Mask_Detection",
+ "QwenImage_ratio",
+ "Random_Select_Prompt",
+ "Robust_Imager_Merge",
+ "Run_torchvision_model",
+ "Sam2AutoSegmentation_data",
+ "SaveMP4",
+ "SaveMP4_batch",
+ "Save_Image_Out",
+ "Save_Image_To_Path",
+ "SegmDetectorCombined_batch",
+ "SelectBatch_paragraph",
+ "Select_Batch_v2",
+ "Select_Images_Batch",
+ "Split_Path",
+ "Str_Append",
+ "Video_Fade",
+ "Video_MaskBasedSplit",
+ "Video_OverlappingSeparation_test",
+ "WAS_Mask_Fill_Region_batch",
+ "adv_crop",
+ "any_math",
+ "any_math_v2",
+ "audio_resample",
+ "audio_scale",
+ "bbox_restore_mask",
+ "color_segmentation",
+ "color_segmentation_v2",
+ "crop_by_bboxs",
+ "crop_data_CoordinateSmooth",
+ "crop_data_edit",
+ "del_file",
+ "filter_DensePose_color",
+ "get_image_data",
+ "get_image_ratio",
+ "image_math",
+ "image_math_value",
+ "image_scale_pixel_option",
+ "image_scale_pixel_v2",
+ "image_url_download",
+ "invert_channel_adv",
+ "load_ColorName_config",
+ "load_EasyOCR_model",
+ "load_color_config",
+ "load_torchvision_model",
+ "maskCompositeMask_Adv",
+ "mask_and_mask_math",
+ "mask_crop_option_Basic",
+ "mask_crop_option_SmoothCrop",
+ "mask_crop_square",
+ "mask_line_mapping",
+ "mask_select_mask",
+ "ratio_selector",
+ "run_yolo_bboxs",
+ "run_yolo_bboxs_v2"
+ ],
+ {
+ "title_aux": "ComfyUI-WJNodes"
+ }
+ ],
+ "https://github.com/807502278/ComfyUI_MaskGCT": [
+ [
+ "audio_capture_percentage",
+ "audio_resample",
+ "audio_scale",
+ "from_path_load_audio",
+ "get_audio_data",
+ "get_text_data",
+ "load_maskgct_model",
+ "load_w2vbert_model",
+ "maskgct_pipeline",
+ "maskgct_run_v2",
+ "maskgct_setting",
+ "multilingual_slice",
+ "remove_blank_space",
+ "whisper_large_v3"
+ ],
+ {
+ "title_aux": "ComfyUI_MaskGCT"
+ }
+ ],
+ "https://github.com/80sVectorz/ComfyUI-Static-Primitives": [
+ [
+ "FloatStaticPrimitive",
+ "IntStaticPrimitive",
+ "StringMlStaticPrimitive",
+ "StringStaticPrimitive"
+ ],
+ {
+ "title_aux": "ComfyUI-Static-Primitives"
+ }
+ ],
+ "https://github.com/834t/ComfyUI_834t_scene_composer": [
+ [
+ "B34tSceneComposerNode"
+ ],
+ {
+ "title_aux": "Scene Composer for ComfyUI"
+ }
+ ],
+ "https://github.com/852wa/ComfyUI-AAP": [
+ [
+ "AdvancedAlphaProcessor"
+ ],
+ {
+ "title_aux": "ComfyUI-AdvancedAlphaProcessor"
+ }
+ ],
+ "https://github.com/852wa/ComfyUI-ColorshiftColor": [
+ [
+ "ColorshiftColor",
+ "CsCFill",
+ "CsCPaletteEditor"
+ ],
+ {
+ "title_aux": "ComfyUI-ColorshiftColor"
+ }
+ ],
+ "https://github.com/9nate-drake/ComfyUI-MaskCenter": [
+ [
+ "MaskSubMassDetector",
+ "MaskToCenterPoint"
+ ],
+ {
+ "title_aux": "ComfyUI Mask to Center Point Nodes"
+ }
+ ],
+ "https://github.com/9nate-drake/ComfyUI-PanoTools": [
+ [
+ "CameraCalibration",
+ "Perspective2Panorama"
+ ],
+ {
+ "title_aux": "ComfyUI-PanoTools"
+ }
+ ],
+ "https://github.com/9nate-drake/Comfyui-SecNodes": [
+ [
+ "CoordinatePlotter",
+ "SeCModelLoader",
+ "SeCVideoSegmentation"
+ ],
+ {
+ "title_aux": "Comfyui-SecNodes"
+ }
+ ],
+ "https://github.com/A043-studios/ComfyUI-ASDF-Pixel-Sort-Nodes": [
+ [
+ "PixelSortAdvancedNode",
+ "PixelSortNode"
+ ],
+ {
+ "title_aux": "ComfyUI ASDF Pixel Sort Nodes"
+ }
+ ],
+ "https://github.com/A043-studios/ComfyUI-OmniSVG": [
+ [
+ "OmniSVG Image to SVG",
+ "OmniSVG Model Loader",
+ "OmniSVG Text to SVG",
+ "SVG Saver",
+ "SVG to Image"
+ ],
+ {
+ "title_aux": "ComfyUI OmniSVG Nodes"
+ }
+ ],
+ "https://github.com/A043-studios/ComfyUI_HunyuanWorldnode": [
+ [
+ "HunyuanWorldHybridNode",
+ "HunyuanWorldImageTo3D",
+ "HunyuanWorldModelLoader",
+ "HunyuanWorldSimplifiedWrapper"
+ ],
+ {
+ "title_aux": "ComfyUI HunyuanWorld - Complete 3D Generation Suite"
+ }
+ ],
+ "https://github.com/A043-studios/Comfyui-ascii-generator": [
+ [
+ "ASCIIGeneratorNode"
+ ],
+ {
+ "title_aux": "ComfyUI ASCII Generator Node"
+ }
+ ],
+ "https://github.com/A043-studios/comfyui-pixel3dmm": [
+ [
+ "FLAMEOptimizer",
+ "FaceReconstructor3D",
+ "MeshExporter",
+ "NormalPredictor",
+ "Pixel3DMMLoader",
+ "UVPredictor"
+ ],
+ {
+ "title_aux": "Pixel3DMM ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/A4P7J1N7M05OT/ComfyUI-AutoColorGimp": [
+ [
+ "AutoColorGimp"
+ ],
+ {
+ "title_aux": "ComfyUI-AutoColorGimp"
+ }
+ ],
+ "https://github.com/A4P7J1N7M05OT/ComfyUI-PixelOE-Wrapper": [
+ [
+ "PixelOE",
+ "PixelOETorch"
+ ],
+ {
+ "title_aux": "ComfyUI-PixelOE-Wrapper"
+ }
+ ],
+ "https://github.com/AARG-FAN/Image-Vector-for-ComfyUI": [
+ [
+ "AIraster"
+ ],
+ {
+ "title_aux": "Image-vector-for-ComfyUI"
+ }
+ ],
+ "https://github.com/AEmotionStudio/ComfyUI-DiscordSend": [
+ [
+ "DiscordSendSaveImage",
+ "DiscordSendSaveVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-DiscordSend"
+ }
+ ],
+ "https://github.com/AEmotionStudio/ComfyUI-ShaderNoiseKSampler": [
+ [
+ "AdvancedImageComparer",
+ "ShaderNoiseKSampler",
+ "ShaderNoiseKSamplerDirect",
+ "Video Comparer",
+ "VideoComparer"
+ ],
+ {
+ "title_aux": "ComfyUI-ShaderNoiseKSampler"
+ }
+ ],
+ "https://github.com/AHEKOT/ComfyUI_VNCCS": [
+ [
+ "CharacterAssetSelector",
+ "CharacterAssetSelectorQWEN",
+ "CharacterCreator",
+ "CharacterPreview",
+ "CharacterSheetCropper",
+ "DatasetGenerator",
+ "EmotionGenerator",
+ "EmotionGeneratorV2",
+ "SpriteGenerator",
+ "VNCCSChromaKey",
+ "VNCCSSamplerSchedulerPicker",
+ "VNCCSSheetExtractor",
+ "VNCCSSheetManager",
+ "VNCCS_ColorFix",
+ "VNCCS_Float",
+ "VNCCS_Integer",
+ "VNCCS_MaskExtractor",
+ "VNCCS_MultilineText",
+ "VNCCS_Pipe",
+ "VNCCS_PoseGenerator",
+ "VNCCS_PromptConcat",
+ "VNCCS_QWEN_Encoder",
+ "VNCCS_QuadSplitter",
+ "VNCCS_RMBG2",
+ "VNCCS_Resize",
+ "VNCCS_String"
+ ],
+ {
+ "title_aux": "VNCCS - Visual Novel Character Creation Suite"
+ }
+ ],
+ "https://github.com/AI-TEC/ComfyUI-AITECCAFE-Toolkit": [
+ [
+ "ChatGPTNode",
+ "CustomStringMerge",
+ "NSFWChecker",
+ "OpenAIImageModeration",
+ "SequentialImageLoader",
+ "SequentialMediaLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_AITECCAFE_Toolkit"
+ }
+ ],
+ "https://github.com/AI2lab/comfyUI-siliconflow-api-2lab": [
+ [
+ "FreeChat",
+ "PaidChat"
+ ],
+ {
+ "title_aux": "comfyUI-siliconflow-api-2lab"
+ }
+ ],
+ "https://github.com/AIExplorer25/ComfyUI_AutoDownloadModels": [
+ [
+ "ALIMAMAFUNCONTROLWANModelsAutoDownload",
+ "AutoDownloadALLModels",
+ "AutoDownloadModels",
+ "AutoInstallRequirements_txt",
+ "GetModelsFromWorkflow",
+ "SetModelPath",
+ "ShowModelsAndFolderMappings",
+ "WANALMAMAModelsAutoDownload",
+ "WANModelsAutoDownload"
+ ],
+ {
+ "title_aux": "ComfyUI_AutoDownloadModels"
+ }
+ ],
+ "https://github.com/AIExplorer25/ComfyUI_ChatGptHelper": [
+ [
+ "ChatGptHelper"
+ ],
+ {
+ "title_aux": "ComfyUI_ChatGptHelper"
+ }
+ ],
+ "https://github.com/AIExplorer25/ComfyUI_ImageCaptioner": [
+ [
+ "CheckImageCaptionsData",
+ "ImageCaptioner",
+ "ImageCaptionerPostProcessing",
+ "Quen3Helper",
+ "Quen3HelperGGUF",
+ "SingleImageCaptioner"
+ ],
+ {
+ "title_aux": "ComfyUI_ImageCaptioner"
+ }
+ ],
+ "https://github.com/AIFSH/AniTalker-ComfyUI": [
+ [
+ "AniTalkerNode",
+ "PreViewVideo"
+ ],
+ {
+ "title_aux": "AniTalker-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-3d-photo-inpainting": [
+ [
+ "LoadImagePath",
+ "PreViewVideo",
+ "TreeDNode"
+ ],
+ {
+ "title_aux": "ComfyUI-3d-photo-inpainting"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-AuraSR": [
+ [
+ "AuraSRNode"
+ ],
+ {
+ "title_aux": "AIFSH/ComfyUI-AuraSR"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-DiffSynth-Studio": [
+ [
+ "ControlNetPathLoader",
+ "DiffTextNode",
+ "DiffutoonNode",
+ "ExVideoNode",
+ "LoadVideo",
+ "PreViewVideo",
+ "SDPathLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-DiffSynth-Studio"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-FishSpeech": [
+ [
+ "FishSpeech_INFER",
+ "FishSpeech_INFER_SRT",
+ "LoadAudio",
+ "LoadSRT",
+ "PreViewAudio"
+ ],
+ {
+ "title_aux": "ComfyUI-FishSpeech"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-GPT_SoVITS": [
+ [
+ "GPT_SOVITS_FT",
+ "GPT_SOVITS_INFER",
+ "GPT_SOVITS_TTS",
+ "LoadAudio",
+ "LoadSRT",
+ "PreViewAudio"
+ ],
+ {
+ "title_aux": "ComfyUI-GPT_SoVITS"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-Hallo": [
+ [
+ "HalloNode",
+ "LoadAudio",
+ "LoadAudioPath",
+ "LoadImagePath",
+ "PreViewVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-Hallo"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-I2V-Adapter": [
+ [
+ "I2V_AdapterNode",
+ "LoraPathLoader",
+ "MotionLoraLoader",
+ "PreViewVideo",
+ "PromptNode"
+ ],
+ {
+ "title_aux": "ComfyUI-I2V-Adapter"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-IP_LAP": [
+ [
+ "CombineAudioVideo",
+ "IP_LAP",
+ "LoadVideo",
+ "PreViewVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-IP_LAP"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-Live2DViewer": [
+ [
+ "Live2DViewer",
+ "LoadAudio"
+ ],
+ {
+ "title_aux": "ComfyUI-Live2DViewer"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-MARS5-TTS": [
+ [
+ "LoadAudioPath",
+ "MARS5TTS_Node",
+ "PreViewAudio",
+ "TTSTextEncode"
+ ],
+ {
+ "title_aux": "ComfyUI-MARS5-TTS"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-MimicBrush": [
+ [
+ "MimicBrushNode"
+ ],
+ {
+ "title_aux": "ComfyUI-MimicBrush"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-MimicMotion": [
+ [
+ "LoadVideo",
+ "MimicMotionNode",
+ "PreViewVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-MimicMotion"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-MuseTalk_FSH": [
+ [
+ "CombineAudioVideo",
+ "LoadVideo",
+ "MuseTalk",
+ "MuseTalkRealTime",
+ "PreViewVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-MuseTalk_FSH"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-RVC": [
+ [
+ "CombineAudio",
+ "LoadAudio",
+ "PreViewAudio",
+ "RVC_Infer",
+ "RVC_Train"
+ ],
+ {
+ "title_aux": "ComfyUI-RVC"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-UVR5": [
+ [
+ "LoadAudioPath",
+ "PreViewAudio",
+ "UVR5_Node"
+ ],
+ {
+ "title_aux": "ComfyUI-UVR5"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-UniAnimate": [
+ [
+ "LoadImagePath",
+ "LoadVideo",
+ "PoseAlignNode",
+ "PreViewVideo",
+ "UniAnimateNode"
+ ],
+ {
+ "title_aux": "ComfyUI-UniAnimate"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-WhisperX": [
+ [
+ "LoadAudioVideoPath",
+ "PreViewSRT",
+ "SRTToString",
+ "WhisperX"
+ ],
+ {
+ "title_aux": "ComfyUI-WhisperX"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI-XTTS": [
+ [
+ "LoadAudioPath",
+ "LoadSRT",
+ "PreViewAudio",
+ "XTTS_INFER",
+ "XTTS_INFER_SRT"
+ ],
+ {
+ "title_aux": "ComfyUI-XTTS"
+ }
+ ],
+ "https://github.com/AIFSH/ComfyUI_V-Express": [
+ [
+ "LoadAudioPath",
+ "LoadImagePath",
+ "LoadVideo",
+ "PreViewVideo",
+ "VExpress"
+ ],
+ {
+ "title_aux": "ComfyUI_V-Express"
+ }
+ ],
+ "https://github.com/AIFSH/CosyVoice-ComfyUI": [
+ [
+ "CosyVoiceDubbingNode",
+ "CosyVoiceNode",
+ "LoadSRT",
+ "TextNode"
+ ],
+ {
+ "title_aux": "CosyVoice-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/DHLive-ComfyUI": [
+ [
+ "CombineVideo",
+ "DHLIVELoadVideo",
+ "DHLiveNode",
+ "PreViewVideo",
+ "StaticVideo"
+ ],
+ {
+ "title_aux": "DHLive-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/DiffMorpher-ComfyUI": [
+ [
+ "DiffMorpherNode",
+ "PreViewGIF",
+ "TextNode"
+ ],
+ {
+ "title_aux": "DiffMorpher-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/DiffSynth-ComfyUI": [
+ [
+ "CogVideoNode",
+ "DownloadModelsNode",
+ "LoadVideo",
+ "PreViewVideo",
+ "TextEncode"
+ ],
+ {
+ "title_aux": "DiffSynth-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/EchoMimicV2-ComfyUI": [
+ [
+ "EchoMimicV2Node",
+ "EchoMimicV2PoseNode"
+ ],
+ {
+ "title_aux": "EchoMimicV2-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/EzAudio-ComfyUI": [
+ [
+ "EzAudioControlNetNode",
+ "EzAudioEditNode",
+ "EzAudioNode",
+ "TextPromptNode"
+ ],
+ {
+ "title_aux": "EzAudio-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/F5-TTS-ComfyUI": [
+ [
+ "F5TTSNode"
+ ],
+ {
+ "title_aux": "F5-TTS-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/FancyVideo-ComfyUI": [
+ [
+ "FancyVideoI2VNode",
+ "FancyVideoV2VNode"
+ ],
+ {
+ "title_aux": "FancyVideo-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/FireRedTTS-ComfyUI": [
+ [
+ "FireRedTTSNode"
+ ],
+ {
+ "title_aux": "FireRedTTS-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/GSTTS-ComfyUI": [
+ [
+ "ASRNode",
+ "AudioSlicerNode",
+ "ConfigGPTNode",
+ "ConfigSoVITSNode",
+ "DatasetNode",
+ "ExperienceNode",
+ "GSFinetuneNone",
+ "GSVTTSNode",
+ "LoadSRT",
+ "PreViewSRT",
+ "TSCY_Node",
+ "TextDictNode"
+ ],
+ {
+ "title_aux": "GSTTS-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/HivisionIDPhotos-ComfyUI": [
+ [
+ "AddBackgroundNode",
+ "AddWaterMarkNode",
+ "ENHivisionParamsNode",
+ "HivisionLayOutNode",
+ "HivisionNode",
+ "LaterProcessNode",
+ "ZHHivisionParamsNode"
+ ],
+ {
+ "author": "cuny",
+ "description": "",
+ "title_aux": "HivisionIDPhotos-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/IMAGDressing-ComfyUI": [
+ [
+ "IMAGDressingNode",
+ "TextNode"
+ ],
+ {
+ "title_aux": "IMAGDressing-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/JoyHallo-ComfyUI": [
+ [
+ "JoyHalloNode"
+ ],
+ {
+ "title_aux": "JoyHallo-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/MaskGCT-ComfyUI": [
+ [
+ "MaskGCTNode"
+ ],
+ {
+ "title_aux": "MaskGCT-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/MiniMates-ComfyUI": [
+ [
+ "MiniMatesNode"
+ ],
+ {
+ "title_aux": "MiniMates-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/OmniGen-ComfyUI": [
+ [
+ "OmniGenLoader",
+ "OmniGenNode"
+ ],
+ {
+ "title_aux": "OmniGen-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/PyramidFlow-ComfyUI": [
+ [
+ "PyramidFlowNode"
+ ],
+ {
+ "title_aux": "PyramidFlow-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/RealisDance-ComfyUI": [
+ [
+ "LoadFile",
+ "LoadVideo",
+ "PreViewVideo",
+ "RealisDanceNode"
+ ],
+ {
+ "title_aux": "RealisDance-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/SenseVoice-ComfyUI": [
+ [
+ "SenseVoiceNode",
+ "ShowTextNode"
+ ],
+ {
+ "title_aux": "SenseVoice-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/StyleShot-ComfyUI": [
+ [
+ "StyleShotNode",
+ "TextNode"
+ ],
+ {
+ "title_aux": "StyleShot-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/VideoSys-ComfyUI": [
+ [
+ "PreViewVideo",
+ "TextNode",
+ "VideoSysNode"
+ ],
+ {
+ "title_aux": "VideoSys-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/ViewCrafter-ComfyUI": [
+ [
+ "LoadVideo",
+ "PreViewVideo",
+ "ViewCrafterTxTNode"
+ ],
+ {
+ "title_aux": "ViewCrafter-ComfyUI"
+ }
+ ],
+ "https://github.com/AIFSH/VocalSeparation-ComfyUI": [
+ [
+ "CombineAudioNode",
+ "VocalSeparationNode"
+ ],
+ {
+ "title_aux": "VocalSeparation-ComfyUI"
+ }
+ ],
+ "https://github.com/AIGCTeam/ComfyUI_kkTranslator_nodes": [
+ [
+ "LoadMarianMTCheckPoint",
+ "PromptBaiduFanyiToText",
+ "PromptTranslateToText"
+ ],
+ {
+ "title_aux": "ComfyUI_kkTranslator_nodes"
+ }
+ ],
+ "https://github.com/AIGODLIKE/Blender-IO": [
+ [
+ "BlenderInputs",
+ "BlenderOutputs",
+ "ComfyUIInputs"
+ ],
+ {
+ "title_aux": "Blender-IO"
+ }
+ ],
+ "https://github.com/AIGODLIKE/ComfyUI-CUP": [
+ [
+ "Mask",
+ "OpenPose",
+ "OpenPoseCanny",
+ "OpenPoseDepth",
+ "OpenPoseFace",
+ "OpenPoseFull",
+ "OpenPoseFullExtraLimb",
+ "OpenPoseHand",
+ "OpenPoseKeyPose",
+ "OpenPoseLineart",
+ "OpenPoseMediaPipeFace",
+ "PreviewAudio",
+ "SaveAudioBL",
+ "SaveModel",
+ "\u5b58\u50a8",
+ "\u622a\u56fe",
+ "\u6750\u8d28\u56fe",
+ "\u8f93\u5165\u56fe\u50cf",
+ "\u9884\u89c8"
+ ],
+ {
+ "title_aux": "ComfyUI-CUP"
+ }
+ ],
+ "https://github.com/AIGODLIKE/ComfyUI-ToonCrafter": [
+ [
+ "ToonCrafterNode",
+ "ToonCrafterWithSketch"
+ ],
+ {
+ "title_aux": "ComfyUI-ToonCrafter"
+ }
+ ],
+ "https://github.com/AIPOQUE/ComfyUI-APQNodes": [
+ [
+ "ColorPalette|AIPOQUE"
+ ],
+ {
+ "title_aux": "ComfyUI-APQNodes"
+ }
+ ],
+ "https://github.com/AIToldMeTo/comfyui-cache-cleaner": [
+ [
+ "CacheCleaner"
+ ],
+ {
+ "title_aux": "ComfyUI Cache Cleaner Node"
+ }
+ ],
+ "https://github.com/AIWarper/ComfyUI-DAViD": [
+ [
+ "DAViDDepthVisualizer",
+ "DAViDMultiTask",
+ "DAViDNormalToLight"
+ ],
+ {
+ "title_aux": "ComfyUI-DAViD"
+ }
+ ],
+ "https://github.com/AIWarper/ComfyUI-NormalCrafterWrapper": [
+ [
+ "DetailTransfer",
+ "NormalCrafterNode"
+ ],
+ {
+ "title_aux": "NormalCrafterWrapper"
+ }
+ ],
+ "https://github.com/AIWarper/ComfyUI-WarperNodes": [
+ [
+ "AspectRatioMatchToBase_Warper",
+ "AspectRatioMatchToStandardResolution_Warper",
+ "AspectRatioResolution_Warper",
+ "CombinePrompts_Warper",
+ "CropAndRestore_Warper",
+ "DWPoseScalerNode_Warper",
+ "FacialPartMaskFromPose_Warper",
+ "FlowVisualizerNode_Warper",
+ "GetBatchByIndex_Warper",
+ "LoadPromptsFromDirectory_Warper",
+ "LoadSinglePromptByIndex_Warper",
+ "MouthMaskFromPose_Warper",
+ "PreprocessForTarget_Warper",
+ "SmartOverlappingBatcher_Warper",
+ "SmartVideoBatcher_Warper",
+ "TextFileIteratorWithInfo_Warper",
+ "TextFileIterator_Warper"
+ ],
+ {
+ "title_aux": "ComfyUI Warper Nodes"
+ }
+ ],
+ "https://github.com/AInseven/ComfyUI-fastblend": [
+ [
+ "FillDarkMask",
+ "InterpolateKeyFrame",
+ "MaskListcaptoBatch",
+ "Merge_Image_List",
+ "MyOpenPoseNode",
+ "SmoothVideo",
+ "alert_when_finished",
+ "reBatchImage"
+ ],
+ {
+ "title_aux": "ComfyUI-fastblend"
+ }
+ ],
+ "https://github.com/AIrjen/OneButtonPrompt": [
+ [
+ "AutoNegativePrompt",
+ "CreatePromptVariant",
+ "OneButtonArtify",
+ "OneButtonFlufferize",
+ "OneButtonPreset",
+ "OneButtonPrompt",
+ "OneButtonSuperPrompt",
+ "SavePromptToFile"
+ ],
+ {
+ "title_aux": "One Button Prompt"
+ }
+ ],
+ "https://github.com/AJO-reading/ComfyUI-AjoNodes": [
+ [
+ "AJO_AudioCollectAndConcat",
+ "AJO_VfiSkipListCalculator"
+ ],
+ {
+ "title_aux": "ComfyUI-AjoNodes"
+ }
+ ],
+ "https://github.com/AJbeckliy/SynVow-Comfyui-Nanoapi": [
+ [
+ "SynVowNano2_I2I",
+ "SynVowNano2_T2I"
+ ],
+ {
+ "title_aux": "SynVow-Comfyui-Nanoapi"
+ }
+ ],
+ "https://github.com/AKharytonchyk/ComfyUI-telegram-bot-node": [
+ [
+ "SaveToTelegram",
+ "TelegramListener",
+ "author",
+ "description",
+ "files",
+ "install_type",
+ "keywords",
+ "license",
+ "name",
+ "nodename_pattern",
+ "pip",
+ "reference",
+ "version"
+ ],
+ {
+ "title_aux": "ComfyUI-telegram-bot-node"
+ }
+ ],
+ "https://github.com/ALatentPlace/ComfyUI_yanc": [
+ [
+ "> Bloom",
+ "> Blur",
+ "> Brightness",
+ "> Clear Text",
+ "> Combine Channels",
+ "> Contrast",
+ "> Divide Channels",
+ "> Edge Enhance",
+ "> Film Grain",
+ "> Float to Int",
+ "> Fog",
+ "> Get Mean Color",
+ "> HUE",
+ "> Int",
+ "> Int to Text",
+ "> Layer Weights (for IPAMS)",
+ "> Lens Distortion",
+ "> Light Source Mask",
+ "> Load Image",
+ "> Load Image From Folder",
+ "> Mask Curves",
+ "> NIKSampler",
+ "> Noise From Image",
+ "> Normal Map Lighting",
+ "> RGB Color",
+ "> RGB Shift",
+ "> Resolution by Aspect Ratio",
+ "> Rotate Image",
+ "> Saturation",
+ "> Save Image",
+ "> Save Text",
+ "> Scale Image to Side",
+ "> Scanlines",
+ "> Sharpen",
+ "> Text",
+ "> Text Combine",
+ "> Text Count",
+ "> Text Pick Line by Index",
+ "> Text Pick Random Line",
+ "> Text Random Weights",
+ "> Text Replace",
+ "> Vignette"
+ ],
+ {
+ "title_aux": "ComfyUI_yanc"
+ }
+ ],
+ "https://github.com/ALatentPlace/YANC_LMStudio": [
+ [
+ "> LMStudio",
+ "> Select LMS Model"
+ ],
+ {
+ "title_aux": "YANC_LMStudio"
+ }
+ ],
+ "https://github.com/APZmedia/APZmedia-comfy-together-lora": [
+ [
+ "TogetherImageGenerator",
+ "TogetherImageGeneratorLoRA"
+ ],
+ {
+ "title_aux": "APZmedia Together Image Generator for ComfyUI"
+ }
+ ],
+ "https://github.com/APZmedia/APZmedia-comfyui-fast-image-save": [
+ [
+ "APZmedia Fast image save"
+ ],
+ {
+ "title_aux": "APZmedia Fast Image Save Node"
+ }
+ ],
+ "https://github.com/APZmedia/ComfyUI-APZmedia-cleanName-from-string": [
+ [
+ "APZmediaGenerateFilePath",
+ "APZmediaImageFilename",
+ "APZmediaReadWidget",
+ "APZmediaStandardFilenameBuilder",
+ "CleanFileNameNode"
+ ],
+ {
+ "title_aux": "APZmedia Naming Tools"
+ }
+ ],
+ "https://github.com/APZmedia/ComfyUI-Dreamlight": [
+ [
+ "DreamLightNode"
+ ],
+ {
+ "title_aux": "ComfyUI DreamLight Node"
+ }
+ ],
+ "https://github.com/APZmedia/ComfyUI-color-tools": [
+ [
+ "AdvancedOcioColorTransform",
+ "BrightnessContrast",
+ "ColorBalance",
+ "ColorConverterAdvanced",
+ "ColorHarmony",
+ "ColorHistogram",
+ "ColorPalette",
+ "ColorProfileConvert",
+ "ColorProfileReader",
+ "ColorSimilarity",
+ "ColorSpaceAnalyzer",
+ "ColorSpaceConverter",
+ "ColorTemperature",
+ "DominantColors",
+ "GammaCompare",
+ "GammaCorrection",
+ "HueShift",
+ "LittleCMSColorProfileConverter",
+ "OCIOColorSpaceConverter",
+ "OCIOConfigInfo",
+ "QuickColorSpaceFix",
+ "Saturation",
+ "TestPatternGenerator",
+ "VectorScope"
+ ],
+ {
+ "title_aux": "ComfyUI Color Profile Reader"
+ }
+ ],
+ "https://github.com/APZmedia/Comfyui-LightDirection-estimation": [
+ [
+ "EnhancedLightEstimator",
+ "IREShadowAnalyzer",
+ "IREShadowComparison",
+ "LightDistributionAnalyzer",
+ "LightImageProcessor",
+ "NormalMapLightEstimator"
+ ],
+ {
+ "title_aux": "NormalMapLightEstimator"
+ }
+ ],
+ "https://github.com/ARM64-EC/ComfyUI-LongCatPlugin": [
+ [
+ "LoadLongCatModel",
+ "LongCatCLIPLoader",
+ "LongCatImageResizer",
+ "LongCatSampler",
+ "LongCatSizePicker",
+ "LongCatVAELoader",
+ "TextEncodeLongCatImage",
+ "TextEncodeLongCatImageEdit"
+ ],
+ {
+ "title_aux": "ComfyUI-LongCatPlugin"
+ }
+ ],
+ "https://github.com/ARZUMATA/ComfyUI-ARZUMATA": [
+ [
+ "CachingCLIPTextEncode",
+ "CachingCLIPTextEncodeFlux",
+ "CachingCLIPTextEncodeFlux|ARZUMATA",
+ "CachingCLIPTextEncode|ARZUMATA",
+ "ImageCacher",
+ "ImageLoaderWithPath|ARZUMATA",
+ "JDC_ImageLoader",
+ "Sampler Selector|ARZUMATA",
+ "Scheduler Selector|ARZUMATA",
+ "UniversalDeviceOverride"
+ ],
+ {
+ "title_aux": "ComfyUI-ARZUMATA"
+ }
+ ],
+ "https://github.com/ARZUMATA/ComfyUI-ARZUMATA-PixelIt": [
+ [
+ "PixelIt"
+ ],
+ {
+ "title_aux": "ComfyUI-ARZUMATA-PixelIt"
+ }
+ ],
+ "https://github.com/ARZUMATA/ComfyUI-ARZUMATA-Qwen2": [
+ [
+ "Image2Base64",
+ "Qwen2ModelLoader",
+ "Qwen2ModelRunInference"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen2"
+ }
+ ],
+ "https://github.com/Aaalice233/ComfyUI-Danbooru-Gallery": [
+ [
+ "CharacterFeatureSwapNode",
+ "GlobalTextCacheGet",
+ "GroupExecutorManager",
+ "GroupExecutorTrigger",
+ "GroupIsEnabled",
+ "GroupMuteManager",
+ "ImageCacheGet",
+ "MultiCharacterEditorNode",
+ "PromptCleaningMaid",
+ "PromptSelector",
+ "ResolutionMasterSimplify",
+ "SimpleImageCompare"
+ ],
+ {
+ "title_aux": "ComfyUI-Danbooru-Gallery"
+ }
+ ],
+ "https://github.com/Aaron-CHM/ComfyUI-z-a1111-sd-webui-DanTagGen": [
+ [
+ "DanTagGen"
+ ],
+ {
+ "title_aux": "z-a1111-sd-webui-DanTagGen"
+ }
+ ],
+ "https://github.com/AbdullahAlfaraj/Comfy-Photoshop-SD": [
+ [
+ "APS_LatentBatch",
+ "APS_Seed",
+ "ContentMaskLatent",
+ "ControlNetScript",
+ "ControlnetUnit",
+ "GaussianLatentImage",
+ "GetConfig",
+ "LoadImageBase64",
+ "LoadImageWithMetaData",
+ "LoadLorasFromPrompt",
+ "MaskExpansion"
+ ],
+ {
+ "title_aux": "Comfy-Photoshop-SD"
+ }
+ ],
+ "https://github.com/AbstractEyes/comfyui-lycoris": [
+ [
+ "ABS_ConcatPrompts",
+ "ABS_PromptNode",
+ "LycorisLoaderNode"
+ ],
+ {
+ "title_aux": "comfyui-lycoris"
+ }
+ ],
+ "https://github.com/AbyssBadger0/ComfyUI_BadgerTools": [
+ [
+ "ApplyMaskToImage-badger",
+ "CropImageByMask-badger",
+ "ExpandImageWithColor-badger",
+ "FindThickLinesFromCanny-badger",
+ "Find_closest_factors-badger",
+ "FloatToInt-badger",
+ "FloatToString-badger",
+ "FrameToVideo-badger",
+ "GETRequset-badger",
+ "GarbageCollect-badger",
+ "GetColorFromBorder-badger",
+ "GetDirName-badger",
+ "GetUUID-badger",
+ "IdentifyBorderColorToMask-badger",
+ "IdentifyColorToMask-badger",
+ "ImageNormalization-badger",
+ "ImageOverlap-badger",
+ "ImageScaleToSide-badger",
+ "IntToString-badger",
+ "IntToStringAdvanced-badger",
+ "LoadImageAdvanced-badger",
+ "LoadImagesFromDirListAdvanced-badger",
+ "MapColorsToPalette-badger",
+ "NormalizationNumber-badger",
+ "ReduceColors-badger",
+ "RotateImageWithPadding-badger",
+ "SegmentToMaskByPoint-badger",
+ "SimpleBoolean-badger",
+ "StringToFizz-badger",
+ "TextListToString-badger",
+ "ToPixel-badger",
+ "ToPixelV2-badger",
+ "TrimTransparentEdges-badger",
+ "VideoCutFromDir-badger",
+ "VideoToFrame-badger",
+ "deleteDir-badger",
+ "findCenterOfMask-badger",
+ "getImageSide-badger",
+ "getParentDir-badger",
+ "mkdir-badger"
+ ],
+ {
+ "title_aux": "ComfyUI_BadgerTools"
+ }
+ ],
+ "https://github.com/AbyssBadger0/ComfyUI_Kolors_awesome_prompts": [
+ [
+ "KolorsAwesomePrompts"
+ ],
+ {
+ "title_aux": "Kolors Awesome Prompts"
+ }
+ ],
+ "https://github.com/AcademiaSD/comfyui_AcademiaSD": [
+ [
+ "AcademiaSD_BatchLoader",
+ "AcademiaSD_Gemini_Node",
+ "AcademiaSD_SaveCaption",
+ "IntegerBypasser",
+ "LoopCounterToFile",
+ "PaddedFileName",
+ "PromptBatchSelector",
+ "ResetCounterFile"
+ ],
+ {
+ "title_aux": "comfyui_AcademiaSD"
+ }
+ ],
+ "https://github.com/Acly/comfyui-inpaint-nodes": [
+ [
+ "INPAINT_ApplyFooocusInpaint",
+ "INPAINT_DenoiseToCompositingMask",
+ "INPAINT_ExpandMask",
+ "INPAINT_InpaintWithModel",
+ "INPAINT_LoadFooocusInpaint",
+ "INPAINT_LoadInpaintModel",
+ "INPAINT_MaskedBlur",
+ "INPAINT_MaskedFill",
+ "INPAINT_ShrinkMask",
+ "INPAINT_StabilizeMask",
+ "INPAINT_VAEEncodeInpaintConditioning"
+ ],
+ {
+ "title_aux": "ComfyUI Inpaint Nodes"
+ }
+ ],
+ "https://github.com/Acly/comfyui-tooling-nodes": [
+ [
+ "ETN_ApplyMaskToImage",
+ "ETN_ApplyReferenceImages",
+ "ETN_AttentionMask",
+ "ETN_BackgroundRegion",
+ "ETN_DefineRegion",
+ "ETN_ExtractImageTile",
+ "ETN_ExtractMaskTile",
+ "ETN_GenerateTileMask",
+ "ETN_KritaCanvas",
+ "ETN_KritaImageLayer",
+ "ETN_KritaMaskLayer",
+ "ETN_KritaOutput",
+ "ETN_KritaSelection",
+ "ETN_KritaSendText",
+ "ETN_KritaStyle",
+ "ETN_KritaStyleAndPrompt",
+ "ETN_ListRegionMasks",
+ "ETN_LoadImageBase64",
+ "ETN_LoadImageCache",
+ "ETN_LoadMaskBase64",
+ "ETN_MergeImageTile",
+ "ETN_NSFWFilter",
+ "ETN_Parameter",
+ "ETN_ReferenceImage",
+ "ETN_SaveImageCache",
+ "ETN_SendImageWebSocket",
+ "ETN_TileLayout",
+ "ETN_Translate"
+ ],
+ {
+ "title_aux": "ComfyUI Nodes for External Tooling"
+ }
+ ],
+ "https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes": [
+ [
+ "Advanced_Color_Correction",
+ "Advanced_Latent_Noise",
+ "Advanced_Sharpen",
+ "Advanced_Upscale_Image_Using_Model",
+ "Capped_Float_Positive",
+ "Capped_Int_Positive",
+ "Embedding_Selector",
+ "Fast_Color_Match",
+ "Fast_Film_Grain",
+ "Get_Side_Length_Of_Image",
+ "Image_Crop",
+ "Image_Dimensions",
+ "Image_Stitch",
+ "Image_Tiler",
+ "Image_Untiler",
+ "Int_Divide_Rounded",
+ "SamplerTiledContextAdvanced",
+ "Sampler_Settings",
+ "Smart_Seed",
+ "Triple_Prompt"
+ ],
+ {
+ "title_aux": "ComfyUI GOAT Nodes"
+ }
+ ],
+ "https://github.com/Ada123-a/ComfyUI-Kandinsky": [
+ [
+ "EmptyKandinskyV5_Latent",
+ "KandinskyV5_ImageToVideoLatent",
+ "KandinskyV5_Loader",
+ "KandinskyV5_PruneFrames",
+ "KandinskyV5_QwenLoader",
+ "KandinskyV5_Sampler",
+ "KandinskyV5_TextEncode",
+ "KandinskyV5_VAEDecode",
+ "KandinskyV5_VAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Kandinsky"
+ }
+ ],
+ "https://github.com/AdamShuo/ComfyUI_Switch": [
+ [
+ "SwitchAny"
+ ],
+ {
+ "title_aux": "ComfyUI Switch Any Node"
+ }
+ ],
+ "https://github.com/Aero-Ex/ComfyUI-Vision-LLM-Analyzer": [
+ [
+ "VisionLLMNode"
+ ],
+ {
+ "title_aux": "ComfyUI Vision LLM Analyzer Node"
+ }
+ ],
+ "https://github.com/Aerse/ComfyUI-Seed-Nodes": [
+ [
+ "Seed-Nodes: ImagePixelator",
+ "Seed-Nodes: ImageTo3D",
+ "Seed-Nodes: ImageTransparencyCrop",
+ "Seed-Nodes: LoadImage",
+ "Seed-Nodes: LoadMultipleImages",
+ "Seed-Nodes: QwenVLAPI",
+ "Seed-Nodes: SLICPixelator",
+ "Seed-Nodes: ScreenModeRemoveBlack",
+ "Seed-Nodes: SeedSaveAudio",
+ "Seed-Nodes: SiliconFlowVLAPI"
+ ],
+ {
+ "title_aux": "ComfyUI-Seed-Nodes"
+ }
+ ],
+ "https://github.com/AgencyMind/ComfyUI-GPU-Preprocessor-Wrapper": [
+ [
+ "CannyEdgePreprocessorWrapper",
+ "DWPreprocessorWrapper",
+ "DepthAnythingV2Wrapper",
+ "MidasDepthMapWrapper",
+ "OpenposePreprocessorWrapper"
+ ],
+ {
+ "title_aux": "ComfyUI-GPU-Preprocessor-Wrapper"
+ }
+ ],
+ "https://github.com/AgencyMind/ComfyUI-Satori": [
+ [
+ "TemporalInvestigator",
+ "WhyDidItBreak"
+ ],
+ {
+ "title_aux": "ComfyUI-Satori"
+ }
+ ],
+ "https://github.com/AhBumm/ComfyUI_BillBum_APIset_Nodes": [
+ [
+ "BillBum_Modified_Base64_Url2Img_Node",
+ "BillBum_Modified_Dalle_API_Node",
+ "BillBum_Modified_DropoutToken_Node",
+ "BillBum_Modified_Flux_API_with_imgInput",
+ "BillBum_Modified_GPTImage1_API_Node",
+ "BillBum_Modified_Ideogram_API_Node",
+ "BillBum_Modified_Image_API_Call_Node",
+ "BillBum_Modified_LLM_API_Node",
+ "BillBum_Modified_LLM_ForceStream_Mode",
+ "BillBum_Modified_Recraft_API_Node",
+ "BillBum_Modified_RegText_Node",
+ "BillBum_Modified_SD3_API_Node",
+ "BillBum_Modified_VisionLM_API_Node",
+ "BillBum_Modified_img2b64_url_Node",
+ "BillBum_NonSysPrompt_VLM_API_Node",
+ "Input_Text",
+ "Text_Concat",
+ "billbum_modified_stream_response_llm_api",
+ "doubao_seedance_api_node",
+ "doubao_seedream_api_node",
+ "hyprlab_image_api_node",
+ "load_video_from_url",
+ "load_video_from_url_comfy_core",
+ "reg_tuzi_chat_response",
+ "url2image"
+ ],
+ {
+ "nodename_pattern": "\\(BillBum\\)$",
+ "title_aux": "Customizable API Call Nodes by BillBum"
+ }
+ ],
+ "https://github.com/AhBumm/ComfyUI_UnfakePy_Warpper": [
+ [
+ "ForceDetectPixelateScale",
+ "ImageScaleDownByFactor",
+ "ImageUpscaleByInt",
+ "ImagesToRGB",
+ "NearestImageScaleDown",
+ "PixelUpscale2Target",
+ "RemoveBackgroundPixel",
+ "Unfake_PixelateTools"
+ ],
+ {
+ "title_aux": "ComfyUI_UnfakePy_Warpper"
+ }
+ ],
+ "https://github.com/AiMiDi/ComfyUI-Aimidi-nodes": [
+ [
+ "Add Tag",
+ "Clear Tag",
+ "Load Images Pair Batch",
+ "Merge Tag",
+ "Move Tag To Top",
+ "Reserve Tag",
+ "Save Images Pair"
+ ],
+ {
+ "title_aux": "ComfyUI-Aimidi-nodes"
+ }
+ ],
+ "https://github.com/Aishor/comfyui-meta-sampler-guiado": [
+ [
+ "MetaSamplerGuiado"
+ ],
+ {
+ "title_aux": "Meta-Sampler Guiado (Seed-WAN)"
+ }
+ ],
+ "https://github.com/AkashKarnatak/ComfyUI_faishme": [
+ [
+ "Faishme Debug",
+ "Faishme Gemini",
+ "Faishme Load Image from Glob",
+ "Faishme Mannequin to Model Loader",
+ "Faishme Memory Debug",
+ "Faishme Moondream",
+ "Faishme Repeat BBOX",
+ "Faishme Repeat Image Batch",
+ "Faishme Repeat Latent Batch",
+ "Faishme Repeat Tensor Batch",
+ "Faishme Save Image",
+ "Faishme Split",
+ "Faishme Stack Images",
+ "Faishme Stack Latents",
+ "Faishme Unstack Images",
+ "Faishme Unstack Latents",
+ "Load Fashion Model"
+ ],
+ {
+ "title_aux": "ComfyUI_faishme"
+ }
+ ],
+ "https://github.com/Akkisdiary/ComfyUI-AnyLLM": [
+ [
+ "AnyLLMVisionChat",
+ "GetEnvVar",
+ "GoogleGemini"
+ ],
+ {
+ "title_aux": "ComfyUI-AnyLLM"
+ }
+ ],
+ "https://github.com/Aksaz/comfyui-seamless-clone": [
+ [
+ "Seamless Clone"
+ ],
+ {
+ "title_aux": "seamless-clone-comfyui"
+ }
+ ],
+ "https://github.com/AlcAI-AnimeHaven/AlcAI-nodes": [
+ [
+ "RandomResSDXL"
+ ],
+ {
+ "title_aux": "AlcAI Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/Alectriciti/comfyui-adaptiveprompts": [
+ [
+ "NormalizeLoraTags",
+ "PromptAliasSwap",
+ "PromptCleanup",
+ "PromptContextMerge",
+ "PromptGenerator",
+ "PromptGeneratorAdvanced",
+ "PromptMixer",
+ "PromptRepack",
+ "PromptReplace",
+ "PromptSequencer",
+ "PromptShuffle",
+ "PromptShuffleAdvanced",
+ "PromptSplitter",
+ "RandomFloats",
+ "RandomIntegers",
+ "SaveImageAndText",
+ "ScaledSeedGenerator",
+ "StringAppend3",
+ "StringAppend8",
+ "StringSplit",
+ "TagCounter",
+ "WeightLifter"
+ ],
+ {
+ "title_aux": "comfyui-adaptiveprompts"
+ }
+ ],
+ "https://github.com/AlexXia007/AIYang_TripleAPI": [
+ [
+ "NanoBananaGenerate",
+ "TripleAPIGenerate"
+ ],
+ {
+ "title_aux": "AIYang_TripleAPI"
+ }
+ ],
+ "https://github.com/Alexankharin/camera-comfyUI": [
+ [
+ "CameraInterpolationNode",
+ "CameraMotionNode",
+ "CameraTrajectoryNode",
+ "CombineDepthsNode",
+ "DepthEstimatorNode",
+ "DepthFramesToVideo",
+ "DepthRenormalizer",
+ "DepthToImageNode",
+ "DepthToPointCloud",
+ "FisheyeDepthEstimator",
+ "LoadPointCloud",
+ "LoadTrajectory",
+ "OutpaintAnyProjection",
+ "PointCloudCleaner",
+ "PointCloudUnion",
+ "PointcloudTrajectoryEnricher",
+ "ProjectAndClean",
+ "ProjectPointCloud",
+ "ReprojectDepth",
+ "ReprojectImage",
+ "SavePointCloud",
+ "SaveTrajectory",
+ "TransformPointCloud",
+ "TransformToMatrix",
+ "TransformToMatrixManual",
+ "VideoCameraMotionSequence",
+ "VideoMetricDepthEstimate",
+ "ZDepthToRayDepthNode"
+ ],
+ {
+ "title_aux": "camera-comfyUI"
+ }
+ ],
+ "https://github.com/Aljnk/ComfyUI-JNK-Tiny-Nodes": [
+ [
+ "Add Layer Overlay JNK",
+ "AddLayerOverlay_JNK",
+ "AlphaImageNode_JNK",
+ "Ask Google Gemini JNK",
+ "AskGoogleGemini_JNK",
+ "Bridge All JNK",
+ "BridgeAll_JNK",
+ "Create Folder JNK",
+ "Create RGBA Image JNK",
+ "CreateFolder_JNK",
+ "Get All Alpha Layers JNK",
+ "Get Gemini Keys JNK",
+ "Get Gemini Models JNK",
+ "Get Models JNK",
+ "Get One Alpha Layer JNK",
+ "Get Substring JNK",
+ "Get Text From List by Index JNK",
+ "Get Timestamp JNK",
+ "GetAllAlphaLayers_JNK",
+ "GetAlphaLayers_JNK",
+ "GetGeminiKeys_JNK",
+ "GetGeminiModels_JNK",
+ "GetModels_JNK",
+ "GetSubstring_JNK",
+ "GetTextFromList_JNK",
+ "GetTimestamp_JNK",
+ "Image Filter Loader JNK",
+ "ImageFilterLoader_JNK",
+ "Join Strings JNK",
+ "JoinStrings_JNK",
+ "Load Checkpoint Model with Name JNK",
+ "Load Image if Exist JNK",
+ "Load LoRA with Name JNK",
+ "Load UNet Model with Name JNK",
+ "LoadImageWithCheck_JNK",
+ "LoadLoRAName_JNK",
+ "LoadModelName_Chpt_JNK",
+ "LoadModelName_Diff_JNK",
+ "LoadModelName_Unet_JNK",
+ "Model2Key_JNK",
+ "Prepare Image for AI JNK",
+ "PrepareImageForAI_JNK",
+ "Queue Stop JNK",
+ "QueueStop_JNK",
+ "Save Frame JNK",
+ "Save Static Image JNK",
+ "Save Video Images JNK",
+ "SaveFrame_JNK",
+ "SaveStaticImage_JNK",
+ "SaveVideoImages_JNK",
+ "Split String JNK",
+ "SplitString_JNK",
+ "Stroke RGBA Image JNK",
+ "StrokeImage_JNK",
+ "Switch Index JNK",
+ "Switch Integer JNK",
+ "SwitchIdx_JNK",
+ "SwitchInt_JNK",
+ "Text Saver JNK",
+ "Text to Key JNK",
+ "Text to MD5 JNK",
+ "Text2MD5_JNK",
+ "TextSaver_JNK",
+ "ToonOut Remove BG JNK",
+ "ToonOutRemoveBG_JNK",
+ "Topaz Photo Upscaler (Autopilot) JNK",
+ "TopazPhotoAI_JNK"
+ ],
+ {
+ "title_aux": "ComfyUI-JNK-Tiny-Nodes"
+ }
+ ],
+ "https://github.com/Aloukik21/ComfyUI-NovaNoiser": [
+ [
+ "CameraOptionsNode",
+ "NSOptionsNode",
+ "NovaNodes"
+ ],
+ {
+ "title_aux": "ComfyUI-NovaNoiser"
+ }
+ ],
+ "https://github.com/Altair200333/ComfyUI_Flux_1.1_PRO": [
+ [
+ "FluxGenerate",
+ "FluxProInpaint",
+ "FluxProOutpaint"
+ ],
+ {
+ "title_aux": "Flux Pro Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/Alvaroeai/ComfyUI-Text2Json": [
+ [
+ "TextToJson"
+ ],
+ {
+ "title_aux": "ComfyUI-Text2Json"
+ }
+ ],
+ "https://github.com/Amorano/Jovi_Capture": [
+ [
+ "CAMERA (JOV_CAPTURE)",
+ "MONITOR (JOV_CAPTURE)",
+ "REMOTE (JOV_CAPTURE)",
+ "WINDOW (JOV_CAPTURE)"
+ ],
+ {
+ "title_aux": "Jovi_Capture"
+ }
+ ],
+ "https://github.com/Amorano/Jovi_GLSL": [
+ [
+ "BLEND LINEAR (JOV_GL)",
+ "BLOOM (JOV_GL)",
+ "CIRCULAR GRADIENT (JOV_GL)",
+ "COLOR CONVERSION (JOV_GL)",
+ "COLOR PALETTE (JOV_GL)",
+ "CONICAL GRADIENT (JOV_GL)",
+ "DIRECTIONAL WARP (JOV_GL)",
+ "FILTER RANGE (JOV_GL)",
+ "GRAYSCALE (JOV_GL)",
+ "HSV ADJUST (JOV_GL)",
+ "INVERT (JOV_GL)",
+ "LINEAR GRADIENT (JOV_GL)",
+ "MIN MAX (JOV_GL)",
+ "NOISE PERLIN (JOV_GL)",
+ "NOISE SIMPLEX (JOV_GL)",
+ "NOISE WORLEY (JOV_GL)",
+ "NORMAL (JOV_GL)",
+ "NORMAL BLEND (JOV_GL)",
+ "PIXELATE (JOV_GL)",
+ "POSTERIZE (JOV_GL)",
+ "SHAPE: CAPSULE (JOV_GL)",
+ "SHAPE: ELLIPSE (JOV_GL)",
+ "SHAPE: POLYGON (JOV_GL)",
+ "SOBEL (JOV_GL)",
+ "TRANSFORM (JOV_GL)"
+ ],
+ {
+ "title_aux": "Jovi_GLSL"
+ }
+ ],
+ "https://github.com/Amorano/Jovi_MIDI": [
+ [
+ "MIDI FILTER (JOV_MIDI)",
+ "MIDI FILTER EZ (JOV_MIDI)",
+ "MIDI LOADER (JOV_MIDI)",
+ "MIDI MESSAGE (JOV_MIDI)",
+ "MIDI READER (JOV_MIDI)"
+ ],
+ {
+ "title_aux": "Jovi_MIDI"
+ }
+ ],
+ "https://github.com/Amorano/Jovi_Measure": [
+ [
+ "BLUR EFFECT (JOV_MEASURE)",
+ "SHANNON ENTROPY (JOV_MEASURE)"
+ ],
+ {
+ "title_aux": "Jovi_Measure"
+ }
+ ],
+ "https://github.com/Amorano/Jovi_Spout": [
+ [
+ "SPOUT READER (JOV_SPOUT)",
+ "SPOUT WRITER (JOV_SPOUT)"
+ ],
+ {
+ "title_aux": "Jovi_Spout"
+ }
+ ],
+ "https://github.com/Amorano/Jovimetrix": [
+ [
+ "ADJUST: BLUR (JOV)",
+ "ADJUST: COLOR (JOV)",
+ "ADJUST: EDGE (JOV)",
+ "ADJUST: EMBOSS (JOV)",
+ "ADJUST: LEVELS (JOV)",
+ "ADJUST: LIGHT (JOV)",
+ "ADJUST: MORPHOLOGY (JOV)",
+ "ADJUST: PIXEL (JOV)",
+ "ADJUST: SHARPEN (JOV)",
+ "AKASHIC (JOV) \ud83d\udcd3",
+ "ARRAY (JOV) \ud83d\udcda",
+ "BATCH TO LIST (JOV)",
+ "BIT SPLIT (JOV) \u2b44",
+ "BLEND (JOV) \u2697\ufe0f",
+ "COLOR BLIND (JOV) \ud83d\udc41\u200d\ud83d\udde8",
+ "COLOR MATCH (JOV) \ud83d\udc9e",
+ "COLOR MEANS (JOV) \u3030\ufe0f",
+ "COLOR THEORY (JOV) \ud83d\udede",
+ "COMPARISON (JOV) \ud83d\udd75\ud83c\udffd",
+ "CONSTANT (JOV) \ud83d\udfea",
+ "CROP (JOV) \u2702\ufe0f",
+ "DELAY (JOV) \u270b\ud83c\udffd",
+ "EXPORT (JOV) \ud83d\udcfd",
+ "FILTER MASK (JOV) \ud83e\udd3f",
+ "FLATTEN (JOV) \u2b07\ufe0f",
+ "GRADIENT MAP (JOV) \ud83c\uddf2\ud83c\uddfa",
+ "GRAPH (JOV) \ud83d\udcc8",
+ "HISTOGRAM (JOV)",
+ "IMAGE INFO (JOV) \ud83d\udcda",
+ "LERP (JOV) \ud83d\udd30",
+ "OP BINARY (JOV) \ud83c\udf1f",
+ "OP UNARY (JOV) \ud83c\udfb2",
+ "PIXEL MERGE (JOV) \ud83e\udec2",
+ "PIXEL SPLIT (JOV) \ud83d\udc94",
+ "PIXEL SWAP (JOV) \ud83d\udd03",
+ "QUEUE (JOV) \ud83d\uddc3",
+ "QUEUE TOO (JOV) \ud83d\uddc3",
+ "ROUTE (JOV) \ud83d\ude8c",
+ "SAVE OUTPUT (JOV) \ud83d\udcbe",
+ "SHAPE GEN (JOV) \u2728",
+ "SPLIT (JOV) \ud83c\udfad",
+ "STACK (JOV) \u2795",
+ "STRINGER (JOV) \ud83e\ude80",
+ "SWIZZLE (JOV) \ud83d\ude35",
+ "TEXT GEN (JOV) \ud83d\udcdd",
+ "THRESHOLD (JOV) \ud83d\udcc9",
+ "TICK (JOV) \u23f1",
+ "TRANSFORM (JOV) \ud83c\udfdd\ufe0f",
+ "VALUE (JOV) \ud83e\uddec",
+ "VECTOR2 (JOV)",
+ "VECTOR3 (JOV)",
+ "VECTOR4 (JOV)",
+ "WAVE GEN (JOV) \ud83c\udf0a"
+ ],
+ {
+ "title_aux": "Jovimetrix"
+ }
+ ],
+ "https://github.com/Analaser/ComfyUI-RandomTagWeights": [
+ [
+ "RandomTagWeights"
+ ],
+ {
+ "title_aux": "ComfyUI-RandomTagWeights"
+ }
+ ],
+ "https://github.com/AnastasiyaW/ComfyUI-SmartScreenshotCleaner": [
+ [
+ "HappyIn_AutoBorderCrop",
+ "HappyIn_ImageSwitch",
+ "HappyIn_ScreenshotCleaner"
+ ],
+ {
+ "title_aux": "ComfyUI-SmartScreenshotCleaner"
+ }
+ ],
+ "https://github.com/Andro-Meta/ComfyUI-Ovis2": [
+ [
+ "Ovis2ImageCaption",
+ "Ovis2ModelLoader",
+ "Ovis2MultiImageInput",
+ "Ovis2VideoFramesDescription"
+ ],
+ {
+ "title_aux": "ComfyUI-Ovis2"
+ }
+ ],
+ "https://github.com/Anibaaal/ComfyUI-UX-Nodes": [
+ [
+ "AdvancedCompositeImageMasked",
+ "BlockLayerStringGenerator",
+ "BlurNode",
+ "ColorGeneratorNode",
+ "DropShadowNode",
+ "EasyResolutionPicker",
+ "LerpNode",
+ "RemoveJSONMarkdownFormatting"
+ ],
+ {
+ "title_aux": "ComfyUI UX Nodes"
+ }
+ ],
+ "https://github.com/Anzhc/SDXL-Flux2VAE-ComfyUI-Node": [
+ [
+ "EmptySDXLFlux2LatentImage"
+ ],
+ {
+ "title_aux": "SDXL-Flux2VAE-ComfyUI-Node"
+ }
+ ],
+ "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner": [
+ [
+ "LoraTuner"
+ ],
+ {
+ "title_aux": "ComfyUI-LoRA-Tuner"
+ }
+ ],
+ "https://github.com/AonekoSS/ComfyUI-SimpleCounter": [
+ [
+ "Simple Counter"
+ ],
+ {
+ "title_aux": "ComfyUI-SimpleCounter"
+ }
+ ],
+ "https://github.com/Apache0ne/ComfyUI_efficient_sam_node": [
+ [
+ "EfficientViTSAMAutoMaskGeneratorNode",
+ "EfficientViTSAMLoader",
+ "EfficientViTSAMPointPredictorNode",
+ "EfficientViTSAMPredictorNode",
+ "EfficientViTSAMVideoAutoMaskGeneratorNode",
+ "EfficientViTSAMVideoPointPredictorNode",
+ "EfficientViTSAMVideoPredictorNode"
+ ],
+ {
+ "title_aux": "ComfyUI_efficient_sam_node"
+ }
+ ],
+ "https://github.com/ApexArtist/comfyui-apex-artist": [
+ [
+ "ApexBatchInfo",
+ "ApexBlur",
+ "ApexDepthToNormal",
+ "ApexGetFrame",
+ "ApexLastFrame",
+ "ApexLatentNoise",
+ "ApexLayerBlend",
+ "ApexLoadImage",
+ "ApexPromptPreset",
+ "ApexRGBCurve",
+ "ApexSharpen",
+ "ApexSmartResize",
+ "ApexUpscaleBy"
+ ],
+ {
+ "title_aux": "Apex Artist - Image Resize"
+ }
+ ],
+ "https://github.com/ArcherFMY/Diffusion360_ComfyUI": [
+ [
+ "Diffusion360LoaderImage2Pano",
+ "Diffusion360LoaderText2Pano",
+ "Diffusion360Sampler",
+ "Diffusion360SamplerImage2Pano",
+ "Diffusion360SamplerText2Pano",
+ "InputImage",
+ "InputText",
+ "VAEDecodeTiledBlended"
+ ],
+ {
+ "title_aux": "Diffusion360_ComfyUI"
+ }
+ ],
+ "https://github.com/Arctenox/Arctenoxs-Essentials_ComfyUI": [
+ [
+ "ArctenoxBox",
+ "ArctenoxCheckpointPassthrough",
+ "ArctenoxLoadCheckpoint",
+ "ArtifactRiskPredictor",
+ "CLIPTextEncodeWithString",
+ "EfficientLatentImage",
+ "ExecutionCostEstimator",
+ "KSamplerWithLatent",
+ "LoadLoRAWithString",
+ "PromptPhaseSplitter",
+ "PromptStyler",
+ "PromptStylerAdvanced",
+ "SaveImageWithMetadata",
+ "SeedTopologyMapper"
+ ],
+ {
+ "title_aux": "Arctenoxs-Essentials_ComfyUI"
+ }
+ ],
+ "https://github.com/ArdeniusAI/ComfyUI-Ardenius": [
+ [
+ "ARD 4crop Latent",
+ "ARD 4img Combine",
+ "ARD 4latent Upscale",
+ "ARD 4vae Decode",
+ "ARD Basic Load Image",
+ "ARD Control Box",
+ "ARD Counter",
+ "ARD Dual Prompt",
+ "ARD Empty Latent Image",
+ "ARD Float",
+ "ARD Float To Integer",
+ "ARD Integer",
+ "ARD Integer To Float",
+ "ARD Load Image",
+ "ARD Math",
+ "ARD Position",
+ "ARD Prompt Travel",
+ "ARD Remainder",
+ "ARD Resize",
+ "ARD Save Image",
+ "ARD Seed",
+ "ARD Text Box",
+ "ARD Text Box Counter",
+ "ARD XY Scripts"
+ ],
+ {
+ "title_aux": "ComfyUI-Ardenius"
+ }
+ ],
+ "https://github.com/Arkanun/ReadCSV_ComfyUI": [
+ [
+ "ReadCSVRowNode"
+ ],
+ {
+ "title_aux": "ReadCSV_ComfyUI"
+ }
+ ],
+ "https://github.com/Art-xmaster/comfyui-AGSoft": [
+ [
+ "AGSoft Loop Lora Strengths",
+ "AGSoft Show Text",
+ "AGSoft Text Input Switch X2",
+ "AGSoft Text Input Switch X4",
+ "AGSoft Text Input Switch X8",
+ "AGSoft Text Multiline",
+ "AGSoft Text Operation",
+ "AGSoft Text Overlay",
+ "AGSoft Text Replace",
+ "AGSoftLoadVideo",
+ "AGSoftSaveImage",
+ "AGSoftTextConcatenateX2",
+ "AGSoftTextConcatenateX4",
+ "AGSoftTextConcatenateX8",
+ "AGSoftTextSplit",
+ "AGSoftVideoFrameExtractor",
+ "AGSoft_Draw_Mask_On_Image",
+ "AGSoft_Empty_Latent",
+ "AGSoft_Empty_Latent_Flux2",
+ "AGSoft_Empty_Latent_QwenImage",
+ "AGSoft_Image_Concatenate",
+ "AGSoft_Image_Concatenate_From_Batch",
+ "AGSoft_Image_Crop",
+ "AGSoft_Image_Mask_Resize",
+ "AGSoft_Image_Mask_Resize_Adv",
+ "AGSoft_Image_Resize_Base",
+ "AGSoft_Image_Resize_Plus",
+ "AGSoft_Image_Rotate",
+ "AGSoft_Image_Stitch",
+ "AGSoft_Img_Pad",
+ "AGSoft_Img_Pad_Adv",
+ "AGSoft_Img_Res",
+ "AGSoft_Img_Res_MP",
+ "AGSoft_Inpaint_Crop",
+ "AGSoft_Inpaint_Stitch",
+ "AGSoft_KSampler",
+ "AGSoft_Loop_Float",
+ "AGSoft_Loop_Images",
+ "AGSoft_Loop_Integer",
+ "AGSoft_Loop_Random_Seed",
+ "AGSoft_Loop_Samplers",
+ "AGSoft_Loop_Texts",
+ "AGSoft_Mask_Blur",
+ "AGSoft_Mask_Composite",
+ "AGSoft_Mask_Fix",
+ "AGSoft_Mask_From_Color",
+ "AGSoft_Styles_CSV_Loader",
+ "AgsoftTranslate"
+ ],
+ {
+ "title_aux": "comfyui-AGSoft"
+ }
+ ],
+ "https://github.com/ArtBot2023/CharacterFaceSwap": [
+ [
+ "Color Blend",
+ "Crop Face",
+ "Exclude Facial Feature",
+ "Generation Parameter Input",
+ "Generation Parameter Output",
+ "Image Full BBox",
+ "Load BiseNet",
+ "Load RetinaFace",
+ "Mask Contour",
+ "Segment Face",
+ "Uncrop Face"
+ ],
+ {
+ "title_aux": "Character Face Swap"
+ }
+ ],
+ "https://github.com/ArtHommage/HommageTools": [
+ [
+ "HTBaseShiftNode",
+ "HTConsoleLoggerNode",
+ "HTConversionNode",
+ "HTDWPoseConstraintNode",
+ "HTDetectionBatchProcessor",
+ "HTDiffusionLoaderMulti",
+ "HTDimensionAnalyzerNode",
+ "HTDimensionFormatterNode",
+ "HTDownsampleNode",
+ "HTDynamicPromptNode",
+ "HTDynamicSwitchNode",
+ "HTFlexibleNode",
+ "HTGeminiImageNode",
+ "HTGeminiNode",
+ "HTImageAdjusterNode",
+ "HTInspectorNode",
+ "HTLayerCollectorNode",
+ "HTLayerExportNode",
+ "HTLevelsNode",
+ "HTMaskDilationNode",
+ "HTMaskValidatorNode",
+ "HTMoireRemovalNode",
+ "HTMultiMaskDilationNode",
+ "HTNodeStateController",
+ "HTNodeUnmuteAll",
+ "HTNullNode",
+ "HTOIDNNode",
+ "HTParameterExtractorNode",
+ "HTPhotoshopBlurNode",
+ "HTRegexNode",
+ "HTResizeNode",
+ "HTResolutionDownsampleNode",
+ "HTResolutionNode",
+ "HTSamplerBridgeNode",
+ "HTSaveImagePlus",
+ "HTScaleByNode",
+ "HTSchedulerBridgeNode",
+ "HTSeedAdvancedNode",
+ "HTSeedNode",
+ "HTSplitterNode",
+ "HTStatusIndicatorNode",
+ "HTSurfaceBlurNode",
+ "HTSwitchNode",
+ "HTTensorInfoNode",
+ "HTTextCleanupNode",
+ "HTTrainingSizeNode",
+ "HTValueMapperNode",
+ "HTWidgetControlNode"
+ ],
+ {
+ "title_aux": "HommageTools for ComfyUI"
+ }
+ ],
+ "https://github.com/Artificial-Sweetener/comfyui-WhiteRabbit": [
+ [
+ "AssembleLoopFrames",
+ "AutocropToLoop",
+ "BatchResizeWithLanczos",
+ "BatchWatermarkSingle",
+ "PixelHold",
+ "PrepareLoopFrames",
+ "RIFE_FPS_Resample",
+ "RIFE_SeamTimingAnalyzer",
+ "RIFE_VFI_Advanced",
+ "RIFE_VFI_Opt",
+ "RollFrames",
+ "TrimBatchEnds",
+ "UnrollFrames",
+ "UpscaleWithModelAdvanced"
+ ],
+ {
+ "title_aux": "WhiteRabbit"
+ }
+ ],
+ "https://github.com/Aryan185/ComfyUI-ExternalAPI-Helpers": [
+ [
+ "ClearDirectoryNode",
+ "ElevenLabsTTSNode",
+ "Flux2Replicate",
+ "FluxKontextReplicate",
+ "GPTImageEditNode",
+ "GeminiChatNode",
+ "GeminiDiarisationAPI",
+ "GeminiSegmentationNode",
+ "GeminiTTSNode",
+ "GoogleImagenEditNode",
+ "GoogleImagenNode",
+ "NanoBananaNode",
+ "OpenAILLMNode",
+ "OpenAITTSNode",
+ "SoraGen",
+ "TripoITM",
+ "TripoTTM",
+ "VeoGeminiVideoGenerator",
+ "VeoVertexVideoGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-ExternalAPI-Helpers"
+ }
+ ],
+ "https://github.com/Aryan185/ComfyUI-VertexAPI": [
+ [
+ "GeminiChatVertexNode",
+ "GeminiDiarisationNode",
+ "GeminiSegmentationVertexNode",
+ "GeminiTTSVertexNode",
+ "GoogleImagenEditVertex",
+ "GoogleImagenGenerateVertex",
+ "GoogleVeoVertexVideoGenerator",
+ "NanoBananaVertexNode"
+ ],
+ {
+ "title_aux": "ComfyUI-VertexAPI"
+ }
+ ],
+ "https://github.com/AshMartian/ComfyUI-DirGir": [
+ [
+ "Dir_Gir_Looper",
+ "Dir_Gir_Picker",
+ "Gir_Image_Nabber"
+ ],
+ {
+ "title_aux": "Dir Gir"
+ }
+ ],
+ "https://github.com/Asidert/ComfyUI_Base64Images": [
+ [
+ "ConvertImageToBase64",
+ "LoadImageFromBase64"
+ ],
+ {
+ "title_aux": "Base64 Images input and output nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/AstrionX/ComfyUI-Tensor-Prism-Node-Pack": [
+ [
+ "AdvancedCLIPMerge",
+ "ModelEnhancerTensorPrism",
+ "SDXL Block Merge (Tensor Prism)",
+ "SDXLAdvancedBlockMergeTensorPrism",
+ "TensorPrismVAEMerge",
+ "TensorPrism_AdvancedFineTuner",
+ "TensorPrism_AnalyzeModelWeights",
+ "TensorPrism_ApplyMergeRecipe",
+ "TensorPrism_CompetitiveModelSelector",
+ "TensorPrism_DatasetPath",
+ "TensorPrism_EpsilonVPredConverter",
+ "TensorPrism_IntelligentTensorSelector",
+ "TensorPrism_LayeredBlend",
+ "TensorPrism_MainMerge",
+ "TensorPrism_ModelAnalyzer",
+ "TensorPrism_ModelComparator",
+ "TensorPrism_ModelKeyFilter",
+ "TensorPrism_ModelMaskBlender",
+ "TensorPrism_ModelMaskGenerator",
+ "TensorPrism_ModelWeightModifier",
+ "TensorPrism_Prism",
+ "TensorPrism_SimplifiedFineTuner",
+ "TensorPrism_WeightedMaskMerge",
+ "TensorPrism_WeightedTensorMerge"
+ ],
+ {
+ "title_aux": "ComfyUI-Tensor-Prism-Node-Pack"
+ }
+ ],
+ "https://github.com/AstroCorp/ComfyUI-AstroCorp-Nodes": [
+ [
+ "InstructNode",
+ "MergeTextsNode",
+ "TextareaNode"
+ ],
+ {
+ "title_aux": "ComfyUI AstroCorp Nodes"
+ }
+ ],
+ "https://github.com/Atsushi888/easy_prompt_selector_for_comfyui": [
+ [
+ "EasyHairPromptSelector"
+ ],
+ {
+ "title_aux": "easy_prompt_selector_for_comfyui"
+ }
+ ],
+ "https://github.com/AugustusLXIII/ComfyUI_CustomResolution_I2V": [
+ [
+ "CustomResolutionI2V"
+ ],
+ {
+ "title_aux": "Custom Resolution I2V"
+ }
+ ],
+ "https://github.com/AuroBit/ComfyUI-AnimateAnyone-reproduction": [
+ [
+ "AnimateAnyone"
+ ],
+ {
+ "title_aux": "ComfyUI-AnimateAnyone-reproduction"
+ }
+ ],
+ "https://github.com/AuroBit/ComfyUI-OOTDiffusion": [
+ [
+ "LoadOOTDPipeline",
+ "LoadOOTDPipelineHub",
+ "OOTDGenerate"
+ ],
+ {
+ "title_aux": "ComfyUI OOTDiffusion"
+ }
+ ],
+ "https://github.com/Austat/ComfyUI-DownsampleFPS": [
+ [
+ "DownsampleFPSNode"
+ ],
+ {
+ "title_aux": "ComfyUI-DownsampleFPS"
+ }
+ ],
+ "https://github.com/Austat/ComfyUI-RemacriScale": [
+ [
+ "RemacriOnnxUpscaleNode"
+ ],
+ {
+ "title_aux": "ComfyUI-RemacriScale"
+ }
+ ],
+ "https://github.com/AustinMroz/ComfyUI-DynamicOversampling": [
+ [
+ "DynamicSampler",
+ "MeasuredSampler",
+ "ResolveMaskPromise"
+ ],
+ {
+ "title_aux": "DynamicOversampling"
+ }
+ ],
+ "https://github.com/AustinMroz/ComfyUI-SpliceTools": [
+ [
+ "LogSigmas",
+ "RerangeSigmas",
+ "SpliceDenoised",
+ "SpliceLatents",
+ "TemporalSplice"
+ ],
+ {
+ "title_aux": "SpliceTools"
+ }
+ ],
+ "https://github.com/Auttasak-L/ComfyUI-ImageCropper": [
+ [
+ "ImageCropper"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageCropper"
+ }
+ ],
+ "https://github.com/AzelusLightvale/ComfyUI-ARG-Toolkit": [
+ [
+ "ADFGVX",
+ "ADFGX",
+ "AESAuthenticated",
+ "AESAuthenticatedKeygen",
+ "AESKeyWrap",
+ "AESKeyWrapWithPadding",
+ "Affine",
+ "Argon2id_Derive",
+ "Argon2id_Verify",
+ "Atbash",
+ "Autokey",
+ "BLAKE2",
+ "Base642String",
+ "Bazeries",
+ "Beaufort",
+ "Bifid",
+ "Binary2String",
+ "BitwiseAND",
+ "BitwiseLS",
+ "BitwiseNOT",
+ "BitwiseOR",
+ "BitwiseRS",
+ "BitwiseXOR",
+ "BooleanOutputter",
+ "Caesar",
+ "CaesarProg",
+ "CaesarProgressive",
+ "ChaCha20Poly1305",
+ "ChaCha20Poly1305Keygen",
+ "Chaocipher",
+ "ColTrans",
+ "ConcatKDFHMAC_Derive",
+ "ConcatKDFHMAC_Verify",
+ "ConcatKDFHash_Derive",
+ "ConcatKDFHash_Verify",
+ "ConstantTimeCompare",
+ "EdDSAPrivateKeyFormat",
+ "EdDSAPublicKeyFormat",
+ "EdDSASignature",
+ "EdDSAVerify",
+ "FernetKeygenSimple",
+ "FernetSimple",
+ "Foursquare",
+ "Gronsfeld",
+ "HKDFExpand_Derive",
+ "HKDFExpand_Verify",
+ "HKDF_Derive",
+ "HKDF_Verify",
+ "Hex2String",
+ "IMWatermarkDecode",
+ "IMWatermarkEncode",
+ "KBKDF_Derive",
+ "KBKDF_Verify",
+ "Keyword",
+ "MD5",
+ "MorseCode",
+ "MyszkowskiTransposition",
+ "Nihilist",
+ "PBKDF2HMAC_Derive",
+ "PBKDF2HMAC_Verify",
+ "Padding",
+ "Playfair",
+ "Polybius",
+ "Porta",
+ "Rot13",
+ "Rot18",
+ "Rot47",
+ "Rot5",
+ "SHA1",
+ "SHA2",
+ "SHA3",
+ "SHAKE",
+ "SM3",
+ "Scrypt_Derive",
+ "Scrypt_Verify",
+ "Scytale",
+ "SimpleSubstitution",
+ "SteganoAnalysis",
+ "SteganoLSBDecode",
+ "SteganoLSBEncode",
+ "String2Base64",
+ "String2Binary",
+ "String2Hex",
+ "StringLooper",
+ "SymmetricEncryptDecrypt",
+ "SystemRandom",
+ "ThreeSquare",
+ "Trifid",
+ "TwoSquare",
+ "Vic",
+ "Vigenere",
+ "X963KDF_Derive",
+ "X963KDF_Verify",
+ "XExchange",
+ "XPrivateKeyFormat",
+ "XPublicKeyFormat",
+ "Zigzag"
+ ],
+ {
+ "title_aux": "ComfyUI ARG Toolkit"
+ }
+ ],
+ "https://github.com/Azornes/Comfyui-LayerForge": [
+ [
+ "LayerForgeNode"
+ ],
+ {
+ "title_aux": "Comfyui-LayerForge"
+ }
+ ],
+ "https://github.com/Azornes/Comfyui-Resolution-Master": [
+ [
+ "ResolutionMaster"
+ ],
+ {
+ "title_aux": "Comfyui-Resolution-Master"
+ }
+ ],
+ "https://github.com/BAIKEMARK/ComfyUI-Civitai-Recipe": [
+ [
+ "CivitaiModelAnalyzerCKPT",
+ "CivitaiModelAnalyzerLORA",
+ "CivitaiParameterUnpacker",
+ "CivitaiRecipeGallery",
+ "LoraTriggerWords",
+ "MarkdownPresenter",
+ "RecipeParamsParser"
+ ],
+ {
+ "title_aux": "Civitai Recipe Finder"
+ }
+ ],
+ "https://github.com/BAIKEMARK/ComfyUI-Civitai-Toolkit": [
+ [
+ "CivitaiModelAnalyzerCKPT",
+ "CivitaiModelAnalyzerLORA",
+ "CivitaiParameterUnpacker",
+ "CivitaiRecipeGallery",
+ "LoraTriggerWords",
+ "MarkdownPresenter",
+ "RecipeParamsParser"
+ ],
+ {
+ "title_aux": "Civitai Toolkit"
+ }
+ ],
+ "https://github.com/BAIKEMARK/ComfyUI_Civitai_Prompt_Stats": [
+ [
+ "CivitaiPromptStatsCKPT",
+ "CivitaiPromptStatsLORA"
+ ],
+ {
+ "title_aux": "Civitai Prompt Stats Node"
+ }
+ ],
+ "https://github.com/BAIS1C/ComfyUI_RSS_Feed_Reader": [
+ [
+ "RSSFeedNode"
+ ],
+ {
+ "title_aux": "ComfyUI_RSS_Feed_Reader"
+ }
+ ],
+ "https://github.com/BEIBEI-star661/SJ_sweepEffect_Comfyui": [
+ [
+ "SJ_sweepEffect"
+ ],
+ {
+ "title_aux": "SJ_sweepEffect_Comfyui"
+ }
+ ],
+ "https://github.com/BIMer-99/ComfyUI_FishSpeech_EX": [
+ [
+ "AudioToPrompt",
+ "LoadVQGAN",
+ "Prompt2Semantic",
+ "SaveAudioToMp3",
+ "Semantic2Audio"
+ ],
+ {
+ "title_aux": "ComfyUI_FishSpeech_EX"
+ }
+ ],
+ "https://github.com/BIMer-99/Comfyui_Hunyuan3D_EX": [
+ [
+ "GenerateSixViews",
+ "Hunyuan3DNode",
+ "RemoveBackground",
+ "SquareImage",
+ "TriMeshViewer"
+ ],
+ {
+ "title_aux": "Comfyui_Hunyuan3D_EX"
+ }
+ ],
+ "https://github.com/BNP1111/comfyui_flux_corrector": [
+ [
+ "FLUXCorrector"
+ ],
+ {
+ "title_aux": "comfyui_flux_corrector"
+ }
+ ],
+ "https://github.com/BWDrum/ComfyUI-RandomWildcardLoader": [
+ [
+ "RandomWildcardLoader",
+ "RandomWildcardLoaderAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI Random Wildcard Loader"
+ }
+ ],
+ "https://github.com/BXYMartin/ComfyUI-InstantIDUtils": [
+ [
+ "ListOfImages",
+ "MultiControlNetConverter",
+ "NHWC2NCHWTensor",
+ "NHWCTensor2PIL",
+ "PIL2NHWCTensor"
+ ],
+ {
+ "title_aux": "ComfyUI-InstantIDUtils"
+ }
+ ],
+ "https://github.com/BZcreativ/ComfyUI-FLUX-TOGETHER-API": [
+ [
+ "FluxDev_TOGETHER",
+ "FluxPro11_TOGETHER",
+ "FluxPro_TOGETHER"
+ ],
+ {
+ "title_aux": "ComfyUI-FLUX-TOGETHER-API"
+ }
+ ],
+ "https://github.com/BadCafeCode/masquerade-nodes-comfyui": [
+ [
+ "Blur",
+ "Change Channel Count",
+ "Combine Masks",
+ "Constant Mask",
+ "Convert Color Space",
+ "Create QR Code",
+ "Create Rect Mask",
+ "Cut By Mask",
+ "Get Image Size",
+ "Image To Mask",
+ "Make Image Batch",
+ "Mask By Text",
+ "Mask Morphology",
+ "Mask To Region",
+ "MasqueradeIncrementer",
+ "Mix Color By Mask",
+ "Mix Images By Mask",
+ "Paste By Mask",
+ "Prune By Mask",
+ "Separate Mask Components",
+ "Unary Image Op",
+ "Unary Mask Op"
+ ],
+ {
+ "title_aux": "Masquerade Nodes"
+ }
+ ],
+ "https://github.com/BahaC/ComfyUI-ZonosTTS": [
+ [
+ "ZonosTextToSpeech"
+ ],
+ {
+ "title_aux": "ComfyUI Zonos TTS Node"
+ }
+ ],
+ "https://github.com/Baldwinzc/ComfyUI-ProductPromptGenerator": [
+ [
+ "ProductPromptGeneratorSimple"
+ ],
+ {
+ "title_aux": "ComfyUI-ProductPromptGenerator"
+ }
+ ],
+ "https://github.com/Baverne/comfyUI-TiledWan": [
+ [
+ "TiledWanImageStatistics",
+ "TiledWanImageToMask",
+ "TiledWanInpaintCropImproved",
+ "TiledWanInpaintStitchImproved",
+ "TiledWanMaskStatistics",
+ "TiledWanVideoVACEpipe"
+ ],
+ {
+ "title_aux": "comfyUI-TiledWan"
+ }
+ ],
+ "https://github.com/Beinsezii/bsz-cui-extras": [
+ [
+ "BSZAbsoluteHires",
+ "BSZAspectHires",
+ "BSZColoredLatentImageXL",
+ "BSZCombinedHires",
+ "BSZHueChromaXL",
+ "BSZInjectionKSampler",
+ "BSZLatentDebug",
+ "BSZLatentFill",
+ "BSZLatentGradient",
+ "BSZLatentHSVAImage",
+ "BSZLatentOffsetXL",
+ "BSZLatentRGBAImage",
+ "BSZLatentbuster",
+ "BSZPixelbuster",
+ "BSZPixelbusterHelp",
+ "BSZPrincipledConditioning",
+ "BSZPrincipledSampler",
+ "BSZPrincipledScale",
+ "BSZStrangeResample"
+ ],
+ {
+ "title_aux": "bsz-cui-extras"
+ }
+ ],
+ "https://github.com/Bellzs/ComfyUI-LoRA-Assistant": [
+ [
+ "LoRATriggerLocal"
+ ],
+ {
+ "title_aux": "ComfyUI-LoRA-Assistant"
+ }
+ ],
+ "https://github.com/BenNarum/ComfyUI_CAS": [
+ [
+ "AttentionToSigmas",
+ "AttenuatorNode",
+ "BasicCFGGuider",
+ "CELU",
+ "CustomAdvancedSampler",
+ "CustomLCMCFGPP",
+ "CustomModelSamplingDiscreteDistilledAncestralCFGPP",
+ "CustomModelSamplingDiscreteDistilledCFGPP",
+ "CustomX0AncestralCFGPP",
+ "CustomX0CFGPP",
+ "ELU",
+ "EPSCFGPPScheduler",
+ "GELU",
+ "GLU",
+ "HardTanhScheduler",
+ "Hardshrink",
+ "Hardsigmoid",
+ "Hardswish",
+ "Hardtanh",
+ "LatentActivation",
+ "LatentChannelPresets",
+ "LatentConvolution",
+ "LatentFFT",
+ "LatentFrequencyPresets",
+ "LatentGlitch",
+ "LatentMath",
+ "LatentMathFormulaBuilder",
+ "LatentMosaic",
+ "LatentNoisePresets",
+ "LatentPixelSort",
+ "LatentSelfAttention",
+ "LatentTwist",
+ "LatentValuePresets",
+ "LatentWarpPresets",
+ "LeakyReLU",
+ "LogSigmoid",
+ "LogSoftmax",
+ "Mish",
+ "PReLU",
+ "RReLU",
+ "ReLU",
+ "ReLU6",
+ "SELU",
+ "SamplerCustomLCMCFGPP",
+ "SamplerCustomModelSamplingDiscreteDistilledAncestralCFGPP",
+ "SamplerCustomModelSamplingDiscreteDistilledCFGPP",
+ "SamplerCustomX0AncestralCFGPP",
+ "SamplerCustomX0CFGPP",
+ "SamplerDPMCFGPP",
+ "SamplerDynamicCFGPP",
+ "SamplerEulerAttnCFGPP",
+ "SamplerEulerStepControlAncestralCFGPP",
+ "SamplerHeunCFGPP",
+ "SamplerLCMUpscaleW",
+ "SamplerLCMUpscaleWCFGPP",
+ "SamplerLCMUpscaleWGPU",
+ "SamplerStepSizeControlCFGPP",
+ "SamplerWeightedCFGPP",
+ "SiLU",
+ "Softmax",
+ "Softmax2D",
+ "SoftmaxScheduler",
+ "Softmin",
+ "Softplus",
+ "Softshrink",
+ "Softsign",
+ "Tanh",
+ "Tanhshrink",
+ "Threshold",
+ "tcd_euler_a_w",
+ "tcd_w"
+ ],
+ {
+ "title_aux": "ComfyUI_CAS"
+ }
+ ],
+ "https://github.com/BenNarum/SigmaWaveFormNode": [
+ [
+ "AttenuatorNode",
+ "FourierFilterNode",
+ "PhaseLockedLoopNode",
+ "SigmaWaveFormNode",
+ "SigmaWaveFormNodeAdvanced",
+ "SigmaWaveFormNodeSimple"
+ ],
+ {
+ "title_aux": "SigmaWaveFormNodes"
+ }
+ ],
+ "https://github.com/BennyDaBall930/ComfyUI-Z-Engineer": [
+ [
+ "ZEngineer"
+ ],
+ {
+ "title_aux": "ComfyUI-Z-Engineer"
+ }
+ ],
+ "https://github.com/BennyKok/comfyui-deploy": [
+ [
+ "ComfyDeployOutputEXR",
+ "ComfyDeployOutputFile",
+ "ComfyDeployOutputImage",
+ "ComfyDeployOutputText",
+ "ComfyDeployWebscoketImageInput",
+ "ComfyDeployWebscoketImageOutput",
+ "ComfyUIDeployExternalAudio",
+ "ComfyUIDeployExternalBoolean",
+ "ComfyUIDeployExternalCheckpoint",
+ "ComfyUIDeployExternalEXR",
+ "ComfyUIDeployExternalFaceModel",
+ "ComfyUIDeployExternalFile",
+ "ComfyUIDeployExternalImage",
+ "ComfyUIDeployExternalImageAlpha",
+ "ComfyUIDeployExternalImageBatch",
+ "ComfyUIDeployExternalLora",
+ "ComfyUIDeployExternalNumber",
+ "ComfyUIDeployExternalNumberInt",
+ "ComfyUIDeployExternalNumberSlider",
+ "ComfyUIDeployExternalNumberSliderInt",
+ "ComfyUIDeployExternalSeed",
+ "ComfyUIDeployExternalText",
+ "ComfyUIDeployExternalTextAny",
+ "ComfyUIDeployExternalVid",
+ "ComfyUIDeployExternalVideo",
+ "ComfyUIDeployStringCombine"
+ ],
+ {
+ "author": "BennyKok",
+ "description": "",
+ "nickname": "Comfy Deploy",
+ "title": "comfyui-deploy",
+ "title_aux": "ComfyUI Deploy"
+ }
+ ],
+ "https://github.com/BetaDoggo/ComfyUI-Cloud-APIs": [
+ [
+ "FalAddLora",
+ "FalAuraFlowAPI",
+ "FalFluxAPI",
+ "FalFluxI2IAPI",
+ "FalFluxLoraAPI",
+ "FalLLaVAAPI",
+ "FalSoteDiffusionAPI",
+ "FalStableCascadeAPI",
+ "FalVeo2ImagetoVideo",
+ "FluxResolutionPresets",
+ "LoadVideoFromURL",
+ "ReplicateFluxAPI",
+ "RunWareAPI",
+ "RunwareAddLora",
+ "SplitImages"
+ ],
+ {
+ "title_aux": "ComfyUI-Cloud-APIs"
+ }
+ ],
+ "https://github.com/BetaDoggo/ComfyUI-FastSDCPU": [
+ [
+ "fastsdcpu",
+ "fastsdcpu_lcm_models",
+ "fastsdcpu_loadModel",
+ "fastsdcpu_vino_models"
+ ],
+ {
+ "title_aux": "ComfyUI-FastSDCPU"
+ }
+ ],
+ "https://github.com/BetaDoggo/ComfyUI-Gatcha-Embedding": [
+ [
+ "GatchaEmbedding"
+ ],
+ {
+ "title_aux": "Gatcha Embeddings"
+ }
+ ],
+ "https://github.com/BetaDoggo/ComfyUI-VideoPlayer": [
+ [
+ "AllInOnePlayer",
+ "ImageToEmoji",
+ "LoadFrame",
+ "LoadJPGFrame",
+ "LoadVideoFrame"
+ ],
+ {
+ "title_aux": "ComfyUI Video Player"
+ }
+ ],
+ "https://github.com/BetaDoggo/ComfyUI-WDV-Nodes": [
+ [
+ "ModelSamplingWaifuDiffusionV"
+ ],
+ {
+ "title_aux": "neggles/ComfyUI-WDV-Nodes [gist-wrapper]"
+ }
+ ],
+ "https://github.com/BetaDoggo/ComfyUI-YetAnotherSafetyChecker": [
+ [
+ "YetAnotherSafetyChecker"
+ ],
+ {
+ "title_aux": "ComfyUI YetAnotherSafetyChecker"
+ }
+ ],
+ "https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools": [
+ [
+ "BTDownloadFont",
+ "BTEndQueue",
+ "BTImageTextOverlay",
+ "BTLoop",
+ "BTLoopEnd",
+ "BTLoopStart",
+ "BTPromptSchedule",
+ "BTPromptSelector",
+ "BTRandomTextOverlay",
+ "BTTextGrowth",
+ "BTTextToImage"
+ ],
+ {
+ "title_aux": "ComfyUI-Book-Tools Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/Big-Idea-Technology/ComfyUI_LLM_Node": [
+ [
+ "AdvOptions_Node",
+ "CodingOptionsNode",
+ "LLM_Node",
+ "Output_Node",
+ "QuantizationConfig_Node"
+ ],
+ {
+ "title_aux": "LLM Node for ComfyUI"
+ }
+ ],
+ "https://github.com/BigStationW/ComfyUi-ConditioningNoiseInjection": [
+ [
+ "ConditioningNoiseInjection"
+ ],
+ {
+ "title_aux": "ComfyUi-ConditioningNoiseInjection"
+ }
+ ],
+ "https://github.com/BigStationW/ComfyUi-ConditioningTimestepSwitch": [
+ [
+ "ConditioningTimestepSwitch"
+ ],
+ {
+ "title_aux": "ComfyUi-ConditioningTimestepSwitch"
+ }
+ ],
+ "https://github.com/BigStationW/ComfyUi-DisplayAllSteps": [
+ [
+ "SamplerCustomAdvancedAllSteps",
+ "VAEDecodeAllSteps"
+ ],
+ {
+ "title_aux": "ComfyUi-DisplayAllSteps"
+ }
+ ],
+ "https://github.com/BigStationW/ComfyUi-Load-Image-And-Display-Prompt-Metadata": [
+ [
+ "LoadImageX",
+ "OnlyLoadImagesWithMetadata"
+ ],
+ {
+ "title_aux": "ComfyUi-Load-Image-And-Display-Prompt-Metadata"
+ }
+ ],
+ "https://github.com/BigStationW/ComfyUi-RescaleCFGAdvanced": [
+ [
+ "RescaleCFGAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUi-RescaleCFGAdvanced"
+ }
+ ],
+ "https://github.com/BigStationW/ComfyUi-Scale-Image-to-Total-Pixels-Advanced": [
+ [
+ "ImageScaleToTotalPixelsX"
+ ],
+ {
+ "title_aux": "ComfyUi-Scale-Image-to-Total-Pixels-Advanced"
+ }
+ ],
+ "https://github.com/BigStationW/ComfyUi-TextEncodeQwenImageEditAdvanced": [
+ [
+ "ConditioningAddImageReference",
+ "ConditioningAddImageReferenceDual",
+ "TextEncodeEditAdvanced",
+ "TextEncodeEditAdvancedDual"
+ ],
+ {
+ "title_aux": "ComfyUi-TextEncodeQwenImageEditAdvanced"
+ }
+ ],
+ "https://github.com/BigStationW/Comfyui-AD-Image-Concatenation-Advanced": [
+ [
+ "AD_image-concat-advanced"
+ ],
+ {
+ "title_aux": "Comfyui-AD-Image-Concatenation-Advanced"
+ }
+ ],
+ "https://github.com/BigWhiteFly/ComfyUI-ImageConcat": [
+ [
+ "ImageConcatenateBatchWithTxt"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageConcat"
+ }
+ ],
+ "https://github.com/Billius-AI/ComfyUI-Path-Helper": [
+ [
+ "Add File Name Prefix",
+ "Add File Name Prefix Advanced",
+ "Add Folder",
+ "Add Folder Advanced",
+ "Create Project Root",
+ "Join Variables",
+ "Show Path",
+ "Show String"
+ ],
+ {
+ "title_aux": "ComfyUI-Path-Helper"
+ }
+ ],
+ "https://github.com/Bin-sam/DynamicPose-ComfyUI": [
+ [
+ "DynamicPose_Sampler",
+ "Load_Pose_Guider",
+ "Load_denoising_unet",
+ "Load_reference_unet",
+ "Pose_Guider_Encode",
+ "align",
+ "load_pose_model",
+ "pose_extraction"
+ ],
+ {
+ "title_aux": "DynamicPose-ComfyUI"
+ }
+ ],
+ "https://github.com/BizaNator/ComfyUI_PromptIterator": [
+ [
+ "PromptIterator",
+ "PromptIteratorAdvanced",
+ "PromptIteratorDynamic"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Iterator Extension"
+ }
+ ],
+ "https://github.com/BlackSnowSkill/wd14_batch_tagger": [
+ [
+ "BSS_LoadImagesFolder",
+ "BSS_WD14BatchTagger"
+ ],
+ {
+ "title_aux": "BSS WD14 Batch Tagger"
+ }
+ ],
+ "https://github.com/BlackVortexAI/bv_nodepack": [
+ [
+ "BV Control Center",
+ "BV Dynamic Combo",
+ "BV Hex Color To Int",
+ "BV Latent Random Aspect Ratio",
+ "BV Latent Random Rotate 90",
+ "BV Pipe",
+ "BV Pipe Config",
+ "BV Prompt AST Debug",
+ "BV Prompt Category Switch",
+ "BV Prompt Decode",
+ "BV Prompt Encode",
+ "BV Subgraph Divider",
+ "BV Subgraph Heading",
+ "BV Subgraph Spacer"
+ ],
+ {
+ "title_aux": "BV Node Pack"
+ }
+ ],
+ "https://github.com/BlakeOne/ComfyUI-CustomScheduler": [
+ [
+ "CustomScheduler"
+ ],
+ {
+ "title_aux": "ComfyUI CustomScheduler"
+ }
+ ],
+ "https://github.com/BlakeOne/ComfyUI-SchedulerMixer": [
+ [
+ "SchedulerMixer"
+ ],
+ {
+ "title_aux": "ComfyUI SchedulerMixer"
+ }
+ ],
+ "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb": [
+ [
+ "BNK_AddCLIPSDXLParams",
+ "BNK_AddCLIPSDXLRParams",
+ "BNK_CLIPTextEncodeAdvanced",
+ "BNK_CLIPTextEncodeSDXLAdvanced"
+ ],
+ {
+ "title_aux": "Advanced CLIP Text Encode"
+ }
+ ],
+ "https://github.com/BlenderNeko/ComfyUI_Cutoff": [
+ [
+ "BNK_CutoffBasePrompt",
+ "BNK_CutoffRegionsToConditioning",
+ "BNK_CutoffRegionsToConditioning_ADV",
+ "BNK_CutoffSetRegions"
+ ],
+ {
+ "title_aux": "ComfyUI Cutoff"
+ }
+ ],
+ "https://github.com/BlenderNeko/ComfyUI_Noise": [
+ [
+ "BNK_GetSigma",
+ "BNK_InjectNoise",
+ "BNK_NoisyLatentImage",
+ "BNK_SlerpLatent",
+ "BNK_Unsampler"
+ ],
+ {
+ "title_aux": "ComfyUI Noise"
+ }
+ ],
+ "https://github.com/BlenderNeko/ComfyUI_SeeCoder": [
+ [
+ "ConcatConditioning",
+ "SEECoderImageEncode"
+ ],
+ {
+ "title_aux": "SeeCoder [WIP]"
+ }
+ ],
+ "https://github.com/BlenderNeko/ComfyUI_TiledKSampler": [
+ [
+ "BNK_TiledKSampler",
+ "BNK_TiledKSamplerAdvanced"
+ ],
+ {
+ "title_aux": "Tiled sampling for ComfyUI"
+ }
+ ],
+ "https://github.com/BlueprintCoding/ComfyUI_AIDocsClinicalTools": [
+ [
+ "Multi Float",
+ "Multi Int",
+ "Multi Text",
+ "MultiFloatNodeAID",
+ "MultiInt",
+ "MultiText"
+ ],
+ {
+ "title_aux": "The AI Doctors Clinical Tools"
+ }
+ ],
+ "https://github.com/BobJohnson24/ComfyUI-Flux2-INT8": [
+ [
+ "INT8DynamicLoraLoader",
+ "INT8DynamicLoraStack",
+ "INT8LoraLoader",
+ "INT8LoraLoaderStack",
+ "OTUNetLoaderW8A8"
+ ],
+ {
+ "title_aux": "ComfyUI-Flux2-INT8"
+ }
+ ],
+ "https://github.com/BobRandomNumber/ComfyUI-BasicOllama": [
+ [
+ "BasicOllama"
+ ],
+ {
+ "title_aux": "ComfyUI-BasicOllama"
+ }
+ ],
+ "https://github.com/BobRandomNumber/ComfyUI-Calculator": [
+ [
+ "Calculator"
+ ],
+ {
+ "title_aux": "ComfyUI-Calculator"
+ }
+ ],
+ "https://github.com/BobRandomNumber/ComfyUI-DiaTTS": [
+ [
+ "DiaGenerate",
+ "DiaLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-DiaTTS"
+ }
+ ],
+ "https://github.com/BobRandomNumber/ComfyUI-KyutaiTTS": [
+ [
+ "KyutaiTTS"
+ ],
+ {
+ "title_aux": "ComfyUI-KyutaiTTS"
+ }
+ ],
+ "https://github.com/BobRandomNumber/ComfyUI-TLBVFI": [
+ [
+ "TLBVFI_VFI"
+ ],
+ {
+ "title_aux": "ComfyUI-TLBVFI"
+ }
+ ],
+ "https://github.com/Boba-svg/ComfyUI-PromptSwitch": [
+ [
+ "PromptSwitch"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptSwitch"
+ }
+ ],
+ "https://github.com/BobsBlazed/Bobs-Lora-Loader": [
+ [
+ "BobsLoraLoaderFlux",
+ "BobsLoraLoaderSdxl"
+ ],
+ {
+ "title_aux": "Bobs_LoRA_Loader"
+ }
+ ],
+ "https://github.com/BobsBlazed/Bobs_Latent_Optimizer": [
+ [
+ "Bobs-Advanced-Latent-Optimizer",
+ "Bobs-Latent-Optimizer",
+ "BobsLatentNode",
+ "BobsLatentNodeAdvanced"
+ ],
+ {
+ "title_aux": "Bobs_Latent_Optimizer"
+ }
+ ],
+ "https://github.com/BoyuanJiang/FitDiT-ComfyUI": [
+ [
+ "FitDiTLoader",
+ "FitDiTMaskGenerator",
+ "FitDiTTryOn"
+ ],
+ {
+ "title_aux": "FitDiT[official] - High-fidelity Virtual Try-on"
+ }
+ ],
+ "https://github.com/Braeden90000/comfyui-load-image-url": [
+ [
+ "LoadImageFileOrURL"
+ ],
+ {
+ "title_aux": "ComfyUI Load Image URL"
+ }
+ ],
+ "https://github.com/Brekel/ComfyUI-Brekel": [
+ [
+ "BrekelAutoPromptGenerator",
+ "BrekelEnhancePrompt",
+ "BrekelLoadImage",
+ "BrekelPromptChooser",
+ "BrekelResolutionSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-Brekel"
+ }
+ ],
+ "https://github.com/Bria-AI/ComfyUI-BRIA-API": [
+ [
+ "AttributionByImageNode",
+ "BriaEraser",
+ "BriaGenFill",
+ "BriaMultiImageSelect",
+ "BriaTailoredGen",
+ "FIBOEditNode",
+ "FIBOEditStructuredInstructionNode",
+ "GenerateImageLiteNodeV2",
+ "GenerateImageNodeV2",
+ "GenerateStructuredPromptLiteNodeV2",
+ "GenerateStructuredPromptNodeV2",
+ "ImageEnhanceNode",
+ "ImageExpansionNode",
+ "LoadVideoFramesNode",
+ "PreviewVideoURLNode",
+ "RefineImageLiteNodeV2",
+ "RefineImageNodeV2",
+ "ReimagineNode",
+ "RemoveForegroundNode",
+ "RemoveVideoBackgroundNode",
+ "ReplaceBgNode",
+ "RmbgNode",
+ "ShotByImageAutomatic",
+ "ShotByImageAutomaticAspectRatio",
+ "ShotByImageCustomCoordinates",
+ "ShotByImageManualPadding",
+ "ShotByImageManualPlacement",
+ "ShotByImageOriginal",
+ "ShotByTextAutomatic",
+ "ShotByTextAutomaticAspectRatio",
+ "ShotByTextCustomCoordinates",
+ "ShotByTextManualPadding",
+ "ShotByTextManualPlacement",
+ "ShotByTextOriginal",
+ "TailoredModelInfoNode",
+ "TailoredPortraitNode",
+ "Text2ImageBaseNode",
+ "Text2ImageFastNode",
+ "Text2ImageHDNode",
+ "VideoEraseElementsNode",
+ "VideoIncreaseResolutionNode",
+ "VideoMaskByKeyPointsNode",
+ "VideoMaskByPromptNode",
+ "VideoSolidColorBackgroundNode"
+ ],
+ {
+ "title_aux": "BRIA AI API nodes"
+ }
+ ],
+ "https://github.com/BuffMcBigHuge/ComfyUI-Google-AI-Studio": [
+ [
+ "GoogleAIStudioImageGen",
+ "GoogleAIStudioMultiSpeakerTTS",
+ "GoogleAIStudioTTS",
+ "GoogleAIStudioTextGen"
+ ],
+ {
+ "title_aux": "ComfyUI-Google-AI-Studio"
+ }
+ ],
+ "https://github.com/BuffMcBigHuge/ComfyUI-Zonos": [
+ [
+ "ZonosEmotion",
+ "ZonosGenerate"
+ ],
+ {
+ "title_aux": "ComfyUI-Zonos"
+ }
+ ],
+ "https://github.com/Burgstall-labs/ComfyUI-BETA-Cropnodes": [
+ [
+ "BETACrop",
+ "BETASceneDetect",
+ "BETAStitch",
+ "IndexedLoRALoader_BETA",
+ "LoadTextFromIndex",
+ "SaveAudioAdvanced_BETA",
+ "SelectSharpestFrames",
+ "SharpestFrameClipper",
+ "TextLineCount",
+ "WANResolutionCalculator"
+ ],
+ {
+ "title_aux": "ComfyUI-BETA-Cropnodes"
+ }
+ ],
+ "https://github.com/Burgstall-labs/ComfyUI-BETA-Helpernodes": [
+ [
+ "BETACrop",
+ "BETASceneDetect",
+ "BETAStitch",
+ "IndexedLoRALoader_BETA",
+ "LoadTextFromIndex",
+ "SaveAudioAdvanced_BETA",
+ "SelectSharpestFrames",
+ "SharpestFrameClipper",
+ "TextLineCount",
+ "WANResolutionCalculator"
+ ],
+ {
+ "title_aux": "ComfyUI-BETA-Helpernodes"
+ }
+ ],
+ "https://github.com/Burgstall-labs/ComfyUI-BS-Textchop": [
+ [
+ "BSTextChop"
+ ],
+ {
+ "title_aux": "ComfyUI-BS-Textchop"
+ }
+ ],
+ "https://github.com/Burgstall-labs/ComfyUI-BS_Kokoro-onnx": [
+ [
+ "Kokoro TTS"
+ ],
+ {
+ "title_aux": "ComfyUI-BS_Kokoro-onnx"
+ }
+ ],
+ "https://github.com/Bzbaozi/ComfyUI-YK-Banana2-Batch": [
+ [
+ "YKNanoBananaProNode"
+ ],
+ {
+ "title_aux": "ComfyUI-YK-Banana2-Batch"
+ }
+ ],
+ "https://github.com/CC-BryanOttho/ComfyUI_API_Manager": [
+ [
+ "APIRequestNode",
+ "PostImageToAPI",
+ "TextPromptCombinerNode"
+ ],
+ {
+ "title_aux": "ComfyUI_API_Manager"
+ }
+ ],
+ "https://github.com/CC-SUN6/ccsun_node": [
+ [
+ "Image Editing",
+ "Single Image",
+ "resize to 8",
+ "several images"
+ ],
+ {
+ "title_aux": "ccsun_node"
+ }
+ ],
+ "https://github.com/CHAOSEA/ComfyUI_FaceAlignPaste": [
+ [
+ "FaceAlignDouble",
+ "FaceAlignSingle",
+ "FaceAutoFitDouble",
+ "FaceAutoFitSingle",
+ "GenderRecognitionNode",
+ "ImageRotateCHAOS",
+ "PromptSelectorDoubleCHAOS",
+ "PromptSelectorSingleCHAOS"
+ ],
+ {
+ "title_aux": "ComfyUI_FaceAlignPaste"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-FramePack-HY": [
+ [
+ "CreateKeyframes_HY",
+ "FramePackBucketResize_HY",
+ "FramePackDiffusersSampler_HY",
+ "LoadFramePackDiffusersPipeline_HY"
+ ],
+ {
+ "title_aux": "ComfyUI-FramePack-HY"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-Free-GPU": [
+ [
+ "FreeGPUMemory"
+ ],
+ {
+ "title_aux": "ComfyUI-Free-GPU"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-GPT-API": [
+ [
+ "GPT-ImageGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-GPT-API"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-Gemini-API": [
+ [
+ "Google-Gemini"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemini-API"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-ImageCompositionCy": [
+ [
+ "CombineImageAlpha",
+ "ImageCompositor",
+ "LoadImageAlpha"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageCompositionCy"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-InpaintEasy": [
+ [
+ "CropByMask",
+ "ImageAndMaskResizeNode",
+ "ImageCropMerge",
+ "InpaintEasyModel"
+ ],
+ {
+ "title_aux": "ComfyUI-InpaintEasy"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-Janus-Pro": [
+ [
+ "JanusImageGeneration",
+ "JanusImageUnderstanding",
+ "JanusModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Janus-Pro"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-MiniCPM-Plus": [
+ [
+ "MiniCPM3_4B",
+ "MiniCPM3_4B_GPTQ_Int4",
+ "MiniCPM_V_2_6",
+ "MiniCPM_V_2_6_Int4",
+ "TextDisplay"
+ ],
+ {
+ "author": "CY-CHENYUE",
+ "description": "Custom nodes for MiniCPM language models in ComfyUI",
+ "nickname": "MiniCPM-Plus",
+ "title": "MiniCPM-Plus",
+ "title_aux": "ComfyUI-MiniCPM-Plus"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-MiniCPM-o": [
+ [
+ "Load MiniCPM Model",
+ "MiniCPM Image Chat",
+ "MiniCPMImageAnalyzer"
+ ],
+ {
+ "title_aux": "ComfyUI-MiniCPM-o"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-Molmo": [
+ [
+ "Molmo7BDbnb"
+ ],
+ {
+ "title_aux": "ComfyUI-Molmo"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-OmniGenX": [
+ [
+ "LoadOmniGen"
+ ],
+ {
+ "title_aux": "ComfyUI-OmniGenX"
+ }
+ ],
+ "https://github.com/CY-CHENYUE/ComfyUI-Redux-Prompt": [
+ [
+ "ReduxPromptStyler"
+ ],
+ {
+ "title_aux": "ComfyUI-Redux-Prompt"
+ }
+ ],
+ "https://github.com/CYBERLOOM-INC/ComfyUI-nodes-hnmr": [
+ [
+ "CLIPIter",
+ "Dict2Model",
+ "GridImage",
+ "ImageBlend2",
+ "KSamplerOverrided",
+ "KSamplerSetting",
+ "KSamplerXYZ",
+ "LatentToHist",
+ "LatentToImage",
+ "ModelIter",
+ "RandomLatentImage",
+ "SaveStateDict",
+ "SaveText",
+ "StateDictLoader",
+ "StateDictMerger",
+ "StateDictMergerBlockWeighted",
+ "StateDictMergerBlockWeightedMulti",
+ "VAEDecodeBatched",
+ "VAEEncodeBatched",
+ "VAEIter"
+ ],
+ {
+ "title_aux": "ComfyUI-nodes-hnmr"
+ }
+ ],
+ "https://github.com/CallMe1101/ComfyUI_OmniAvatar": [
+ [
+ "OmniAvatar All-in-One (14B)"
+ ],
+ {
+ "title_aux": "ComfyUI_OmniAvatar"
+ }
+ ],
+ "https://github.com/Candlehead/Candlehead-Comfy-Nodez": [
+ [
+ "AspectToRes",
+ "ImageInfo",
+ "StyleChooser",
+ "TextProcessor"
+ ],
+ {
+ "title_aux": "Candlehead-Comfy-Nodez"
+ }
+ ],
+ "https://github.com/Carasibana/ComfyUI-PolyMask": [
+ [
+ "PolyMaskNode",
+ "PolyMaskNodeMulti"
+ ],
+ {
+ "title_aux": "ComfyUI-PolyMask"
+ }
+ ],
+ "https://github.com/Chan-0312/ComfyUI-EasyDeforum": [
+ [
+ "Easy2DDeforum"
+ ],
+ {
+ "title_aux": "ComfyUI-EasyDeforum"
+ }
+ ],
+ "https://github.com/Chan-0312/ComfyUI-IPAnimate": [
+ [
+ "IPAdapterAnimate"
+ ],
+ {
+ "title_aux": "ComfyUI-IPAnimate"
+ }
+ ],
+ "https://github.com/Chan-0312/ComfyUI-Prompt-Preview": [
+ [
+ "SDXLPromptStylerAdvancedPreview",
+ "SDXLPromptStylerPreview"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Preview"
+ }
+ ],
+ "https://github.com/ChangeTheConstants/SeedVarianceEnhancer": [
+ [
+ "SeedVarianceEnhancer"
+ ],
+ {
+ "title_aux": "SeedVarianceEnhancer"
+ }
+ ],
+ "https://github.com/ChaosHL/Marvelous-Box-Comfyui": [
+ [
+ "MarvelousBox",
+ "MarvelousText",
+ "Multi Lora Loader"
+ ],
+ {
+ "title_aux": "Marvelous-Box-Comfyui"
+ }
+ ],
+ "https://github.com/Chaoses-Ib/ComfyUI_Ib_CustomNodes": [
+ [
+ "ImageToPIL",
+ "LoadImageFromPath",
+ "LoadImageFromPathEnhanced",
+ "PILToImage",
+ "PILToMask"
+ ],
+ {
+ "title_aux": "ComfyUI_Ib_CustomNodes"
+ }
+ ],
+ "https://github.com/Charlweed/image_transceiver": [
+ [
+ "ImageTransceiver"
+ ],
+ {
+ "title_aux": "ImageTransceiver - ComfyUI"
+ }
+ ],
+ "https://github.com/Charonartist/comfyui-auto-lora-v2": [
+ [
+ "AutoLoRANode",
+ "LoRABrowserNode",
+ "LoRAManagerNode"
+ ],
+ {
+ "title_aux": "ComfyUI Auto LoRA"
+ }
+ ],
+ "https://github.com/Charonartist/comfyui-last-frame-extractor": [
+ [
+ "LastFrameExtractorNode"
+ ],
+ {
+ "title_aux": "comfyui-last-frame-extractor"
+ }
+ ],
+ "https://github.com/Charonartist/comfyui-lmstudio-conversation": [
+ [
+ "LMStudioConversation",
+ "LMStudioConversationClear",
+ "LMStudioTextGen"
+ ],
+ {
+ "title_aux": "comfyui-lmstudio-conversation"
+ }
+ ],
+ "https://github.com/Charonartist/comfyui-smart-resize-node": [
+ [
+ "SmartResizeNode"
+ ],
+ {
+ "title_aux": "ComfyUI Smart Resize Node"
+ }
+ ],
+ "https://github.com/Charonartist/comfyui-tag-remover": [
+ [
+ "TagRemoverNode"
+ ],
+ {
+ "title_aux": "ComfyUI Tag Remover"
+ }
+ ],
+ "https://github.com/CheNing233/ComfyUI_Image_Pin": [
+ [
+ "ImagePin"
+ ],
+ {
+ "title_aux": "ComfyUI_Image_Pin"
+ }
+ ],
+ "https://github.com/ChenDarYen/ComfyUI-NAG": [
+ [
+ "KSamplerWithNAG",
+ "KSamplerWithNAG (Advanced)",
+ "NAGCFGGuider",
+ "NAGGuider",
+ "SamplerCustomWithNAG"
+ ],
+ {
+ "title_aux": "ComfyUI-NAG"
+ }
+ ],
+ "https://github.com/ChenDarYen/ComfyUI-TimestepShiftModel": [
+ [
+ "Timestep Shift Model"
+ ],
+ {
+ "title_aux": "ComfyUI-TimestepShiftModel"
+ }
+ ],
+ "https://github.com/Chengym2023/ComfyUI-DeepSeek_Online": [
+ [
+ "DeepSeekOnline",
+ "SiliconCloud"
+ ],
+ {
+ "title_aux": "ComfyUI-DeepSeek_Online"
+ }
+ ],
+ "https://github.com/ChrisColeTech/ComfyUI-Elegant-Resource-Monitor": [
+ [
+ "Resource Monitor"
+ ],
+ {
+ "title_aux": "ComfyUI-Elegant-Resource-Monitor"
+ }
+ ],
+ "https://github.com/ChrisColeTech/ComfyUI-Line-counter": [
+ [
+ "Directory File Counter",
+ "Simple Number Counter",
+ "Text File Line Counter",
+ "Text File Line Reader"
+ ],
+ {
+ "title_aux": "ComfyUI-Line-counter"
+ }
+ ],
+ "https://github.com/Chrisvenator/ComfyUI-Painting-by-colors-generator": [
+ [
+ "EnhancedPaintByNumbersNode",
+ "HexStackNode",
+ "NumbersOverlayAdvancedNode",
+ "NumbersOverlayNode",
+ "PaintByNumbersNode",
+ "PaintByNumbersPaletteNode",
+ "PaintByNumbersTemplateNode"
+ ],
+ {
+ "title_aux": "painting-by-colors-generator"
+ }
+ ],
+ "https://github.com/ClownsharkBatwing/RES4LYF": [
+ [
+ "AdvancedNoise",
+ "Base64ToConditioning",
+ "BongSampler",
+ "CLIPTextEncodeFluxUnguided",
+ "ClownGuide_AdaIN_MMDiT_Beta",
+ "ClownGuide_AttnInj_MMDiT_Beta",
+ "ClownGuide_Beta",
+ "ClownGuide_FrequencySeparation",
+ "ClownGuide_Mean_Beta",
+ "ClownGuide_StyleNorm_Advanced_HiDream",
+ "ClownGuide_Style_Beta",
+ "ClownGuide_Style_EdgeWidth",
+ "ClownGuide_Style_TileSize",
+ "ClownGuidesAB_Beta",
+ "ClownGuides_Beta",
+ "ClownGuides_Sync",
+ "ClownGuides_Sync_Advanced",
+ "ClownInpaint",
+ "ClownInpaintSimple",
+ "ClownModelLoader",
+ "ClownOptions_Automation_Beta",
+ "ClownOptions_Combine",
+ "ClownOptions_Cycles_Beta",
+ "ClownOptions_DetailBoost_Beta",
+ "ClownOptions_ExtraOptions_Beta",
+ "ClownOptions_FlowGuide",
+ "ClownOptions_FrameWeights",
+ "ClownOptions_Frameweights",
+ "ClownOptions_ImplicitSteps_Beta",
+ "ClownOptions_Momentum_Beta",
+ "ClownOptions_SDE_Beta",
+ "ClownOptions_SDE_Mask_Beta",
+ "ClownOptions_SDE_Noise",
+ "ClownOptions_SigmaScaling_Beta",
+ "ClownOptions_StepSize_Beta",
+ "ClownOptions_SwapSampler_Beta",
+ "ClownOptions_Tile_Advanced_Beta",
+ "ClownOptions_Tile_Beta",
+ "ClownRegionalConditioning",
+ "ClownRegionalConditioning2",
+ "ClownRegionalConditioning3",
+ "ClownRegionalConditioning_AB",
+ "ClownRegionalConditioning_ABC",
+ "ClownRegionalConditionings",
+ "ClownSampler",
+ "ClownSamplerAdvanced",
+ "ClownSamplerAdvanced_Beta",
+ "ClownSamplerSelector_Beta",
+ "ClownSampler_Beta",
+ "ClownScheduler",
+ "ClownStyle_Attn_MMDiT",
+ "ClownStyle_Attn_UNet",
+ "ClownStyle_Block_MMDiT",
+ "ClownStyle_Block_UNet",
+ "ClownStyle_Boost",
+ "ClownStyle_MMDiT",
+ "ClownStyle_ResBlock_UNet",
+ "ClownStyle_SpatialBlock_UNet",
+ "ClownStyle_TransformerBlock_UNet",
+ "ClownStyle_UNet",
+ "ClownpileModelWanVideo",
+ "ClownsharKSampler",
+ "ClownsharKSamplerAutomation",
+ "ClownsharKSamplerAutomation_Advanced",
+ "ClownsharKSamplerGuide",
+ "ClownsharKSamplerGuides",
+ "ClownsharKSamplerOptions",
+ "ClownsharKSampler_Beta",
+ "ClownsharkChainsampler_Beta",
+ "Conditioning Recast FP64",
+ "ConditioningAdd",
+ "ConditioningAverageScheduler",
+ "ConditioningBatch4",
+ "ConditioningBatch8",
+ "ConditioningDownsample (T5)",
+ "ConditioningMultiply",
+ "ConditioningOrthoCollin",
+ "ConditioningToBase64",
+ "ConditioningTruncate",
+ "ConditioningZeroAndTruncate",
+ "Constant Scheduler",
+ "CrossAttn_EraseReplace_HiDream",
+ "EmptyLatentImage64",
+ "EmptyLatentImageCustom",
+ "Film Grain",
+ "FluxGuidanceDisable",
+ "FluxLoader",
+ "FluxOrthoCFGPatcher",
+ "Frame Select",
+ "Frame Select Latent",
+ "Frame Select Latent Raw",
+ "Frames Concat",
+ "Frames Concat Latent",
+ "Frames Concat Latent Raw",
+ "Frames Concat Masks",
+ "Frames Latent ReverseOrder",
+ "Frames Masks Uninterpolate",
+ "Frames Masks ZeroOut",
+ "Frames Slice",
+ "Frames Slice Latent",
+ "Frames Slice Latent Raw",
+ "Frequency Separation Hard Light",
+ "Frequency Separation Hard Light LAB",
+ "Frequency Separation Linear Light",
+ "Image Channels LAB",
+ "Image Crop Location Exact",
+ "Image Gaussian Blur",
+ "Image Get Color Swatches",
+ "Image Grain Add",
+ "Image Median Blur",
+ "Image Pair Split",
+ "Image Repeat Tile To Size",
+ "Image Sharpen FS",
+ "Latent Batcher",
+ "Latent Channels From To",
+ "Latent Clear State Info",
+ "Latent Display State Info",
+ "Latent Get Channel Means",
+ "Latent Match Channelwise",
+ "Latent Normalize Channels",
+ "Latent Replace State Info",
+ "Latent Transfer State Info",
+ "Latent TrimVideo State Info",
+ "Latent to Cuda",
+ "Latent to RawX",
+ "LatentBatch_channels",
+ "LatentBatch_channels_16",
+ "LatentNoiseBatch_fractal",
+ "LatentNoiseBatch_gaussian",
+ "LatentNoiseBatch_gaussian_channels",
+ "LatentNoiseBatch_perlin",
+ "LatentNoiseList",
+ "LatentNoised",
+ "LatentPhaseMagnitude",
+ "LatentPhaseMagnitudeMultiply",
+ "LatentPhaseMagnitudeOffset",
+ "LatentPhaseMagnitudePower",
+ "LatentUpscaleWithVAE",
+ "LayerPatcher",
+ "Legacy_ClownSampler",
+ "Legacy_ClownsharKSampler",
+ "Legacy_ClownsharKSamplerGuides",
+ "Legacy_SharkSampler",
+ "Linear Quadratic Advanced",
+ "Mask Bounding Box Aspect Ratio",
+ "Mask Sketch",
+ "MaskEdge",
+ "MaskFloatToBoolean",
+ "MaskToggle",
+ "Masks From Color Swatches",
+ "Masks From Colors",
+ "Masks Unpack 16",
+ "Masks Unpack 4",
+ "Masks Unpack 8",
+ "ModelSamplingAdvanced",
+ "ModelSamplingAdvancedResolution",
+ "ModelTimestepPatcher",
+ "PrepForUnsampling",
+ "ReAuraPatcher",
+ "ReAuraPatcherAdvanced",
+ "ReChromaPatcher",
+ "ReChromaPatcherAdvanced",
+ "ReFluxPatcher",
+ "ReFluxPatcherAdvanced",
+ "ReHiDreamPatcher",
+ "ReHiDreamPatcherAdvanced",
+ "ReLTXVPatcher",
+ "ReLTXVPatcherAdvanced",
+ "ReReduxPatcher",
+ "ReSD35Patcher",
+ "ReSD35PatcherAdvanced",
+ "ReSDPatcher",
+ "ReWanPatcher",
+ "ReWanPatcherAdvanced",
+ "SD35Loader",
+ "SamplerOptions_GarbageCollection",
+ "SamplerOptions_TimestepScaling",
+ "SeedGenerator",
+ "Set Precision",
+ "Set Precision Advanced",
+ "Set Precision Universal",
+ "SetImageSize",
+ "SetImageSizeWithScale",
+ "SharkChainsampler_Beta",
+ "SharkOptions_Beta",
+ "SharkOptions_GuideCond_Beta",
+ "SharkOptions_GuideConds_Beta",
+ "SharkOptions_GuiderInput",
+ "SharkOptions_StartStep_Beta",
+ "SharkOptions_UltraCascade_Latent_Beta",
+ "SharkSampler",
+ "SharkSamplerAdvanced_Beta",
+ "SharkSampler_Beta",
+ "Sigmas Abs",
+ "Sigmas AdaptiveNoiseFloor",
+ "Sigmas AdaptiveStep",
+ "Sigmas Add",
+ "Sigmas Append",
+ "Sigmas ArcCosine",
+ "Sigmas ArcSine",
+ "Sigmas ArcTangent",
+ "Sigmas Attractor",
+ "Sigmas CNFInverse",
+ "Sigmas CatmullRom",
+ "Sigmas Chaos",
+ "Sigmas Cleanup",
+ "Sigmas CollatzIteration",
+ "Sigmas Concat",
+ "Sigmas ConwaySequence",
+ "Sigmas Count",
+ "Sigmas CrossProduct",
+ "Sigmas DeleteBelowFloor",
+ "Sigmas DeleteDuplicates",
+ "Sigmas DotProduct",
+ "Sigmas Easing",
+ "Sigmas Fmod",
+ "Sigmas Frac",
+ "Sigmas From Text",
+ "Sigmas GammaBeta",
+ "Sigmas Gaussian",
+ "Sigmas GaussianCDF",
+ "Sigmas GilbreathSequence",
+ "Sigmas HarmonicDecay",
+ "Sigmas Hyperbolic",
+ "Sigmas If",
+ "Sigmas InvLerp",
+ "Sigmas Iteration Karras",
+ "Sigmas Iteration Polyexp",
+ "Sigmas KernelSmooth",
+ "Sigmas LambertW",
+ "Sigmas LangevinDynamics",
+ "Sigmas Lerp",
+ "Sigmas LinearSine",
+ "Sigmas Logarithm2",
+ "Sigmas Math1",
+ "Sigmas Math3",
+ "Sigmas Modulus",
+ "Sigmas Mult",
+ "Sigmas Noise Inversion",
+ "Sigmas NormalizingFlows",
+ "Sigmas Pad",
+ "Sigmas Percentile",
+ "Sigmas PersistentHomology",
+ "Sigmas Power",
+ "Sigmas QuantileNorm",
+ "Sigmas Quotient",
+ "Sigmas ReactionDiffusion",
+ "Sigmas Recast",
+ "Sigmas Resample",
+ "Sigmas Rescale",
+ "Sigmas RiemannianFlow",
+ "Sigmas SetFloor",
+ "Sigmas Sigmoid",
+ "Sigmas SmoothStep",
+ "Sigmas Split",
+ "Sigmas Split Value",
+ "Sigmas SquareRoot",
+ "Sigmas Start",
+ "Sigmas StepwiseMultirate",
+ "Sigmas TimeStep",
+ "Sigmas Truncate",
+ "Sigmas Unpad",
+ "Sigmas Variance Floor",
+ "Sigmas ZetaEta",
+ "Sigmas2 Add",
+ "Sigmas2 Mult",
+ "SigmasPreview",
+ "SigmasSchedulePreview",
+ "StableCascade_StageB_Conditioning64",
+ "StableCascade_StageC_VAEEncode_Exact",
+ "StyleModelApplyStyle",
+ "Tan Scheduler",
+ "Tan Scheduler 2",
+ "Tan Scheduler 2 Simple",
+ "TemporalCrossAttnMask",
+ "TemporalMaskGenerator",
+ "TemporalSplitAttnMask",
+ "TemporalSplitAttnMask (Midframe)",
+ "TextBox1",
+ "TextBox2",
+ "TextBox3",
+ "TextBoxConcatenate",
+ "TextConcatenate",
+ "TextLoadFile",
+ "TextShuffle",
+ "TextShuffleAndTruncate",
+ "TextTruncateTokens",
+ "TorchCompileModelAura",
+ "TorchCompileModelFluxAdv",
+ "TorchCompileModelSD35",
+ "TorchCompileModels",
+ "UNetSave",
+ "UltraSharkSampler",
+ "UltraSharkSampler Tiled",
+ "VAEEncodeAdvanced",
+ "VAEStyleTransferLatent"
+ ],
+ {
+ "title_aux": "RES4LYF"
+ }
+ ],
+ "https://github.com/Clybius/ComfyUI-ClybsChromaNodes": [
+ [
+ "ClybGuidance",
+ "InverseSquaredScheduler",
+ "PrintSigmas",
+ "SamplerClyb_BDF"
+ ],
+ {
+ "title_aux": "ComfyUI-ClybsChromaNodes"
+ }
+ ],
+ "https://github.com/Clybius/ComfyUI-Extra-Samplers": [
+ [
+ "GeometricCFGGuider",
+ "ImageAssistedCFGGuider",
+ "MegaCFGGuider",
+ "SamplerCLYB_4M_SDE_Momentumized",
+ "SamplerCustomModelMixtureDuo",
+ "SamplerCustomNoise",
+ "SamplerCustomNoiseDuo",
+ "SamplerDPMPP_3M_SDE_DynETA",
+ "SamplerDPMPP_DualSDE_Momentumized",
+ "SamplerEulerAncestralDancing_Experimental",
+ "SamplerLCMCustom",
+ "SamplerRES_Momentumized",
+ "SamplerSupreme",
+ "SamplerTTM",
+ "ScaledCFGGuider",
+ "SimpleExponentialScheduler",
+ "WarmupDecayCFGGuider"
+ ],
+ {
+ "title_aux": "ComfyUI Extra Samplers"
+ }
+ ],
+ "https://github.com/Clybius/ComfyUI-Latent-Modifiers": [
+ [
+ "Latent Diffusion Mega Modifier"
+ ],
+ {
+ "title_aux": "ComfyUI-Latent-Modifiers"
+ }
+ ],
+ "https://github.com/CoiiChan/ComfyUI-Depth-Visualization-Advanced": [
+ [
+ "DepthViewerAndQuilts"
+ ],
+ {
+ "title_aux": "ComfyUI-Depth-Visualization-advanced"
+ }
+ ],
+ "https://github.com/CoiiChan/ComfyUI-FuncAsTexture-CoiiNode": [
+ [
+ "Add",
+ "Ceil",
+ "Chroma_Key_Alpha",
+ "Clamp",
+ "Contant3Vector",
+ "CustomScriptNumpy",
+ "DDX",
+ "Desaturation",
+ "Distance",
+ "Divided",
+ "Dot",
+ "HueShift",
+ "InverseUVMapGenerator",
+ "Lerp",
+ "Max",
+ "Min",
+ "Multiply",
+ "Oneminus",
+ "Outline",
+ "Panner",
+ "Power",
+ "Rotator",
+ "Sine",
+ "Subtraction",
+ "TextureSampler",
+ "UVCoordinateGen",
+ "ifFunction"
+ ],
+ {
+ "title_aux": "ComfyUI-FuncAsTexture-CoiiNode"
+ }
+ ],
+ "https://github.com/CoiiChan/comfyui-every-person-seg-coii": [
+ [
+ "EveryPersonSegDetail",
+ "EveryPersonSegSimple"
+ ],
+ {
+ "title_aux": "comfyui-every-person-seg-coii"
+ }
+ ],
+ "https://github.com/Comfy-Org/NIMnodes": [
+ [
+ "Get_HFToken",
+ "InstallNIMNode",
+ "LoadNIMNode",
+ "NIMFLUXNode"
+ ],
+ {
+ "title_aux": "NVIDIA FLUX NIM"
+ }
+ ],
+ "https://github.com/ComfyAssets/ComfyUI-KikoStats": [
+ [
+ "ResourceMonitor"
+ ],
+ {
+ "title_aux": "ComfyUI-KikoStats"
+ }
+ ],
+ "https://github.com/ComfyAssets/ComfyUI-KikoTools": [
+ [
+ "BatchPrompts",
+ "DisplayAny",
+ "DisplayText",
+ "EmptyLatentBatch",
+ "FluxSamplerParams",
+ "GeminiPrompt",
+ "GlifConsistencyDecoder",
+ "GlifPatchConsistencyDecoderTiled",
+ "GlifVariable",
+ "HFHubEmbeddingLoader",
+ "HFHubLoraLoader",
+ "ImageScaleDownBy",
+ "ImageToMultipleOf",
+ "KikoFilmGrain",
+ "KikoLocalImageLoader",
+ "KikoModelDownloader",
+ "KikoPurgeVRAM",
+ "KikoSaveImage",
+ "KikoWorkflowTimer",
+ "LoRAFolderBatch",
+ "PlotParameters+",
+ "ResolutionCalculator",
+ "SDXLAspectRatio",
+ "SamplerCombo",
+ "SamplerComboCompact",
+ "SamplerSelectHelper",
+ "SchedulerSelectHelper",
+ "SeedHistory",
+ "TextEncodeSamplerParams",
+ "TextInput",
+ "WidthHeightSelector",
+ "WidthHeightToVec2"
+ ],
+ {
+ "title_aux": "ComfyUI-KikoTools"
+ }
+ ],
+ "https://github.com/ComfyAssets/ComfyUI_PromptManager": [
+ [
+ "PromptManager",
+ "PromptManagerText",
+ "PromptSearchList"
+ ],
+ {
+ "title_aux": "ComfyUI_PromptManager"
+ }
+ ],
+ "https://github.com/ComfyAssets/ComfyUI_Selectors": [
+ [
+ "HeightNode",
+ "SamplerSelector",
+ "SchedulerSelector",
+ "SeedHistory",
+ "WidthHeightNode",
+ "WidthNode"
+ ],
+ {
+ "title_aux": "ComfyUI_Selectors"
+ }
+ ],
+ "https://github.com/ComfyUI-JH/ComfyUI-JH-Misc-Nodes": [
+ [
+ "JHDaisyChainableStringConstantNode",
+ "JHPreviewImage",
+ "JHThreeWaySwitchNode",
+ "JHTwoWaySwitchNode"
+ ],
+ {
+ "title_aux": "JH Misc. Nodes"
+ }
+ ],
+ "https://github.com/ComfyUI-JH/ComfyUI-JH-XMP-Metadata-Nodes": [
+ [
+ "JHFormatMetadataNode",
+ "JHGetWidgetValueFloatNode",
+ "JHGetWidgetValueIntNode",
+ "JHGetWidgetValueStringNode",
+ "JHLoadImageWithXMPMetadataNode",
+ "JHPathToStemNode",
+ "JHSaveImageWithXMPMetadata"
+ ],
+ {
+ "title_aux": "JH XMP Metadata Nodes"
+ }
+ ],
+ "https://github.com/ComfyUI-WanVideoWrapper/QQ.copied": [
+ [
+ "ImageBlend_GPU",
+ "ImageRadialZoomBlur_GPU",
+ "LoraExtractKJv2",
+ "PowerLoraLoaderV2",
+ "VideoMergeABC",
+ "WanScaleAB",
+ "WanVideoCacheSamples",
+ "WanVideoCacheVideos",
+ "WanVideoEmptyEmbeds_v2",
+ "WanVideoFlowmapDistortion",
+ "WanVideoImageToVideoEncode_v2",
+ "WanVideoMotionToFlowmap",
+ "WanVideoPowerLoraLoader"
+ ],
+ {}
+ ],
+ "https://github.com/ComfyUI/Base64_IO": [
+ [
+ "AnyToBase64",
+ "Base64ToAny",
+ "Base64ToConditioning",
+ "Base64ToLatent"
+ ],
+ {}
+ ],
+ "https://github.com/ComfyUI/Eagleshadow": [
+ [
+ "Batch 12 Images",
+ "Batch12Images",
+ "Detect Transparency",
+ "DetectTransparency",
+ "Fix Checkpoint Name",
+ "FixCheckpointName",
+ "ImageLinearGammaCompositeMasked",
+ "KSampler Same Noise",
+ "MaskGlow",
+ "OffsetImage",
+ "Round Float to String",
+ "RoundFloat2String",
+ "SaveImageToFolder",
+ "Select ControlNet",
+ "Select Model 20",
+ "SelectControlNet",
+ "SelectModel20",
+ "Simple Load Image Batch",
+ "SimpleLoadImageBatch"
+ ],
+ {}
+ ],
+ "https://github.com/ComfyUI/RH_Qwen-Image": [
+ [
+ "QwenImageModelLoader",
+ "RH_QwenImageGenerator",
+ "RH_QwenImagePromptEnhancer"
+ ],
+ {}
+ ],
+ "https://github.com/ComfyUI/ResolutionSelector": [
+ [
+ "ResolutionSelector"
+ ],
+ {}
+ ],
+ "https://github.com/ComfyUI/SequentialGroupController": [
+ [
+ "SequentialGroupController",
+ "SequentialGroupControllerV2"
+ ],
+ {}
+ ],
+ "https://github.com/ComfyUI/subjectselector": [
+ [
+ "ComfyUI_subjectselector"
+ ],
+ {}
+ ],
+ "https://github.com/ComplexRobot/ComfyUI-Simple-VFI": [
+ [
+ "Simple_Frame_Interpolation"
+ ],
+ {
+ "title_aux": "ComfyUI-Simple-VFI"
+ }
+ ],
+ "https://github.com/Conor-Collins/ComfyUI-CoCoTools_IO": [
+ [
+ "ColorspaceNode",
+ "CryptomatteLayer",
+ "ImageLoader",
+ "LoadExr",
+ "LoadExrLayerByName",
+ "LoadExrSequence",
+ "SaverNode",
+ "ZNormalizeNode"
+ ],
+ {
+ "title_aux": "ComfyUI-CoCoTools_IO"
+ }
+ ],
+ "https://github.com/ConstantlyGrowup/ComfyUI_Qwen_chat_models": [
+ [
+ "qwen_VL_model",
+ "qwen_chat_model"
+ ],
+ {
+ "title_aux": "ComfyUI_Qwen_chat_models"
+ }
+ ],
+ "https://github.com/CoreyCorza/ComfyUI-CRZnodes": [
+ [
+ "CRZBooleanToggle",
+ "CRZCompare",
+ "CRZCustomDropdown",
+ "CRZDashboardNode",
+ "CRZDropdown",
+ "CRZExecuteBlock",
+ "CRZExecuteSwitch",
+ "CRZFloatSlider",
+ "CRZFloatToInt",
+ "CRZImageSelector",
+ "CRZIntToFloat",
+ "CRZIntegerSlider",
+ "CRZLabel",
+ "CRZMapDropdown",
+ "CRZPassthrough",
+ "CRZStringNode",
+ "CRZSwitch"
+ ],
+ {
+ "title_aux": "ComfyUI-CRZnodes"
+ }
+ ],
+ "https://github.com/Cornmeister/ComfyUI-CornmeisterNL-PowerPack": [
+ [
+ "CornmeisterNL_PowerDiffusionModelLoader",
+ "CornmeisterNL_PowerLoraConfigurator",
+ "CornmeisterNL_PowerLoraSelector",
+ "CornmeisterNL_PowerPromptBuilder",
+ "CornmeisterNL_PowerRes",
+ "CornmeisterNL_PowerSaveImage",
+ "CornmeisterNL_PowerTextConcat"
+ ],
+ {
+ "title_aux": "CornmeisterNL PowerPack"
+ }
+ ],
+ "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes": [
+ [
+ "DebugToFile",
+ "PrimereAestheticCKPTScorer",
+ "PrimereAnyDetailer",
+ "PrimereAnyOutput",
+ "PrimereCKPT",
+ "PrimereCKPTLoader",
+ "PrimereCLIPEncoder",
+ "PrimereClearNetworkTagsPrompt",
+ "PrimereConceptDataTuple",
+ "PrimereDiTPurifyPrompt",
+ "PrimereDynamicParser",
+ "PrimereEmbedding",
+ "PrimereEmbeddingHandler",
+ "PrimereEmbeddingKeywordMerger",
+ "PrimereEmotionsStyles",
+ "PrimereFaceAnalyzer",
+ "PrimereFastSeed",
+ "PrimereHypernetwork",
+ "PrimereImageSegments",
+ "PrimereImgToPrompt",
+ "PrimereKSampler",
+ "PrimereLLMEnhancer",
+ "PrimereLLMEnhancerOptions",
+ "PrimereLORA",
+ "PrimereLYCORIS",
+ "PrimereLatentNoise",
+ "PrimereLensStyles",
+ "PrimereLoraKeywordMerger",
+ "PrimereLoraStackMerger",
+ "PrimereLycorisKeywordMerger",
+ "PrimereLycorisStackMerger",
+ "PrimereMetaCollector",
+ "PrimereMetaDistributor",
+ "PrimereMetaDistributorStage2",
+ "PrimereMetaHandler",
+ "PrimereMetaSave",
+ "PrimereMetaTupleCollector",
+ "PrimereMidjourneyStyles",
+ "PrimereModelConceptSelector",
+ "PrimereModelKeyword",
+ "PrimereMultiImage",
+ "PrimereNetworkDataCollector",
+ "PrimereNetworkTagLoader",
+ "PrimerePreviewImage",
+ "PrimerePrompt",
+ "PrimerePromptOrganizer",
+ "PrimerePromptOrganizerCSV",
+ "PrimerePromptSwitch",
+ "PrimereRefinerPrompt",
+ "PrimereResolution",
+ "PrimereResolutionCoordinatorMPX",
+ "PrimereResolutionMultiplierMPX",
+ "PrimereSamplersSteps",
+ "PrimereSeed",
+ "PrimereStyleLoader",
+ "PrimereStylePile",
+ "PrimereTextOutput",
+ "PrimereUpscaleModel",
+ "PrimereVAE",
+ "PrimereVAELoader",
+ "PrimereVisualCKPT",
+ "PrimereVisualEmbedding",
+ "PrimereVisualHypernetwork",
+ "PrimereVisualLORA",
+ "PrimereVisualLYCORIS",
+ "PrimereVisualPromptOrganizerCSV",
+ "PrimereVisualStyle"
+ ],
+ {
+ "title_aux": "Primere nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/CpreForEver/CFE_comfyui": [
+ [
+ "CFE Aspect Ratio",
+ "CFE FLUX Guidance",
+ "CFE FLUX Sampler",
+ "CFE FLUX Sampler (Pipe)",
+ "CFE Flux In Pipe",
+ "CFE Flux Out Pipe",
+ "CFE Lora Params",
+ "CFE Scheduler",
+ "CFE Sigma Sampler",
+ "CFE Sigma Sampler Strings",
+ "CFE_Aspect_Ratio",
+ "CFE_FLUX_Pipe_Sampler",
+ "CFE_FLUX_Sampler",
+ "CFE_Flux_Guidance",
+ "CFE_Flux_In_Pipe",
+ "CFE_Flux_Out_Pipe",
+ "CFE_Lora_Params",
+ "CFE_Scheduler",
+ "CFE_Sigma_Sampler_Strings",
+ "CFE_Sigma_Scheduler"
+ ],
+ {
+ "title_aux": "CFE_comfyui"
+ }
+ ],
+ "https://github.com/CraftBlack/ComfyUI-Resolution-Divider": [
+ [
+ "ResolutionDividerNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Resolution-Divider"
+ }
+ ],
+ "https://github.com/CrateTools/comfyui-preview-video-monitor": [
+ [
+ "PreviewVideoMonitorPro"
+ ],
+ {
+ "title_aux": "Preview Video Monitor Pro"
+ }
+ ],
+ "https://github.com/Creditas-labs/ComfyUI_Adforge": [
+ [
+ "LoadVideoGCS",
+ "VertexVeoExtendVideoNode",
+ "VertexVeoFirstLastFrameToVideoNode",
+ "VertexVeoImageToVideoNode",
+ "VertexVeoInsertContentNode",
+ "VertexVeoRemoveContentNode",
+ "VertexVeoTextToVideoNode",
+ "VertexVeoVideoToVideoNode",
+ "VertexVeoVideoWithReferenceNode"
+ ],
+ {
+ "title_aux": "ComfyUI_Adforge"
+ }
+ ],
+ "https://github.com/Creeper-MZ/comfyui_nai_api": [
+ [
+ "NovelAI",
+ "NovelAI_Declutter_Preprocessor",
+ "NovelAI_Lineart_Processor",
+ "NovelAI_Prompt",
+ "NovelAI_Sketch_Processor",
+ "NovelAI_VIBE"
+ ],
+ {
+ "title_aux": "comfyui_nai_api"
+ }
+ ],
+ "https://github.com/Creepybits/ComfyUI-Creepy_nodes": [
+ [
+ "ArtAnalyst",
+ "AudioKeywordExtractor",
+ "CLIPSwitch",
+ "Categorizer",
+ "CharacterSelect (Creepybits)",
+ "CharacterVault",
+ "CollectAndDistributeText",
+ "Coloring",
+ "ConditionalLoRAApplierCreepybits",
+ "CreepyDirector'sSlate",
+ "CustomNodeManager",
+ "DelayNode",
+ "DelayTextNode",
+ "DynamicClipswitch",
+ "DynamicConditioning",
+ "DynamicDelayText",
+ "DynamicImageSwitch",
+ "DynamicLatentSwitch",
+ "DynamicModelswitch",
+ "DynamicStartIndex (Creepybits)",
+ "DynamicVAESwitch",
+ "EmptyFolderCleaner",
+ "EvaluaterNode",
+ "FallbackTextSwitch",
+ "FileSorterNode",
+ "FilterImages",
+ "GeminiAPICreepybits",
+ "GeminiAudioAnalyzer",
+ "IMGToIMGConditioning",
+ "ImageFormatConverter",
+ "KeywordExtractor",
+ "LoadBatchFromDir",
+ "LoadBatchImagesDir",
+ "LoadLatentFromPath",
+ "LoadLatentFromPathCreepy",
+ "LoraDBBuilder",
+ "LoraTriggerLookup",
+ "MasterKey",
+ "MediaMigratorNode",
+ "Modelswitch",
+ "PeopleEvaluationNode",
+ "QWENPrompt",
+ "QwenAspectRatioCreepy",
+ "RandomAudioSegment",
+ "RandomGreekMyth",
+ "RandomScripture",
+ "SanitizeFilename",
+ "SaveRawLatent",
+ "SaveRawLatentCreepy",
+ "SceneDirector",
+ "SummaryWriter",
+ "SystemPromp",
+ "Textswitch",
+ "TriggerNextWorkflow",
+ "VAESwitch",
+ "WanPrompter",
+ "WorldWeaverPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-Creepy_nodes"
+ }
+ ],
+ "https://github.com/Creepybits/ComfyUI-Save_To_GDrive": [
+ [
+ "SaveImageToGoogleDrive"
+ ],
+ {
+ "title_aux": "Save Image To Google Drive"
+ }
+ ],
+ "https://github.com/Creepybits/ComfyUI-Save_To_OneDrive": [
+ [
+ "SaveImageToOneDrive_CreepyBits"
+ ],
+ {
+ "title_aux": "Comfyui-Save_To_OneDrive"
+ }
+ ],
+ "https://github.com/Creepybits/World_weaver": [
+ [
+ "WW_CharacterSelect",
+ "WW_CharacterVault",
+ "WW_ConditionalLoRAApplierCreepybits",
+ "WW_DelayTextNode",
+ "WW_GeminiAPI",
+ "WW_MasterKey",
+ "WW_QwenAspectRatioCreepy",
+ "WW_SceneDirector",
+ "WW_WorldWeaverPrompt"
+ ],
+ {
+ "title_aux": "world weaver"
+ }
+ ],
+ "https://github.com/Cryptyox/anaglyphTool-Comfyui": [
+ [
+ "AnaglyphTool",
+ "CrossEyeTool",
+ "StereogramTool"
+ ],
+ {
+ "author": "Timon",
+ "description": "Provides CUDA GPU accelerated nodes for creating 3D images (Anaglyph, Cross-Eye, Stereogram).",
+ "nickname": "StereoTools",
+ "title": "Stereo Tools (CUDA)",
+ "title_aux": "anaglyphTool-Comfyui"
+ }
+ ],
+ "https://github.com/Curt-Park/human-parser-comfyui-node-in-pure-python": [
+ [
+ "Cozy Human Parser ATR",
+ "Cozy Human Parser LIP",
+ "Cozy Human Parser Pascal"
+ ],
+ {
+ "title_aux": "Cozy Human Parser in pure Python"
+ }
+ ],
+ "https://github.com/CyanAutumn/ComfyUi_Random_Manage_Cyan": [
+ [
+ "Random Prompt Cyan",
+ "Remove Prompt Cyan"
+ ],
+ {
+ "title_aux": "ComfyUi Random Manage Cyan"
+ }
+ ],
+ "https://github.com/Cyber-BlackCat/ComfyUI-Image-Vector": [
+ [
+ "Vector"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Vector"
+ }
+ ],
+ "https://github.com/Cyber-BlackCat/ComfyUI-MoneyMaker": [
+ [
+ "Black and white",
+ "Image Judgment",
+ "Image Resize MM",
+ "ImageMinusMask",
+ "Light or Dark",
+ "Load Random Images",
+ "Mask Preprocess Morphology",
+ "Mask To Gray",
+ "Number",
+ "PhotoShop Transfer",
+ "SomethingShow",
+ "TensorShow"
+ ],
+ {
+ "title_aux": "ComfyUI-Yuan"
+ }
+ ],
+ "https://github.com/Cyber-BlackCat/ComfyUI_Auto_Caption": [
+ [
+ "Auto Caption",
+ "Auto_Caption2",
+ "ExtraOptionsSet",
+ "Joy Model load",
+ "Joy_Model2_load",
+ "LoadManyImages"
+ ],
+ {
+ "title_aux": "ComfyUI_Auto_Caption"
+ }
+ ],
+ "https://github.com/Cyberschorsch/ComfyUI-checkpoint-config-loader": [
+ [
+ "Checkpoint Loader Config"
+ ],
+ {
+ "title_aux": "ComfyUI Checkpoint Loader Config"
+ }
+ ],
+ "https://github.com/CypherNaught-0x/ComfyUI_resolution_presets": [
+ [
+ "ResolutionPresets",
+ "ResolutionPresetsAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI_resolution_presets"
+ }
+ ],
+ "https://github.com/Cyrostar/Artha-Gemini": [
+ [
+ "Gemini Backdrop",
+ "Gemini Body",
+ "Gemini Camera",
+ "Gemini Cloth",
+ "Gemini Compose",
+ "Gemini Condense",
+ "Gemini Face",
+ "Gemini Form",
+ "Gemini Imagen",
+ "Gemini Instruct",
+ "Gemini Light",
+ "Gemini Makeup",
+ "Gemini Markdown",
+ "Gemini Motion",
+ "Gemini Operation",
+ "Gemini Portrait",
+ "Gemini Prompter",
+ "Gemini Question",
+ "Gemini Response",
+ "Gemini Scenery",
+ "Gemini Speech",
+ "Gemini Style",
+ "Gemini Subject",
+ "Gemini Translate",
+ "Gemini Vision"
+ ],
+ {
+ "title_aux": "Artha-Gemini"
+ }
+ ],
+ "https://github.com/Cyrostar/Artha-Projekt": [
+ [
+ "Project Pause",
+ "Project Prefix",
+ "Project Seed",
+ "Project Setup"
+ ],
+ {
+ "title_aux": "Artha-Projekt"
+ }
+ ],
+ "https://github.com/Cyrostar/ComfyUI-Artha-Nodes": [
+ [
+ "ArthaFlowPause",
+ "ArthaGeminiBody",
+ "ArthaGeminiCamera",
+ "ArthaGeminiCloth",
+ "ArthaGeminiCompose",
+ "ArthaGeminiCondense",
+ "ArthaGeminiFace",
+ "ArthaGeminiForm",
+ "ArthaGeminiImagen",
+ "ArthaGeminiInstruct",
+ "ArthaGeminiLight",
+ "ArthaGeminiMakeup",
+ "ArthaGeminiMarkdown",
+ "ArthaGeminiMotion",
+ "ArthaGeminiOperation",
+ "ArthaGeminiPortrait",
+ "ArthaGeminiPrompter",
+ "ArthaGeminiQuestion",
+ "ArthaGeminiResponse",
+ "ArthaGeminiScenery",
+ "ArthaGeminiSpeech",
+ "ArthaGeminiStyle",
+ "ArthaGeminiSubject",
+ "ArthaGeminiTranslate",
+ "ArthaGeminiVision",
+ "ArthaImageColorMatch",
+ "ArthaImagePreview",
+ "ArthaImageSave",
+ "ArthaImageTransform",
+ "ArthaInputSelector",
+ "ArthaLogicBasic",
+ "ArthaLogicCompare",
+ "ArthaLogicGate",
+ "ArthaLogicPassthru",
+ "ArthaLogicPrint",
+ "ArthaMathF2I",
+ "ArthaMathFloat",
+ "ArthaMathI2F",
+ "ArthaMathInteger",
+ "ArthaMathNumber",
+ "ArthaMathOperation",
+ "ArthaMathRandom",
+ "ArthaProjectPrefix",
+ "ArthaProjectSeed",
+ "ArthaProjectSetup"
+ ],
+ {
+ "title_aux": "ComfyUI-Artha-Nodes"
+ }
+ ],
+ "https://github.com/D-Ogi/ComfyUI-Attention-Optimizer": [
+ [
+ "AttentionOptimizer"
+ ],
+ {
+ "title_aux": "ComfyUI-Attention-Optimizer"
+ }
+ ],
+ "https://github.com/DJ-Tribefull/Comfyui_FOCUS_nodes": [
+ [
+ "Control Pipe (Focus Nodes)",
+ "FOCUS Upscale (Focus Nodes)",
+ "Global Seed Controller (Focus Nodes)",
+ "KSampler Settings (Focus Nodes)",
+ "Model Unloader (Focus Nodes)",
+ "Prompt Box (Focus Nodes)",
+ "SDXL All-In-One (Focus Nodes)",
+ "SDXL Control Module (Focus Nodes)",
+ "SDXL Preprocess (Focus Nodes)",
+ "Style Injector (Focus Nodes)",
+ "Style Selector (Focus Nodes)",
+ "Text Display (Focus Nodes)",
+ "Wildcard Processor (Focus Nodes)"
+ ],
+ {
+ "title_aux": "Comfyui FOCUS nodes"
+ }
+ ],
+ "https://github.com/DN2048/dn_little_helpers": [
+ [
+ "DNLHBooleanToOther",
+ "DNLHIsGroupActive"
+ ],
+ {
+ "title_aux": "dn_little_helpers"
+ }
+ ],
+ "https://github.com/DaLongZhuaZi/ComfyUI-Gemini-Prompt-Studio": [
+ [
+ "GeminiPromptStudio_T2I_I2V"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemini-Prompt-Studio"
+ }
+ ],
+ "https://github.com/DanPli/ComfyUI-Flux2LatentPresets": [
+ [
+ "Flux2EmptyLatentPresets"
+ ],
+ {
+ "title_aux": "ComfyUI-Flux2LatentPresets"
+ }
+ ],
+ "https://github.com/Danand/ComfyUI-ComfyCouple": [
+ [
+ "Attention couple",
+ "Comfy Couple"
+ ],
+ {
+ "author": "Rei D.",
+ "description": "If you want to draw two different characters together without blending their features, so you could try to check out this custom node.",
+ "nickname": "Danand",
+ "title": "Comfy Couple",
+ "title_aux": "Comfy Couple"
+ }
+ ],
+ "https://github.com/DanielHabib/ComfyUI-Voxels": [
+ [
+ "ImageBatchToImageList",
+ "MaskBatchToMaskList",
+ "MeshToVoxel",
+ "VoxelBlockLoader",
+ "VoxelBlockSaver",
+ "VoxelBlocksIntoVoxelVideo",
+ "VoxelVideoAPIInputNode",
+ "VoxelVideoLoader",
+ "VoxelVideoPreview",
+ "VoxelVideoViewer",
+ "VoxelViewer",
+ "VoxelizeMesh"
+ ],
+ {
+ "title_aux": "ComfyUI-Voxels"
+ }
+ ],
+ "https://github.com/DanielPFlorian/ComfyUI-WorkflowGenerator": [
+ [
+ "NodeValidator",
+ "WG_Pipeline",
+ "WG_UpdateNodeCatalog",
+ "WorkflowBuilder",
+ "WorkflowGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-WorkflowGenerator"
+ }
+ ],
+ "https://github.com/DaniilVdovin/ComfyUI-prompt-templating": [
+ [
+ "PromptTemplateGetManyRandomTemplates",
+ "PromptTemplateJson",
+ "PromptTemplateJsonConstructor",
+ "PromptTemplateKeyValue"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Template"
+ }
+ ],
+ "https://github.com/DanrisiUA/ComfyUI-ZImage-LoRA-Merger": [
+ [
+ "ZImageLoRAMergeToSingle",
+ "ZImageLoRAMerger",
+ "ZImageLoRAStack",
+ "ZImageLoRAStackApply",
+ "ZImageLoRATrueMerge"
+ ],
+ {
+ "title_aux": "ComfyUI-ZImage-LoRA-Merger"
+ }
+ ],
+ "https://github.com/Daohoi123/ComfyUI-Gemini3": [
+ [
+ "Gemini3ProImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemini3"
+ }
+ ],
+ "https://github.com/DareFail/ComfyUI-Roboflow": [
+ [
+ "CustomWorkflow_1image",
+ "LabelEmotions",
+ "RemoveBackground"
+ ],
+ {
+ "title_aux": "ComfyUI-Roboflow"
+ }
+ ],
+ "https://github.com/DarioFT/ComfyUI-VideoDirCombiner": [
+ [
+ "VideoDirCombiner"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoDirCombiner"
+ }
+ ],
+ "https://github.com/DataCTE/prompt_injection": [
+ [
+ "AdvancedPromptInjection",
+ "AdvancedSD15PromptInjection",
+ "PromptInjection",
+ "SD15PromptInjection",
+ "SimplePromptInjection",
+ "SimpleSD15PromptInjection"
+ ],
+ {
+ "title_aux": "Prompt Injection Node for ComfyUI"
+ }
+ ],
+ "https://github.com/DavidPiazza/network_bending": [
+ [
+ "InvertedPruning",
+ "LatentFormatConverter",
+ "ModelMixer",
+ "NetworkBending",
+ "NetworkBendingAdvanced",
+ "VAEChannelManipulator",
+ "VAELatentBending",
+ "VAEMixer",
+ "VAENetworkBending"
+ ],
+ {
+ "title_aux": "Network Bending for ComfyUI"
+ }
+ ],
+ "https://github.com/Daxamur/DaxNodes": [
+ [
+ "DaxGetStringByIndex",
+ "DaxStringSplitter",
+ "FaceFrameDetector",
+ "ResolutionPickerFLF2V",
+ "ResolutionPickerI2V",
+ "ResolutionPickerT2V",
+ "RuntimeGenerationLengthSet",
+ "TrimBatch",
+ "VideoColorCorrectV3",
+ "VideoPreview",
+ "VideoSave",
+ "VideoSegmentCombinerV2",
+ "VideoSegmentSaverV2",
+ "VideoSegmentStateLoader",
+ "VideoStreamRIFEVFI",
+ "VideoStreamUpscaler",
+ "WANResolutionPicker"
+ ],
+ {
+ "title_aux": "DaxNodes"
+ }
+ ],
+ "https://github.com/Dayuppy/ComfyUI-DiscordWebhook": [
+ [
+ "DiscordPostViaWebhook",
+ "DiscordSetWebhook",
+ "Set Discord Webhook",
+ "Use Discord Webhook"
+ ],
+ {
+ "author": "Dayuppy",
+ "description": "A very simple Discord webhook integration node for ComfyUI that lets you post images and text.",
+ "nickname": "DiscordWebhook",
+ "title": "Discord Webhook",
+ "title_aux": "Discord Webhook"
+ }
+ ],
+ "https://github.com/DazzleNodes/ComfyUI-Smart-Resolution-Calc": [
+ [
+ "SmartResolutionCalc"
+ ],
+ {
+ "title_aux": "Smart Resolution Calculator"
+ }
+ ],
+ "https://github.com/DazzleNodes/DazzleNodes": [
+ [
+ "FitMaskToImage",
+ "JDC_AutoContrast",
+ "JDC_BlendImages",
+ "JDC_BrownNoise",
+ "JDC_Contrast",
+ "JDC_EqualizeGrey",
+ "JDC_GaussianBlur",
+ "JDC_GreyNoise",
+ "JDC_Greyscale",
+ "JDC_ImageLoader",
+ "JDC_ImageLoaderMeta",
+ "JDC_OmniNoise",
+ "JDC_PinkNoise",
+ "JDC_Plasma",
+ "JDC_PlasmaSampler",
+ "JDC_PowerImage",
+ "JDC_RandNoise",
+ "JDC_ResizeFactor",
+ "PreviewBridgeExtended",
+ "SmartResolutionCalc"
+ ],
+ {
+ "author": "djdarcy",
+ "description": "Collection of productivity custom nodes for ComfyUI workflows",
+ "nickname": "DazzleNodes",
+ "title": "DazzleNodes",
+ "title_aux": "DazzleNodes Collection"
+ }
+ ],
+ "https://github.com/DazzleNodes/fit-mask-to-image": [
+ [
+ "FitMaskToImage"
+ ],
+ {
+ "title_aux": "ComfyUI Fit Mask to Image"
+ }
+ ],
+ "https://github.com/De-Zoomer/ComfyUI-DeZoomer-Nodes": [
+ [
+ "CaptionRefinement",
+ "VideoCaptioning"
+ ],
+ {
+ "title_aux": "ComfyUI-DeZoomer-Nodes"
+ }
+ ],
+ "https://github.com/DeJoker/pipeline-parallel-comfy": [
+ [
+ "PipelineParallel"
+ ],
+ {
+ "title_aux": "Pipeline Parallel ComfyUI"
+ }
+ ],
+ "https://github.com/Deathspike/ComfyUI-MyOriginalWaifu": [
+ [
+ "MyOriginalWaifu",
+ "MyOriginalWaifuCLIP"
+ ],
+ {
+ "title_aux": "ComfyUI-MyOriginalWaifu"
+ }
+ ],
+ "https://github.com/DebugPadawan/DebugPadawans-ComfyUI-Essentials": [
+ [
+ "DebugPadawan_ConditionalString",
+ "DebugPadawan_DebugPrint",
+ "DebugPadawan_ListInfo",
+ "DebugPadawan_TextJoiner",
+ "DebugPadawan_TextSplitter",
+ "DebugPadawan_TextToJSON",
+ "DebugPadawan_WaitNode"
+ ],
+ {
+ "title_aux": "DebugPadawan's ComfyUI Essentials"
+ }
+ ],
+ "https://github.com/DecartAI/Lucy-Edit-ComfyUI": [
+ [
+ "LucyConditionConcatNode",
+ "LucyEditProAPINode"
+ ],
+ {
+ "title_aux": "Lucy-Edit-ComfyUI"
+ }
+ ],
+ "https://github.com/DeemosTech/ComfyUI-Rodin": [
+ [
+ "LoadRodinAPIKEY",
+ "Rodin3D_bbox_controlnet",
+ "mRodin3D_Detail",
+ "mRodin3D_Gen2",
+ "mRodin3D_Regular",
+ "mRodin3D_Sketch",
+ "mRodin3D_Smooth"
+ ],
+ {
+ "title_aux": "ComfyUI-Rodin"
+ }
+ ],
+ "https://github.com/Deep-Neko/ComfyUI_ascii_art": [
+ [
+ "AsciiGenerator"
+ ],
+ {
+ "author": "DeepNeko ",
+ "title_aux": "ascii-art-comfyui"
+ }
+ ],
+ "https://github.com/Dehypnotic/comfyui-aspect-ratio-advanced": [
+ [
+ "AspectRatioAdvanced"
+ ],
+ {
+ "title_aux": "AspectRatioAdvanced"
+ }
+ ],
+ "https://github.com/Dehypnotic/comfyui-dehypnotic-save-nodes": [
+ [
+ "SaveAudioMP3Dehypnotic",
+ "SaveImagesDehypnotic",
+ "SaveVideoDehypnotic"
+ ],
+ {
+ "title_aux": "Dehypnotic Save nodes"
+ }
+ ],
+ "https://github.com/Dehypnotic/comfyui-numbered-text": [
+ [
+ "NumberedText"
+ ],
+ {
+ "title_aux": "NumberedText"
+ }
+ ],
+ "https://github.com/Dehypnotic/comfyui-range-to-string": [
+ [
+ "RangeToString"
+ ],
+ {
+ "title_aux": "RangeToString"
+ }
+ ],
+ "https://github.com/DemonAlone/SimpeStringGenerator_ComfyUI": [
+ [
+ "AnyAdapterNode",
+ "AnyConcatNode",
+ "CheckpointSelectorNode",
+ "ClipSkipSliderNode",
+ "DA_Base_KSampler",
+ "DA_Enhanced_KSampler",
+ "DiffusionModelGeneratorNode",
+ "DiffusionModelSelectorNode",
+ "ImageResizeNode",
+ "LORASelectorNode",
+ "LoadImageWithMetadataNode",
+ "MaskDebugNode",
+ "ModelGeneratorNode",
+ "OptionalCondMergeNode",
+ "PonyPrefixesNode",
+ "ResizeInterpolationControlNode",
+ "ResizeMethodControl",
+ "ResizeMethodControlNode",
+ "SamplerGeneratorNode",
+ "ScaleImageAspectNode",
+ "SchedulerGeneratorNode",
+ "ShiftSliderNode",
+ "StringToFloatNode",
+ "StringToIntNode",
+ "TextConcatNode",
+ "TextEncoderGeneratorNode",
+ "TextEncoderSelectorNode",
+ "VAEGeneratorNode",
+ "VAESelectorNode",
+ "\u0421heckpointSelectorNode"
+ ],
+ {
+ "title_aux": "SimpeStringGenerator_ComfyUI"
+ }
+ ],
+ "https://github.com/DemonNCoding/PromptGenerator12Columns": [
+ [
+ "PromptGenerator12Columns_Empty",
+ "PromptGenerator12Columns_Prefilled",
+ "PromptGenerator12Columns_PrefilledNSFW"
+ ],
+ {
+ "title_aux": "PromptGenerator 12-Columns"
+ }
+ ],
+ "https://github.com/DenRakEiw/ComfyUI-nearest-qwen-resolution": [
+ [
+ "NearestQwenResolution"
+ ],
+ {
+ "title_aux": "ComfyUI-nearest-qwen-resolution"
+ }
+ ],
+ "https://github.com/DenRakEiw/Latent_Nodes": [
+ [
+ "LatentColorMatch",
+ "LatentColorMatchSimple",
+ "LatentImageAdjust"
+ ],
+ {
+ "title_aux": "ComfyUI Latent Color Tools"
+ }
+ ],
+ "https://github.com/DenRakEiw/WAN_NN_Latent_Upscale": [
+ [
+ "UniversalNNLatentUpscale"
+ ],
+ {
+ "title_aux": "Universal NN Latent Upscaler for ComfyUI"
+ }
+ ],
+ "https://github.com/Derfuu/Derfuu_ComfyUI_ModdedNodes": [
+ [],
+ {
+ "author": "Derfuu",
+ "description": "Pack of simple (or not) and modded nodes for scaling images/latents, editing numbers or text. Automate calculations depending on image sizes or any other thing you want. Or randomize any number in your workflow. Debug node included.",
+ "nickname": "Derfuu simple/modded Nodes",
+ "nodename_pattern": "^DF_",
+ "title": "Derfuu simple/modded Nodes",
+ "title_aux": "Derfuu_ComfyUI_ModdedNodes"
+ }
+ ],
+ "https://github.com/DesertPixelAi/ComfyUI-DP-Ideogram-Character": [
+ [
+ "DP_IdeogramCharacter"
+ ],
+ {
+ "title_aux": "ComfyUI DP Ideogram Character Node"
+ }
+ ],
+ "https://github.com/DesertPixelAi/ComfyUI-Desert-Pixel-Nodes": [
+ [
+ "DP 10 Images Switch Or Batch",
+ "DP 10 String Switch Or Connect",
+ "DP 2 String Switch",
+ "DP 3 Images Switch Or Batch",
+ "DP 3 String Switch Or Connect",
+ "DP 5 Find And Replace",
+ "DP 5 Image And Mask Switch",
+ "DP 5 Images Switch Or Batch",
+ "DP 5 String Switch Or Connect",
+ "DP Add Background To Png",
+ "DP Add Weight To String Sdxl",
+ "DP Advanced Sampler",
+ "DP Advanced Weight String Sdxl",
+ "DP Animation Calculator 10 Inputs",
+ "DP Animation Calculator 5 Inputs",
+ "DP Art Style Generator",
+ "DP Aspect Ratio Picker",
+ "DP Big Letters",
+ "DP Broken Token",
+ "DP Clean Prompt",
+ "DP Clean Prompt Travel",
+ "DP Condition Switch",
+ "DP ControlNet Apply Advanced",
+ "DP Crazy Prompt Mixer",
+ "DP Create Json File",
+ "DP Custom Aspect Ratio",
+ "DP Diff Int 8step Selector",
+ "DP Draggable Floats 1",
+ "DP Draggable Floats 2",
+ "DP Draggable Floats 3",
+ "DP Draggable Int 1step",
+ "DP Draggable Int 4step",
+ "DP Draggable Int 8step",
+ "DP Extract Mask",
+ "DP Fast Slow Motion",
+ "DP Five Lora",
+ "DP Five Lora Random",
+ "DP Float Stepper",
+ "DP Get Seed From Image",
+ "DP IF Int Condition",
+ "DP Image And String Pairs Switch",
+ "DP Image Color Analyzer",
+ "DP Image Color Analyzer Small",
+ "DP Image Color Effect",
+ "DP Image Effect Processor",
+ "DP Image Effect Processor Small",
+ "DP Image Empty Latent Switch Flux",
+ "DP Image Empty Latent Switch SDXL",
+ "DP Image Grid To Image",
+ "DP Image Slice To Grid",
+ "DP Image Slide Show",
+ "DP Image Strip",
+ "DP Image To Pixelgrid",
+ "DP Int 0 1000",
+ "DP Latent Split",
+ "DP Line Cycler",
+ "DP Load Checkpoint With Info",
+ "DP Load Controlnet Model With Name",
+ "DP Load Dual CLIP With Info",
+ "DP Load Image Effects",
+ "DP Load Image Effects Small",
+ "DP Load Image Folder",
+ "DP Load Image Minimal",
+ "DP Load Image V2",
+ "DP Load Image With Seed",
+ "DP Load UNET With Info",
+ "DP Logo Animator",
+ "DP Lora Random Strength Controller",
+ "DP Lora Strength Controller",
+ "DP Mask Settings",
+ "DP Place Image",
+ "DP Prompt Inverter",
+ "DP Prompt Manager Small",
+ "DP Prompt Mode Controller",
+ "DP Prompt Styler",
+ "DP Prompt Token Compressor",
+ "DP Prompt Travel Prompt",
+ "DP Quick Model Link",
+ "DP Random Character",
+ "DP Random Crazy Prompt Generator",
+ "DP Random Logo Style Generator",
+ "DP Random Min Max",
+ "DP Random Mode Controller",
+ "DP Random Mode Switch",
+ "DP Random Psychedelic Punk Generator",
+ "DP Random Superhero Prompt Generator",
+ "DP Random Vehicle Generator",
+ "DP Resize Image And Mask",
+ "DP Sampler With Info",
+ "DP Save Image V2",
+ "DP Save Preview Image",
+ "DP Stitch 2 Images",
+ "DP String Text",
+ "DP String Text With Sdxl Weight",
+ "DP Strip Edge Masks",
+ "DP Switch Controller",
+ "DP Text Preview",
+ "DP Transition Frames Selector",
+ "DP Versatile Prompt Subjects Generator",
+ "DP Video Effect Receiver",
+ "DP Video Effect Sender",
+ "DP Video Flicker",
+ "DP Video Looper",
+ "DP Video Transition",
+ "DP Words",
+ "DP_Crazy_Prompt_Mixer",
+ "DP_Float_Stepper",
+ "DP_Image_To_Pixelgrid",
+ "DP_Prompt_Inverter"
+ ],
+ {
+ "title_aux": "ComfyUI-Desert-Pixel-Nodes"
+ }
+ ],
+ "https://github.com/DesertPixelAi/comfyui-dp-them-styler": [
+ [
+ "DP_Add_Logo_Banner",
+ "DP_Advanced_Sampler_Modified",
+ "DP_Dynamic_Random_Styler",
+ "DP_Gender_Age_Detector"
+ ],
+ {
+ "title_aux": "ComfyUI DP Dynamic Random Styler"
+ }
+ ],
+ "https://github.com/DevDuckFace/KsamplerDF": [
+ [
+ "KsamplerDF"
+ ],
+ {
+ "title_aux": "KsamplerDF"
+ }
+ ],
+ "https://github.com/Devourer56/ComfyUI-Impact-BIGdetector-BBOX-SEGS": [
+ [
+ "CascadeDetectorAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-Impact-BIGdetector-BBOX-SEGS"
+ }
+ ],
+ "https://github.com/DiaoDaiaChan/ComfyUI_API_Request": [
+ [
+ "Character_Prompt_Select",
+ "NovelAI_Request",
+ "NovelAI_Request_Payload",
+ "SDWebUI_Request",
+ "SDWebUI_Request_Payload",
+ "SDWebUI_Request_PayloadExtend"
+ ],
+ {
+ "title_aux": "Comfyui SDAPI Request / NovelAI"
+ }
+ ],
+ "https://github.com/DiffusionLight/DiffusionLight-ComfyUI": [
+ [
+ "DiffusionLightBall2Envmap",
+ "DiffusionLightChromeballMask",
+ "DiffusionLightExposure2HDR",
+ "DiffusionLightExposureBracket",
+ "DiffusionLightPadBlackBorder",
+ "DiffusionLightPercentileToPixelValueTonemap",
+ "DiffusionLightSaveHDR"
+ ],
+ {
+ "title_aux": "DiffusionLight-ComfyUI"
+ }
+ ],
+ "https://github.com/Diohim/ComfyUI-Unusual-Tools": [
+ [
+ "AdjustCrop",
+ "AutoImageResize",
+ "BatchLoadLatentImage",
+ "BatchSaveLatentImage",
+ "FillMaskWithColor"
+ ],
+ {
+ "title_aux": "ComfyUI Unusual Tools"
+ }
+ ],
+ "https://github.com/Dobidop/ComfyStereo": [
+ [
+ "NativeStereoImageViewer",
+ "NativeStereoVideoViewer",
+ "NativeVRStatus",
+ "StereoDiffusion",
+ "StereoImageNode"
+ ],
+ {
+ "title_aux": "Dobidop ComfyStereo"
+ }
+ ],
+ "https://github.com/DoctorDiffusion/ComfyUI-BEN": [
+ [
+ "BackgroundEraseNetwork"
+ ],
+ {
+ "title_aux": "ComfyUI BEN - Background Erase Network"
+ }
+ ],
+ "https://github.com/DoctorDiffusion/ComfyUI-MediaMixer": [
+ [
+ "FinalFrameSelector",
+ "FirstFrameSelector",
+ "PromptJournal",
+ "ReverseFrameSequence",
+ "VideoMerge",
+ "YouTubeVideoDownloader"
+ ],
+ {
+ "title_aux": "MediaMixer"
+ }
+ ],
+ "https://github.com/DoctorDiffusion/ComfyUI-Schedulizer": [
+ [
+ "prompt_schedule_converter",
+ "whisper_node"
+ ],
+ {
+ "title_aux": "Schedulizer"
+ }
+ ],
+ "https://github.com/DoctorDiffusion/ComfyUI-SnakeOil": [
+ [
+ "NegativeLoRALoader"
+ ],
+ {
+ "title_aux": "ComfyUI-SnakeOil"
+ }
+ ],
+ "https://github.com/DoctorDiffusion/ComfyUI-basic-pitch": [
+ [
+ "AudioToMidi",
+ "SaveMidi"
+ ],
+ {
+ "title_aux": "ComfyUI-basic-pitch"
+ }
+ ],
+ "https://github.com/Dontdrunk/ComfyUI-DD-Nodes": [
+ [
+ "DD-AdvancedFusion",
+ "DD-AspectRatioSelector",
+ "DD-ConditionSwitcher",
+ "DD-DimensionCalculator",
+ "DD-ImageSizeLimiter",
+ "DD-ImageSplitter",
+ "DD-ImageStroke",
+ "DD-ImageToVideo",
+ "DD-ImageUniformSize",
+ "DD-LatentSwitcher",
+ "DD-MaskUniformSize",
+ "DD-ModelOptimizer",
+ "DD-ModelSwitcher",
+ "DD-QwenMTTranslator",
+ "DD-SimpleLatent",
+ "DD-TxtFileMerger",
+ "DD-VideoFrameExtractor"
+ ],
+ {
+ "title_aux": "ComfyUI-DD-Nodes"
+ }
+ ],
+ "https://github.com/DrMWeigand/ComfyUI-StereoVision": [
+ [
+ "AutostereogramGenerator",
+ "StereoCrafterInpainter",
+ "StereoscopicGenerator",
+ "StereoscopicGeneratorMax",
+ "StereoscopicGeneratorPro"
+ ],
+ {
+ "title_aux": "StereoVision Plugin for ComfyUI"
+ }
+ ],
+ "https://github.com/DrMWeigand/ComfyUI_ColorImageDetection": [
+ [
+ "ColorDetection",
+ "LABColorDetection",
+ "RGBColorDetection"
+ ],
+ {
+ "title_aux": "ComfyUI Color Detection Nodes"
+ }
+ ],
+ "https://github.com/DrStone71/ComfyUI-Prompt-Translator": [
+ [
+ "AT_CLIPTextTranslate",
+ "AT_CLIPTextTranslateAdvanced",
+ "AT_CombineConditioning",
+ "AT_ConditionalTranslate",
+ "AT_LanguagePackageManager",
+ "AT_PromptTextTranslate",
+ "AT_TextTranslate",
+ "AT_UniversalTextTranslate",
+ "CLIP Text Encode (Translate)",
+ "CLIP Text Translate Advanced",
+ "Combine Conditioning",
+ "Conditional Translate",
+ "Language Package Manager",
+ "Prompt Text (Translate)",
+ "Text Translate",
+ "Universal Text Translate"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Translator"
+ }
+ ],
+ "https://github.com/DraconicDragon/ComfyUI-RyuuNoodles": [
+ [
+ "Ryuu_CleanStringAdvanced",
+ "Ryuu_ColorMatch",
+ "Ryuu_ExtractAndSaveLora",
+ "Ryuu_FallbackPassthrough",
+ "Ryuu_FallbackSwitchAny",
+ "Ryuu_FallbackSwitchImage",
+ "Ryuu_FallbackSwitchLatent",
+ "Ryuu_FloatPlain",
+ "Ryuu_FloatPlainLarger",
+ "Ryuu_FloatSlider",
+ "Ryuu_IntSlider",
+ "Ryuu_IsMultipleOf",
+ "Ryuu_ScaleToMultiple",
+ "Ryuu_ScaleToMultipleAdvanced",
+ "Ryuu_ScaleToMultipleLatentSizePicker",
+ "Ryuu_TextEncoderDiffCheck",
+ "Ryuu_TokenCountTextBox",
+ "Ryuu_WaitNode"
+ ],
+ {
+ "title_aux": "ComfyUI-RyuuNoodles"
+ }
+ ],
+ "https://github.com/DraconicDragon/ComfyUI-Venice-API": [
+ [
+ "CharCountTextBox",
+ "GenerateImage_VENICE",
+ "GenerateSpeech_VENICE",
+ "GenerateTextAdvanced_VENICE",
+ "GenerateTextVeniceParameters_VENICE",
+ "GenerateText_VENICE",
+ "I2IEnhanceUpscale_VENICE"
+ ],
+ {
+ "title_aux": "ComfyUI-Venice-API"
+ }
+ ],
+ "https://github.com/Draek2077/comfyui-draekz-nodez": [
+ [
+ "Draekz Flux Resolutions",
+ "Draekz JoyCaption",
+ "Draekz Resolution Multiply",
+ "Draekz Resolutions By Ratio",
+ "DraekzJsonGetValue",
+ "DraekzLLMOptions",
+ "DraekzLLMPrompt",
+ "DraekzLoraLoader",
+ "DraekzResolutionMultiply",
+ "DraekzResolutions",
+ "DraekzResolutionsByRatio",
+ "DraekzSeed"
+ ],
+ {
+ "title_aux": "comfyui-draekz-nodez"
+ }
+ ],
+ "https://github.com/DragonDiffusionbyBoyo/BoyoSupercoolWrapper": [
+ [
+ "BoyoSuperCoolWrapper"
+ ],
+ {
+ "title_aux": "BoyoSupercoolWrapper"
+ }
+ ],
+ "https://github.com/DragonDiffusionbyBoyo/Boyonodes": [
+ [
+ "BoyoApplyIPAdapterZImage",
+ "BoyoAssetGrabberAdvanced",
+ "BoyoAssetGrabberSimple",
+ "BoyoAudioDurationAnalyzer",
+ "BoyoAudioEval",
+ "BoyoAudioPadder",
+ "BoyoChainBastardLoops",
+ "BoyoChatterboxTurboGenerate",
+ "BoyoChatterboxTurboLoader",
+ "BoyoCompare",
+ "BoyoExecutionBarrier",
+ "BoyoForLoopEnd",
+ "BoyoForLoopStart",
+ "BoyoFrameCounter",
+ "BoyoFramePackLoRA",
+ "BoyoIPAdapterZImageLoader",
+ "BoyoImageCrop",
+ "BoyoImageGrab",
+ "BoyoIncontextSaver",
+ "BoyoLatentCacheUpdater",
+ "BoyoLatentPassthrough",
+ "BoyoLatentSwitch",
+ "BoyoLoRAConfigInspector",
+ "BoyoLoRAConfigProcessor",
+ "BoyoLoRAJSONBuilder",
+ "BoyoLoRAPairedLoader",
+ "BoyoLoRAPathForwarder",
+ "BoyoLoadImageList",
+ "BoyoLoopCollector",
+ "BoyoLoopCounter",
+ "BoyoLoopImageSaver",
+ "BoyoLoopReset",
+ "BoyoLorainforsender",
+ "BoyoMathInt",
+ "BoyoOverlapSwitch",
+ "BoyoPainterSVI",
+ "BoyoPairedImageSaver",
+ "BoyoPairedSaver",
+ "BoyoPromptInjector",
+ "BoyoPromptLoop",
+ "BoyoQwenVLGrounding",
+ "BoyoResolutionCalc",
+ "BoyoSaver",
+ "BoyoStoryboardJsonParser",
+ "BoyoStoryboardOutput",
+ "BoyoStoryboardPrompt",
+ "BoyoTiledVAEDecode",
+ "BoyoVACEInjector",
+ "BoyoVACEViewer",
+ "BoyoVAEDecode",
+ "BoyoVideoClipper",
+ "BoyoVideoCutter",
+ "BoyoVideoLengthCalculator",
+ "BoyoVideoPairedSaver",
+ "BoyoVideoSaver",
+ "BoyoVision",
+ "BoyoVoiceEnhancer",
+ "BoyoWhileLoopEnd",
+ "BoyoWhileLoopStart",
+ "Boyolatent",
+ "MandelbrotVideo"
+ ],
+ {
+ "title_aux": "Boyonodes"
+ }
+ ],
+ "https://github.com/Dream-Pixels-Forge/ComfyUI-Mzikart-Mixer": [
+ [
+ "ArrangementEnforcer",
+ "AudioPostProcessor",
+ "CompressorNode",
+ "LimiterNode",
+ "MasteringEffects"
+ ],
+ {
+ "title_aux": "ComfyUI Mzikart Mixer"
+ }
+ ],
+ "https://github.com/Duanyll/comfyui_functional": [
+ [
+ "CallClosure",
+ "CallClosureRemote",
+ "HighLevelComap",
+ "HighLevelFold",
+ "HighLevelMap",
+ "HighLevelMapIndexed",
+ "HighLevelNest",
+ "HighLevelNestWhile",
+ "HighLevelSelect",
+ "HighLevelTakeWhile",
+ "IfCondition",
+ "Latch",
+ "LogicalAnd",
+ "LogicalOr",
+ "Sleep",
+ "__CreateClosure__",
+ "__Deserialize__",
+ "__FunctionEnd__",
+ "__FunctionParam__",
+ "__InspectImpl__",
+ "__InspectPassthru__",
+ "__Inspect__",
+ "__IntermidiateCoroutine__",
+ "__Reap__",
+ "__RecoverList__",
+ "__Serialize__",
+ "__Sow__"
+ ],
+ {
+ "title_aux": "ComfyUI Functional"
+ }
+ ],
+ "https://github.com/Duanyll/duanyll_nodepack": [
+ [
+ "AsAny",
+ "BBoxCrop",
+ "BBoxImageStitcher",
+ "BBoxesToImpactPackSegs",
+ "ChannelIncrementalConstrainedCFGGuiderNode",
+ "CoverWordsWithRectangles",
+ "CreateArkClient",
+ "CreateS3Client",
+ "DiffusersFluxScheduler",
+ "DiffusersRandomNoise",
+ "DownloadImageFromUrl",
+ "DrawBBox",
+ "DrawBBoxMask",
+ "DrawTextInBBox",
+ "DumpJson",
+ "ExpandBBoxByRatio",
+ "FillBBoxWithImage",
+ "FluxKontextTrue3DPE",
+ "FluxTextLoraLoader",
+ "GetTextBBoxWithAnchor",
+ "HfCheckpointLoader",
+ "HfClipLoader",
+ "HfDiffusionModelLoader",
+ "HfDualClipLoader",
+ "HfLoraLoader",
+ "HfLoraLoaderModelOnly",
+ "HfQuadrupleClipLoader",
+ "HfTripleClipLoader",
+ "HfVaeLoader",
+ "ImageCropFromPadded",
+ "ImageDifferenceCmap",
+ "ImageLinstretch",
+ "ImagePadToResolution",
+ "InsightFaceSimilarity",
+ "JsonPathQuery",
+ "JsonPathQuerySingle",
+ "JsonPathUpdate",
+ "LaplacianVariance",
+ "LlmChatAddMessage",
+ "LlmChatCompletion",
+ "LlmClientSetSeed",
+ "LlmCreateChat",
+ "LlmCreateClient",
+ "MaskLinstretch",
+ "MaskToBBox",
+ "MergeBBoxes",
+ "ParseBBoxQwenVL",
+ "ParseJson5",
+ "ParseLlmJsonOutput",
+ "PhotoDoddleConditioning",
+ "QwenImageClipEnforceBfloat16",
+ "ReadTextFile",
+ "SeedEditNode",
+ "StringFormat",
+ "TextContainsChinese",
+ "UploadImageToS3",
+ "VllmHunyuanImage3Node"
+ ],
+ {
+ "title_aux": "Duanyll Nodepack"
+ }
+ ],
+ "https://github.com/EMkrtchyan/ComfyUI-NormalsToDepth": [
+ [
+ "DepthMathCombiner",
+ "FrankotChellappa",
+ "PoissonReconstruction"
+ ],
+ {
+ "title_aux": "ComfyUI-NormalsToDepth"
+ }
+ ],
+ "https://github.com/Eagle-CN/ComfyUI-Addoor": [
+ [
+ "AD_AnyFileList",
+ "AD_BatchImageLoadFromDir",
+ "AD_CSVPromptStyler",
+ "AD_CSVReader",
+ "AD_CSVTranslator",
+ "AD_DeleteLocalAny",
+ "AD_FluxTrainStepMath",
+ "AD_HFDownload",
+ "AD_ImageDrawRectangleSimple",
+ "AD_ImageIndexer",
+ "AD_ImageSaver",
+ "AD_LoadImageAdvanced",
+ "AD_PromptReplace",
+ "AD_TextIndexer",
+ "AD_TextListToString",
+ "AD_TextSaver",
+ "AD_TxtToCSVCombiner",
+ "AD_ZipSave",
+ "AD_advanced-padding",
+ "AD_color-image",
+ "AD_image-concat",
+ "AD_image-resize",
+ "AD_mockup-maker",
+ "AD_poster-maker",
+ "AD_prompt-saver",
+ "ImageCaptioner",
+ "ImageResize",
+ "Incrementer \ud83e\udeb4",
+ "TextAppendNode",
+ "Width and height for scaling image to ideal resolution \ud83e\udeb4",
+ "Width and height from aspect ratio \ud83e\udeb4",
+ "YANC.MultilineString",
+ "comfyui-easy-padding",
+ "image concat mask"
+ ],
+ {
+ "author": "ComfyUI Addoor",
+ "description": "Save prompts to CSV file with customizable naming pattern",
+ "title": "ComfyUI-PromptSaver",
+ "title_aux": "ComfyUI-Addoor"
+ }
+ ],
+ "https://github.com/Easymode-ai/ComfyUI-BPT": [
+ [
+ "TrimeshBPT",
+ "TrimeshLoad",
+ "TrimeshPreview",
+ "TrimeshSave"
+ ],
+ {
+ "title_aux": "ComfyUI-BPT"
+ }
+ ],
+ "https://github.com/Easymode-ai/ComfyUI-FlexPainter": [
+ [
+ "ContinueFromRGBNode",
+ "FlexPainter"
+ ],
+ {
+ "title_aux": "FlexPainter ComfyUI Wrapper"
+ }
+ ],
+ "https://github.com/Easymode-ai/ComfyUI-ShadowR": [
+ [
+ "ShadowRModelLoader",
+ "ShadowRShadowRemover"
+ ],
+ {
+ "title_aux": "ComfyUI-ShadowR"
+ }
+ ],
+ "https://github.com/EeroHeikkinen/ComfyUI-eesahesNodes": [
+ [
+ "InstantX Flux Union ControlNet Loader"
+ ],
+ {
+ "author": "eesahe",
+ "description": "InstantX's Flux union ControlNet loader and implementation",
+ "nickname": "eesahesNodes",
+ "title": "eesahe's Nodes",
+ "title_aux": "ComfyUI-eesahesNodes"
+ }
+ ],
+ "https://github.com/Elaine-chennn/comfyui-overlay-media": [
+ [
+ "OverlayMediaNode",
+ "VideoUpload"
+ ],
+ {
+ "title_aux": "ComfyUI Overlay Media Node"
+ }
+ ],
+ "https://github.com/Electrofried/ComfyUI-OpenAINode": [
+ [
+ "OpenAINode"
+ ],
+ {
+ "title_aux": "OpenAINode"
+ }
+ ],
+ "https://github.com/EllangoK/ComfyUI-post-processing-nodes": [
+ [
+ "ArithmeticBlend",
+ "AsciiArt",
+ "Blend",
+ "Blur",
+ "CannyEdgeMask",
+ "ChromaticAberration",
+ "ColorCorrect",
+ "ColorTint",
+ "Dissolve",
+ "Dither",
+ "DodgeAndBurn",
+ "FilmGrain",
+ "Glow",
+ "HSVThresholdMask",
+ "KMeansQuantize",
+ "KuwaharaBlur",
+ "Parabolize",
+ "PencilSketch",
+ "PixelSort",
+ "Pixelize",
+ "Quantize",
+ "Sharpen",
+ "SineWave",
+ "Solarize",
+ "Vignette"
+ ],
+ {
+ "title_aux": "ComfyUI-post-processing-nodes"
+ }
+ ],
+ "https://github.com/EmAySee/ComfyUI_EmAySee_CustomNodes": [
+ [
+ "EmAySee_AnyPassthrough",
+ "EmAySee_CalculateAspectRatio",
+ "EmAySee_CheckboxFloatNode",
+ "EmAySee_ConditionalResize",
+ "EmAySee_DateTimeStringNode",
+ "EmAySee_DimensionSwapper",
+ "EmAySee_DynamicRangeSlider",
+ "EmAySee_DynamicStringSelectorNode",
+ "EmAySee_FloatToText",
+ "EmAySee_GeminiImageGen",
+ "EmAySee_GetModelPath",
+ "EmAySee_GreaterThanNode",
+ "EmAySee_HostPinger",
+ "EmAySee_ImageGetSize",
+ "EmAySee_ImagePassthrough",
+ "EmAySee_ImagePreviewPassthrough",
+ "EmAySee_IntegerStringSelectorNode",
+ "EmAySee_IntegerStringSelectorNodeDynamic",
+ "EmAySee_LLMOutputCleaner",
+ "EmAySee_LatentSwitch",
+ "EmAySee_LoRA Metadata Extractor TagDrop",
+ "EmAySee_LoRAMetadataExtractor",
+ "EmAySee_LoRAMetadataExtractorTagDrop",
+ "EmAySee_LoraApplier",
+ "EmAySee_LoraFilePicker",
+ "EmAySee_LoraLoaderFromInput",
+ "EmAySee_LoraNameSelector",
+ "EmAySee_LoraProcessor",
+ "EmAySee_LoraSelector",
+ "EmAySee_LoraStacker20",
+ "EmAySee_MathExpression",
+ "EmAySee_MetadataFormatter",
+ "EmAySee_MultiMaskToBBOX",
+ "EmAySee_MultiplierNode",
+ "EmAySee_NineChoiceSelector",
+ "EmAySee_PadImageForOutpainting",
+ "EmAySee_ProbabilityStringSelectorNode",
+ "EmAySee_QwenPixelAligner",
+ "EmAySee_RandomIntFromList",
+ "EmAySee_RandomIntegerFromListNode",
+ "EmAySee_RandomIntegerFromTogglesNode_PremadeLabels",
+ "EmAySee_RandomLoraLoader",
+ "EmAySee_RandomStringSelector",
+ "EmAySee_RandomStringSelectorNode",
+ "EmAySee_RandomStringSelectorNodeFourChoice",
+ "EmAySee_RandomStringSelectorNodeThreeChoice",
+ "EmAySee_RemoveDuplicateCSV",
+ "EmAySee_RemoveDuplicatesFromString",
+ "EmAySee_RemoveDuplicatesFromStringV2",
+ "EmAySee_RemoveWordsFromText",
+ "EmAySee_RepaintKSampler",
+ "EmAySee_SaveImage",
+ "EmAySee_SaveTextToFile",
+ "EmAySee_StringDetector",
+ "EmAySee_StringPoseSelectorNode",
+ "EmAySee_StringTupleInputNode",
+ "EmAySee_SubmitToOobaboogaAPI",
+ "EmAySee_SubmitToOobaboogaAPIWithKey",
+ "EmAySee_SubmitToOobaboogaAPIWithKeyThinker",
+ "EmAySee_SubmitToOobaboogaAPIWithKey_WithThinkParse",
+ "EmAySee_SubmitToOobaboogaAPIWithKey_test",
+ "EmAySee_TagPruner",
+ "EmAySee_TextCombiner",
+ "EmAySee_ToggleIntNode",
+ "EmAySee_VAECompatibleAspectRatioCalculator",
+ "EmAySee_VarTextReplacer",
+ "EmAySee_VeryUniqueStringSelectorNode",
+ "EmAySee_WD14TagFilter",
+ "f"
+ ],
+ {
+ "title_aux": "ComfyUI_EmAySee_CustomNodes"
+ }
+ ],
+ "https://github.com/Enashka/ComfyUI-nhknodes": [
+ [
+ "AddHeadroom",
+ "Bookmark",
+ "ConditionalRouter",
+ "ConditionalRouterDual",
+ "ConditionalSplitter",
+ "ConditionalStop",
+ "CyclingSwitch",
+ "DoubleSwitch",
+ "DoubleSwitchOut",
+ "EditWithKrita",
+ "ExecutionCounter",
+ "ExtractGridPanel",
+ "GeminiImageChat",
+ "ImageEvaluator",
+ "ImageGridBatch",
+ "ImageGridComposite",
+ "ImageLoaderWithPreviews",
+ "IntervalGate",
+ "LLMChat",
+ "ListSelector",
+ "Load2x2GridSeries",
+ "Load3x3GridSeries",
+ "LoadImageSeries",
+ "LoadImageSeriesWithPrompts",
+ "OllamaChat",
+ "PlaySound",
+ "PreviewImagePassthrough",
+ "SaveImagePassthrough",
+ "SimpleTextInput",
+ "SizePicker",
+ "TextCombiner",
+ "TextDisplay",
+ "TextEncodeFlux2ImageEdit",
+ "TextTemplate",
+ "TextTemplateExtended",
+ "VisualResizer"
+ ],
+ {
+ "title_aux": "ComfyUI-nhknodes"
+ }
+ ],
+ "https://github.com/Enemyx-net/VibeVoice-ComfyUI": [
+ [
+ "LoadTextFromFileNode",
+ "VibeVoice Free Memory",
+ "VibeVoice LoRA",
+ "VibeVoice Load Text From File",
+ "VibeVoice Multiple Speakers",
+ "VibeVoice Single Speaker",
+ "VibeVoiceFreeMemoryNode",
+ "VibeVoiceLoRANode",
+ "VibeVoiceMultipleSpeakersNode",
+ "VibeVoiceSingleSpeakerNode"
+ ],
+ {
+ "title_aux": "VibeVoice ComfyUI"
+ }
+ ],
+ "https://github.com/Enferlain/ComfyUI-A1111-cond": [
+ [
+ "A1111Prompt",
+ "A1111PromptNegative"
+ ],
+ {
+ "title_aux": "ComfyUI-A1111-cond"
+ }
+ ],
+ "https://github.com/EnragedAntelope/ComfyUI-ConstrainResolution": [
+ [
+ "ConstrainResolution"
+ ],
+ {
+ "title_aux": "ComfyUI-ConstrainResolution"
+ }
+ ],
+ "https://github.com/EnragedAntelope/ComfyUI-EACloudNodes": [
+ [
+ "GroqNode",
+ "OpenRouterModels",
+ "OpenrouterNode"
+ ],
+ {
+ "title_aux": "ComfyUI-EACloudNodes"
+ }
+ ],
+ "https://github.com/EnragedAntelope/ComfyUI_EasyRegion": [
+ [
+ "EasyRegionMask",
+ "EasyRegionSimple"
+ ],
+ {
+ "title_aux": "ComfyUI_EasyRegion"
+ }
+ ],
+ "https://github.com/EnragedAntelope/comfy-modelopt": [
+ [
+ "ModelOptCalibrationHelper",
+ "ModelOptQuantizeUNet",
+ "ModelOptSaveQuantized",
+ "ModelOptUNetLoader"
+ ],
+ {
+ "title_aux": "comfy-modelopt"
+ }
+ ],
+ "https://github.com/EnragedAntelope/comfyui-relight": [
+ [
+ "ReLight"
+ ],
+ {
+ "title_aux": "ComfyUI-ReLight"
+ }
+ ],
+ "https://github.com/EnragedAntelope/comfyui-sdnq": [
+ [
+ "SDNQModelQuantizer",
+ "SDNQSampler"
+ ],
+ {
+ "title_aux": "comfyui-sdnq"
+ }
+ ],
+ "https://github.com/Erehr/ComfyUI-EreNodes": [
+ [
+ "ErePromptCloud",
+ "ErePromptFilter",
+ "ErePromptGallery",
+ "ErePromptLoraStack",
+ "ErePromptMultiSelect",
+ "ErePromptMultiline",
+ "ErePromptRandomizer",
+ "ErePromptToggle"
+ ],
+ {
+ "title_aux": "ComfyUI-EreNodes"
+ }
+ ],
+ "https://github.com/EricRollei/AAA_Metadata_System": [
+ [
+ "AspectRatio2StepLatent",
+ "CheckpointBatchInfoSetter_v074",
+ "CheckpointInfoSetter_v074",
+ "CheckpointInfoViewer_v074",
+ "CheckpointParamsLoader_v074",
+ "CheckpointTester_v074",
+ "ColorNameToRGB_v01",
+ "ColorSelector",
+ "CulturalColorPaletteGenerator_v01",
+ "EnhancedMetadataFilterNode_V2",
+ "EricCivitaiPromptExtractor",
+ "EricCivitaiPromptExtractorAutoLoader",
+ "EricLoadImageExtended",
+ "EricLoadImageWithLayers",
+ "EricSaveTrueSVGImage",
+ "Eric_Color_Palette_Analyzer_v3",
+ "Eric_Duplicate_Image_Finder_v04",
+ "Eric_Metadata_Debugger_V2",
+ "Eric_Metadata_Entry_V2",
+ "Eric_Metadata_Filter_V2",
+ "Eric_Metadata_Query_V3",
+ "Eric_Workflow_Toolkit_v2",
+ "EricsWordCloudNode",
+ "FileOrganizer",
+ "FlattenNestedFiles_v2",
+ "LoRABatchInfoSetter_v03",
+ "LoRABulkOperations_v03",
+ "LoRADatabaseMaintenance_v03",
+ "LoRADatabaseStats_v03",
+ "LoRAGalleryDisplay_v03",
+ "LoRAGalleryWithEdit_v03",
+ "LoRAInfoSetter_v03",
+ "LoRAInfoViewer_v03",
+ "LoRAParamsLoader_v03",
+ "LoRAQuickFeedback_v03",
+ "LoRATester_v03",
+ "MetadataAwareSaveImage_Simple",
+ "MetadataAwareSaveImage_v099d",
+ "MetadataConsolidatorNode_V2",
+ "Multi-LoRA Loader Flux",
+ "Multi-LoRA Loader Model-Only",
+ "Multi-LoRA Loader Qwen",
+ "Multi-LoRA Loader Wan-i2v",
+ "Multi-LoRA Loader Wan-t2v",
+ "Multi-LoRA Loader Z-Image",
+ "Multi-LoRA Loader [PLATFORM_NAME]",
+ "Multi-LoRA Loader v02",
+ "MyCustomNode",
+ "PngInfoDiagnosticV3",
+ "PngMetadataExtractorV3",
+ "SmartImageCropper",
+ "SplitWorkflowExtractorNode_V2",
+ "TextOverlayNode_v04",
+ "TriggerWordManager_v03",
+ "Wan22AspectRatioHelper",
+ "Wan22_Size_Preset"
+ ],
+ {
+ "nodename_pattern": "^(MetadataAwareSaveImage|Multi_LoRA_Loader|LoadImageLayers)",
+ "title_aux": "AAA Metadata System"
+ }
+ ],
+ "https://github.com/EricRollei/Comfy_HunyuanImage3": [
+ [
+ "HunyuanImage3ClearDownstream",
+ "HunyuanImage3ForceUnload",
+ "HunyuanImage3FullGPULoader",
+ "HunyuanImage3FullLoader",
+ "HunyuanImage3Generate",
+ "HunyuanImage3GenerateLarge",
+ "HunyuanImage3GenerateLargeBudget",
+ "HunyuanImage3GenerateLowVRAM",
+ "HunyuanImage3GenerateLowVRAMBudget",
+ "HunyuanImage3GenerateTelemetry",
+ "HunyuanImage3Int8Loader",
+ "HunyuanImage3Int8LoaderBudget",
+ "HunyuanImage3NF4LoaderLowVRAMBudget",
+ "HunyuanImage3QuantizedLoader",
+ "HunyuanImage3SoftUnload",
+ "HunyuanImage3Unload",
+ "HunyuanPromptRewriter"
+ ],
+ {
+ "title_aux": "Comfy_HunyuanImage3"
+ }
+ ],
+ "https://github.com/EricRollei/Download_Tools": [
+ [
+ "EricWebFileScraper_v082",
+ "GalleryDLDownloader",
+ "YtDlpDownloader"
+ ],
+ {
+ "nodename_pattern": "(Gallery-dl|Yt-dlp|Web.*Scraper)",
+ "title_aux": "Download Tools for ComfyUI"
+ }
+ ],
+ "https://github.com/EricRollei/Emu35-Comfyui-Nodes": [
+ [
+ "Emu35ClearCache",
+ "Emu35EmergencyReset",
+ "Emu35InterleavedGenerator",
+ "Emu35Loader",
+ "Emu35LoaderV2",
+ "Emu35MemoryManager",
+ "Emu35OfficialT2I",
+ "Emu35Sampler",
+ "Emu35T2ISamplerV2",
+ "Emu35VQA",
+ "Emu35VRAMCleanup",
+ "Emu35X2ISampler"
+ ],
+ {
+ "title_aux": "Emu35-Comfyui-Nodes"
+ }
+ ],
+ "https://github.com/EricRollei/Eric_Image_Processing_Nodes": [
+ [
+ "AdaptiveFrequencyFilter",
+ "AdaptiveImageEnhancement",
+ "AdvancedFilmGrainNode",
+ "AutoDenoiseComparisonNode",
+ "AutoDenoiseNode",
+ "BM3D Film Grain Denoising",
+ "BM3DComparisonNode",
+ "BM3DDeblurNode",
+ "BM3DDenoiseNode",
+ "BatchImageProcessing",
+ "ComprehensiveComparison",
+ "DeepImagePriorNode",
+ "DiffBIRRestorationNode",
+ "DnCNNDenoiseNode",
+ "FGANNFilmGrainDenoiseNode",
+ "FilmGrainAnalysis",
+ "FilmGrainAnalysisNode",
+ "FilmGrainProcessing",
+ "FrequencyEnhancementPresets",
+ "GPUWaveletDenoiseNode",
+ "HomomorphicFilter",
+ "ImageQualityAssessment",
+ "LB-CLAHE",
+ "LightweightCNNDenoiseNode",
+ "MemoryOptimization",
+ "Multi-Scale Retinex",
+ "MultiscaleFFTEnhancement",
+ "NAFNetDenoiseNode",
+ "Noise2VoidNode",
+ "NoiseDABatchNode",
+ "NoiseDANode",
+ "NonLocalMeans",
+ "NonLocalMeansSimple",
+ "PhasePreservingEnhancement",
+ "ProfessionalRestorationPipeline",
+ "RealBM3DDeblurNode",
+ "RealBM3DNode",
+ "RestormerRestorationNode",
+ "RichardsonLucy",
+ "RichardsonLucyGPU",
+ "RichardsonLucySimple",
+ "SCUNetBatchRestoration",
+ "SCUNetRestoration",
+ "Smart Sharpening",
+ "SmartWorkflowNode",
+ "StationaryWaveletDenoise",
+ "SwinIRBatch",
+ "SwinIRRestoration",
+ "SwinIRSharpnessBoostNode",
+ "WaveletDenoise",
+ "WienerFilter",
+ "WienerFilterCompare",
+ "WienerFilterSNR"
+ ],
+ {
+ "title_aux": "Eric_Image_Processing_Nodes"
+ }
+ ],
+ "https://github.com/EricRollei/HYPIR-ComfyUI": [
+ [
+ "HyperComfyUIHYPIRRestore"
+ ],
+ {
+ "nodename_pattern": "HYPIR",
+ "title_aux": "HYPIR Image Restoration for ComfyUI"
+ }
+ ],
+ "https://github.com/EricRollei/Local_LLM_Prompt_Enhancer": [
+ [
+ "DeepSeekChat",
+ "DeepSeekPromptRewriter",
+ "EricImageToImagePromptExpander",
+ "EricImageToVideoPromptExpander",
+ "EricTextToImagePromptEnhancer",
+ "EricVideoPromptExpander",
+ "EricVideoPromptExpanderAdvanced"
+ ],
+ {
+ "title_aux": "Eric's Prompt Enhancers for ComfyUI"
+ }
+ ],
+ "https://github.com/EricRollei/PDF-Tools": [
+ [
+ "EnhancedLayoutParser",
+ "EnhancedLayoutParser_v02",
+ "EnhancedLayoutParser_v03",
+ "EnhancedLayoutParser_v04",
+ "EnhancedLayoutParser_v05",
+ "EnhancedLayoutParser_v06_Streamlined",
+ "EnhancedPDFExtractor_v08",
+ "EnhancedPDFExtractor_v09",
+ "Eric_PDF_Extractor_Enhanced_V04",
+ "Eric_PDF_Extractor_Enhanced_V06",
+ "Eric_PDF_Extractor_Enhanced_V07",
+ "Eric_PDF_Extractor_Enhanced_v05",
+ "Florence2ImageCropper",
+ "Florence2ModelInfo",
+ "Florence2RectangleDetector",
+ "Florence2RegionVisualizer",
+ "GalleryDLDownloader",
+ "LayoutLMv3DocumentAnalysisNode",
+ "LayoutLMv3QuestionAnsweringNode",
+ "PaddleOCRVLRemoteNode",
+ "SafeLayoutLMv3Node",
+ "SimplePDFImageExtractor",
+ "SuryaLayoutOCRHybrid",
+ "SuryaOCR",
+ "SuryaOCRLayout",
+ "SuryaOCR_v02"
+ ],
+ {
+ "title_aux": "PDF Tools - Advanced PDF Processing & OCR"
+ }
+ ],
+ "https://github.com/EricRollei/Qwen_Layers_Diffuser_Pipeline_Comfyui": [
+ [
+ "EricQwenAddAlpha",
+ "EricQwenBatchToVideo",
+ "EricQwenDecompose",
+ "EricQwenEncode",
+ "EricQwenLatentCutToBatch",
+ "EricQwenLayerComposite",
+ "EricQwenLayerDescribe",
+ "EricQwenLayerExtract",
+ "EricQwenLayerInfo",
+ "EricQwenLayerLoad",
+ "EricQwenLayerPrompts",
+ "EricQwenLayerReorder",
+ "EricQwenLayerSave",
+ "EricQwenLayerSelector",
+ "EricQwenMultiLatent",
+ "EricQwenRGBAVAELoader",
+ "EricQwenStringJoin",
+ "EricQwenUnloadModel"
+ ],
+ {
+ "title_aux": "Qwen Layers Diffuser Pipeline"
+ }
+ ],
+ "https://github.com/EricRollei/comfyui-refocus": [
+ [
+ "BokehNetApply",
+ "ComputeDefocusMap",
+ "DeblurNetApply",
+ "DepthMetricToInverse",
+ "DepthMetricToRelative",
+ "DepthProEstimate",
+ "DepthProModelLoader",
+ "FocalMMtoPX",
+ "FocalPXtoMM",
+ "FocusPointFromMask",
+ "GenfocusBokeh",
+ "GenfocusBokehNative",
+ "GenfocusCondition",
+ "GenfocusDeblur",
+ "GenfocusDeblurLoader",
+ "GenfocusDeblurNative",
+ "GenfocusDefocusMapCondition",
+ "GenfocusGenerate",
+ "GenfocusLoRALoader",
+ "GenfocusModelLoader",
+ "GenfocusSwitchAdapter",
+ "GenfocusUnloadModels",
+ "SelectFocusPoint"
+ ],
+ {
+ "title_aux": "Refocus - Generative Refocusing"
+ }
+ ],
+ "https://github.com/EricRorich/ComfyUI-face-shaper": [
+ [
+ "RORICH-AI.COM",
+ "Rorich"
+ ],
+ {
+ "title_aux": "ComfyUI-face-shaper"
+ }
+ ],
+ "https://github.com/EuphoricPenguin/resemble-enhance-comfyui": [
+ [
+ "ResembleEnhance"
+ ],
+ {
+ "title_aux": "ComfyUI Resemble Enhance"
+ }
+ ],
+ "https://github.com/EvilBT/ComfyUI_SLK_joy_caption_two": [
+ [
+ "Batch_joy_caption_two",
+ "Batch_joy_caption_two_advanced",
+ "Joy_caption_two",
+ "Joy_caption_two_advanced",
+ "Joy_caption_two_load",
+ "Joy_extra_options"
+ ],
+ {
+ "title_aux": "JoyCaptionAlpha Two for ComfyUI"
+ }
+ ],
+ "https://github.com/Excidos/ComfyUI-Documents": [
+ [
+ "ChunkRouter",
+ "DocumentLoader",
+ "ImageSelector",
+ "PDFPageSplitter",
+ "PDFToImage",
+ "TextChunker"
+ ],
+ {
+ "title_aux": "ComfyUI-Documents"
+ }
+ ],
+ "https://github.com/Excidos/ComfyUI-Lumina-Next-SFT-DiffusersWrapper": [
+ [
+ "LuminaDiffusersNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Lumina-Next-SFT-DiffusersWrapper"
+ }
+ ],
+ "https://github.com/ExoticArts/comfyui-ea-nodes": [
+ [
+ "EAImageCompare",
+ "EAImageCompare3Way",
+ "EAImageCompare4Way",
+ "EA_AutoTrimPingPong",
+ "EA_FilenameCombine",
+ "EA_LightningMotionBias",
+ "EA_ListVideos",
+ "EA_ManifestIndex",
+ "EA_PingPong",
+ "EA_PowerLora",
+ "EA_PowerLora_CLIP",
+ "EA_PowerLora_WanVideo",
+ "EA_TrimFrames",
+ "EA_TrimWindow",
+ "EA_VideoLoad",
+ "EA_VideoSaveIdempotent"
+ ],
+ {
+ "title_aux": "comfyui-ea-nodes"
+ }
+ ],
+ "https://github.com/ExponentialML/ComfyUI_ModelScopeT2V": [
+ [
+ "ModelScopeT2VLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_ModelScopeT2V"
+ }
+ ],
+ "https://github.com/ExponentialML/ComfyUI_Native_DynamiCrafter": [
+ [
+ "DynamiCrafterLoader",
+ "DynamiCrafterProcessor"
+ ],
+ {
+ "title_aux": "ComfyUI - Native DynamiCrafter"
+ }
+ ],
+ "https://github.com/ExponentialML/ComfyUI_VisualStylePrompting": [
+ [
+ "ApplyVisualStyle"
+ ],
+ {
+ "title_aux": "ComfyUI_VisualStylePrompting"
+ }
+ ],
+ "https://github.com/ExterminanzHS/Gecco-Discord-Autosend": [
+ [
+ "GeccoAutosend",
+ "GeccoImageSave",
+ "GeccoSelectchannel"
+ ],
+ {
+ "title_aux": "Gecco Discord Autosend"
+ }
+ ],
+ "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG": [
+ [
+ "Automatic CFG",
+ "Automatic CFG - Advanced",
+ "Automatic CFG - Attention modifiers",
+ "Automatic CFG - Attention modifiers tester",
+ "Automatic CFG - Custom attentions",
+ "Automatic CFG - Excellent attention",
+ "Automatic CFG - Negative",
+ "Automatic CFG - Post rescale only",
+ "Automatic CFG - Preset Loader",
+ "Automatic CFG - Unpatch function",
+ "Automatic CFG - Warp Drive"
+ ],
+ {
+ "title_aux": "ComfyUI-AutomaticCFG"
+ }
+ ],
+ "https://github.com/Extraltodeus/DistanceSampler": [
+ [
+ "SamplerDistance",
+ "SamplerDistanceAdvanced"
+ ],
+ {
+ "title_aux": "DistanceSampler"
+ }
+ ],
+ "https://github.com/Extraltodeus/LoadLoraWithTags": [
+ [
+ "LoraLoaderTagsQuery"
+ ],
+ {
+ "title_aux": "LoadLoraWithTags"
+ }
+ ],
+ "https://github.com/Extraltodeus/Negative-attention-for-ComfyUI-": [
+ [
+ "Negative cross attention",
+ "Negative cross attention concatenate"
+ ],
+ {
+ "title_aux": "Negative-attention-for-ComfyUI-"
+ }
+ ],
+ "https://github.com/Extraltodeus/Skimmed_CFG": [
+ [
+ "CFG_Skimming_Single_Scale_Pre_CFG",
+ "ConstantSkimPreCFG",
+ "DifferenceCFG_PreCFG",
+ "SkimFlipPreCFG",
+ "SkimReplacePreCFG",
+ "SkimmedCFG_LinInterp_CFG_PreCFG",
+ "SkimmedCFG_LinInterp_DualScales_CFG_PreCFG"
+ ],
+ {
+ "title_aux": "Skimmed_CFG"
+ }
+ ],
+ "https://github.com/Extraltodeus/Stable-Diffusion-temperature-settings": [
+ [
+ "CLIP Temperature",
+ "Unet Temperature"
+ ],
+ {
+ "title_aux": "Stable-Diffusion-temperature-settings"
+ }
+ ],
+ "https://github.com/Extraltodeus/Uncond-Zero-for-ComfyUI": [
+ [
+ "Conditioning combine positive and negative",
+ "Conditioning crop or fill",
+ "Uncond Zero",
+ "interrupt on NaN"
+ ],
+ {
+ "title_aux": "Uncond-Zero-for-ComfyUI"
+ }
+ ],
+ "https://github.com/Extraltodeus/Vector_Sculptor_ComfyUI": [
+ [
+ "CLIP Vector Sculptor text encode",
+ "Conditioning (Average keep magnitude)",
+ "Conditioning (Slerp)",
+ "Conditioning SDXL merge clip_g / clip_l",
+ "Conditioning normalize magnitude to empty"
+ ],
+ {
+ "title_aux": "Vector_Sculptor_ComfyUI"
+ }
+ ],
+ "https://github.com/Extraltodeus/noise_latent_perlinpinpin": [
+ [
+ "NoisyLatentPerlin",
+ "NoisyLatentPerlin16ch"
+ ],
+ {
+ "title_aux": "noise latent perlinpinpin"
+ }
+ ],
+ "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler": [
+ [
+ "Aligned Scheduler",
+ "Gaussian Tail Scheduler",
+ "Get sigmas as float",
+ "Graph sigmas",
+ "Manual scheduler",
+ "Merge many sigmas by average",
+ "Merge sigmas by average",
+ "Merge sigmas gradually",
+ "Multiply sigmas",
+ "Output min/max sigmas",
+ "Split and concatenate sigmas",
+ "The Golden Scheduler"
+ ],
+ {
+ "title_aux": "sigmas_tools_and_the_golden_scheduler"
+ }
+ ],
+ "https://github.com/FaberVS/MultiModel": [
+ [
+ "ActiveModel",
+ "DenoiseSelector",
+ "KSamplerPipe",
+ "ListSelector",
+ "ModelParamsPipe",
+ "MySwitchIndex",
+ "ParamsPipeUnpack",
+ "PromptBuilder"
+ ],
+ {
+ "title_aux": "MultiModel"
+ }
+ ],
+ "https://github.com/Faildes/ComfyUI-NegativeFold": [
+ [
+ "FoldNegativeIntoPositiveConditioning"
+ ],
+ {
+ "title_aux": "ComfyUI-NegativeFold"
+ }
+ ],
+ "https://github.com/Faildes/ComfyUI-TC_ADV_ZPrompt": [
+ [
+ "TC_ADV_ZPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-TC_ADV_ZPrompt"
+ }
+ ],
+ "https://github.com/Fannovel16/ComfyUI-Frame-Interpolation": [
+ [
+ "AMT VFI",
+ "CAIN VFI",
+ "FILM VFI",
+ "FLAVR VFI",
+ "GMFSS Fortuna VFI",
+ "IFRNet VFI",
+ "IFUnet VFI",
+ "KSampler Gradually Adding More Denoise (efficient)",
+ "M2M VFI",
+ "Make Interpolation State List",
+ "RIFE VFI",
+ "STMFNet VFI",
+ "Sepconv VFI",
+ "VFI FloatToInt"
+ ],
+ {
+ "title_aux": "ComfyUI Frame Interpolation"
+ }
+ ],
+ "https://github.com/Fannovel16/ComfyUI-MagickWand": [
+ [
+ "ImageMagick Adaptive Blur",
+ "ImageMagick Adaptive Resize",
+ "ImageMagick Adaptive Sharpen",
+ "ImageMagick Adaptive Threshold",
+ "ImageMagick Auto Gamma",
+ "ImageMagick Auto Level",
+ "ImageMagick Auto Orient",
+ "ImageMagick Auto Threshold",
+ "ImageMagick Blue Shift",
+ "ImageMagick Blur",
+ "ImageMagick Brightness Contrast",
+ "ImageMagick Canny",
+ "ImageMagick Charcoal",
+ "ImageMagick Chop",
+ "ImageMagick Clahe",
+ "ImageMagick Clamp",
+ "ImageMagick Coalesce",
+ "ImageMagick Color Decision List",
+ "ImageMagick Color Matrix",
+ "ImageMagick Combine",
+ "ImageMagick Concat",
+ "ImageMagick Contrast",
+ "ImageMagick Contrast Stretch",
+ "ImageMagick Crop",
+ "ImageMagick Cycle Color Map",
+ "ImageMagick Decipher",
+ "ImageMagick Despeckle",
+ "ImageMagick Distort",
+ "ImageMagick Edge",
+ "ImageMagick Emboss",
+ "ImageMagick Encipher",
+ "ImageMagick Enhance",
+ "ImageMagick Equalize",
+ "ImageMagick Evaluate",
+ "ImageMagick Extent",
+ "ImageMagick Flip",
+ "ImageMagick Flop",
+ "ImageMagick Forward Fourier Transform",
+ "ImageMagick Function",
+ "ImageMagick Gamma",
+ "ImageMagick Gaussian Blur",
+ "ImageMagick Hough Lines",
+ "ImageMagick Implode",
+ "ImageMagick Kmeans",
+ "ImageMagick Kuwahara",
+ "ImageMagick Level",
+ "ImageMagick Levelize",
+ "ImageMagick Linear Stretch",
+ "ImageMagick Liquid Rescale",
+ "ImageMagick Local Contrast",
+ "ImageMagick Magnify",
+ "ImageMagick Mean Shift",
+ "ImageMagick Merge Layers",
+ "ImageMagick Mode",
+ "ImageMagick Modulate",
+ "ImageMagick Morphology",
+ "ImageMagick Motion Blur",
+ "ImageMagick Negate",
+ "ImageMagick Noise",
+ "ImageMagick Normalize",
+ "ImageMagick Oil Paint",
+ "ImageMagick Ordered Dither",
+ "ImageMagick Polynomial",
+ "ImageMagick Posterize",
+ "ImageMagick Quantize",
+ "ImageMagick Random Threshold",
+ "ImageMagick Range Threshold",
+ "ImageMagick Resample",
+ "ImageMagick Resize",
+ "ImageMagick Roll",
+ "ImageMagick Rotational Blur",
+ "ImageMagick Sample",
+ "ImageMagick Scale",
+ "ImageMagick Selective Blur",
+ "ImageMagick Sepia Tone",
+ "ImageMagick Shade",
+ "ImageMagick Shadow",
+ "ImageMagick Sharpen",
+ "ImageMagick Shave",
+ "ImageMagick Sigmoidal Contrast",
+ "ImageMagick Sketch",
+ "ImageMagick Smush",
+ "ImageMagick Solarize",
+ "ImageMagick Splice",
+ "ImageMagick Spread",
+ "ImageMagick Statistic",
+ "ImageMagick Swirl",
+ "ImageMagick Threshold",
+ "ImageMagick Thumbnail",
+ "ImageMagick Transform",
+ "ImageMagick Transform Colorspace",
+ "ImageMagick Transparentize",
+ "ImageMagick Transpose",
+ "ImageMagick Transverse",
+ "ImageMagick Unsharp Mask",
+ "ImageMagick Vignette",
+ "ImageMagick Wave",
+ "ImageMagick Wavelet Denoise",
+ "ImageMagick White Balance"
+ ],
+ {
+ "title_aux": "ComfyUI-MagickWand"
+ }
+ ],
+ "https://github.com/Fannovel16/ComfyUI-MotionDiff": [
+ [
+ "EmptyMotionData",
+ "ExportSMPLTo3DSoftware",
+ "Export_SMPLMultipleSubjects_To_3DSoftware",
+ "Human4D_Img2SMPL",
+ "Humans4DLoader",
+ "MotionCLIPTextEncode",
+ "MotionDataVisualizer",
+ "MotionDiffLoader",
+ "MotionDiffSimpleSampler",
+ "RenderMultipleSubjectsSMPLMesh",
+ "RenderSMPLMesh",
+ "Render_OpenPose_From_SMPL_Mesh_Multiple_Subjects",
+ "SMPLLoader",
+ "SMPLShapeParameters",
+ "SaveSMPL",
+ "SmplifyMotionData",
+ "SpectreFaceReconLoader",
+ "SpectreImg2SMPL",
+ "mgpt_model_loader",
+ "mgpt_t2m"
+ ],
+ {
+ "title_aux": "ComfyUI MotionDiff"
+ }
+ ],
+ "https://github.com/Fannovel16/ComfyUI-Video-Matting": [
+ [
+ "BRIAAI Matting",
+ "Robust Video Matting"
+ ],
+ {
+ "title_aux": "ComfyUI-Video-Matting"
+ }
+ ],
+ "https://github.com/Fannovel16/comfyui_controlnet_aux": [
+ [
+ "AIO_Preprocessor",
+ "AnimalPosePreprocessor",
+ "AnimeFace_SemSegPreprocessor",
+ "AnimeLineArtPreprocessor",
+ "AnyLineArtPreprocessor_aux",
+ "BAE-NormalMapPreprocessor",
+ "BinaryPreprocessor",
+ "CannyEdgePreprocessor",
+ "ColorPreprocessor",
+ "ControlNetAuxSimpleAddText",
+ "ControlNetPreprocessorSelector",
+ "DSINE-NormalMapPreprocessor",
+ "DWPreprocessor",
+ "DensePosePreprocessor",
+ "DepthAnythingPreprocessor",
+ "DepthAnythingV2Preprocessor",
+ "DiffusionEdge_Preprocessor",
+ "ExecuteAllControlNetPreprocessors",
+ "FacialPartColoringFromPoseKps",
+ "FakeScribblePreprocessor",
+ "HEDPreprocessor",
+ "HintImageEnchance",
+ "ImageGenResolutionFromImage",
+ "ImageGenResolutionFromLatent",
+ "ImageIntensityDetector",
+ "ImageLuminanceDetector",
+ "InpaintPreprocessor",
+ "LeReS-DepthMapPreprocessor",
+ "LineArtPreprocessor",
+ "LineartStandardPreprocessor",
+ "M-LSDPreprocessor",
+ "Manga2Anime_LineArt_Preprocessor",
+ "MaskOptFlow",
+ "MediaPipe-FaceMeshPreprocessor",
+ "MeshGraphormer+ImpactDetector-DepthMapPreprocessor",
+ "MeshGraphormer-DepthMapPreprocessor",
+ "Metric3D-DepthMapPreprocessor",
+ "Metric3D-NormalMapPreprocessor",
+ "MiDaS-DepthMapPreprocessor",
+ "MiDaS-NormalMapPreprocessor",
+ "OneFormer-ADE20K-SemSegPreprocessor",
+ "OneFormer-COCO-SemSegPreprocessor",
+ "OpenposePreprocessor",
+ "PiDiNetPreprocessor",
+ "PixelPerfectResolution",
+ "PyraCannyPreprocessor",
+ "RenderAnimalKps",
+ "RenderPeopleKps",
+ "SAMPreprocessor",
+ "SavePoseKpsAsJsonFile",
+ "ScribblePreprocessor",
+ "Scribble_PiDiNet_Preprocessor",
+ "Scribble_XDoG_Preprocessor",
+ "SemSegPreprocessor",
+ "ShufflePreprocessor",
+ "TEEDPreprocessor",
+ "TEED_Preprocessor",
+ "TTPlanet_TileGF_Preprocessor",
+ "TTPlanet_TileSimple_Preprocessor",
+ "TilePreprocessor",
+ "UniFormer-SemSegPreprocessor",
+ "Unimatch_OptFlowPreprocessor",
+ "UpperBodyTrackingFromPoseKps",
+ "Zoe-DepthMapPreprocessor",
+ "Zoe_DepthAnythingPreprocessor"
+ ],
+ {
+ "preemptions": [
+ "AIO_Preprocessor",
+ "AnimalPosePreprocessor",
+ "AnimeFace_SemSegPreprocessor",
+ "AnimeLineArtPreprocessor",
+ "BAE-NormalMapPreprocessor",
+ "BinaryPreprocessor",
+ "CannyEdgePreprocessor",
+ "ColorPreprocessor",
+ "DSINE-NormalMapPreprocessor",
+ "DWPreprocessor",
+ "DensePosePreprocessor",
+ "DepthAnythingPreprocessor",
+ "DiffusionEdge_Preprocessor",
+ "FacialPartColoringFromPoseKps",
+ "FakeScribblePreprocessor",
+ "HEDPreprocessor",
+ "HintImageEnchance",
+ "ImageGenResolutionFromImage",
+ "ImageGenResolutionFromLatent",
+ "ImageIntensityDetector",
+ "ImageLuminanceDetector",
+ "InpaintPreprocessor",
+ "LeReS-DepthMapPreprocessor",
+ "LineArtPreprocessor",
+ "LineartStandardPreprocessor",
+ "M-LSDPreprocessor",
+ "Manga2Anime_LineArt_Preprocessor",
+ "MaskOptFlow",
+ "MediaPipe-FaceMeshPreprocessor",
+ "MeshGraphormer-DepthMapPreprocessor",
+ "MiDaS-DepthMapPreprocessor",
+ "MiDaS-NormalMapPreprocessor",
+ "OneFormer-ADE20K-SemSegPreprocessor",
+ "OneFormer-COCO-SemSegPreprocessor",
+ "OpenposePreprocessor",
+ "PiDiNetPreprocessor",
+ "PixelPerfectResolution",
+ "SAMPreprocessor",
+ "SavePoseKpsAsJsonFile",
+ "ScribblePreprocessor",
+ "Scribble_XDoG_Preprocessor",
+ "SemSegPreprocessor",
+ "ShufflePreprocessor",
+ "TEEDPreprocessor",
+ "TilePreprocessor",
+ "UniFormer-SemSegPreprocessor",
+ "Unimatch_OptFlowPreprocessor",
+ "Zoe-DepthMapPreprocessor",
+ "Zoe_DepthAnythingPreprocessor"
+ ],
+ "title_aux": "ComfyUI's ControlNet Auxiliary Preprocessors"
+ }
+ ],
+ "https://github.com/Fantaxico/ComfyUI-GCP-Storage": [
+ [
+ "GCPStorageNode"
+ ],
+ {
+ "title_aux": "ComfyUI-GCP-Storage"
+ }
+ ],
+ "https://github.com/FaraamFide/ComfyUI-ParamNodes": [
+ [
+ "HelperModelSwitch",
+ "ParamBoolean",
+ "ParamFloat",
+ "ParamImage",
+ "ParamInt",
+ "ParamString",
+ "ParamUniversal"
+ ],
+ {
+ "title_aux": "ComfyUI-ParamNodes"
+ }
+ ],
+ "https://github.com/FearL0rd/ComfyUI-AnyDeviceOffload": [
+ [
+ "AnyDeviceOffload"
+ ],
+ {
+ "title_aux": "ComfyUI Any-Device Offload"
+ }
+ ],
+ "https://github.com/FearL0rd/ComfyUI-MaskAIFingerprint": [
+ [
+ "MaskAIFingerprint"
+ ],
+ {
+ "title_aux": "ComfyUI MaskAIFingerprint"
+ }
+ ],
+ "https://github.com/FearL0rd/ComfyUI-ParallelAnything": [
+ [
+ "ParallelAnything",
+ "ParallelDevice",
+ "ParallelDeviceList"
+ ],
+ {
+ "title_aux": "ComfyUI-ParallelAnything"
+ }
+ ],
+ "https://github.com/FeiMao-326/Comfyui-General-API-Node": [
+ [
+ "FeiMao_326_GeneralAPINode",
+ "FeiMao_326_GetListElement",
+ "FeiMao_326_JsonParser",
+ "FeiMao_326_TextBatchReplace",
+ "FeiMao_326_TextIterator",
+ "FeiMao_326_TextSplitByDelimiter",
+ "ShowTextNode",
+ "SimpleTextNode"
+ ],
+ {
+ "title_aux": "Comfyui-General-API-Node"
+ }
+ ],
+ "https://github.com/Feidorian/feidorian-ComfyNodes": [
+ [],
+ {
+ "nodename_pattern": "^Feidorian_",
+ "title_aux": "feidorian-ComfyNodes"
+ }
+ ],
+ "https://github.com/FemReiyaDev/ComfyUI-ReiyaNodes": [
+ [
+ "ReiImageStitch"
+ ],
+ {
+ "title_aux": "ComfyUI-ReiyaNodes"
+ }
+ ],
+ "https://github.com/Ferocit/comfyui-feroccustomnodes": [
+ [
+ "LoadDescriptionNode",
+ "RandomLineFromText"
+ ],
+ {
+ "title_aux": "comfyui-feroccustomnodes"
+ }
+ ],
+ "https://github.com/FewBox/fewbox-outfit-comfyui": [
+ [
+ "FewBoxInContextLora",
+ "FewBoxLab",
+ "FewBoxSaveImage",
+ "FewBoxWatermark",
+ "FewBoxWebDAV"
+ ],
+ {
+ "title_aux": "fewbox-outfit-comfyui"
+ }
+ ],
+ "https://github.com/Fictiverse/ComfyUI_Fictiverse": [
+ [
+ "Add Margin With Color",
+ "Any to Int/Float/String",
+ "Audio Duration",
+ "Clamp Images To Megapixels",
+ "Clean Style From Caption",
+ "Essential Params",
+ "Essential Params Expand",
+ "FV Get Image Half Size",
+ "Get Last Output Video Path",
+ "If Image Valid",
+ "Image Params",
+ "Image Params Expand",
+ "Is Image Valid ?",
+ "LoRA Enable With Prefix",
+ "Math Operation",
+ "None if same Image",
+ "Prompt Assembler",
+ "Resize Images To Megapixels",
+ "Resize To Megapixels",
+ "Text Enable With Prefix",
+ "Video Params",
+ "Video Params Expand",
+ "WaveformDevice"
+ ],
+ {
+ "title_aux": "ComfyUI Fictiverse Nodes"
+ }
+ ],
+ "https://github.com/Fihade/IC-Light-ComfyUI-Node": [
+ [
+ "LoadICLightUnetDiffusers",
+ "diffusers_model_loader",
+ "iclight_diffusers_sampler"
+ ],
+ {
+ "title_aux": "IC-Light-ComfyUI-Node"
+ }
+ ],
+ "https://github.com/FinetunersAI/ComfyUI_Finetuners_Suite": [
+ [
+ "AutoImageResize",
+ "GroupLink",
+ "ModelListNode",
+ "VariablesInjector",
+ "VariablesLogicNode"
+ ],
+ {
+ "title_aux": "ComfyUI_Finetuners_Suite"
+ }
+ ],
+ "https://github.com/Firetheft/ComfyUI_Civitai_Gallery": [
+ [
+ "CivitaiGalleryNode",
+ "CivitaiModelsGalleryNode"
+ ],
+ {
+ "title_aux": "ComfyUI Civitai Gallery"
+ }
+ ],
+ "https://github.com/Firetheft/ComfyUI_Local_Lora_Gallery": [
+ [
+ "LocalLoraGallery",
+ "LocalLoraGalleryModelOnly",
+ "LocalLoraGalleryStackApply",
+ "LocalLoraGalleryStacker"
+ ],
+ {
+ "title_aux": "ComfyUI_Local_Lora_Gallery"
+ }
+ ],
+ "https://github.com/Firetheft/ComfyUI_Pixabay_Gallery": [
+ [
+ "PixabayImageNode",
+ "PixabayVideoNode"
+ ],
+ {
+ "title_aux": "ComfyUI_Pixabay_Gallery"
+ }
+ ],
+ "https://github.com/Firetheft/ComfyUI_Simple_Web_Browser": [
+ [
+ "WebViewerNode"
+ ],
+ {
+ "title_aux": "ComfyUI_Simple_Web_Browser"
+ }
+ ],
+ "https://github.com/FizzleDorf/ComfyUI-AIT": [
+ [
+ "AIT_Unet_Loader"
+ ],
+ {
+ "title_aux": "ComfyUI-AIT"
+ }
+ ],
+ "https://github.com/FizzleDorf/ComfyUI_FizzNodes": [
+ [
+ "AbsCosWave",
+ "AbsSinWave",
+ "BatchPromptSchedule",
+ "BatchPromptScheduleEncodeSDXL",
+ "BatchPromptScheduleLatentInput",
+ "BatchPromptScheduleSDXLLatentInput",
+ "BatchStringSchedule",
+ "BatchValueSchedule",
+ "BatchValueScheduleLatentInput",
+ "CalculateFrameOffset",
+ "ConcatStringSingle",
+ "CosWave",
+ "FizzFrame",
+ "FizzFrameConcatenate",
+ "ImageBatchFromValueSchedule",
+ "ImagesFromBatchSchedule",
+ "Init FizzFrame",
+ "InvCosWave",
+ "InvSinWave",
+ "Lerp",
+ "PromptSchedule",
+ "PromptScheduleEncodeSDXL",
+ "PromptScheduleNodeFlow",
+ "PromptScheduleNodeFlowEnd",
+ "SawtoothWave",
+ "SelectFrameNumber",
+ "SinWave",
+ "SquareWave",
+ "StringConcatenate",
+ "StringSchedule",
+ "TriangleWave",
+ "ValueSchedule",
+ "convertKeyframeKeysToBatchKeys"
+ ],
+ {
+ "title_aux": "FizzNodes"
+ }
+ ],
+ "https://github.com/Flow-two/ComfyUI-WanStartEndFramesNative": [
+ [
+ "GetImagesFromBatchRanged_F2",
+ "WanImageToVideo_F2",
+ "WanSkipEndFrameImages_F2"
+ ],
+ {
+ "title_aux": "ComfyUI-WanStartEndFramesNative"
+ }
+ ],
+ "https://github.com/FloyoAI/ComfyUI-Seed-API": [
+ [
+ "ResolutionHelper",
+ "SeedChat",
+ "SeedEditImageToImage",
+ "SeedanceLiteFirstLastFrame",
+ "SeedanceLiteImageToVideo",
+ "SeedanceLiteReferenceImages",
+ "SeedanceLiteTextToVideo",
+ "SeedancePro15Video",
+ "SeedanceProTextImageToVideo",
+ "Seedream4BatchGeneration",
+ "Seedream4ImageToImage",
+ "Seedream4MultiImageBlending",
+ "Seedream4TextToImage",
+ "Seedream4Unified",
+ "SeedreamTextToImage",
+ "VideoToFrames"
+ ],
+ {
+ "title_aux": "ComfyUI Seed API Integration"
+ }
+ ],
+ "https://github.com/FlyingFireCo/tiled_ksampler": [
+ [
+ "Asymmetric Tiled KSampler",
+ "Circular VAEDecode",
+ "Tiled KSampler"
+ ],
+ {
+ "title_aux": "tiled_ksampler"
+ }
+ ],
+ "https://github.com/ForeignGods/ComfyUI-Mana-Nodes": [
+ [
+ "Canvas Properties",
+ "Combine Video",
+ "Font Properties",
+ "Generate Audio",
+ "Preset Color Animations",
+ "Save/Preview Text",
+ "Scheduled Values",
+ "Speech Recognition",
+ "Split Video",
+ "Text to Image Generator"
+ ],
+ {
+ "title_aux": "ComfyUI-Mana-Nodes"
+ }
+ ],
+ "https://github.com/FortunaCournot/comfyui_stereoscopic": [
+ [
+ "CalculateDimensions",
+ "ColorCorrectBatch",
+ "DecryptWatermark",
+ "EncryptWatermark",
+ "GetResolutionForVR",
+ "GradeVariant",
+ "ImageVRConverter",
+ "JoinVariantProperties",
+ "LinearFade",
+ "LoadImageAdvanced",
+ "RegexSubstitute",
+ "SaveAudioSimple",
+ "SaveStrippedUTF8File",
+ "ScaleByFactor",
+ "ScaleToResolution",
+ "SpecVariants",
+ "StripXML",
+ "VRwearePause",
+ "VRwearePauseLatent",
+ "VRweareResume",
+ "VariantPromptBuilder",
+ "strftime"
+ ],
+ {
+ "title_aux": "Stereoscopic"
+ }
+ ],
+ "https://github.com/Fossiel/ComfyUI-Fossiel-QoL-Nodes": [
+ [
+ "FossielCentralControlLite",
+ "FossielCentralControl_v2",
+ "FossielLevelMatchmaker",
+ "FossielSequenceWrangler",
+ "FossielWebPWrangler",
+ "Fossiel_Qwen_Size_Stabilizer",
+ "Fossiel_Sensor_KSampler_Switch",
+ "Fossiel_Sensor_Switch_Clip",
+ "Fossiel_Sensor_Switch_Conditioning",
+ "Fossiel_Sensor_Switch_Image",
+ "Fossiel_Sensor_Switch_Latent",
+ "Fossiel_Sensor_Switch_Mask",
+ "Fossiel_Sensor_Switch_Model",
+ "Fossiel_Sensor_Switch_VAE"
+ ],
+ {
+ "title_aux": "ComfyUI-Fossiel-QoL-Nodes"
+ }
+ ],
+ "https://github.com/Fossiel/ComfyUI-Fossiel-WAN-Additional-Tilers": [
+ [
+ "Wan22AnimateToVideoTiled",
+ "Wan22FirstMiddleLastFrameToVideoTiled",
+ "Wan22FunControlToVideoTiled",
+ "Wan22PainterFLF2VTiled",
+ "Wan22PainterI2VTiled",
+ "Wan22PainterLongVideoTiled",
+ "Wan22SoundImageToVideoExtendTiled",
+ "Wan22SoundImageToVideoTiled"
+ ],
+ {
+ "title_aux": "ComfyUI-Fossiel-WAN-Additional-Tilers"
+ }
+ ],
+ "https://github.com/Franck-Demongin/NX_HuggingFace_Flux": [
+ [
+ "HFFlux"
+ ],
+ {
+ "title_aux": "NX_HuggingFace_Flux"
+ }
+ ],
+ "https://github.com/Franck-Demongin/NX_PromptStyler": [
+ [
+ "NX_PromptStyler"
+ ],
+ {
+ "title_aux": "NX_PromptStyler"
+ }
+ ],
+ "https://github.com/Franck-Demongin/NX_Translator": [
+ [
+ "Nx_Translator"
+ ],
+ {
+ "title_aux": "NX_Translator"
+ }
+ ],
+ "https://github.com/FranckyB/ComfyUI-Prompt-Manager": [
+ [
+ "AudioMonoToStereo",
+ "LoadLatentFile",
+ "PromptApplyLora",
+ "PromptExtractor",
+ "PromptGenOptions",
+ "PromptGenerator",
+ "PromptManager",
+ "PromptManagerAdvanced",
+ "SaveVideoH26x"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Manager"
+ }
+ ],
+ "https://github.com/Franklyc/comfyui-lora-adain-patcher-node": [
+ [
+ "LoraAdaLNPatcher"
+ ],
+ {
+ "title_aux": "ComfyUI LoRA adaLN Patcher Node"
+ }
+ ],
+ "https://github.com/Frief84/ComfyUI-LoRAWeightAxisXY": [
+ [
+ "XY Input: LoRA Weight (simple)"
+ ],
+ {
+ "title_aux": "ComfyUI-LoRAWeightAxisXY"
+ }
+ ],
+ "https://github.com/FunnyFinger/ComfyUi-RadarWeightNode": [
+ [
+ "RadarWeightsNode"
+ ],
+ {
+ "title_aux": "Radar Weights Node"
+ }
+ ],
+ "https://github.com/FuouM/ComfyUI-EbSynth": [
+ [
+ "ES_Guides7",
+ "ES_Translate",
+ "ES_VideoTransfer",
+ "ES_VideoTransferExtra"
+ ],
+ {
+ "author": "Fuou Marinas",
+ "description": "Run EbSynth in ComfyUI.",
+ "nickname": "EbSynth",
+ "title": "ComfyUI-EbSynth",
+ "title_aux": "ComfyUI-EbSynth"
+ }
+ ],
+ "https://github.com/FuouM/ComfyUI-FirstOrderMM": [
+ [
+ "Articulate_Runner",
+ "FOMM_Partswap",
+ "FOMM_Runner",
+ "FOMM_Seg10Chooser",
+ "FOMM_Seg15Chooser",
+ "FOMM_Seg5Chooser",
+ "FSRT_Runner",
+ "MRFA_Runner",
+ "Spline_Runner"
+ ],
+ {
+ "author": "Fuou Marinas",
+ "description": "ComfyUI-native nodes to run First Order Motion Model for Image Animation and its non-diffusion-based successors.",
+ "nickname": "FOMM",
+ "title": "ComfyUI-FirstOrderMM",
+ "title_aux": "ComfyUI-FirstOrderMM"
+ }
+ ],
+ "https://github.com/FuouM/ComfyUI-MatAnyone": [
+ [
+ "MatAnyone",
+ "SolidColorBatched"
+ ],
+ {
+ "author": "Fuou Marinas",
+ "description": "A collection of nodes.",
+ "nickname": "FM_nodes",
+ "title": "FM Nodes",
+ "title_aux": "ComfyUI-MatAnyone"
+ }
+ ],
+ "https://github.com/FuouM/ComfyUI-StyleTransferPlus": [
+ [
+ "AESFA",
+ "AesFAStyleBlend",
+ "AesPA",
+ "CAST",
+ "CoralColorTransfer",
+ "EFDM",
+ "MicroAST",
+ "NeuralNeighbor",
+ "TSSAT",
+ "UniST",
+ "UniST_Video"
+ ],
+ {
+ "author": "ZJU",
+ "description": "A collection of style transfer nodes.",
+ "nickname": "StyleTransferPlus",
+ "title": "ComfyUI-StyleTransferPlus",
+ "title_aux": "ComfyUI-StyleTransferPlus"
+ }
+ ],
+ "https://github.com/FuouM/FM_nodes": [
+ [
+ "CoLIE_LowLight_Enhance",
+ "ConvIR_DeHaze",
+ "ConvIR_DeRain",
+ "ConvIR_DeSnow",
+ "ConvIR_DefocusDeblur",
+ "ConvIR_MotionDeBlur",
+ "ProPIH_Harmonizer",
+ "RealViFormerSR",
+ "StabStitch",
+ "StabStitch_Crop_Resize",
+ "StabStitch_Stabilize",
+ "VFI_MAMBA",
+ "WFEN"
+ ],
+ {
+ "author": "Fuou Marinas",
+ "description": "A collection of nodes.",
+ "nickname": "FM_nodes",
+ "title": "FM Nodes",
+ "title_aux": "FM_nodes"
+ }
+ ],
+ "https://github.com/FuryNocturn/ComfyUI-Dummy_Node_Pack": [
+ [
+ "ACN_AdvancedControlNetApply_v2",
+ "ACN_ControlNetLoaderAdvanced",
+ "ECHOCheckpointLoaderSimple",
+ "KSampler_A1111"
+ ],
+ {
+ "title_aux": "ComfyUI-Dummy_Node_Pack"
+ }
+ ],
+ "https://github.com/FuryNocturn/ComfyUI-Studio-Fury": [
+ [
+ "SF_ActionAnimator",
+ "SF_AddEntity",
+ "SF_AssetLoader",
+ "SF_DirectorEngine",
+ "SF_FurySampler",
+ "SF_ProjectManager",
+ "SF_SceneComposer",
+ "SF_SmartSaver",
+ "StudioFury_AdvancedPrompt",
+ "StudioFury_EmbeddingsSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-Studio-Fury"
+ }
+ ],
+ "https://github.com/Fuwuffyi/ComfyUI-VisualArea-Nodes": [
+ [
+ "VisualAreaPrompt",
+ "VisualAreaPromptAdvanced"
+ ],
+ {
+ "author": "Fuwuffy",
+ "description": "This is a collection of nodes created to aid when managing area conditionings.",
+ "nickname": "comfy-visual-area",
+ "title": "ComfyUI Visual Area Nodes",
+ "title_aux": "ComfyUI-VisualArea-Nodes"
+ }
+ ],
+ "https://github.com/G-370/ComfyUI-SD3-Powerlab": [
+ [
+ "G370SD3PowerLab_AttentionToImage",
+ "G370SD3PowerLab_ImageIntoAttention",
+ "G370SD3PowerLab_ImageIntoLayer",
+ "G370SD3PowerLab_LayerToImage",
+ "G370SD3PowerLab_RenderAttention"
+ ],
+ {
+ "title_aux": "ComfyUI-SD3-Powerlab"
+ }
+ ],
+ "https://github.com/GACLove/ComfyUI-VFI": [
+ [
+ "CalculateLoadedFPS",
+ "RIFEInterpolation"
+ ],
+ {
+ "title_aux": "ComfyUI-VFI"
+ }
+ ],
+ "https://github.com/GENKAIx/PixelArt-Processing-Nodes-for-ComfyUI": [
+ [
+ "PixelArtDownscaleNode",
+ "PixelArtNode"
+ ],
+ {
+ "title_aux": "PixelArt Processing Nodes"
+ }
+ ],
+ "https://github.com/GHOSTLXH/ComfyUI-Counternodes": [
+ [
+ "AlternatingOutput",
+ "AlternatingOutputB",
+ "ImageCounter",
+ "IntervalCounter",
+ "IntervalCounterB",
+ "LoadPromptFromTXT"
+ ],
+ {
+ "title_aux": "ComfyUI-Counternodes"
+ }
+ ],
+ "https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes": [
+ [
+ "Danbooru (ID)",
+ "Danbooru (Random)",
+ "DanbooruID",
+ "DanbooruRandom",
+ "Random File From Path",
+ "RandomFileFromPath",
+ "Replace Strings",
+ "ReplaceStrings",
+ "Simple Wildcards",
+ "Simple Wildcards (Dir.)",
+ "SimpleWildcards",
+ "SimpleWildcardsDir",
+ "Wildcards Nodes",
+ "WildcardsNodes"
+ ],
+ {
+ "title_aux": "ComfyUI-GTSuya-Nodes"
+ }
+ ],
+ "https://github.com/GZK1108/Comfyui-QwenLoraLoaderSelective": [
+ [
+ "LoadLoraQwenImage"
+ ],
+ {
+ "title_aux": "Comfyui-QwenLoraLoaderSelective"
+ }
+ ],
+ "https://github.com/GadzoinksOfficial/comfyui_gprompts": [
+ [
+ "GPrompts",
+ "GPrompts Save Image"
+ ],
+ {
+ "author": "gadzoinksofficial",
+ "description": "Another dynamic prompt node, designed to be easy to use and support wildcards",
+ "nickname": "Gprompts",
+ "title": "Gprompts",
+ "title_aux": "Gprompts"
+ }
+ ],
+ "https://github.com/GadzoinksOfficial/gadzoinks_ComfyUI": [
+ [
+ "Gadzoinks"
+ ],
+ {
+ "author": "gadzoinksofficial",
+ "description": "Custom node for integrating with gadzoinks iPhone app",
+ "nickname": "Gadzoinks",
+ "title": "Gadzoinks",
+ "title_aux": "Gadzoinks"
+ }
+ ],
+ "https://github.com/GamingDaveUk/daves_nodes": [
+ [
+ "davesTextToList"
+ ],
+ {
+ "title_aux": "Daves Nodes"
+ }
+ ],
+ "https://github.com/Gary-yeh/ComfyUI-WebPrompter": [
+ [
+ "ContentFetcher (WebPrompter)",
+ "LLMNewsScriptGenerator (WebPrompter)"
+ ],
+ {
+ "title_aux": "ComfyUI-WebPrompter"
+ }
+ ],
+ "https://github.com/Gary-yeh/comfyui-super-captioner": [
+ [
+ "SuperCaptioner"
+ ],
+ {
+ "title_aux": "comfyui-super-captioner"
+ }
+ ],
+ "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes": [
+ [
+ "SD3LatentSelectRes",
+ "SD3LatentSelectResV2"
+ ],
+ {
+ "title_aux": "ComfyUI-SD3LatentSelectRes"
+ }
+ ],
+ "https://github.com/GavChap/ComfyUI_ExtractLora": [
+ [
+ "ExtractLoRA"
+ ],
+ {
+ "title_aux": "ComfyUI_ExtractLora"
+ }
+ ],
+ "https://github.com/GeekatplayStudio/ComfyUI-Text2Speech": [
+ [
+ "HttpTTSToAudio",
+ "TTSServerStatus"
+ ],
+ {
+ "title_aux": "ComfyUI-Text2Speech"
+ }
+ ],
+ "https://github.com/GeekatplayStudio/comfyui-hitem3d": [
+ [
+ "DynamicValueGenerator",
+ "HTMLPreviewer",
+ "HiTem3DConfigNode",
+ "HiTem3DDownloaderNode",
+ "HiTem3DHistoryNode",
+ "HiTem3DNode",
+ "HiTem3DPreviewNode",
+ "TextTemplate"
+ ],
+ {
+ "title_aux": "ComfyUI HiTem3D Integration"
+ }
+ ],
+ "https://github.com/GeekyGhost/ComfyUI-Geeky-Kokoro-TTS": [
+ [
+ "GeekyKokoroAdvancedVoice",
+ "GeekyKokoroTTS"
+ ],
+ {
+ "title_aux": "ComfyUI-Geeky-Kokoro-TTS"
+ }
+ ],
+ "https://github.com/GeekyGhost/ComfyUI-Geeky-LatentSyncWrapper": [
+ [
+ "GeekyLatentSyncNode",
+ "GeekyVideoLengthAdjuster"
+ ],
+ {
+ "title_aux": "ComfyUI-Geeky-LatentSyncWrapper 1.5"
+ }
+ ],
+ "https://github.com/GeekyGhost/ComfyUI-GeekyRemB": [
+ [
+ "GeekyRemB"
+ ],
+ {
+ "title_aux": "ComfyUI-GeekyRemB"
+ }
+ ],
+ "https://github.com/GeekyGhost/ComfyUI-Image-Segmenting-Loader": [
+ [
+ "GeekyQwenCompositor",
+ "GeekyQwenEffects",
+ "GeekyQwenSegmentLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Segmenting-Loader"
+ }
+ ],
+ "https://github.com/GeekyGhost/ComfyUI_Geeky_AudioMixer": [
+ [
+ "GeekyAudioMixer"
+ ],
+ {
+ "title_aux": "ComfyUI Geeky AudioMixer"
+ }
+ ],
+ "https://github.com/GegenDenTag/ComfyUI-multi-area-condition-node": [
+ [
+ "MultiAreaConditioning"
+ ],
+ {
+ "title_aux": "Multi Area Conditioning"
+ }
+ ],
+ "https://github.com/GeneralShan/comfyui-zimage-sdnq": [
+ [
+ "ZImageSDNQCannyPreprocess",
+ "ZImageSDNQClearCaches",
+ "ZImageSDNQControlLoRAApply",
+ "ZImageSDNQControlPipelineLoader",
+ "ZImageSDNQDepthPreprocess",
+ "ZImageSDNQLoRAApply",
+ "ZImageSDNQPipelineLoader",
+ "ZImageSDNQSamplerControl",
+ "ZImageSDNQSamplerI2I",
+ "ZImageSDNQSamplerInpaint",
+ "ZImageSDNQSamplerT2I"
+ ],
+ {
+ "title_aux": "comfyui-zimage-sdnq"
+ }
+ ],
+ "https://github.com/GentlemanHu/ComfyUI-SunoAI": [
+ [
+ "GentlemanHu_SunoAI",
+ "GentlemanHu_SunoAI_NotSafe"
+ ],
+ {
+ "title_aux": "ComfyUI Suno API"
+ }
+ ],
+ "https://github.com/Geo1230/ComfyUI-DeepseekOCR": [
+ [
+ "DeepSeekOCR_Load",
+ "DeepSeekOCR_Run"
+ ],
+ {
+ "title_aux": "ComfyUI-DeepseekOCR"
+ }
+ ],
+ "https://github.com/GeraldWie/ComfyUI-I2I-slim": [
+ [
+ "Color Transfer Slim",
+ "Combine and Paste Slim",
+ "Inpaint Segments Slim",
+ "Mask Ops Slim"
+ ],
+ {
+ "author": "GeraldWie",
+ "title": "ComfyI2I-lite",
+ "title_aux": "ComfyUI-I2I-slim"
+ }
+ ],
+ "https://github.com/Gipphe/comfyui-metadata-statistics": [
+ [
+ "RecordModels"
+ ],
+ {
+ "title_aux": "ComfyUI Metadata Statistics"
+ }
+ ],
+ "https://github.com/GiusTex/ComfyUI-DiffusersImageOutpaint": [
+ [
+ "DiffusersImageOutpaint",
+ "EncodeDiffusersOutpaintPrompt",
+ "LoadDiffuserControlnet",
+ "LoadDiffuserModel",
+ "PadImageForDiffusersOutpaint"
+ ],
+ {
+ "title_aux": "ComfyUI-DiffusersImageOutpaint"
+ }
+ ],
+ "https://github.com/GiusTex/ComfyUI-MoreEfficientSamplers": [
+ [
+ "SamplerCustomAdvanced_Efficient",
+ "SamplerCustomUltraAdvancedEfficient",
+ "SamplerCustomUltraAdvancedPlusEfficient"
+ ],
+ {
+ "title_aux": "ComfyUI-MoreEfficientSamplers"
+ }
+ ],
+ "https://github.com/GiusTex/ComfyUI-Wan-TimeToMove": [
+ [
+ "CFGFloatListScheduler",
+ "EncodeWanVideo",
+ "TTMLatentAdd",
+ "TimeToMoveGuider"
+ ],
+ {
+ "title_aux": "ComfyUI-Wan-TimeToMove"
+ }
+ ],
+ "https://github.com/GizmoR13/PG-Nodes": [
+ [
+ "PgCheckpointSelect",
+ "PgClipSelect",
+ "PgClipVisionSelect",
+ "PgControlNetSelect",
+ "PgCpSwitch",
+ "PgCreateHookLoraBoth",
+ "PgCreateHookLoraClipOnly",
+ "PgCreateHookLoraModelOnly",
+ "PgDiffusionSelect",
+ "PgIPAdapterSelect",
+ "PgJustSaveImage",
+ "PgJustSaveImageOut",
+ "PgLORASelect",
+ "PgLazyPrompt",
+ "PgLazyPromptExt",
+ "PgLazyPromptMini",
+ "PgLoraBridgeLoader",
+ "PgMergeLoraBoth",
+ "PgMergeLoraClipOnly",
+ "PgMergeLoraModelOnly",
+ "PgPercentFloat",
+ "PgSamplerSelect",
+ "PgSamplerSelectCombo",
+ "PgSchedulerSelect",
+ "PgSchedulerSelectCombo",
+ "PgSetClipHooks",
+ "PgSetHookKeyframes",
+ "PgSetModelHooks",
+ "PgSwapCFGGuidance",
+ "PgUniCheckpointSelect",
+ "PgUniClipSelect",
+ "PgUniClipVisionSelect",
+ "PgUniControlNetSelect",
+ "PgUniDiffusionSelect",
+ "PgUniIPAdapterSelect",
+ "PgUniLORASelect",
+ "PgUniUpscaleSelect",
+ "PgUniVAESelect",
+ "PgUnifiedLoader",
+ "PgUnifiedLoaderMini",
+ "PgUpscaleSelect",
+ "PgVAESelect",
+ "PgXorDualToggle"
+ ],
+ {
+ "title_aux": "PG Nodes"
+ }
+ ],
+ "https://github.com/Glidias/mask2sam": [
+ [
+ "MaskToBBoxes",
+ "MaskToPoints"
+ ],
+ {
+ "title_aux": "mask2sam"
+ }
+ ],
+ "https://github.com/Goktug/comfyui-saveimage-plus": [
+ [
+ "SaveImagePlus"
+ ],
+ {
+ "title_aux": "Save Image Plus for ComfyUI"
+ }
+ ],
+ "https://github.com/GonDesign/ComfyUI-HaoranWanxImageEdit": [
+ [
+ "HaoranWanxAPILoader",
+ "HaoranWanxImageEdit",
+ "HaoranWanxPromptHelper"
+ ],
+ {
+ "title_aux": "ComfyUI-HaoranWanxImageEdit"
+ }
+ ],
+ "https://github.com/GoogleCloudPlatform/comfyui-google-genmedia-custom-nodes": [
+ [
+ "Gemini25FlashImage",
+ "Gemini3ProImage",
+ "GeminiNode25",
+ "Imagen3TextToImageNode",
+ "Imagen4TextToImageNode",
+ "Lyria2TextToMusicNode",
+ "Veo2GcsUriImageToVideoNode",
+ "Veo2ImageToVideoNode",
+ "Veo2TextToVideoNode",
+ "Veo3GcsUriImageToVideoNode",
+ "Veo3ImageToVideoNode",
+ "Veo3ReferenceToVideo",
+ "Veo3TextToVideoNode",
+ "VeoVideoSaveAndPreview",
+ "VeoVideoToVHSNode",
+ "VirtualTryOn"
+ ],
+ {
+ "title_aux": "comfyui-google-genmedia-custom-nodes"
+ }
+ ],
+ "https://github.com/Goshe-nite/comfyui-gps-supplements": [
+ [
+ "KSampler to Image Saver",
+ "Lora Prompt Concatenation",
+ "Lora to String",
+ "Model to String",
+ "gpsdebugger"
+ ],
+ {
+ "title_aux": "GPS' Supplements for ComfyUI"
+ }
+ ],
+ "https://github.com/Gourieff/ComfyUI-ReActor": [
+ [
+ "ImageRGBA2RGB",
+ "ReActorBuildFaceModel",
+ "ReActorFaceBoost",
+ "ReActorFaceSwap",
+ "ReActorFaceSwapOpt",
+ "ReActorImageDublicator",
+ "ReActorLoadFaceModel",
+ "ReActorMakeFaceModelBatch",
+ "ReActorMaskHelper",
+ "ReActorOptions",
+ "ReActorRestoreFace",
+ "ReActorRestoreFaceAdvanced",
+ "ReActorSaveFaceModel",
+ "ReActorSetWeight",
+ "ReActorUnload"
+ ],
+ {
+ "title_aux": "comfyui-reactor-node"
+ }
+ ],
+ "https://github.com/GraftingRayman/Border-Distance-Mapper": [
+ [
+ "BorderDistanceMapper"
+ ],
+ {
+ "title_aux": "Border Distance Mapper"
+ }
+ ],
+ "https://github.com/GraftingRayman/ComfyUI-Dimension-Selector": [
+ [
+ "DimensionSelector"
+ ],
+ {
+ "title_aux": "ComfyUI Visual Dimension Selector"
+ }
+ ],
+ "https://github.com/GraftingRayman/ComfyUI-Games": [
+ [
+ "ArkanoidNode",
+ "CheckersNode",
+ "PacManNode",
+ "SnakeNode",
+ "TetrisNode",
+ "TicTacToeNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Games"
+ }
+ ],
+ "https://github.com/GraftingRayman/ComfyUI-PuLID-Flux-GR": [
+ [
+ "GRApplyPulidFlux",
+ "GRPulidFluxEvaClipLoader",
+ "GRPulidFluxInsightFaceLoader",
+ "GRPulidFluxModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-PuLID-Flux-GR"
+ }
+ ],
+ "https://github.com/GraftingRayman/ComfyUI_GraftingRayman": [
+ [
+ "GR BLIP 2 Caption Generator",
+ "GR BLIP 2 Text Expander",
+ "GR Background Remover REMBG",
+ "GR Checkered Board",
+ "GR Counter",
+ "GR Filename",
+ "GR Flip Tile Random Inverted",
+ "GR Flip Tile Random Red Ring",
+ "GR Florence 2 Caption Generator",
+ "GR INT Incremetor",
+ "GR Image Details Displayer",
+ "GR Image Details Saver",
+ "GR Image Multiplication",
+ "GR Image Multiplier",
+ "GR Image Paste",
+ "GR Image Paste With Mask",
+ "GR Image Resize",
+ "GR Image Resize Methods",
+ "GR Image Size",
+ "GR Image/Depth Mask",
+ "GR Lora Randomizer",
+ "GR Mask",
+ "GR Mask Create",
+ "GR Mask Create Random",
+ "GR Mask Create Random Multi",
+ "GR Mask Resize",
+ "GR Multi Mask Create",
+ "GR Onomatopoeia",
+ "GR Pan Or Zoom",
+ "GR Prompt Generator",
+ "GR Prompt Generator Extended",
+ "GR Prompt Generator1",
+ "GR Prompt HUB",
+ "GR Prompt Selector",
+ "GR Prompt Selector Multi",
+ "GR Prompty",
+ "GR Scroller",
+ "GR Sigma Presets",
+ "GR Sigmas",
+ "GR Stack Image",
+ "GR Text Overlay",
+ "GR Tile and Border Image",
+ "GR Tile and Border Image Random Flip",
+ "GRAudioSelector",
+ "GRImageSelector",
+ "GRLoraLoader",
+ "GRMenuHook",
+ "GRPromptViewer"
+ ],
+ {
+ "title_aux": "GraftingRayman"
+ }
+ ],
+ "https://github.com/GraftingRayman/ComfyUI_QueueTube": [
+ [
+ "GR QueueTube"
+ ],
+ {
+ "title_aux": "ComfyUI QueueTube"
+ }
+ ],
+ "https://github.com/GraftingRayman/Unified-Vision-Prompt-Generator": [
+ [
+ "UnifiedVisionPromptGenerator"
+ ],
+ {
+ "title_aux": "Unfied Vision Prompt Generator"
+ }
+ ],
+ "https://github.com/GrailGreg/images_base64": [
+ [
+ "SaveImage64",
+ "ShowText64"
+ ],
+ {
+ "title_aux": "Image Saving and Base64 Encoding Script"
+ }
+ ],
+ "https://github.com/Granddyser/wan-video-extender": [
+ [
+ "WanVideoExtenderLowHigh",
+ "WanVideoExtenderNative"
+ ],
+ {
+ "title_aux": "Wan-video-extender"
+ }
+ ],
+ "https://github.com/GreenLandisaLie/AuraSR-ComfyUI": [
+ [
+ "AuraSR.AuraSRUpscaler"
+ ],
+ {
+ "title_aux": "AuraSR-ComfyUI"
+ }
+ ],
+ "https://github.com/GreenLandisaLie/ComfyUI-BooruBrowser": [
+ [
+ "SILVER_FL_BooruBrowser",
+ "SILVER_Online_Video_Frame_Extractor"
+ ],
+ {
+ "title_aux": "ComfyUI-BooruBrowser"
+ }
+ ],
+ "https://github.com/GreenLandisaLie/ComfyUI-RichText_BasicDynamicPrompts": [
+ [
+ "SILVER_BasicDynamicPrompts"
+ ],
+ {
+ "title_aux": "ComfyUI-RichText_BasicDynamicPrompts"
+ }
+ ],
+ "https://github.com/GroxicTinch/EasyUI-ComfyUI": [
+ [
+ "UINode"
+ ],
+ {
+ "title_aux": "EasyUI"
+ }
+ ],
+ "https://github.com/GrvBdgr/comfyui-negativewildcardsprocessor": [
+ [
+ "custom_token_processor",
+ "neg_wildcard_processor"
+ ],
+ {
+ "title_aux": "Negative Wildcard Processor Node for ComfyUI"
+ }
+ ],
+ "https://github.com/GuardSkill/ComfyUI-VoiceSep": [
+ [
+ "ClearVoiceModelLoader",
+ "ClearVoiceSpeechSeparation"
+ ],
+ {
+ "title_aux": "ComfyUI-VoiceSep"
+ }
+ ],
+ "https://github.com/Gue-e/ComfyUI-PanoCard": [
+ [
+ "PanoCardViewer",
+ "PanoCondAllBatch",
+ "PanoCondFaceBatch",
+ "PanoCondFaceClamp",
+ "PanoCondFaceDetailerHook",
+ "PanoCondFaceUnPack",
+ "PanoImage2FaceSplit",
+ "PanoImageAdjust",
+ "PanoImageEqu2Equ",
+ "PanoImageEqu2Face",
+ "PanoImageEqu2Pic",
+ "PanoImageFace2Equ",
+ "PanoImageFaceClamp",
+ "PanoImageFaceToLong",
+ "PanoImageHeightPad",
+ "PanoImagePad",
+ "PanoImagePic2Equ",
+ "PanoImageRoll",
+ "PanoImageUnPack",
+ "PanoImageWidthPad",
+ "PanoLongMaskSplit",
+ "PanoMaskUnPack",
+ "PanoPipe",
+ "PanoPromptSplit",
+ "PanoRegionalPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-PanoCard"
+ }
+ ],
+ "https://github.com/Guillaume-Fgt/ComfyUI_StableCascadeLatentRatio": [
+ [
+ "StableCascadeLatentRatio"
+ ],
+ {
+ "title_aux": "ComfyUI_StableCascadeLatentRatio"
+ }
+ ],
+ "https://github.com/HAL41/ComfyUI-aichemy-nodes": [
+ [
+ "aichemyYOLOv8Segmentation"
+ ],
+ {
+ "title_aux": "ComfyUI aichemy nodes"
+ }
+ ],
+ "https://github.com/HECer/ComfyUI-FilePathCreator": [
+ [
+ "FilePathCreator",
+ "FilePathExtractor"
+ ],
+ {
+ "title_aux": "ComfyUI-FilePathCreator"
+ }
+ ],
+ "https://github.com/HJH-AILab/ComfyUI_CosyVoice2": [
+ [
+ "CosyVoiceModel",
+ "CosyVoiceNode",
+ "HJHCosyVoiceSaveAudio"
+ ],
+ {
+ "title_aux": "ComfyUI_CosyVoice2"
+ }
+ ],
+ "https://github.com/HJH-AILab/ComfyUI_Facefusion": [
+ [
+ "FacefusionFaceEnhancerProcessor",
+ "FacefusionFaceSwapperProcessor",
+ "FacefusionFrameEnhancerProcessor",
+ "FacefusionLipSyncerProcessor",
+ "FacefusionOptionsNode",
+ "FacefusionProcesserOptionsNode",
+ "FacefusionProcessingNode"
+ ],
+ {
+ "title_aux": "ComfyUI_Facefusion"
+ }
+ ],
+ "https://github.com/HJH-AILab/ComfyUI_StableAnimator": [
+ [
+ "StableAnimatorDWPoseDetectorAlignedModels",
+ "StableAnimatorLoadFramesFromFolderNode",
+ "StableAnimatorModels",
+ "StableAnimatorNode",
+ "StableAnimatorSkeletonNode"
+ ],
+ {
+ "title_aux": "ComfyUI_StableAnimator"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_APICall": [
+ [
+ "RH_AudioUploader",
+ "RH_BatchImages",
+ "RH_ExecuteNode",
+ "RH_ExtractImage",
+ "RH_ImageUploaderNode",
+ "RH_NodeInfoListNode",
+ "RH_SettingsNode",
+ "RH_Utils",
+ "RH_VideoUploader"
+ ],
+ {
+ "title_aux": "ComfyUI_RH_APICall"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_DMOSpeech2": [
+ [
+ "RunningHub DMOSpeech2"
+ ],
+ {
+ "title_aux": "ComfyUI DMOSpeech2 Node"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_DreamOmni2": [
+ [
+ "RunningHub DreamOmni2 Edit Pipeline",
+ "RunningHub DreamOmni2 Editor",
+ "RunningHub DreamOmni2 Gen Pipeline",
+ "RunningHub DreamOmni2 Generator"
+ ],
+ {
+ "title_aux": "ComfyUI DreamOmni2 Node"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_FramePack": [
+ [
+ "RunningHub_FramePack",
+ "RunningHub_FramePack_F1"
+ ],
+ {
+ "title_aux": "ComfyUI_RH_FramePack"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_ICCustom": [
+ [
+ "RunningHub ICCustom Loader",
+ "RunningHub ICCustom Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI IC-Custom Node"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_LLM_API": [
+ [
+ "RH_LLMAPI_NODE"
+ ],
+ {
+ "title_aux": "ComfyUI_RH_LLM_API"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_OminiControl": [
+ [
+ "RunningHub_Omini_Fill",
+ "RunningHub_Omini_Spatial",
+ "RunningHub_Omini_Subject"
+ ],
+ {
+ "title_aux": "ComfyUI_RH_OminiControl"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_OneReward": [
+ [
+ "RunningHub OneReward Eraser",
+ "RunningHub OneReward Loader",
+ "RunningHub OneReward Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI OneReward Node"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_Ovi": [
+ [
+ "RunningHub Ovi Image to Video",
+ "RunningHub Ovi Model Loader",
+ "RunningHub Ovi Text to Video"
+ ],
+ {
+ "title_aux": "ComfyUI Ovi Node"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_QwenImageI2L": [
+ [
+ "RunningHub_ImageQwenI2L_Loader(CFB)",
+ "RunningHub_ImageQwenI2L_Loader(Style)",
+ "RunningHub_ImageQwenI2L_LoraGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI_RH_QwenImageI2L"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_SeedXPro": [
+ [
+ "RunningHub SeedXPro Translator"
+ ],
+ {
+ "title_aux": "ComfyUI SeedXPro Translation Node"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_Step1XEdit": [
+ [
+ "RunningHub_Step1XEdit"
+ ],
+ {
+ "title_aux": "ComfyUI_RH_Step1XEdit"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_UNO": [
+ [
+ "RunningHub_UNO_Loadmodel",
+ "RunningHub_UNO_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_RH_UNO"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_USO": [
+ [
+ "RunningHub USO Loader",
+ "RunningHub USO Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI USO Node"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_VideoAsPrompt": [
+ [
+ "RunningHub VideoAsPrompt Loader",
+ "RunningHub VideoAsPrompt Sampler(CogVideoX)"
+ ],
+ {
+ "title_aux": "ComfyUI_RH_VideoAsPrompt"
+ }
+ ],
+ "https://github.com/HM-RunningHub/ComfyUI_RH_mammothmoda": [
+ [
+ "RunningHub Mammothmoda Loader",
+ "RunningHub Mammothmoda T2I Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_RH_mammothmoda"
+ }
+ ],
+ "https://github.com/HMG-Fiverr/ComfyUI-RandomNumberButton": [
+ [
+ "RandomNumberButton"
+ ],
+ {
+ "title_aux": "Random Number Button"
+ }
+ ],
+ "https://github.com/HSDHCdev/ComfyUI-AI-Pixel-Art-Enhancer": [
+ [
+ "AIPixelArtEnhancer"
+ ],
+ {
+ "title_aux": "AI Pixel Art Enhancer for ComfyUI"
+ }
+ ],
+ "https://github.com/HWDigi/Factory-Prompts_comfyui": [
+ [
+ "FactoryPromptsNegative",
+ "FactoryPromptsNegativeCategorized",
+ "FactoryPromptsNegativeToggle",
+ "FactoryPromptsPositive"
+ ],
+ {
+ "title_aux": "Factory Prompt Generator"
+ }
+ ],
+ "https://github.com/Hahihula/ComfyUI-batching-nodes": [
+ [
+ "BatchImageLoaderNode",
+ "ImageFromBatchNode",
+ "PromptFromListNode",
+ "PromptLoopNode"
+ ],
+ {
+ "title_aux": "ComfyUI-batching-nodes"
+ }
+ ],
+ "https://github.com/Haiper-ai/ComfyUI-HaiperAI-API": [
+ [
+ "HaiperImage2Video",
+ "HaiperKeyframeConditioning",
+ "HaiperText2Image",
+ "HaiperText2Video"
+ ],
+ {
+ "title_aux": "ComfyUI-HaiperAI-API"
+ }
+ ],
+ "https://github.com/HallettVisual/ComfyUI-Qwen-Camera-Selector": [
+ [
+ "QwenCameraPromptBuilder"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen-Camera-Selector"
+ }
+ ],
+ "https://github.com/Hangover3832/ComfyUI_Hangover-Utils": [
+ [
+ "Get Workflow Data",
+ "Image Clipboard Copy",
+ "Image Clipboard Paster",
+ "Image Scale Bounding Box",
+ "Make Inpaint Model",
+ "Save Image w/o Metadata",
+ "Sympy Math Interpreter",
+ "Text Encode Wildcards"
+ ],
+ {
+ "author": "AlexL",
+ "description": "Scales an input image into a given box size, whereby the aspect ratio keeps retained.",
+ "nickname": "Hangover-Image_Scale_Bouning_Box",
+ "title": "ComfyUI-Hangover-Image_Scale_Bouning_Box",
+ "title_aux": "ComfyUI_Hangover-Utils"
+ }
+ ],
+ "https://github.com/HannibalP/comfyui-HannibalPack": [
+ [
+ "HannibalLoraLoader"
+ ],
+ {
+ "title_aux": "comfyui-HannibalPack"
+ }
+ ],
+ "https://github.com/Haoming02/comfyui-diffusion-cg": [
+ [
+ "Diffusion CG",
+ "Disable CG"
+ ],
+ {
+ "title_aux": "Diffusion CG"
+ }
+ ],
+ "https://github.com/Haoming02/comfyui-floodgate": [
+ [
+ "FloodGate"
+ ],
+ {
+ "title_aux": "Floodgate"
+ }
+ ],
+ "https://github.com/Haoming02/comfyui-resharpen": [
+ [
+ "ReSharpen"
+ ],
+ {
+ "title_aux": "ComfyUI ReSharpen"
+ }
+ ],
+ "https://github.com/HappyOnigiri/ComfyUI-Meld": [
+ [
+ "MeldAutoExposure",
+ "MeldImageLoader",
+ "MeldImageLoaderBatch",
+ "MeldPatternHeart",
+ "MeldPixelate",
+ "MeldPromptConstructor",
+ "MeldSaveImage",
+ "MeldSettingsUnpacker",
+ "MeldUnifiedFluxLoader",
+ "MeldUnifiedLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Meld"
+ }
+ ],
+ "https://github.com/HappyXY/ComfyUI-AmazonBedrock": [
+ [
+ "Amazon Bedrock - Nova Canvas Background Prompt Replace",
+ "Amazon Bedrock - Nova Canvas Generate Image",
+ "Amazon Bedrock - Nova Canvas Generate Variations",
+ "Amazon Bedrock - Nova Canvas Remove Object",
+ "Amazon Bedrock - Nova Reel Video",
+ "Bedrock - Claude",
+ "Bedrock - Claude Multimodal",
+ "Bedrock - Nova",
+ "Bedrock - SDXL"
+ ],
+ {
+ "title_aux": "ComfyUI-AmazonBedrock"
+ }
+ ],
+ "https://github.com/Hasasasa/ComfyUI_DashuaiTools": [
+ [
+ "API_PromptHelper",
+ "API_caption",
+ "Batch_API_caption",
+ "Gemini_API_Image",
+ "ImageComparisonGIF",
+ "Load64image",
+ "LoadImageList",
+ "LoadTextList",
+ "MinimumFilter",
+ "SaveImageWithName",
+ "XY_Image",
+ "ZImageLoraModelOnly",
+ "getImageRetio",
+ "qwenMultiAngles"
+ ],
+ {
+ "title_aux": "ComfyUI DashuaiTools"
+ }
+ ],
+ "https://github.com/HavocsCall/comfyui_HavocsCall_Custom_Nodes": [
+ [
+ "Clip Switch",
+ "Combine String",
+ "Conditioning Switch",
+ "Float Selector",
+ "Float to Integer",
+ "Float to String",
+ "Image Switch",
+ "Integer Selector",
+ "Integer to Float",
+ "Integer to String",
+ "Latent Switch",
+ "Load Image",
+ "Logic Compare",
+ "Math Operation",
+ "Model Switch",
+ "Prompt Combiner",
+ "Prompt Styler",
+ "Sampler Config",
+ "Save Image",
+ "String Switch",
+ "String to Float",
+ "String to Integer",
+ "Text Box",
+ "VAE Switch"
+ ],
+ {
+ "title_aux": "HavocsCall's Custom ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/HaydenReeve/ComfyUI-Better-Strings": [
+ [
+ "BetterString"
+ ],
+ {
+ "title_aux": "ComfyUI Better Strings"
+ }
+ ],
+ "https://github.com/Hazukiaoi/ComfyUI-LM_Studio_Tools": [
+ [
+ "LMS_APIConfig",
+ "LMS_GetAssistantMessage",
+ "LMS_Request",
+ "LMS_SelectModel",
+ "LMS_SystemPrompt",
+ "LMS_UnloadModel",
+ "LMS_UserPrompt"
+ ],
+ {
+ "title_aux": "LM Studio Tools for ComfyUI"
+ }
+ ],
+ "https://github.com/HeadshotPro/ComfyUI-HeadshotPro": [
+ [
+ "[HSP] Download Dreambooth Checkpoint",
+ "[HSP] Download Flux Lora",
+ "[HSP] Get Random Value From List",
+ "[HSP] Load Canny Pose Face",
+ "[HSP] Transparent to White Background"
+ ],
+ {
+ "title_aux": "ComfyUI-HeadshotPro"
+ }
+ ],
+ "https://github.com/Hearmeman24/ComfyUI-LoRAPlotNode": [
+ [
+ "LoRAPlotImageSaver",
+ "LoRAPlotNode"
+ ],
+ {
+ "title_aux": "ComfyUI-LoRAPlotNode"
+ }
+ ],
+ "https://github.com/Hearmeman24/ComfyUI-Pinecone": [
+ [
+ "PineconePromptUpserter"
+ ],
+ {
+ "title_aux": "ComfyUI Pinecone Prompt Upserter"
+ }
+ ],
+ "https://github.com/HebelHuber/comfyui-enhanced-save-node": [
+ [
+ "EnhancedSaveNode"
+ ],
+ {
+ "title_aux": "comfyui-enhanced-save-node"
+ }
+ ],
+ "https://github.com/HellerCommaA/ComfyUI-VideoResolutions": [
+ [
+ "HunyuanResolutions"
+ ],
+ {
+ "title_aux": "Hunyuan Video Resolutions"
+ }
+ ],
+ "https://github.com/HellerCommaA/ComfyUI-ZImageLatent": [
+ [
+ "ZImageLatent"
+ ],
+ {
+ "title_aux": "ComfyUI-ZImageLatent"
+ }
+ ],
+ "https://github.com/Hellfiredragon/comfyui-image-manipulation": [
+ [
+ "AlphaApplyMaskToImage",
+ "CreateMaskFromColorsNode"
+ ],
+ {
+ "title_aux": "comfyui-image-manipulation"
+ }
+ ],
+ "https://github.com/HelloVision/ComfyUI_HelloMeme": [
+ [
+ "GetExpression",
+ "GetExpression2",
+ "GetFaceLandmarks",
+ "GetHeadPose",
+ "HMFaceToolkitsLoader",
+ "HMImagePipelineLoader",
+ "HMPipelineImage",
+ "HMPipelineVideo",
+ "HMVideoPipelineLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_HelloMeme"
+ }
+ ],
+ "https://github.com/Hellrunner2k/ComfyUI-HellrunnersMagicalNodes": [
+ [
+ "AdjustMojo",
+ "BufferedEncoder",
+ "LoRABox",
+ "LoadMaskMap",
+ "MagicalSaveNode",
+ "MaskMapPrompt",
+ "MaskMapPromptMix",
+ "MojoLoader",
+ "MojoMaker",
+ "SaveMojo",
+ "TEAce",
+ "ThermalLatenator"
+ ],
+ {
+ "title_aux": "Hellrunner's Magical Nodes"
+ }
+ ],
+ "https://github.com/HenkDz/nd-super-nodes": [
+ [
+ "NdSuperLoraLoader"
+ ],
+ {
+ "title_aux": "nd-super-nodes"
+ }
+ ],
+ "https://github.com/HighDoping/ComfyUI_ASSSSA": [
+ [
+ "ASSSubtitleReader",
+ "ASSSubtitleSave",
+ "FFMpegSettings",
+ "MultilineTextInput",
+ "SubtitleEmbedding",
+ "SubtitleExtraction",
+ "VideoTranscoding"
+ ],
+ {
+ "title_aux": "ComfyUI-ASSSSA"
+ }
+ ],
+ "https://github.com/HoangYell/comfyui-hoangyell-video": [
+ [
+ "AddIntroImage"
+ ],
+ {
+ "title_aux": "comfyui-hoangyell-video-edit"
+ }
+ ],
+ "https://github.com/Holasyb918/Ghost2_Comfyui": [
+ [
+ "AlignPipeline",
+ "BlenderPipeline",
+ "FaceAnalysisePipeline",
+ "FaceParsingPipeline",
+ "LoadAlignerModel",
+ "LoadBlenderModel",
+ "LoadFaceAnalysisModel",
+ "LoadFaceParsingModel",
+ "LoadInpainterModel",
+ "LoadStyleMatteModel"
+ ],
+ {
+ "title_aux": "Ghost2_Comfyui"
+ }
+ ],
+ "https://github.com/Hopping-Mad-Games/ComfyUI_LiteLLM": [
+ [
+ "AgentMemoryProvider",
+ "AgentNode",
+ "BasicRecursionFilterNode",
+ "Completion Enhancement Filter",
+ "Document Chunk Processor",
+ "DocumentChunkRecursionFilterNode",
+ "DocumentProcessor",
+ "Iterative Completion Agent",
+ "LinuxMemoryDirectory",
+ "QueryNode"
+ ],
+ {
+ "description": "Nodes for interfacing with LiteLLM",
+ "nickname": "Tasha",
+ "title": "ComfyUI_LiteLLM",
+ "title_aux": "ComfyUI_LiteLLM"
+ }
+ ],
+ "https://github.com/HowToSD/ComfyUI-Data-Analysis": [
+ [
+ "CDAFloatCreate",
+ "CDAIntCreate",
+ "CDAJSONCreate",
+ "CDAShowFloat",
+ "CDAShowInt",
+ "CDAStringCreate",
+ "CDATextCreate",
+ "MPLBar",
+ "MPLLine",
+ "MPLPieChart",
+ "MPLScatter",
+ "NumpyFloatCreate",
+ "NumpyIntCreate",
+ "NumpyShow",
+ "NumpySqueeze",
+ "PandasAdd",
+ "PandasAddScalarFloat",
+ "PandasAddScalarInt",
+ "PandasAddSeries",
+ "PandasAsFloat",
+ "PandasAsInt",
+ "PandasAsString",
+ "PandasAtDatetime",
+ "PandasAtFloat",
+ "PandasAtInt",
+ "PandasAtSetDatetime",
+ "PandasAtSetFloat",
+ "PandasAtSetInt",
+ "PandasAtSetString",
+ "PandasAtString",
+ "PandasBooleanIndex",
+ "PandasColumns",
+ "PandasCorr",
+ "PandasCos",
+ "PandasCount",
+ "PandasCov",
+ "PandasCreate",
+ "PandasCreateFromDict",
+ "PandasCreateFromDictIndexList",
+ "PandasCreateFromMultipleDict",
+ "PandasCreateFromNumpy",
+ "PandasCreateFromTensor",
+ "PandasCreateSeriesFromDict",
+ "PandasCreateSeriesFromList",
+ "PandasCreateSeriesFromListIndexList",
+ "PandasCreateWithIndex",
+ "PandasCrosstab",
+ "PandasCummax",
+ "PandasCummin",
+ "PandasCumprod",
+ "PandasCumsum",
+ "PandasDiv",
+ "PandasDivScalarFloat",
+ "PandasDivScalarInt",
+ "PandasDivSeries",
+ "PandasDropDuplicates",
+ "PandasDropNA",
+ "PandasEq",
+ "PandasEqScalarFloat",
+ "PandasEqScalarInt",
+ "PandasExcelFileSheetNames",
+ "PandasExp",
+ "PandasFeatureSplitToNumpy",
+ "PandasFeatureSplitToPt",
+ "PandasFillNAScalarFloat",
+ "PandasFillNAScalarInt",
+ "PandasGe",
+ "PandasGeScalarFloat",
+ "PandasGeScalarInt",
+ "PandasGroupBy",
+ "PandasGt",
+ "PandasGtScalarFloat",
+ "PandasGtScalarInt",
+ "PandasHead",
+ "PandasHorizontalConcat",
+ "PandasHorizontalSplit",
+ "PandasIatDatetime",
+ "PandasIatFloat",
+ "PandasIatInt",
+ "PandasIatSetDatetime",
+ "PandasIatSetFloat",
+ "PandasIatSetInt",
+ "PandasIatSetString",
+ "PandasIatString",
+ "PandasIlocRowSeries",
+ "PandasIlocRowsDataFrame",
+ "PandasIlocRowsSliceDataFrame",
+ "PandasIndex",
+ "PandasIndexToString",
+ "PandasIsNA",
+ "PandasJoin",
+ "PandasKurtosis",
+ "PandasLe",
+ "PandasLeScalarFloat",
+ "PandasLeScalarInt",
+ "PandasLoadCSV",
+ "PandasLoadCSVWithEncoding",
+ "PandasLoadCSVWithIndex",
+ "PandasLoadExcel",
+ "PandasLoadHTML",
+ "PandasLoadJSON",
+ "PandasLocCellString",
+ "PandasLocRowMultiIndexDataFrame",
+ "PandasLocRowSeries",
+ "PandasLog",
+ "PandasLt",
+ "PandasLtScalarFloat",
+ "PandasLtScalarInt",
+ "PandasMax",
+ "PandasMean",
+ "PandasMedian",
+ "PandasMelt",
+ "PandasMin",
+ "PandasMode",
+ "PandasMul",
+ "PandasMulScalarFloat",
+ "PandasMulScalarInt",
+ "PandasMulSeries",
+ "PandasNe",
+ "PandasNeScalarFloat",
+ "PandasNeScalarInt",
+ "PandasPivot",
+ "PandasPow",
+ "PandasPowScalarFloat",
+ "PandasPowScalarInt",
+ "PandasPowSeries",
+ "PandasRename",
+ "PandasRenameAdvanced",
+ "PandasReplace",
+ "PandasReplaceAdvanced",
+ "PandasSaveCSV",
+ "PandasSaveJSON",
+ "PandasSelectColumnAsSeries",
+ "PandasSelectColumns",
+ "PandasSelectRows",
+ "PandasSeriesToDataFrame",
+ "PandasSeriesToString",
+ "PandasSetIndex",
+ "PandasShowDataFrame",
+ "PandasShowIndex",
+ "PandasShowSeries",
+ "PandasShowText",
+ "PandasSin",
+ "PandasSkew",
+ "PandasSort",
+ "PandasStd",
+ "PandasStrftime",
+ "PandasSub",
+ "PandasSubScalarFloat",
+ "PandasSubScalarInt",
+ "PandasSubSeries",
+ "PandasSum",
+ "PandasSummary",
+ "PandasTan",
+ "PandasToDatetime",
+ "PandasToNumpy",
+ "PandasToString",
+ "PandasTranspose",
+ "PandasValueCounts",
+ "PandasVar",
+ "PandasVerticalConcat",
+ "PandasVerticalSplit",
+ "PandasXs",
+ "PyDatetimeToString",
+ "PyFloatToString",
+ "PyIntToString",
+ "PyKvFloatCreate",
+ "PyKvIntCreate",
+ "PyKvStringCreate",
+ "PyListToString",
+ "PyStringToDatetime",
+ "PyStringToDict",
+ "PyStringToFloat",
+ "PyStringToInt",
+ "PyStringToList",
+ "SNSBar",
+ "SNSBarPt",
+ "SNSBoxplot",
+ "SNSHeatmap",
+ "SNSHistogram",
+ "SNSHistogramPt",
+ "SNSLine",
+ "SNSLinePt",
+ "SNSPairplot",
+ "SNSScatter",
+ "SNSScatterPt"
+ ],
+ {
+ "title_aux": "ComfyUI-Data-Analysis"
+ }
+ ],
+ "https://github.com/HowToSD/ComfyUI-Pt-Wrapper": [
+ [
+ "HfTokenizerEncode",
+ "PtAbs",
+ "PtAcos",
+ "PtAdd",
+ "PtApplyFunction",
+ "PtArange",
+ "PtArgmax",
+ "PtArgmin",
+ "PtAsin",
+ "PtAtan",
+ "PtBitwiseAnd",
+ "PtBitwiseLeftShift",
+ "PtBitwiseNot",
+ "PtBitwiseOr",
+ "PtBitwiseRightShift",
+ "PtBitwiseXor",
+ "PtBmm",
+ "PtBoolCreate",
+ "PtComputeLoss",
+ "PtConcat",
+ "PtCos",
+ "PtCosh",
+ "PtCrop",
+ "PtDataLoader",
+ "PtDataLoaderFromTensors",
+ "PtDiv",
+ "PtEinsum",
+ "PtEq",
+ "PtEvaluateClassificationModel",
+ "PtExp",
+ "PtFlatten",
+ "PtFloatCreate",
+ "PtFloorDiv",
+ "PtFromImage",
+ "PtFromImageTranspose",
+ "PtFromLatent",
+ "PtFromNumpy",
+ "PtFull",
+ "PtGather",
+ "PtGe",
+ "PtGt",
+ "PtIndexSelect",
+ "PtIntCreate",
+ "PtInterpolateByScaleFactor",
+ "PtInterpolateToSize",
+ "PtLe",
+ "PtLinspace",
+ "PtLoadModel",
+ "PtLog",
+ "PtLogicalAnd",
+ "PtLogicalNot",
+ "PtLogicalOr",
+ "PtLogicalXor",
+ "PtLt",
+ "PtMaskedSelect",
+ "PtMatMul",
+ "PtMax",
+ "PtMean",
+ "PtMedian",
+ "PtMin",
+ "PtMm",
+ "PtMul",
+ "PtNe",
+ "PtNeg",
+ "PtOnes",
+ "PtPad",
+ "PtPermute",
+ "PtPow",
+ "PtPredictClassificationModel",
+ "PtPredictRegressionModel",
+ "PtProd",
+ "PtRand",
+ "PtRandInt",
+ "PtRandn",
+ "PtRemainder",
+ "PtReshape",
+ "PtSaveModel",
+ "PtScatter",
+ "PtShowSize",
+ "PtShowText",
+ "PtSin",
+ "PtSinh",
+ "PtSize",
+ "PtSizeCreate",
+ "PtSizeToNumpy",
+ "PtSizeToString",
+ "PtSqrt",
+ "PtSqueeze",
+ "PtStack",
+ "PtStd",
+ "PtSub",
+ "PtSum",
+ "PtTan",
+ "PtTanh",
+ "PtToBfloat16",
+ "PtToFloat16",
+ "PtToFloat32",
+ "PtToFloat64",
+ "PtToImage",
+ "PtToImageTranspose",
+ "PtToInt16",
+ "PtToInt32",
+ "PtToInt64",
+ "PtToInt8",
+ "PtToLatent",
+ "PtToNumpy",
+ "PtToRgbTensors",
+ "PtToUint8",
+ "PtTokenizer",
+ "PtTrainClassificationModel",
+ "PtTrainClassificationModelLr",
+ "PtTrainClassificationTransformerModel",
+ "PtTrainFineTuneClassificationTransformerModel",
+ "PtTrainModel",
+ "PtTrainRNNModel",
+ "PtTrainRegressionModel",
+ "PtUnsqueeze",
+ "PtVar",
+ "PtView",
+ "PtWhere",
+ "PtZeros",
+ "PtdBernoulli",
+ "PtdBeta",
+ "PtdBinomial",
+ "PtdCategorical",
+ "PtdChi2",
+ "PtdExponential",
+ "PtdGamma",
+ "PtdNormal",
+ "PtdPoisson",
+ "PtdStudentT",
+ "PtdUniform",
+ "PtdmCdf",
+ "PtdmCdfTensor",
+ "PtdmIcdf",
+ "PtdmIcdfTensor",
+ "PtdmLogProb",
+ "PtdmLogProbTensor",
+ "PtdmPdf",
+ "PtdmPdfTensor",
+ "PtdmPmf",
+ "PtdmPmfTensor",
+ "PtdmSample",
+ "PtfGELU",
+ "PtfLeakyReLU",
+ "PtfLogSoftmax",
+ "PtfReLU",
+ "PtfSiLU",
+ "PtfSigmoid",
+ "PtfSoftmax",
+ "PtfSoftplus",
+ "PtfTanh",
+ "PtnAvgPool2d",
+ "PtnBCELoss",
+ "PtnBCEWithLogitsLoss",
+ "PtnBatchNorm2d",
+ "PtnChainedModel",
+ "PtnChainedModelWithAttentionMask",
+ "PtnConv2d",
+ "PtnConvModel",
+ "PtnCrossEntropyLoss",
+ "PtnEmbedding",
+ "PtnEmbeddingRNNLinear",
+ "PtnEmbeddingTransformerLinear",
+ "PtnGRU",
+ "PtnGRULinear",
+ "PtnHfFineTunedClassificationModel",
+ "PtnHfLoraClassificationModel",
+ "PtnHuberLoss",
+ "PtnInstanceNorm2d",
+ "PtnKLDivLoss",
+ "PtnL1Loss",
+ "PtnLSTM",
+ "PtnLSTMLinear",
+ "PtnLayerNorm",
+ "PtnLinear",
+ "PtnLinearModel",
+ "PtnMSELoss",
+ "PtnMaskedMeanPooling",
+ "PtnMaxPool2d",
+ "PtnModelWithClosure",
+ "PtnMultiheadAttention",
+ "PtnMultiheadAttentionCustom",
+ "PtnNLLLoss",
+ "PtnPreAddChannelAxis",
+ "PtnPreFlatten",
+ "PtnRNN",
+ "PtnRNNLinear",
+ "PtnResidualConnectionModel",
+ "PtnResidualConnectionModelWithAttentionMask",
+ "PtnResnetModel",
+ "PtnSmoothL1Loss",
+ "PtoAdam",
+ "PtoAdamW",
+ "PtoLrSchedulerCosineAnnealing",
+ "PtoLrSchedulerReduceOnPlateau",
+ "PtoLrSchedulerStep",
+ "PtoSGD",
+ "PtoSimple",
+ "PtvDataset",
+ "PtvDatasetLen",
+ "PtvDatasetLoader",
+ "PtvHfDatasetWithTokenEncode",
+ "PtvHfGloveDataset",
+ "PtvHfLocalDataset",
+ "PtvImageFolderDataset",
+ "PtvSequentialTensorDataset",
+ "PtvTransformsDataAugment",
+ "PtvTransformsResize",
+ "PtvTransformsToTensor",
+ "SpEncode",
+ "SpLoadModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Pt-Wrapper"
+ }
+ ],
+ "https://github.com/Hullabalo/ComfyUI-Loop": [
+ [
+ "ImageCropLoop",
+ "ImagePasteLoop",
+ "LoopAny",
+ "SaveAny"
+ ],
+ {
+ "title_aux": "ComfyUI-Loop"
+ }
+ ],
+ "https://github.com/I-ShadowStar/L2UC": [
+ [
+ "CLIPTextEncodeLumina2Unchained"
+ ],
+ {
+ "title_aux": "L2UC"
+ }
+ ],
+ "https://github.com/IAMCCS/IAMCCS-nodes": [
+ [
+ "IAMCCS_AutoLinkArguments",
+ "IAMCCS_AutoLinkConverter",
+ "IAMCCS_GGUF_accelerator",
+ "IAMCCS_GetAutoLink",
+ "IAMCCS_HWProbeRecommendations",
+ "IAMCCS_HwSupporter",
+ "IAMCCS_HwSupporterAny",
+ "IAMCCS_LTX2_ControlPreprocess",
+ "IAMCCS_LTX2_EnsureFrames8nPlus1",
+ "IAMCCS_LTX2_ExtensionModule",
+ "IAMCCS_LTX2_ExtensionModule_simple",
+ "IAMCCS_LTX2_FrameCountValidator",
+ "IAMCCS_LTX2_FrameRateSync",
+ "IAMCCS_LTX2_GetImageFromBatch",
+ "IAMCCS_LTX2_ImageBatchCropByPad",
+ "IAMCCS_LTX2_ImageBatchPadReflect",
+ "IAMCCS_LTX2_LoRAStack",
+ "IAMCCS_LTX2_LoRAStackModelIO",
+ "IAMCCS_LTX2_LoRAStackSegmented6",
+ "IAMCCS_LTX2_LoRAStackStaged",
+ "IAMCCS_LTX2_ModelWithLoRA_Segmented6",
+ "IAMCCS_LTX2_ReferenceImageSwitch",
+ "IAMCCS_LTX2_ReferenceStartFramesInjector",
+ "IAMCCS_LTX2_TimeFrameCount",
+ "IAMCCS_LTX2_Validator",
+ "IAMCCS_ModelWithLoRA",
+ "IAMCCS_ModelWithLoRA_LTX2",
+ "IAMCCS_ModelWithLoRA_LTX2_Staged",
+ "IAMCCS_MultiSwitch",
+ "IAMCCS_SamplerAdvancedVersion1",
+ "IAMCCS_SetAutoLink",
+ "IAMCCS_VAEDecodeTiledSafe",
+ "IAMCCS_VAEDecodeToDisk",
+ "IAMCCS_VRAMCleanup",
+ "IAMCCS_WanImageMotion",
+ "IAMCCS_WanLoRAStack",
+ "IAMCCS_WanLoRAStackModelIO",
+ "IAMCCS_bus_group",
+ "iamccs_ltx2_lora_stack"
+ ],
+ {
+ "title_aux": "IAMCCS-nodes"
+ }
+ ],
+ "https://github.com/IDGallagher/ComfyUI-IG-Motion-I2V": [
+ [
+ "MI2V Flow Animator",
+ "MI2V Flow Predictor",
+ "MI2V PauseNode",
+ "MotionPainter"
+ ],
+ {
+ "author": "IDGallagher",
+ "description": "Custom nodes to aid in the exploration of Latent Space",
+ "nickname": "IG Interpolation Nodes",
+ "title": "IG Interpolation Nodes",
+ "title_aux": "ComfyUI-IG-Motion-I2V"
+ }
+ ],
+ "https://github.com/IDGallagher/ComfyUI-IG-Nodes": [
+ [
+ "IG Analyze SSIM",
+ "IG Cross Fade Images",
+ "IG Explorer",
+ "IG Float",
+ "IG Float List",
+ "IG Folder",
+ "IG Image Crop",
+ "IG Int",
+ "IG Interpolate",
+ "IG Load Image",
+ "IG Load Images",
+ "IG MotionPredictor",
+ "IG Multiply",
+ "IG Path Join",
+ "IG PointCloud From Cylindrical",
+ "IG PointCloud From Depth",
+ "IG Save PLY PointCloud",
+ "IG Simple Translate Stitcher",
+ "IG Stitch Depth Tiles",
+ "IG Stitch Images CV2",
+ "IG String",
+ "IG String List",
+ "IG Tile Image",
+ "IG ZFill",
+ "SM Video Base",
+ "SM Video Base Control"
+ ],
+ {
+ "author": "IDGallagher",
+ "description": "Custom nodes to aid in the exploration of Latent Space",
+ "nickname": "IG Interpolation Nodes",
+ "title": "IG Interpolation Nodes",
+ "title_aux": "IG Interpolation Nodes"
+ }
+ ],
+ "https://github.com/IDGallagher/MotionVideoSearch": [
+ [
+ "IG Motion Video Frame",
+ "IG Motion Video Search"
+ ],
+ {
+ "author": "IDGallagher",
+ "description": "Search an index of videos by motion image",
+ "nickname": "IG Motion Video Search",
+ "title": "IG Motion Video Search",
+ "title_aux": "IG-Motion-Search"
+ }
+ ],
+ "https://github.com/IIEleven11/ComfyUI-FairyTaler": [
+ [
+ "FairyTalerStoryboard",
+ "SceneParser",
+ "SceneToConditioning",
+ "StoryboardCompositor",
+ "ThreeSceneGenerator"
+ ],
+ {
+ "author": "Eleven",
+ "description": "Turn your AI roleplay into AI generated scenes from every response. Visualize what you read!",
+ "nickname": "ComfyUI FairyTaler",
+ "title": "ComfyUI FairyTaler Storyboard Nodes",
+ "title_aux": "ComfyUI-FairyTaler"
+ }
+ ],
+ "https://github.com/IIs-fanta/ComfyUI-FANTA-GameBox": [
+ [
+ "BilliardsGameNode",
+ "BrickBreakerNode",
+ "FlappyBirdNode",
+ "SnakeGameNode"
+ ],
+ {
+ "title_aux": "ComfyUI-FANTA-GameBox"
+ }
+ ],
+ "https://github.com/INuBq8/ComfyUI-NotificationBridge": [
+ [
+ "DiscordNotifyNode",
+ "WhatsAppNotifyNodeTwilio"
+ ],
+ {
+ "title_aux": "Notification Bridge"
+ }
+ ],
+ "https://github.com/IRCSS/comfyUI-blender-wrapper": [
+ [
+ "BlenderGenericNode",
+ "CV2InpaintTexture",
+ "DownloadAndLoadHy3DDelightModel",
+ "DownloadAndLoadHy3DPaintModel",
+ "Hy3DApplyTexture",
+ "Hy3DBPT",
+ "Hy3DBakeFromMultiview",
+ "Hy3DCameraConfig",
+ "Hy3DDelightImage",
+ "Hy3DDiffusersSchedulerConfig",
+ "Hy3DExportMesh",
+ "Hy3DFastSimplifyMesh",
+ "Hy3DGenerateMesh",
+ "Hy3DGenerateMeshMultiView",
+ "Hy3DGetMeshPBRTextures",
+ "Hy3DIMRemesh",
+ "Hy3DLoadMesh",
+ "Hy3DMeshInfo",
+ "Hy3DMeshUVWrap",
+ "Hy3DMeshVerticeInpaintTexture",
+ "Hy3DModelLoader",
+ "Hy3DNvdiffrastRenderer",
+ "Hy3DPostprocessMesh",
+ "Hy3DRenderMultiView",
+ "Hy3DRenderMultiViewDepth",
+ "Hy3DRenderSingleView",
+ "Hy3DSampleMultiView",
+ "Hy3DSetMeshPBRAttributes",
+ "Hy3DSetMeshPBRTextures",
+ "Hy3DTorchCompileSettings",
+ "Hy3DUploadMesh",
+ "Hy3DVAEDecode",
+ "Hy3DVAELoader",
+ "Hy3D_2_1SimpleMeshGen",
+ "MESHToTrimesh",
+ "TrimeshToMESH"
+ ],
+ {
+ "title_aux": "comfyUI-blender-wrapper"
+ }
+ ],
+ "https://github.com/ITurchenko/ComfyUI-SizeFromArray": [
+ [
+ "SizeFromArray"
+ ],
+ {
+ "title_aux": "ComfyUI-SizeFromArray"
+ }
+ ],
+ "https://github.com/IXIWORKS-KIMJUNGHO/ComfyUI-VideoDescription": [
+ [
+ "BatchStartMarker",
+ "BuildCharacterPromptNode",
+ "BuildPromptNode",
+ "Bypass",
+ "ConcatStrings",
+ "ControlNetPreprocessor",
+ "CropAndResize",
+ "DiffSynthControlnetAdvanced",
+ "EmptyLatentRatio",
+ "ImageToList",
+ "JsonParserNode",
+ "LoadImageList",
+ "LoraLoaderAdvanced",
+ "MergeStringsNode",
+ "ModelProgressTracker",
+ "PromptPoseFilter",
+ "PromptStyleFilter",
+ "SaveText",
+ "SelectIndexNode",
+ "StringToList",
+ "SwitchBoolean",
+ "SwitchCase",
+ "VideoDescriptionQwen3VL"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoDescription"
+ }
+ ],
+ "https://github.com/IamCreateAI/ComfyUI-Animon": [
+ [
+ "AnimonImageToVideoNode",
+ "AnimonKeyNode",
+ "AnimonStartEndToVideoNode",
+ "AnimonUploadImageFromFileNode",
+ "AnimonUploadImageFromTensorNode",
+ "AnimonUploadVideoFromBytesNode",
+ "AnimonUploadVideoFromFileNode",
+ "AnimonUploadVideoFromTensorNode",
+ "AnimonUpscaleVideoNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Animon"
+ }
+ ],
+ "https://github.com/IamCreateAI/Ruyi-Models": [
+ [
+ "Ruyi_EnhanceAVideo",
+ "Ruyi_I2VSampler",
+ "Ruyi_LoadLora",
+ "Ruyi_LoadModel",
+ "Ruyi_TeaCache"
+ ],
+ {
+ "title_aux": "ComfyUI-Ruyi"
+ }
+ ],
+ "https://github.com/Ian2073/ComfyUI-MyLLMnode": [
+ [
+ "GemmaLLMNode",
+ "LlamaLLMNode",
+ "MistralLLMNode",
+ "PhiLLMNode",
+ "QwenLLMNode",
+ "YiLLMNode"
+ ],
+ {
+ "title_aux": "ComfyUI-MyLLMNode"
+ }
+ ],
+ "https://github.com/IcelandicCenterArtificialIntelligence/ComfyUI-SamplerSchedulerMetricsTester": [
+ [
+ "SamplerSchedulerMetricsTester"
+ ],
+ {
+ "title_aux": "Sampler Scheduler Metrics Tester for ComfyUI"
+ }
+ ],
+ "https://github.com/Icyman86/ComfyUI_AnimeCharacterSelect": [
+ [
+ "ActionPromptNode",
+ "CharacterPromptNode",
+ "CombinePromptStringsNode",
+ "EnhancedCharacterPromptNode",
+ "MinimalCharacterActionPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI_AnimeCharacterSelect"
+ }
+ ],
+ "https://github.com/IgalOgonov/ComfyUI_Simple_String_Repository": [
+ [
+ "SimpleStringRepository",
+ "SimpleStringRepositoryCompact",
+ "SimpleStringRepositoryLarge",
+ "SimpleStringRepositoryLargeCompact",
+ "SimpleStringRepositorySmall",
+ "SimpleStringRepositorySmallCompact"
+ ],
+ {
+ "title_aux": "Simple String Repository"
+ }
+ ],
+ "https://github.com/ImagineerNL/ComfyUI-IMGNR-Utils": [
+ [
+ "CatchEditTextNode",
+ "DIYNodeWriter",
+ "PreviewImageAdHocSaveNode",
+ "PreviewImageBase64Node"
+ ],
+ {
+ "title_aux": "ComfyUI-IMGNR-Utils"
+ }
+ ],
+ "https://github.com/ImagineerNL/ComfyUI-ToSVG-Potracer": [
+ [
+ "PotracerVectorize",
+ "SaveAsSVG Potracer (Temporary Fix)"
+ ],
+ {
+ "title_aux": "ComfyUI-ToSVG-Potracer"
+ }
+ ],
+ "https://github.com/Immac/ComfyUI-CoreVideoMocks": [
+ [
+ "CoreVideoMocks:AV1Codec",
+ "CoreVideoMocks:BatchAudioStreams",
+ "CoreVideoMocks:BatchSubtitlesStreams",
+ "CoreVideoMocks:BatchVideoStreams",
+ "CoreVideoMocks:CodecFromVideoStream",
+ "CoreVideoMocks:CombineVideo",
+ "CoreVideoMocks:DecodeVideoStream",
+ "CoreVideoMocks:EncodeVideoStream",
+ "CoreVideoMocks:GetAudioStream",
+ "CoreVideoMocks:GetSubtitleStream",
+ "CoreVideoMocks:GetVideoStream",
+ "CoreVideoMocks:LoadVideo",
+ "CoreVideoMocks:PreviewVideo",
+ "CoreVideoMocks:SaveVideo",
+ "CoreVideoMocks:SplitVideo",
+ "CoreVideoMocks:VP9Codec",
+ "CoreVideoMocks:VideoStreamData"
+ ],
+ {
+ "title_aux": "ComfyUI Core Video Nodes"
+ }
+ ],
+ "https://github.com/ImmortalPie/ComfyUI-PonySwitch": [
+ [
+ "PonySwitch"
+ ],
+ {
+ "title_aux": "PonySwitch Node"
+ }
+ ],
+ "https://github.com/InstantStudioAI/ComfyUI-InstantStudio": [
+ [
+ "HuggingFace Classify",
+ "Moondream",
+ "UploadImagesToInstantStudio"
+ ],
+ {
+ "title_aux": "ComfyUI-InstantStudio"
+ }
+ ],
+ "https://github.com/Intersection98/ComfyUI_MX_post_processing-nodes": [
+ [
+ "MX_AlphaBlend",
+ "MX_Blend",
+ "MX_Blur",
+ "MX_Canny",
+ "MX_ChromaticAberration",
+ "MX_ColorCorrect",
+ "MX_ColorMatch",
+ "MX_ColorTint",
+ "MX_Glow",
+ "MX_HSVThresholdMask",
+ "MX_KuwaharaBlur(Cartoon)",
+ "MX_LUT",
+ "MX_LensBokeh",
+ "MX_LensOpticAxis",
+ "MX_LensZoomBurst",
+ "MX_Mosaic",
+ "MX_Noise",
+ "MX_Posterize",
+ "MX_SineWave",
+ "MX_Solarize",
+ "MX_Vignette"
+ ],
+ {
+ "title_aux": "ComfyUI-MX-post-processing-nodes"
+ }
+ ],
+ "https://github.com/Inzaniak/comfyui-ranbooru": [
+ [
+ "LockSeed",
+ "PromptBackground",
+ "PromptLimit",
+ "PromptMix",
+ "PromptRandomWeight",
+ "PromptRemove",
+ "Ranbooru",
+ "RanbooruURL",
+ "RandomPicturePath",
+ "TimestampFileName"
+ ],
+ {
+ "title_aux": "Ranbooru for ComfyUI"
+ }
+ ],
+ "https://github.com/Irsalistic/comfyui-dam-object-extractor": [
+ [
+ "DAMObjectNameNode",
+ "DAMVisualizeNode"
+ ],
+ {
+ "title_aux": "ComfyUI DAM Object Extractor"
+ }
+ ],
+ "https://github.com/IsItDanOrAi/ComfyUI-Stereopsis": [
+ [
+ "Dan_FrameDelay",
+ "Dan_Stereopsis"
+ ],
+ {
+ "title_aux": "ComfyUI-Stereopsis"
+ }
+ ],
+ "https://github.com/IsItDanOrAi/ComfyUI-exLoadout": [
+ [
+ "dropdowns",
+ "exCheckpointLoader",
+ "exLoadoutCheckpointLoader",
+ "exLoadoutEditCell",
+ "exLoadoutReadColumn",
+ "exLoadoutSeg",
+ "exLoadoutSeg2",
+ "exLoadoutSelector",
+ "exSeg",
+ "exSeg2"
+ ],
+ {
+ "title_aux": "exLoadout: Excel-Based Model & Settings Loader"
+ }
+ ],
+ "https://github.com/Isi-dev/ComfyUI-Animation_Nodes_and_Workflows": [
+ [
+ "CLIPTextEncodeStyles",
+ "ComputePadding",
+ "JoinVideos",
+ "MakeDrivingVideoForLivePortrait",
+ "MakePortraitWalk",
+ "MoveInOrOut",
+ "MoveLeftOrRight",
+ "MoveUpOrDown",
+ "Replace_Img_or_Vid_Bg_Assistant"
+ ],
+ {
+ "title_aux": "ComfyUI-Animation_Nodes_and_Workflows"
+ }
+ ],
+ "https://github.com/Isi-dev/ComfyUI-Img2DrawingAssistants": [
+ [
+ "LineArt_Assistant",
+ "LineArt_Assistant_2",
+ "Sketch_Assistant",
+ "Sketch_Assistant_grayScale"
+ ],
+ {
+ "title_aux": "ComfyUI-Img2DrawingAssistants"
+ }
+ ],
+ "https://github.com/Isi-dev/ComfyUI-Img2PaintingAssistant": [
+ [
+ "Painting",
+ "ProcessInspyrenetRembg"
+ ],
+ {
+ "title_aux": "Image to Painting and Inspyrenet Assistant Nodes"
+ }
+ ],
+ "https://github.com/Isi-dev/ComfyUI-UniAnimate-W": [
+ [
+ "Animate_X_Image",
+ "Animate_X_Image_Long",
+ "Animate_X_Image_v2",
+ "Animate_X_ReposeImage",
+ "Animate_X_ReposeImage_v2",
+ "Gen_align_pose",
+ "Gen_align_pose2",
+ "ReposeImage",
+ "UniAnimateImage",
+ "UniAnimateImageLong"
+ ],
+ {
+ "title_aux": "ComfyUI-UniAnimate-W"
+ }
+ ],
+ "https://github.com/Isi-dev/ComfyUI_DeleteModelPassthrough": [
+ [
+ "ControlledCLIPTextEncode",
+ "ControlledControlNetLoader",
+ "ControlledModelPatchLoader",
+ "ControlledUNETLoader",
+ "ControlledUnetLoaderGGUF",
+ "ControlledVAELoader",
+ "DeleteModelPassthrough",
+ "DeleteModelPassthroughLight",
+ "SmartClipDeleter"
+ ],
+ {
+ "title_aux": "ComfyUI_DeleteModelPassthrough"
+ }
+ ],
+ "https://github.com/Isulion/ComfyUI_Isulion": [
+ [
+ "CustomTextNode",
+ "CustomTextNode \u2328\ufe0f",
+ "CustomTextNode.py",
+ "DisplayImageFromURL",
+ "IsuCollage_Node",
+ "Isulion Civitai Image Display",
+ "Isulion Civitai Model Explorer",
+ "Isulion Civitai Trending",
+ "IsulionActionGenerator",
+ "IsulionAlienWorldGenerator",
+ "IsulionAnimalBehaviorGenerator",
+ "IsulionAnimalRandom",
+ "IsulionArtStyleGenerator",
+ "IsulionArtifactGenerator",
+ "IsulionCivitaiImageDisplay",
+ "IsulionCivitaiModelExplorer",
+ "IsulionCivitaiTrending",
+ "IsulionClothingGenerator",
+ "IsulionCuteAnimalRandom",
+ "IsulionEmotionGenerator",
+ "IsulionEpochGenerator",
+ "IsulionFantasyRaceGenerator",
+ "IsulionHabitatGenerator",
+ "IsulionLoadImagesNode",
+ "IsulionMagicalEffectGenerator",
+ "IsulionMegaPromptV3",
+ "IsulionMultiplePromptGenerator",
+ "IsulionMythicalLocationGenerator",
+ "IsulionNegativePromptGenerator",
+ "IsulionProfessionGenerator",
+ "IsulionPromptEnhancer",
+ "IsulionPromptGenerator",
+ "IsulionSceneComposition",
+ "IsulionSpacecraftGenerator",
+ "IsulionStyleMixer",
+ "IsulionTechGenerator",
+ "IsulionTimeOfDayGenerator",
+ "IsulionVideoPromptGenerator",
+ "IsulionWeatherGenerator",
+ "MegaPromptV3",
+ "\u29c9 IsulionOverlay",
+ "\ud83d\udca4 IsulionShutdown",
+ "\ud83e\udde9 IsulionQRCode"
+ ],
+ {
+ "title_aux": "ComfyUI_Isulion Random Prompt Generator"
+ }
+ ],
+ "https://github.com/IuvenisSapiens/ComfyUI_MiniCPM-V-4_5": [
+ [
+ "DisplayText",
+ "MiniCPM_VQA",
+ "MiniCPM_VQA_Polished",
+ "MultipleImagesInput"
+ ],
+ {
+ "title_aux": "ComfyUI_MiniCPM-V-4_5"
+ }
+ ],
+ "https://github.com/IuvenisSapiens/ComfyUI_Qwen2-Audio-7B-Instruct-Int4": [
+ [
+ "AudioLoader",
+ "AudioPreviewer",
+ "Qwen2_AQA"
+ ],
+ {
+ "title_aux": "ComfyUI_Qwen2-Audio-7B-Instruct-Int4"
+ }
+ ],
+ "https://github.com/IuvenisSapiens/ComfyUI_Qwen3-VL-Instruct": [
+ [
+ "ImageLoader",
+ "MultiplePathsInput",
+ "Qwen3_VQA",
+ "VideoLoader",
+ "VideoLoaderPath"
+ ],
+ {
+ "title_aux": "Comfyui_Qwen3-VL-Instruct"
+ }
+ ],
+ "https://github.com/J-ChenX/ComfyUI-NIX": [
+ [
+ "NIX_ImageComposite",
+ "NIX_ImageInference",
+ "NIX_ImageTile",
+ "NIX_ImageUpscaleProportionally",
+ "NIX_MaskCrop",
+ "NIX_MaskNull",
+ "NIX_PathLoading",
+ "NIX_RotateCrop",
+ "NIX_RotateImage",
+ "NIX_SaveImage",
+ "NIX_StringMatch",
+ "NIX_StringMatcher",
+ "NIX_SwitchAnything",
+ "NIX_XYGridMapper"
+ ],
+ {
+ "title_aux": "NIX ComfyUI Plugin"
+ }
+ ],
+ "https://github.com/JEONG-JIWOO/ComfyUI_Eugene_Nodes": [
+ [
+ "DictBus",
+ "DictBusEdit",
+ "DictBusUnpack",
+ "DictMultilineSelect",
+ "DictTemplate",
+ "DictUpdate1",
+ "DictUpdate10",
+ "DictUpdate5",
+ "LoraPresetListLoader",
+ "LoraPresetLoader",
+ "LoraPresetSaver",
+ "LoraPresetSelector"
+ ],
+ {
+ "title_aux": "ComfyUI_Eugene_Nodes"
+ }
+ ],
+ "https://github.com/JPS-GER/ComfyUI_JPS-Nodes": [
+ [
+ "CLIPTextEncode SDXL Plus (JPS)",
+ "Conditioning Switch (JPS)",
+ "ControlNet Switch (JPS)",
+ "Crop Image Pipe (JPS)",
+ "Crop Image Settings (JPS)",
+ "Crop Image Square (JPS)",
+ "Crop Image TargetSize (JPS)",
+ "CtrlNet CannyEdge Pipe (JPS)",
+ "CtrlNet CannyEdge Settings (JPS)",
+ "CtrlNet MiDaS Pipe (JPS)",
+ "CtrlNet MiDaS Settings (JPS)",
+ "CtrlNet OpenPose Pipe (JPS)",
+ "CtrlNet OpenPose Settings (JPS)",
+ "CtrlNet ZoeDepth Pipe (JPS)",
+ "CtrlNet ZoeDepth Settings (JPS)",
+ "Disable Enable Switch (JPS)",
+ "Enable Disable Switch (JPS)",
+ "Generation TXT IMG Settings (JPS)",
+ "Get Date Time String (JPS)",
+ "Get Image Size (JPS)",
+ "IP Adapter Settings (JPS)",
+ "IP Adapter Settings Pipe (JPS)",
+ "IP Adapter Tiled Settings (JPS)",
+ "IP Adapter Tiled Settings Pipe (JPS)",
+ "IPA Switch (JPS)",
+ "Image Prepare Pipe (JPS)",
+ "Image Prepare Settings (JPS)",
+ "Image Switch (JPS)",
+ "ImageToImage Pipe (JPS)",
+ "ImageToImage Settings (JPS)",
+ "Images Masks MultiPipe (JPS)",
+ "InstantID Mask Prepare Pipe (JPS)",
+ "InstantID Mask Prepare Settings (JPS)",
+ "InstantID Pipe (JPS)",
+ "InstantID Pose Prepare Pipe (JPS)",
+ "InstantID Pose Prepare Settings (JPS)",
+ "InstantID Settings (JPS)",
+ "InstantID Source Prepare Pipe (JPS)",
+ "InstantID Source Prepare Settings (JPS)",
+ "Integer Switch (JPS)",
+ "Largest Int (JPS)",
+ "Latent Switch (JPS)",
+ "Lora Loader (JPS)",
+ "Mask Switch (JPS)",
+ "Model Switch (JPS)",
+ "Multiply Float Float (JPS)",
+ "Multiply Int Float (JPS)",
+ "Multiply Int Int (JPS)",
+ "Prepare Image (JPS)",
+ "Prepare Image Plus (JPS)",
+ "Prepare Image Tiled IPA (JPS)",
+ "Resolution Multiply (JPS)",
+ "Revision Settings (JPS)",
+ "Revision Settings Pipe (JPS)",
+ "SDXL Basic Settings (JPS)",
+ "SDXL Basic Settings Pipe (JPS)",
+ "SDXL Fundamentals MultiPipe (JPS)",
+ "SDXL Prompt Handling (JPS)",
+ "SDXL Prompt Handling Plus (JPS)",
+ "SDXL Prompt Styler (JPS)",
+ "SDXL Recommended Resolution Calc (JPS)",
+ "SDXL Resolutions (JPS)",
+ "SDXL Settings (JPS)",
+ "SDXL Settings Pipe (JPS)",
+ "Sampler Scheduler Settings (JPS)",
+ "Save Images Plus (JPS)",
+ "Substract Int Int (JPS)",
+ "Text Concatenate (JPS)",
+ "Text Prompt (JPS)",
+ "Text Prompt Combo (JPS)",
+ "Time Seed (JPS)",
+ "VAE Switch (JPS)"
+ ],
+ {
+ "author": "JPS",
+ "description": "Various nodes to handle SDXL Resolutions, SDXL Basic Settings, IP Adapter Settings, Revision Settings, SDXL Prompt Styler, Crop Image to Square, Crop Image to Target Size, Get Date-Time String, Resolution Multiply, Largest Integer, 5-to-1 Switches for Integer, Images, Latents, Conditioning, Model, VAE, ControlNet",
+ "nickname": "JPS Custom Nodes",
+ "title": "JPS Custom Nodes for ComfyUI",
+ "title_aux": "JPS Custom Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/JPrevots/ComfyUI-PhyCV": [
+ [
+ "PAGE",
+ "PST",
+ "PhyCV_PST",
+ "PhyCV_Page",
+ "PhyCV_Vevid",
+ "VEVID"
+ ],
+ {
+ "title_aux": "ComfyUI-PhyCV"
+ }
+ ],
+ "https://github.com/JTriggerFish/ComfyLatentTools": [
+ [
+ "DownsampledLatentGuidance",
+ "GenericAttentionGuidance",
+ "LatentNormalizedLanczosResize"
+ ],
+ {
+ "title_aux": "Comfy Latent Tools"
+ }
+ ],
+ "https://github.com/JVsup/ComfyUI-SettingsToText": [
+ [
+ "SettingsToText"
+ ],
+ {
+ "title_aux": "ComfyUI-SettingsToText"
+ }
+ ],
+ "https://github.com/JackEllie/ComfyUI_AI_Assistant": [
+ [
+ "apply_lighting_effects",
+ "clean_prompt_tags",
+ "noline_process",
+ "prompt_blacklist",
+ "prompt_sorting",
+ "resize_image_sdxl_ratio"
+ ],
+ {
+ "title_aux": "ComfyUI-AI-Assistant"
+ }
+ ],
+ "https://github.com/Jacky-MYQ/comfyui-DataCleaning": [
+ [
+ "CleanData"
+ ],
+ {
+ "title_aux": "comfyui-DataCleaning"
+ }
+ ],
+ "https://github.com/Jacky-MYQ/comfyui-rgb2cmyk": [
+ [
+ "RGB2CMYK"
+ ],
+ {
+ "title_aux": "RGB to CMYK for ComfyUI (Save as tif)"
+ }
+ ],
+ "https://github.com/Jairodaniel-17/ComfyUI-translate-offline": [
+ [
+ "CLIPTextTranslateNode",
+ "PromptTextTranslateNode"
+ ],
+ {
+ "title_aux": "ComfyUI-translate-offline"
+ }
+ ],
+ "https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node": [
+ [
+ "RandomIntegerNodeEfficient",
+ "RandomIntegerNodeEfficientAdvanced",
+ "RandomIntegerNodeList"
+ ],
+ {
+ "title_aux": "ComfyUI-Random-Int-Divisor-Node"
+ }
+ ],
+ "https://github.com/Jannchie/ComfyUI-J": [
+ [
+ "DiffusersCompelPromptEmbedding",
+ "DiffusersControlnetLoader",
+ "DiffusersControlnetUnit",
+ "DiffusersControlnetUnitStack",
+ "DiffusersDecoder",
+ "DiffusersGenerator",
+ "DiffusersPipeline",
+ "DiffusersPrepareLatents",
+ "DiffusersTextureInversionLoader",
+ "DiffusersXLPipeline",
+ "GetAverageColorFromImage",
+ "GetFilledColorImage"
+ ],
+ {
+ "title_aux": "ComfyUI-J"
+ }
+ ],
+ "https://github.com/Jannled/owl-vit-comfyui": [
+ [
+ "OWL_BBox_Visualizer",
+ "OWL_Load_Model",
+ "OWL_Objectness_Inference"
+ ],
+ {
+ "title_aux": "OWL-ViT ComfyUI"
+ }
+ ],
+ "https://github.com/Jarcis-cy/ComfyUI-HunyuanVideoFoley": [
+ [
+ "HunyuanVideoFoleyGenerateAudio",
+ "VideoAudioMerger"
+ ],
+ {
+ "title_aux": "HunyuanVideo-Foley Audio Generator"
+ }
+ ],
+ "https://github.com/JaredTherriault/ComfyUI-JNodes": [
+ [
+ "JNodes_AddOrSetMetaDataKey",
+ "JNodes_AddOrSetPngInfoKey",
+ "JNodes_AnyToString",
+ "JNodes_AppendReversedFrames",
+ "JNodes_AudioInputOptions",
+ "JNodes_BooleanSelectorWithString",
+ "JNodes_BreakMediaInfo",
+ "JNodes_CacheGlobalParameters",
+ "JNodes_CheckpointSelectorWithString",
+ "JNodes_ConditioningInOut",
+ "JNodes_CreateStereoscopicImageFromDepth",
+ "JNodes_DiffusionModelSelector",
+ "JNodes_EmptyCudaCache",
+ "JNodes_FloatLiteral",
+ "JNodes_GetCleanFilename",
+ "JNodes_GetComfyDirectory",
+ "JNodes_GetLeafDirectory",
+ "JNodes_GetOutputDirectory",
+ "JNodes_GetParameterFromList",
+ "JNodes_GetParameterFromTable",
+ "JNodes_GetTempDirectory",
+ "JNodes_ImageFormatSelector",
+ "JNodes_ImageSizeSelector",
+ "JNodes_IntLiteral",
+ "JNodes_JoinVideosInDirectory",
+ "JNodes_LoadVideo",
+ "JNodes_LoadVisualMediaFromPath",
+ "JNodes_LoadVisualMediaFromPath_Batch",
+ "JNodes_LoadVisualMediaFromPath_List",
+ "JNodes_LoraExtractor",
+ "JNodes_MakeParameterTable",
+ "JNodes_MediaInfoToString",
+ "JNodes_ModelInOut",
+ "JNodes_OutVideoInfo",
+ "JNodes_ParseDynamicPrompts",
+ "JNodes_ParseWildcards",
+ "JNodes_PromptBuilderSingleSubject",
+ "JNodes_RemoveCommentedText",
+ "JNodes_RemoveMetaDataKey",
+ "JNodes_RemoveParseableDataForInference",
+ "JNodes_SamplerSelectorWithString",
+ "JNodes_SaveImageWithOutput",
+ "JNodes_SaveVideo",
+ "JNodes_SaveVideoWithOptions",
+ "JNodes_SchedulerSelectorWithString",
+ "JNodes_SearchAndReplace",
+ "JNodes_SearchAndReplaceFromFile",
+ "JNodes_SearchAndReplaceFromList",
+ "JNodes_SelectRandomFileFromDirectory",
+ "JNodes_SeparateStringByDelimiters",
+ "JNodes_SetMetadataA1111",
+ "JNodes_SetNegativePromptInMetaData",
+ "JNodes_SetPositivePromptInMetaData",
+ "JNodes_SplitAndJoin",
+ "JNodes_StringLiteral",
+ "JNodes_SubdirectorySelector",
+ "JNodes_SyncedStringLiteral",
+ "JNodes_TextManager",
+ "JNodes_TokenCounter",
+ "JNodes_TrimAndStrip",
+ "JNodes_UploadVideo",
+ "JNodes_UploadVisualMedia",
+ "JNodes_VaeSelectorWithString"
+ ],
+ {
+ "title_aux": "ComfyUI-JNodes"
+ }
+ ],
+ "https://github.com/Jash-Vora/ComfyUI-GarmentDiT": [
+ [
+ "GarmentEnhancementNode"
+ ],
+ {
+ "title_aux": "FitDiT"
+ }
+ ],
+ "https://github.com/JasonHoku/ComfyUI-Ultimate-Auto-Sampler-Config-Grid-Testing-Suite": [
+ [
+ "SamplerGridTester",
+ "SmartJSONText",
+ "UltimateConfigBuilder",
+ "UltimateGridDashboard",
+ "UltimateSamplerGrid"
+ ],
+ {
+ "title_aux": "ComfyUI Ultimate Auto Sampler Config Grid Testing Suite"
+ }
+ ],
+ "https://github.com/JayLyu/blender-in-comfyui": [
+ [
+ "BL_Camera_Creator",
+ "BL_Export_Model",
+ "BL_Model_Merger",
+ "BL_Model_Param",
+ "BL_Render",
+ "BL_Save_Mesh",
+ "BL_Scene_Composer"
+ ],
+ {
+ "title_aux": "blender-in-comfyui"
+ }
+ ],
+ "https://github.com/JcandZero/ComfyUI_GLM4Node": [
+ [
+ "GLM3_turbo_CHAT",
+ "GLM4_CHAT",
+ "GLM4_Vsion_IMGURL"
+ ],
+ {
+ "title_aux": "ComfyUI_GLM4Node"
+ }
+ ],
+ "https://github.com/Jcd1230/rembg-comfyui-node": [
+ [
+ "Image Remove Background (rembg)"
+ ],
+ {
+ "title_aux": "Rembg Background Removal Node for ComfyUI"
+ }
+ ],
+ "https://github.com/Jelosus2/comfyui-vae-reflection": [
+ [
+ "AddReflectionToVAE"
+ ],
+ {
+ "title_aux": "ComfyUI VAE Reflection"
+ }
+ ],
+ "https://github.com/JerryOrbachJr/ComfyUI-RandomSize": [
+ [
+ "JOJR_RandomSize"
+ ],
+ {
+ "author": "JerryOrbachJr",
+ "description": "A ComfyUI custom node that randomly selects a height and width pair from a list in a config file",
+ "nickname": "Random Size",
+ "title": "Random Size",
+ "title_aux": "Random Size"
+ }
+ ],
+ "https://github.com/JettHu/ComfyUI-TCD": [
+ [
+ "TCDModelSamplingDiscrete"
+ ],
+ {
+ "title_aux": "ComfyUI-TCD"
+ }
+ ],
+ "https://github.com/JettHu/ComfyUI_TGate": [
+ [
+ "TGateApply",
+ "TGateApplyAdvanced",
+ "TGateApplySimple"
+ ],
+ {
+ "title_aux": "ComfyUI_TGate"
+ }
+ ],
+ "https://github.com/JiSenHua/ComfyUI-TD": [
+ [
+ "AudiotoTD",
+ "Comfy3DPacktoTD",
+ "GaussianSplattingtoTD",
+ "Hy3DtoTD",
+ "ImagetoTD",
+ "ImagetoTD(JPEG)",
+ "LoadTDImage",
+ "Tripo3DtoTD",
+ "TripoSRtoTD",
+ "VideotoTD"
+ ],
+ {
+ "title_aux": "ComfyUI-TD"
+ }
+ ],
+ "https://github.com/Jint8888/Comfyui_JTnodes": [
+ [
+ "JT Find Text From Excel",
+ "JT Read From Excel",
+ "JTBrightness",
+ "JTImagesavetopath",
+ "JTSaveTextToExcel",
+ "JTSaveTextToFile",
+ "JTcounter",
+ "SiliconflowFree"
+ ],
+ {
+ "title_aux": "Comfyui_JTnodes"
+ }
+ ],
+ "https://github.com/JoeNavark/comfyui_custom_sigma_editor": [
+ [
+ "CustomSplineSigma",
+ "SigmaJoiner"
+ ],
+ {
+ "title_aux": "Custom Graph Sigma for ComfyUI"
+ }
+ ],
+ "https://github.com/JohanK66/ComfyUI-WebhookImage": [
+ [
+ "Notif-Webhook"
+ ],
+ {
+ "title_aux": "ComfyUI WebhookImage"
+ }
+ ],
+ "https://github.com/JohnDoeSmithee/ComfyUI-SoX-Mixdown": [
+ [
+ "SoxMixNode"
+ ],
+ {
+ "title_aux": "ComfyUI-SoX-Mixdown"
+ }
+ ],
+ "https://github.com/Jokimbe/ComfyUI-DrawThings-gRPC": [
+ [
+ "DrawThingsControlNet",
+ "DrawThingsHints",
+ "DrawThingsLoRA",
+ "DrawThingsNegative",
+ "DrawThingsPositive",
+ "DrawThingsPrompt",
+ "DrawThingsRefiner",
+ "DrawThingsSampler",
+ "DrawThingsUpscaler"
+ ],
+ {
+ "title_aux": "ComfyUI-DrawThings-gRPC"
+ }
+ ],
+ "https://github.com/Jonseed/ComfyUI-Detail-Daemon": [
+ [
+ "DetailDaemonGraphSigmasNode",
+ "DetailDaemonSamplerNode",
+ "LyingSigmaSampler",
+ "MultiplySigmas"
+ ],
+ {
+ "title_aux": "ComfyUI-Detail-Daemon"
+ }
+ ],
+ "https://github.com/Jordach/comfy-plasma": [
+ [
+ "JDC_AutoContrast",
+ "JDC_BlendImages",
+ "JDC_BrownNoise",
+ "JDC_Contrast",
+ "JDC_EqualizeGrey",
+ "JDC_GaussianBlur",
+ "JDC_GreyNoise",
+ "JDC_Greyscale",
+ "JDC_ImageLoader",
+ "JDC_ImageLoaderMeta",
+ "JDC_PinkNoise",
+ "JDC_Plasma",
+ "JDC_PlasmaSampler",
+ "JDC_PowerImage",
+ "JDC_RandNoise",
+ "JDC_ResizeFactor"
+ ],
+ {
+ "title_aux": "comfy-plasma"
+ }
+ ],
+ "https://github.com/JosefKuchar/ComfyUI-AdvancedTiling": [
+ [
+ "AdvancedTiling",
+ "AdvancedTilingSettings",
+ "AdvancedTilingVAEDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-AdvancedTiling"
+ }
+ ],
+ "https://github.com/JosephThomasParker/ComfyUI-DrawThingsWrapper": [
+ [
+ "DrawThingsGenerateFromPipeline",
+ "DrawThingsImg2Img",
+ "DrawThingsImg2ImgPipeline",
+ "DrawThingsPipelineAddControl",
+ "DrawThingsPipelineAddCustom",
+ "DrawThingsPipelineAddLora",
+ "DrawThingsTxt2Img",
+ "DrawThingsTxt2ImgPipeline"
+ ],
+ {
+ "title_aux": "ComfyUI-DrawThingsWrapper"
+ }
+ ],
+ "https://github.com/JuanBerta/comfyui_ollama_vl_prompt": [
+ [
+ "Ollama VL Prompt"
+ ],
+ {
+ "title_aux": "comfyui_ollama_vl_prompt"
+ }
+ ],
+ "https://github.com/Julian-adv/WildDivide": [
+ [
+ "Attention couple wild divide",
+ "Comfy Divide",
+ "WildPromptGenerator",
+ "WildcardDivide",
+ "WildcardEncode"
+ ],
+ {
+ "author": "Julian Adventurer.",
+ "description": "This node is used to encode a wildcard string.",
+ "nickname": "WildDivide",
+ "title": "Wild Divide",
+ "title_aux": "Wild Divide"
+ }
+ ],
+ "https://github.com/Junst/ComfyUI-Concept-Diffusion": [
+ [
+ "ConceptAttentionNode",
+ "ConceptAttentionVisualizerNode",
+ "ConceptSaliencyMapNode",
+ "ConceptSegmentationNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Concept-Diffusion"
+ }
+ ],
+ "https://github.com/JustLateNightAI/KeywordImageBlocker": [
+ [
+ "TagKeywordBlocker"
+ ],
+ {
+ "title_aux": "KeywordImageBlocker"
+ }
+ ],
+ "https://github.com/Juste-Leo2/Canary-ComfyUI": [
+ [
+ "Canary180mFlashASRNode",
+ "Canary180mFlashTranslateFromENNode",
+ "Canary180mFlashTranslateToENNode",
+ "CanaryASRNode",
+ "CanaryFlashASRNode",
+ "CanaryFlashTranslateFromENNode",
+ "CanaryFlashTranslateToENNode",
+ "CanaryModelLoader",
+ "CanaryTranslateFromENNode",
+ "CanaryTranslateToENNode"
+ ],
+ {
+ "title_aux": "Canary-ComfyUI"
+ }
+ ],
+ "https://github.com/Juste-Leo2/USO_ComfyUI": [
+ [
+ "USOLoader",
+ "USOSampler"
+ ],
+ {
+ "title_aux": "USO Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/Justify87/ComfyUI-Multi-Analysis-Heatmaps": [
+ [
+ "MultiAnalysisNode"
+ ],
+ {
+ "title_aux": "ComfyUI Multi-Analysis Heatmaps"
+ }
+ ],
+ "https://github.com/JustinMatters/comfyUI-JMNodes": [
+ [
+ "JMBinaryNot",
+ "JMIntegerToBooleans",
+ "JMNumberList",
+ "JMSWitchablePrompt",
+ "JMSwitchablePrompt"
+ ],
+ {
+ "title_aux": "ComfyUI JMNodes"
+ }
+ ],
+ "https://github.com/K3NK3/ComfyUI-K3NKImageGrab": [
+ [
+ "K3NKImageGrab",
+ "K3NKImageLoaderWithBlending"
+ ],
+ {
+ "title_aux": "ComfyUI-K3NKImageGrab"
+ }
+ ],
+ "https://github.com/K3nt3L/ComfyUI-S1Z35": [
+ [
+ "S1Z35_Custom1",
+ "S1Z35_Custom2",
+ "S1Z35_Flux1",
+ "S1Z35_Flux2",
+ "S1Z35_Hunyuan",
+ "S1Z35_Qwen",
+ "S1Z35_SDXL",
+ "S1Z35_ZIT"
+ ],
+ {
+ "title_aux": "ComfyUI-S1Z35"
+ }
+ ],
+ "https://github.com/KAVVATARE/ComfyUI-Light-N-Color": [
+ [
+ "ControlNetSwitch",
+ "FluxLightingAndColor",
+ "FluxSamplerPuLID",
+ "ImageSwitch",
+ "LatentSwitch",
+ "LoadInputOutputImage"
+ ],
+ {
+ "title_aux": " ComfyUI-Light-N-Color"
+ }
+ ],
+ "https://github.com/KAVVATARE/ComfyUI_RightEyeDisparity": [
+ [
+ "RightEyeImageNode",
+ "VideoRightEyeNode"
+ ],
+ {
+ "title_aux": "RightEyeDisparity"
+ }
+ ],
+ "https://github.com/KAVVATARE/ComfyUI_SimpleGoogleTranslate": [
+ [
+ "SimpleGoogleTranslateTextNode"
+ ],
+ {
+ "title_aux": "ComfyUI_SimpleGoogleTranslate"
+ }
+ ],
+ "https://github.com/KERRY-YUAN/ComfyUI_Float_Animator": [
+ [
+ "Float_Animator"
+ ],
+ {
+ "title_aux": "ComfyUI_Float_Animator"
+ }
+ ],
+ "https://github.com/KERRY-YUAN/ComfyUI_Simple_Executor": [
+ [
+ "NodeAutoSampler",
+ "NodeImagePre",
+ "NodeImageResize"
+ ],
+ {
+ "title_aux": "NodeSimpleExecutor"
+ }
+ ],
+ "https://github.com/KERRY-YUAN/ComfyUI_Spark_TTS": [
+ [
+ "Spark_TTS_Clone",
+ "Spark_TTS_Creation"
+ ],
+ {
+ "title_aux": "ComfyUI_Spark_TTS"
+ }
+ ],
+ "https://github.com/KLL535/ComfyUI_SimpleButcher": [
+ [
+ "Simple Auto Bypass",
+ "Simple Extract Lora From Text",
+ "Simple Image Saver (as Forge)",
+ "Simple Load Image With Metadata",
+ "Simple Load Images From Dir",
+ "Simple Load Images from Dir",
+ "Simple Load Line From Text File",
+ "Simple Lora Loader",
+ "Simple Remove Think"
+ ],
+ {
+ "title_aux": "ComfyUI_SimpleButcher"
+ }
+ ],
+ "https://github.com/KLL535/ComfyUI_Simple_Qwen3-VL-gguf": [
+ [
+ "SimpleCameraSelector",
+ "SimpleMasterPromptLoader",
+ "SimpleMasterPromptLoaderAdvanced",
+ "SimpleModelPresetLoaderAdvanced",
+ "SimpleQwenVLgguf",
+ "SimpleQwenVLggufV2",
+ "SimpleStyleSelector"
+ ],
+ {
+ "title_aux": "ComfyUI_Simple_Qwen3-VL-gguf"
+ }
+ ],
+ "https://github.com/KY-2000/ComfyUI_PuLID_Flux_ll_FaceNet": [
+ [
+ "ApplyPulidFlux",
+ "FixPulidFluxPatch",
+ "PulidFluxEvaClipLoader",
+ "PulidFluxFaceDetector",
+ "PulidFluxFaceNetLoader",
+ "PulidFluxInsightFaceLoader",
+ "PulidFluxModelLoader",
+ "PulidFluxOptions"
+ ],
+ {
+ "title_aux": "ComfyUI_PuLID_Flux_ll_FaceNet"
+ }
+ ],
+ "https://github.com/KY-2000/RES4LYF-tester-loop": [
+ [
+ "DoubleFloatRangeLoop",
+ "DoubleIntRangeLoop",
+ "RES4LYFComboLoop",
+ "RES4LYFSamplerLoop",
+ "RES4LYFSchedulerLoop",
+ "SingleFloatLoop",
+ "SingleIntLoop"
+ ],
+ {
+ "title_aux": "RES4LYF-tester-loop"
+ }
+ ],
+ "https://github.com/KY-2000/comfyui-ksampler-tester-loop": [
+ [
+ "AllParametersLoop",
+ "AllParametersLoopAdvanced",
+ "FloatRangeLoop",
+ "ParametersRangeLoop",
+ "SamplerLoop",
+ "SamplerLoopAdvanced",
+ "SamplerSchedulerLoop",
+ "SamplerSchedulerLoopAdvanced",
+ "SchedulerLoop"
+ ],
+ {
+ "title_aux": "comfyui-ksampler-tester-loop"
+ }
+ ],
+ "https://github.com/KY-2000/comfyui-save-image-enhanced": [
+ [
+ "SaveImageEnhancedNode"
+ ],
+ {
+ "title_aux": "comfyui-save-image-enhanced"
+ }
+ ],
+ "https://github.com/Kaleidia/KaleidiaNodes": [
+ [
+ "DynamicPromptNode",
+ "DynamicPromptNodeEXT",
+ "FormatIntToString",
+ "GetFileCountInOutputFolder",
+ "LoadCSV",
+ "RandomFloatToString",
+ "RandomIntToString"
+ ],
+ {
+ "title_aux": "KaleidiaNodes"
+ }
+ ],
+ "https://github.com/Kangkang625/ComfyUI-paint-by-example": [
+ [
+ "PaintbyExamplePipeLoader",
+ "PaintbyExampleSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-Paint-by-Example"
+ }
+ ],
+ "https://github.com/KarmaSwint/ComfyUI-KarmaNodes": [
+ [
+ "Karma-Film-Grain",
+ "Karma-KSampler-Cycle",
+ "Karma-Kolors",
+ "Karma_Film_Grain",
+ "Karma_Kolors"
+ ],
+ {
+ "title_aux": "KarmaNodes"
+ }
+ ],
+ "https://github.com/Kayarte/AudioDriven-Latent-Space-Tools-for-ComfyUI": [
+ [
+ "AdvancedNoisePatterns",
+ "AudioNoiseMapper",
+ "LibrosaAnalysisNode",
+ "NoiseToLatentConverter"
+ ],
+ {
+ "title_aux": "AudioDriven-Latent-Space-Tools-for-ComfyUI"
+ }
+ ],
+ "https://github.com/Kayarte/GeoNodes": [
+ [
+ "GISDetectionNode",
+ "YOLOInferenceNode",
+ "YOLOTrainNode"
+ ],
+ {
+ "title_aux": "GeoNodes"
+ }
+ ],
+ "https://github.com/Kazama-Suichiku/ComfyUI-Meshy": [
+ [
+ "MeshyAPIKey",
+ "MeshyImageTo3D",
+ "MeshyTextTo3DPreview",
+ "MeshyTextTo3DRefine"
+ ],
+ {
+ "title_aux": "ComfyUI-Meshy"
+ }
+ ],
+ "https://github.com/Kebolder/ComfyUI-Jax-Nodes": [
+ [
+ "JAX_ConditionalSelect",
+ "JAX_EasyPrompt",
+ "JAX_EasyPromptSimple",
+ "JAX_ImageSizeMultiplier",
+ "JAX_KritaPipeIn",
+ "JAX_KritaStrength",
+ "JAX_SamplerPipeOut"
+ ],
+ {
+ "title_aux": "ComfyUI-Jax-Nodes"
+ }
+ ],
+ "https://github.com/Kesin11/ComfyUI-list-filter": [
+ [
+ "list_filter_FilterImageListByIndexList",
+ "list_filter_FilterStringListByIndexList",
+ "list_filter_FindAnyStrings",
+ "list_filter_FindNotAnyStrings",
+ "list_filter_StringToIndex",
+ "random_normal_dist"
+ ],
+ {
+ "title_aux": "ComfyUI-list-filter"
+ }
+ ],
+ "https://github.com/KewkLW/ComfyUI-kewky_tools": [
+ [
+ "CLIPInterrogator",
+ "FormattedPromptNode",
+ "ImageBatcher",
+ "LoadImagePlus",
+ "LoadVideoPlus",
+ "TensorDebugPlus",
+ "TextAppendNode",
+ "TextSearchNode",
+ "VRAM_Debug_Plus"
+ ],
+ {
+ "title_aux": "ComfyUI-kewky_tools"
+ }
+ ],
+ "https://github.com/Kidev/ComfyUI-FaceFilter": [
+ [
+ "FaceFilterNode",
+ "MergeImageBatches"
+ ],
+ {
+ "title_aux": "ComfyUI-FaceFilter"
+ }
+ ],
+ "https://github.com/Kidev/ComfyUI-Fisheye-effects": [
+ [
+ "Defisheye",
+ "Fisheye"
+ ],
+ {
+ "title_aux": "ComfyUI Fisheye Effects Nodes"
+ }
+ ],
+ "https://github.com/Kishor900/comfyui-wanv2v-video-stitcher": [
+ [
+ "MixColorByMaskBatched",
+ "NumberedBatchDebugger",
+ "VideoToImages",
+ "WanV2VIterControlGroup",
+ "WanV2VMergeDeOverlap",
+ "WanV2VUpscaler"
+ ],
+ {
+ "title_aux": "ComfyUI WANv2v Video Stitcher"
+ }
+ ],
+ "https://github.com/KohakuBlueleaf/HDM-ext": [
+ [
+ "HDMCameraParam",
+ "HDMLoader",
+ "HDMTreadGamma"
+ ],
+ {
+ "title_aux": "HDM-ext"
+ }
+ ],
+ "https://github.com/KohakuBlueleaf/z-tipo-extension": [
+ [
+ "TIPO",
+ "TIPOFormat",
+ "TIPOOperation"
+ ],
+ {
+ "title_aux": "TIPO-extension"
+ }
+ ],
+ "https://github.com/Koko-boya/Comfyui-GeminiWeb": [
+ [
+ "GeminiWeb"
+ ],
+ {
+ "title_aux": "Comfyui-GeminiWeb"
+ }
+ ],
+ "https://github.com/Koko-boya/Comfyui-Z-Image-Utilities": [
+ [
+ "Z_ImageAPIConfig",
+ "Z_ImageClearSessions",
+ "Z_ImageIntegratedKSampler",
+ "Z_ImageOptions",
+ "Z_ImagePromptEnhancer",
+ "Z_ImageUnloadModels"
+ ],
+ {
+ "title_aux": "Comfyui-Z-Image-Utilities"
+ }
+ ],
+ "https://github.com/Koratahiu/ComfyUI-Diff2Flow": [
+ [
+ "Diff2FlowODESampler"
+ ],
+ {
+ "author": "Koratahiu",
+ "description": "Unofficial Implementation of Diff2Flow Method for ComfyUI.",
+ "nickname": "ComfyUI-Diff2Flow",
+ "title": "ComfyUI-Diff2Flow",
+ "title_aux": "ComfyUI-Diff2Flow"
+ }
+ ],
+ "https://github.com/KoreTeknology/ComfyUI-Nai-Production-Nodes-Pack": [
+ [
+ "Brightness Image",
+ "ColorMatch2",
+ "Contrast Image",
+ "Get Text",
+ "Image Difference",
+ "ImageConcatenate",
+ "ImageDesaturate",
+ "ImageExtend",
+ "ImageFlip",
+ "ImageRotate",
+ "LoadImageNai",
+ "Math Operation",
+ "NoteAdvanced",
+ "Set Text"
+ ],
+ {
+ "title_aux": "ComfyUI Production Nodes Pack"
+ }
+ ],
+ "https://github.com/KoreTeknology/ComfyUI-Universal-Styler": [
+ [
+ "LoadScriptsFromDatabase",
+ "SaveScriptToDatabase",
+ "SetMainChannel",
+ "\ud83d\udee1\ufe0f Load Scripts from Database",
+ "\ud83d\udee1\ufe0f Save Script to Database (In progress)",
+ "\ud83d\udee1\ufe0f Set Main Channel"
+ ],
+ {
+ "title_aux": "ComfyUI Universal Styler"
+ }
+ ],
+ "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": [
+ [
+ "ACN_AdvancedControlNetApply",
+ "ACN_AdvancedControlNetApplySingle",
+ "ACN_AdvancedControlNetApplySingle_v2",
+ "ACN_AdvancedControlNetApply_v2",
+ "ACN_ControlNet++InputNode",
+ "ACN_ControlNet++LoaderAdvanced",
+ "ACN_ControlNet++LoaderSingle",
+ "ACN_ControlNetLoaderAdvanced",
+ "ACN_CtrLoRALoader",
+ "ACN_CustomControlNetWeightsFlux",
+ "ACN_CustomControlNetWeightsSD15",
+ "ACN_CustomT2IAdapterWeights",
+ "ACN_DefaultUniversalWeights",
+ "ACN_DiffControlNetLoaderAdvanced",
+ "ACN_ExtrasMiddleMult",
+ "ACN_ReferenceControlNet",
+ "ACN_ReferenceControlNetFinetune",
+ "ACN_ReferencePreprocessor",
+ "ACN_ScaledSoftControlNetWeights",
+ "ACN_SoftControlNetWeightsSD15",
+ "ACN_SoftT2IAdapterWeights",
+ "ACN_SparseCtrlIndexMethodNode",
+ "ACN_SparseCtrlLoaderAdvanced",
+ "ACN_SparseCtrlMergedLoaderAdvanced",
+ "ACN_SparseCtrlRGBPreprocessor",
+ "ACN_SparseCtrlSpreadMethodNode",
+ "ACN_SparseCtrlWeightExtras",
+ "ACN_TimestepKeyframeFromStrengthList",
+ "ACN_TimestepKeyframeInterpolation",
+ "ControlNetLoaderAdvanced",
+ "CustomControlNetWeights",
+ "CustomT2IAdapterWeights",
+ "DiffControlNetLoaderAdvanced",
+ "LatentKeyframe",
+ "LatentKeyframeBatchedGroup",
+ "LatentKeyframeGroup",
+ "LatentKeyframeTiming",
+ "LoadImagesFromDirectory",
+ "ScaledSoftControlNetWeights",
+ "ScaledSoftMaskedUniversalWeights",
+ "SoftControlNetWeights",
+ "SoftT2IAdapterWeights",
+ "TimestepKeyframe"
+ ],
+ {
+ "title_aux": "ComfyUI-Advanced-ControlNet"
+ }
+ ],
+ "https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved": [
+ [
+ "ADBlockComboNode",
+ "ADBlockIndivNode",
+ "ADE_AdjustPEFullStretch",
+ "ADE_AdjustPEManual",
+ "ADE_AdjustPESweetspotStretch",
+ "ADE_AdjustWeightAllAdd",
+ "ADE_AdjustWeightAllMult",
+ "ADE_AdjustWeightIndivAdd",
+ "ADE_AdjustWeightIndivAttnAdd",
+ "ADE_AdjustWeightIndivAttnMult",
+ "ADE_AdjustWeightIndivMult",
+ "ADE_AncestralOptions",
+ "ADE_AnimateDiffCombine",
+ "ADE_AnimateDiffKeyframe",
+ "ADE_AnimateDiffLoRALoader",
+ "ADE_AnimateDiffLoaderGen1",
+ "ADE_AnimateDiffLoaderV1Advanced",
+ "ADE_AnimateDiffLoaderWithContext",
+ "ADE_AnimateDiffModelSettings",
+ "ADE_AnimateDiffModelSettingsAdvancedAttnStrengths",
+ "ADE_AnimateDiffModelSettingsSimple",
+ "ADE_AnimateDiffModelSettings_Release",
+ "ADE_AnimateDiffSamplingSettings",
+ "ADE_AnimateDiffSettings",
+ "ADE_AnimateDiffUniformContextOptions",
+ "ADE_AnimateDiffUnload",
+ "ADE_ApplyAnimateDiffModel",
+ "ADE_ApplyAnimateDiffModelSimple",
+ "ADE_ApplyAnimateDiffModelWithCameraCtrl",
+ "ADE_ApplyAnimateDiffModelWithPIA",
+ "ADE_ApplyAnimateLCMI2VModel",
+ "ADE_AttachLoraHookToCLIP",
+ "ADE_AttachLoraHookToConditioning",
+ "ADE_BatchedContextOptions",
+ "ADE_CFGExtrasPAG",
+ "ADE_CFGExtrasPAGSimple",
+ "ADE_CFGExtrasRescaleCFG",
+ "ADE_CFGExtrasRescaleCFGSimple",
+ "ADE_CameraCtrlAnimateDiffKeyframe",
+ "ADE_CameraManualPoseAppend",
+ "ADE_CameraPoseAdvanced",
+ "ADE_CameraPoseBasic",
+ "ADE_CameraPoseCombo",
+ "ADE_CombineLoraHooks",
+ "ADE_CombineLoraHooksEight",
+ "ADE_CombineLoraHooksFour",
+ "ADE_ConditioningCombine",
+ "ADE_ConditioningSetMask",
+ "ADE_ConditioningSetMaskAndCombine",
+ "ADE_ConditioningSetUnmaskedAndCombine",
+ "ADE_ContextExtras_ContextRef",
+ "ADE_ContextExtras_ContextRef_Keyframe",
+ "ADE_ContextExtras_ContextRef_KeyframeFromList",
+ "ADE_ContextExtras_ContextRef_KeyframeInterpolation",
+ "ADE_ContextExtras_ContextRef_ModeFirst",
+ "ADE_ContextExtras_ContextRef_ModeIndexes",
+ "ADE_ContextExtras_ContextRef_ModeSliding",
+ "ADE_ContextExtras_ContextRef_TuneAttn",
+ "ADE_ContextExtras_ContextRef_TuneAttnAdain",
+ "ADE_ContextExtras_NaiveReuse",
+ "ADE_ContextExtras_NaiveReuse_Keyframe",
+ "ADE_ContextExtras_NaiveReuse_KeyframeFromList",
+ "ADE_ContextExtras_NaiveReuse_KeyframeInterpolation",
+ "ADE_ContextExtras_Set",
+ "ADE_CustomCFG",
+ "ADE_CustomCFGKeyframe",
+ "ADE_CustomCFGKeyframeFromList",
+ "ADE_CustomCFGKeyframeInterpolation",
+ "ADE_CustomCFGKeyframeSimple",
+ "ADE_CustomCFGSimple",
+ "ADE_EmptyLatentImageLarge",
+ "ADE_InjectI2VIntoAnimateDiffModel",
+ "ADE_InjectPIAIntoAnimateDiffModel",
+ "ADE_InputPIA_Multival",
+ "ADE_InputPIA_PaperPresets",
+ "ADE_IterationOptsDefault",
+ "ADE_IterationOptsFreeInit",
+ "ADE_LoadAnimateDiffModel",
+ "ADE_LoadAnimateDiffModelWithCameraCtrl",
+ "ADE_LoadAnimateLCMI2VModel",
+ "ADE_LoadCameraPoses",
+ "ADE_LoadCameraPosesFromPath",
+ "ADE_LoopedUniformContextOptions",
+ "ADE_LoopedUniformViewOptions",
+ "ADE_LoraHookKeyframe",
+ "ADE_LoraHookKeyframeFromStrengthList",
+ "ADE_LoraHookKeyframeInterpolation",
+ "ADE_MultivalConvertToMask",
+ "ADE_MultivalDynamic",
+ "ADE_MultivalDynamicFloatInput",
+ "ADE_MultivalDynamicFloats",
+ "ADE_MultivalScaledMask",
+ "ADE_NoiseCalibration",
+ "ADE_NoiseLayerAdd",
+ "ADE_NoiseLayerAddWeighted",
+ "ADE_NoiseLayerNormalizedSum",
+ "ADE_NoiseLayerReplace",
+ "ADE_NoisedImageInjectOptions",
+ "ADE_NoisedImageInjection",
+ "ADE_PIA_AnimateDiffKeyframe",
+ "ADE_PairedConditioningCombine",
+ "ADE_PairedConditioningSetMask",
+ "ADE_PairedConditioningSetMaskAndCombine",
+ "ADE_PairedConditioningSetUnmaskedAndCombine",
+ "ADE_PerturbedAttentionGuidanceMultival",
+ "ADE_RawSigmaSchedule",
+ "ADE_RegisterLoraHook",
+ "ADE_RegisterLoraHookModelOnly",
+ "ADE_RegisterModelAsLoraHook",
+ "ADE_RegisterModelAsLoraHookModelOnly",
+ "ADE_ReplaceCameraParameters",
+ "ADE_ReplaceOriginalPoseAspectRatio",
+ "ADE_RescaleCFGMultival",
+ "ADE_SetLoraHookKeyframe",
+ "ADE_SigmaSchedule",
+ "ADE_SigmaScheduleSplitAndCombine",
+ "ADE_SigmaScheduleToSigmas",
+ "ADE_SigmaScheduleWeightedAverage",
+ "ADE_SigmaScheduleWeightedAverageInterp",
+ "ADE_StandardStaticContextOptions",
+ "ADE_StandardStaticViewOptions",
+ "ADE_StandardUniformContextOptions",
+ "ADE_StandardUniformViewOptions",
+ "ADE_TimestepsConditioning",
+ "ADE_UpscaleAndVAEEncode",
+ "ADE_UseEvolvedSampling",
+ "ADE_ViewsOnlyContextOptions",
+ "ADE_VisualizeContextOptionsK",
+ "ADE_VisualizeContextOptionsKAdv",
+ "ADE_VisualizeContextOptionsSCustom",
+ "AddValuesReplaceNode",
+ "AnimateDiffLoaderV1",
+ "CheckpointLoaderSimpleWithNoiseSelect",
+ "ConditionExtractionNode",
+ "FloatToFloatsNode",
+ "PerBlockHighLevelNode",
+ "PerBlock_SD15_FromFloatsNode",
+ "PerBlock_SD15_LowLevelNode",
+ "PerBlock_SD15_MidLevelNode",
+ "PerBlock_SDXL_FromFloatsNode",
+ "PerBlock_SDXL_LowLevelNode",
+ "PerBlock_SDXL_MidLevelNode",
+ "PromptSchedulingLatentsNode",
+ "PromptSchedulingNode",
+ "ValueSchedulingLatentsNode",
+ "ValueSchedulingNode"
+ ],
+ {
+ "title_aux": "AnimateDiff Evolved"
+ }
+ ],
+ "https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite": [
+ [
+ "VHS_AudioToVHSAudio",
+ "VHS_BatchManager",
+ "VHS_DuplicateImages",
+ "VHS_DuplicateLatents",
+ "VHS_DuplicateMasks",
+ "VHS_GetImageCount",
+ "VHS_GetLatentCount",
+ "VHS_GetMaskCount",
+ "VHS_LoadAudio",
+ "VHS_LoadAudioUpload",
+ "VHS_LoadImagePath",
+ "VHS_LoadImages",
+ "VHS_LoadImagesPath",
+ "VHS_LoadVideo",
+ "VHS_LoadVideoFFmpeg",
+ "VHS_LoadVideoFFmpegPath",
+ "VHS_LoadVideoPath",
+ "VHS_MergeImages",
+ "VHS_MergeLatents",
+ "VHS_MergeMasks",
+ "VHS_PruneOutputs",
+ "VHS_SelectEveryNthImage",
+ "VHS_SelectEveryNthLatent",
+ "VHS_SelectEveryNthMask",
+ "VHS_SelectFilename",
+ "VHS_SelectImages",
+ "VHS_SelectLatents",
+ "VHS_SelectLatest",
+ "VHS_SelectMasks",
+ "VHS_SplitImages",
+ "VHS_SplitLatents",
+ "VHS_SplitMasks",
+ "VHS_Unbatch",
+ "VHS_VAEDecodeBatched",
+ "VHS_VAEEncodeBatched",
+ "VHS_VHSAudioToAudio",
+ "VHS_VideoCombine",
+ "VHS_VideoInfo",
+ "VHS_VideoInfoLoaded",
+ "VHS_VideoInfoSource"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoHelperSuite"
+ }
+ ],
+ "https://github.com/Koushakur/ComfyUI-DenoiseChooser": [
+ [
+ "DenoiseChooser|Koushakur"
+ ],
+ {
+ "title_aux": "ComfyUI-DenoiseChooser"
+ }
+ ],
+ "https://github.com/KunmyonChoi/ComfyUI_S3_direct": [
+ [
+ "CKM Direct Load Image From S3",
+ "CKM Direct Save Image To S3",
+ "Direct Load Image From S3",
+ "Direct Save Image To S3",
+ "Save VHS Video to S3"
+ ],
+ {
+ "title_aux": "ComfyUI_S3_direct"
+ }
+ ],
+ "https://github.com/Kurdknight/Kurdknight_comfycheck": [
+ [
+ "SystemCheck",
+ "SystemViz"
+ ],
+ {
+ "title_aux": "KurdKnight ComfyUI System Check Node"
+ }
+ ],
+ "https://github.com/KursatAs/KrsNodes": [
+ [
+ "CropPadAdvancedKrs",
+ "QwenImageEditLatentKrs",
+ "TextEncodeQwenImageEditKrsAdvanced",
+ "TextEncodeQwenImageEditKrsSimple"
+ ],
+ {
+ "title_aux": "Comfyui Krs Nodes"
+ }
+ ],
+ "https://github.com/KwaiVGI/ComfyUI-KLingAI-API": [
+ [
+ "Client",
+ "Effects",
+ "Image Expander",
+ "Image Generator",
+ "Image2Video",
+ "KLingAI Preview Audio",
+ "KLingAI Preview Video",
+ "Lip Sync",
+ "Lip Sync Audio Input",
+ "Lip Sync Text Input",
+ "Text2Audio",
+ "Text2Video",
+ "Video Extender",
+ "Video2Audio",
+ "Virtual Try On"
+ ],
+ {
+ "title_aux": "ComfyUI-KLingAI-API"
+ }
+ ],
+ "https://github.com/Ky11le/draw_tools": [
+ [
+ "DetectInnerBox",
+ "PasteIntoFrame",
+ "TextBoxAutoWrap"
+ ],
+ {
+ "title_aux": "draw_tools"
+ }
+ ],
+ "https://github.com/KytraScript/ComfyUI_KytraWebhookHTTP": [
+ [
+ "SendToDiscordWebhook"
+ ],
+ {
+ "title_aux": "ComfyUI_KytraWebhookHTTP"
+ }
+ ],
+ "https://github.com/KytraScript/ComfyUI_MatAnyone_Kytra": [
+ [
+ "Kytra_Images_To_RGB",
+ "MatAnyoneVideoMatting"
+ ],
+ {
+ "title_aux": "ComfyUI_MatAnyone_Kytra"
+ }
+ ],
+ "https://github.com/L-Hugh/ComfyUI-Lumina-DiMOO": [
+ [
+ "Generator_I2I",
+ "Generator_T2I",
+ "ImageTokens_I2I",
+ "ImageTokens_Inpainting",
+ "ImageTokens_T2I",
+ "LoadModel",
+ "PromptBuilder",
+ "VQDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-Lumina-DiMOO"
+ }
+ ],
+ "https://github.com/L33chKing/ComfyUI-danbooru-FAISS-search": [
+ [
+ "DanbooruLookupAndDownload",
+ "GetDanbooru",
+ "StyleSimilarity",
+ "TagPrompt"
+ ],
+ {
+ "title_aux": "Danbooru FAISS Search Nodes"
+ }
+ ],
+ "https://github.com/L33chKing/ComfyUI_Channel_Ops": [
+ [
+ "ChannelOpsNode",
+ "LayerBlendingNode"
+ ],
+ {
+ "title_aux": "ComfyUI Channel Ops"
+ }
+ ],
+ "https://github.com/L33chKing/comfyui-tag-frequency-weighter": [
+ [
+ "TagFrequencyWeighter"
+ ],
+ {
+ "title_aux": "Tag Frequency Weighter for ComfyUI"
+ }
+ ],
+ "https://github.com/LAOGOU-666/ComfyUI-LG_HotReload": [
+ [
+ "HotReload_Terminal"
+ ],
+ {
+ "title_aux": "ComfyUI-LG_HotReload"
+ }
+ ],
+ "https://github.com/LAOGOU-666/ComfyUI-LG_SamplingUtils": [
+ [
+ "LGNoiseInjection",
+ "LGNoiseInjectionLatent",
+ "ModelSamplingZImage",
+ "SigmasEditor",
+ "ZImageTimestepNoise"
+ ],
+ {
+ "title_aux": "ComfyUI-LG_SamplingUtils"
+ }
+ ],
+ "https://github.com/LAOGOU-666/ComfyUI_LG_FFT": [
+ [
+ "LG_FFTNode",
+ "LG_IFFTNode"
+ ],
+ {
+ "title_aux": "ComfyUI_LG_FFT"
+ }
+ ],
+ "https://github.com/LAOGOU-666/Comfyui-LG_GroupExecutor": [
+ [
+ "GroupExecutorRepeater",
+ "GroupExecutorSender",
+ "GroupExecutorSingle",
+ "ImageListRepeater",
+ "ImageListSplitter",
+ "LG_AccumulatePreview",
+ "LG_ClearAccumulatedValues",
+ "LG_ConcatVideoFiles",
+ "LG_CreateAndSaveVideo",
+ "LG_FastPreview",
+ "LG_ImageReceiver",
+ "LG_ImageSender",
+ "LG_SaveAudioGetPath",
+ "LG_ValueReceiver",
+ "LG_ValueSender",
+ "MaskListRepeater",
+ "MaskListSplitter"
+ ],
+ {
+ "title_aux": "Comfyui-LG_GroupExecutor"
+ }
+ ],
+ "https://github.com/LAOGOU-666/Comfyui-LG_Relight": [
+ [
+ "LG_Relight",
+ "LG_Relight_Basic",
+ "LG_Relight_Ultra"
+ ],
+ {
+ "title_aux": "Comfyui-LG_Relight"
+ }
+ ],
+ "https://github.com/LAOGOU-666/Comfyui-Memory_Cleanup": [
+ [
+ "RAMCleanup",
+ "VRAMCleanup"
+ ],
+ {
+ "title_aux": "Comfyui-Memory_Cleanup"
+ }
+ ],
+ "https://github.com/LAOGOU-666/Comfyui_LG_Tools": [
+ [
+ "AFL2:ImageRestoreNodeV2",
+ "AFL2:MaskBoxCropNodeV2",
+ "AFL2_PSD_Layer",
+ "AFL2_Save_PSD",
+ "BridgePreviewNode",
+ "CachePreviewBridge",
+ "ColorAdjustment",
+ "ComboSetter",
+ "FastCanvas",
+ "FastCanvasComposite",
+ "FastCanvasTool",
+ "GroupSwitcher",
+ "ImageCropper",
+ "ImageSelector",
+ "ImageSizeAdjustment",
+ "InspyrenetRembgLoader",
+ "InspyrenetRembgProcess",
+ "LG_Counter",
+ "LG_FloatRange",
+ "LG_ImageLoaderWithCounter",
+ "LG_InstallDependencies",
+ "LG_LatentBatchToList",
+ "LG_LoadImage",
+ "LG_MaskBatchMerge",
+ "LG_MaskHoleFiller",
+ "LG_Noise",
+ "LG_PipManager",
+ "LG_SaveImage",
+ "LazySwitch1way",
+ "LazySwitch2way",
+ "MuterSwitcher",
+ "TransformDataFromString"
+ ],
+ {
+ "title_aux": "Comfyui_LG_Tools"
+ }
+ ],
+ "https://github.com/LDNKS094/ComfyUI-Painter-I2V-AIO": [
+ [
+ "PainterI2V",
+ "PainterI2VAdvanced",
+ "PainterI2VExtend",
+ "PainterSampler",
+ "PainterSamplerAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-Painter-I2V-AIO"
+ }
+ ],
+ "https://github.com/LEv145/images-grid-comfy-plugin": [
+ [
+ "GridAnnotation",
+ "ImageCombine",
+ "ImagesGridByColumns",
+ "ImagesGridByRows",
+ "LatentCombine"
+ ],
+ {
+ "title_aux": "ImagesGrid"
+ }
+ ],
+ "https://github.com/LK-168/comfyui_imgutils": [
+ [
+ "BBoxFilter",
+ "BBoxToMaskNode",
+ "CensorWithMask",
+ "ImgutilsAutoSegmenter",
+ "ImgutilsBBoxSegmenter",
+ "ImgutilsGenericDetector",
+ "MaskAttributeNodeLK",
+ "MaskCombineNodeLK",
+ "MaskEdgeNodeLK",
+ "MaskHelperLK",
+ "MaskInfoNodeLK",
+ "MaskMorphologyNodeLK",
+ "MaskToBBoxNode",
+ "SAMLoaderLK",
+ "SAMPredictorNode"
+ ],
+ {
+ "title_aux": "comfyui_imgutils"
+ }
+ ],
+ "https://github.com/LKbaba/ComfyUI-TuZi-Flux-Kontext": [
+ [
+ "FluxKontext_ImageToImage",
+ "FluxKontext_MultiImageToImage",
+ "FluxKontext_TextToImage"
+ ],
+ {
+ "title_aux": "ComfyUI-TuZi-Flux-Kontext"
+ }
+ ],
+ "https://github.com/LaVie024/comfyui-lopi999-llm": [
+ [
+ "CanaryQwenASR",
+ "LLMNode(lopi999)"
+ ],
+ {
+ "title_aux": "comfyui-lopi999-llm"
+ }
+ ],
+ "https://github.com/Lakonik/ComfyUI-piFlow": [
+ [
+ "Load pi-Flow Model",
+ "Load pi-Flow Model (GGUF)",
+ "ModelSamplingPiFlow",
+ "pi-Flow Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI-piFlow"
+ }
+ ],
+ "https://github.com/LamEmil/ComfyUI_ASCIIArtNode": [
+ [
+ "ASCIIAnimationGenerator",
+ "ASCIIArtGenerator",
+ "ColorASCIIAnimationGenerator",
+ "RealisticColorASCIIAnimationGenerator",
+ "SequentialTwoPassTypingColorASCIIAnimation",
+ "TwoPassTypingColorASCIIAnimation",
+ "VideoToColorStaticASCIIArt",
+ "VideoToDynamicColorASCIIArt"
+ ],
+ {
+ "title_aux": "ComfyUI ASCII Art Nodes"
+ }
+ ],
+ "https://github.com/LaoMaoBoss/ComfyUI-WBLESS": [
+ [
+ "Inversed Switch",
+ "RunningHUB API",
+ "Switch"
+ ],
+ {
+ "title_aux": "ComfyUI-WBLESS"
+ }
+ ],
+ "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI": [
+ [
+ "LoRA Caption Load",
+ "LoRA Caption Save"
+ ],
+ {
+ "title_aux": "Image-Captioning-in-ComfyUI"
+ }
+ ],
+ "https://github.com/LarryJane491/Lora-Training-in-Comfy": [
+ [
+ "Lora Training in Comfy (Advanced)",
+ "Lora Training in ComfyUI",
+ "Tensorboard Access"
+ ],
+ {
+ "title_aux": "Lora-Training-in-Comfy"
+ }
+ ],
+ "https://github.com/LatentSpaceDirective/ComfyUI-Texturaizer": [
+ [
+ "Texturaizer_ApplyControlNets",
+ "Texturaizer_ApplyStyleToPrompt",
+ "Texturaizer_CachedCNLoader",
+ "Texturaizer_CachedCheckpointLoader",
+ "Texturaizer_CircularVAEDecode",
+ "Texturaizer_ClipEncodeSwitchVersion",
+ "Texturaizer_CombinedConditioningFromColors",
+ "Texturaizer_ExtractCNData",
+ "Texturaizer_GenerateNoise",
+ "Texturaizer_GetCNData",
+ "Texturaizer_GetClipModelName",
+ "Texturaizer_GetFluxGuidance",
+ "Texturaizer_GetIPAdapterData",
+ "Texturaizer_GetImageData",
+ "Texturaizer_GetJsonData",
+ "Texturaizer_GetKontextData",
+ "Texturaizer_GetLoraData",
+ "Texturaizer_GetMaterialTileData",
+ "Texturaizer_GetModelName",
+ "Texturaizer_GetPromptData",
+ "Texturaizer_GetRenderData",
+ "Texturaizer_GetSamplerData",
+ "Texturaizer_GetSegData",
+ "Texturaizer_GetStyleData",
+ "Texturaizer_GetVAEName",
+ "Texturaizer_IPAdapterEmbeds",
+ "Texturaizer_KSamplerAdvanced",
+ "Texturaizer_Placeholder",
+ "Texturaizer_PowerLoraLoader",
+ "Texturaizer_SeamlessTilingPatch",
+ "Texturaizer_SendImage",
+ "Texturaizer_SetGlobalDir",
+ "Texturaizer_SigmasSelector",
+ "Texturaizer_SwitchAny",
+ "Texturaizer_SwitchLazy",
+ "Texturaizer_SwitchSmart",
+ "Texturaizer_UseSDXL"
+ ],
+ {
+ "title_aux": "ComfyUI-Texturaizer"
+ }
+ ],
+ "https://github.com/Laurent2916/comfyui-piq": [
+ [
+ "ContentScore",
+ "DISTS",
+ "DSS",
+ "FSIM",
+ "GMSD",
+ "HaarPSI",
+ "IW-SSIM",
+ "LPIPS",
+ "MDSI",
+ "MS-SSIM",
+ "MSGMSD",
+ "PSNR",
+ "PieAPP",
+ "SRSIM",
+ "SSIM",
+ "StyleScore",
+ "VIFp"
+ ],
+ {
+ "title_aux": "comfyui-piq"
+ }
+ ],
+ "https://github.com/Lavah000/ComfyUI-AdvGenPack": [
+ [
+ "AGP_Bloom_Glow_FX",
+ "AGP_Checkpoint_Mask_Generator",
+ "AGP_Checkpoint_Merger_Advanced",
+ "AGP_Checkpoint_Merger_Blockwise",
+ "AGP_Checkpoint_Merger_DARE",
+ "AGP_Chromatic_Aberration",
+ "AGP_Color_Grading_Preset",
+ "AGP_Curves_And_Levels",
+ "AGP_Denoise_Suite",
+ "AGP_Film_Grain_Noise",
+ "AGP_HSV_Shifter",
+ "AGP_Histogram_Equalizer",
+ "AGP_Keyframe_Extractor",
+ "AGP_LUT_3D_Loader",
+ "AGP_LoRA_DARE_Merger",
+ "AGP_LoRA_Multi_Merger",
+ "AGP_LoRA_Strength_Scheduler",
+ "AGP_Motion_Prediction_Sampler",
+ "AGP_Optical_Flow_Interpolator",
+ "AGP_Sharpening_Filter",
+ "AGP_Temporal_Consistency_Enforcer",
+ "AGP_WAN_Boundary_Optimizer",
+ "AGP_WAN_Lightning_Hybrid",
+ "AGP_WAN_Multi_Expert_Sampler",
+ "AGP_WAN_Noise_Mixer_Expert",
+ "AGP_White_Balance_Corrector"
+ ],
+ {
+ "title_aux": "ComfyUI Advanced Generation Pack (AGP)"
+ }
+ ],
+ "https://github.com/Layer-norm/comfyui-lama-remover": [
+ [
+ "LamaRemover",
+ "LamaRemoverIMG"
+ ],
+ {
+ "title_aux": "Comfyui lama remover"
+ }
+ ],
+ "https://github.com/LeanModels/ComfyUI-DFloat11": [
+ [
+ "DFloat11ModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-DFloat11"
+ }
+ ],
+ "https://github.com/Legorobotdude/ComfyUI-VariationLab": [
+ [
+ "CFGExplorer",
+ "CheckpointExplorer",
+ "StepExplorer"
+ ],
+ {
+ "title_aux": "ComfyUI-VariationLab"
+ }
+ ],
+ "https://github.com/LeonQ8/ComfyUI-Dynamic-Lora-Scheduler": [
+ [
+ "AdaptiveLoraScheduler",
+ "LoadWanVideoClipTextEncoder",
+ "LoadWanVideoT5TextEncoder",
+ "WanVideoBlockSwap",
+ "WanVideoExtraModelSelect",
+ "WanVideoLoraBlockEdit",
+ "WanVideoLoraSelect",
+ "WanVideoLoraSelectByName",
+ "WanVideoLoraSelectMulti",
+ "WanVideoModelLoader",
+ "WanVideoSetLoRAs",
+ "WanVideoTinyVAELoader",
+ "WanVideoTorchCompileSettings",
+ "WanVideoVACEModelSelect",
+ "WanVideoVAELoader",
+ "WanVideoVRAMManagement"
+ ],
+ {
+ "title_aux": "ComfyUI-Dynamic-Lora-Scheduler"
+ }
+ ],
+ "https://github.com/Lerc/canvas_tab": [
+ [
+ "Canvas_Tab",
+ "Send_To_Editor"
+ ],
+ {
+ "author": "Lerc",
+ "description": "This extension provides a full page image editor with mask support. There are two nodes, one to receive images from the editor and one to send images to the editor.",
+ "nickname": "Canvas Tab",
+ "title": "Canvas Tab",
+ "title_aux": "Canvas Tab"
+ }
+ ],
+ "https://github.com/LevelPixel/ComfyUI-LevelPixel": [
+ [
+ "AnyToText|LP",
+ "BoolToInt|LP",
+ "BoolToString|LP",
+ "CLIP Text Encode Translate [LP]",
+ "CLIPTextEncodeTranslate|LP",
+ "Calculate Target Size By Mask [LP]",
+ "CalculateTargetSizeByMask|LP",
+ "ComboToText|LP",
+ "Convert Any To Text [LP]",
+ "Convert Bool To Int [LP]",
+ "Convert Bool To String [LP]",
+ "Convert Combo To Text [LP]",
+ "Convert Float To Int [LP]",
+ "Convert Float To String [LP]",
+ "Convert Int To Bool [LP]",
+ "Convert Int To Float [LP]",
+ "Convert Int To String [LP]",
+ "Convert String To Bool [LP]",
+ "Convert String To Combo [LP]",
+ "Convert String To Float [LP]",
+ "Convert String To Int [LP]",
+ "Convert String To Number [LP]",
+ "Count Objects [LP]",
+ "CountObjects|LP",
+ "Cropped Aspect Size Parameters [LP]",
+ "Cropped Forsed Size Parameters [LP]",
+ "Cropped Free Size Parameters [LP]",
+ "Cropped Ranged Size Parameters [LP]",
+ "CroppedAspectSizeParameters|LP",
+ "CroppedForsedSizeParameters|LP",
+ "CroppedFreeSizeParameters|LP",
+ "CroppedRangedSizeParameters|LP",
+ "Delay [LP]",
+ "Delay|LP",
+ "Extend Factor Parameters [LP]",
+ "ExtendFactorParameters|LP",
+ "Fast Checker Pattern [LP]",
+ "FastCheckerPattern|LP",
+ "File Counter [LP]",
+ "FileCounter|LP",
+ "Find Value From File [LP]",
+ "FindValueFromFile|LP",
+ "FloatToInt|LP",
+ "FloatToString|LP",
+ "Get ComfyUI Folder Path [LP]",
+ "Get ComfyUI HTTP Folder Path [LP]",
+ "Get Filename By Index In Folder [LP]",
+ "Get Iterator Data From Image Folders [LP]",
+ "Get Iterator Data From Videos [LP]",
+ "GetComfyUIFolderPath|LP",
+ "GetComfyUIHttpFolderPath|LP",
+ "GetFilenameByIndexInFolder|LP",
+ "GetIteratorDataImageFolders|LP",
+ "GetIteratorDataVideos|LP",
+ "Hard Unload All Models [LP]",
+ "HardModelUnloader|LP",
+ "HundredthsSimpleFloatSlider|LP",
+ "Image Data Iterator [LP]",
+ "Image Loader From Path [LP]",
+ "Image Overlay [LP]",
+ "ImageDataIterator|LP",
+ "ImageLoaderFromPath|LP",
+ "ImageOverlay|LP",
+ "Inpaint Crop [LP]",
+ "Inpaint Stitch [LP]",
+ "InpaintCrop|LP",
+ "InpaintStitch|LP",
+ "IntToBool|LP",
+ "IntToFloat|LP",
+ "IntToString|LP",
+ "Iterator [LP]",
+ "Iterator|LP",
+ "Keep Only English Tags [LP]",
+ "Keep Only English Words [LP]",
+ "KeepOnlyEnglishTags|LP",
+ "KeepOnlyEnglishWords|LP",
+ "Load Image [LP]",
+ "Load LoRA Tag [LP]",
+ "LoadImage|LP",
+ "LoraTagLoader|LP",
+ "ModelUnloader|LP",
+ "Override CLIP Device [LP]",
+ "Override CLIP Vision Device [LP]",
+ "Override VAE Device [LP]",
+ "OverrideCLIPDevice|LP",
+ "OverrideCLIPVisionDevice|LP",
+ "OverrideVAEDevice|LP",
+ "Pipe In [LP]",
+ "Pipe Out [LP]",
+ "Pipe [LP]",
+ "PipeIn|LP",
+ "PipeOut|LP",
+ "Pipe|LP",
+ "Preview Image Bridge [LP]",
+ "PreviewImageForConditions|LP",
+ "Remove Banned Tags From Tags [LP]",
+ "Remove Banned Tags From Text [LP]",
+ "Remove Duplicate Tags [LP]",
+ "RemoveBannedTagsFromTags|LP",
+ "RemoveBannedTagsFromText|LP",
+ "RemoveDuplicateTags|LP",
+ "Resize Image To Target Size [LP]",
+ "Resize Image and Masks [LP]",
+ "ResizeImageAndMasks|LP",
+ "ResizeImageToTargetSize|LP",
+ "Resorting Tags [LP]",
+ "ResortingTags|LP",
+ "Seed [LP]",
+ "Seed|LP",
+ "Show Text Bridge [LP]",
+ "Show Text [LP]",
+ "ShowTextBridge|LP",
+ "ShowText|LP",
+ "Simple Float Slider - Hundredths Step [LP]",
+ "Simple Float Slider - Tenths Step [LP]",
+ "Simple Float Slider [LP]",
+ "SimpleFloatSlider|LP",
+ "Soft Full Clean RAM and VRAM [LP]",
+ "Soft Unload Models Data [LP]",
+ "SoftFullCleanRAMAndVRAM|LP",
+ "SoftModelUnloader|LP",
+ "Split Compound Text [LP]",
+ "SplitCompoundText|LP",
+ "String Cycler [LP]",
+ "String [LP]",
+ "StringCycler|LP",
+ "StringToBool|LP",
+ "StringToCombo|LP",
+ "StringToFloat|LP",
+ "StringToInt|LP",
+ "StringToNumber|LP",
+ "String|LP",
+ "Tag Category Filter [LP]",
+ "Tag Category Keeper [LP]",
+ "Tag Category Remover [LP]",
+ "Tag Category [LP]",
+ "Tag Merger [LP]",
+ "Tag Remover [LP]",
+ "Tag Replace [LP]",
+ "Tag Switcher [LP]",
+ "TagCategoryFilter|LP",
+ "TagCategoryKeeper|LP",
+ "TagCategoryRemover|LP",
+ "TagCategory|LP",
+ "TagMerger|LP",
+ "TagRemover|LP",
+ "TagReplace|LP",
+ "TagSwitcher|LP",
+ "TenthsSimpleFloatSlider|LP",
+ "Text Choice Parser [LP]",
+ "Text Replace [LP]",
+ "Text To List [LP]",
+ "Text Translate [LP]",
+ "Text [LP]",
+ "TextChoiceParser|LP",
+ "TextReplace|LP",
+ "TextToList|LP",
+ "TextTranslateManualAll|LP",
+ "TextTranslateManual|LP",
+ "TextTranslate|LP",
+ "Text|LP",
+ "Unload Model [LP]"
+ ],
+ {
+ "title_aux": "ComfyUI Level Pixel"
+ }
+ ],
+ "https://github.com/LevelPixel/ComfyUI-LevelPixel-Advanced": [
+ [
+ "Autotagger [LP]",
+ "Autotagger|LP",
+ "Color Input [LP]",
+ "ColorInput|LP",
+ "Image Remove Background (BiRefNet) [LP]",
+ "Image Remove Background (RMBG) [LP]",
+ "Image Remove Background (rembg) [LP]",
+ "ImageRemoveBackgroundBiRefNet|LP",
+ "ImageRemoveBackgroundRMBG|LP",
+ "ImageRemoveBackground|LP",
+ "LLM Advanced [LP]",
+ "LLM Loader [LP]",
+ "LLM Sampler [LP]",
+ "LLMAdvanced|LP",
+ "LLMLoader|LP",
+ "LLMSampler|LP",
+ "LLava Advanced [LP]",
+ "LLava Clip Loader [LP]",
+ "LLava Loader [LP]",
+ "LLava Sampler Advanced [LP]",
+ "LLava Sampler Simple [LP]",
+ "LLava Simple [LP]",
+ "LLavaAdvanced|LP",
+ "LLavaClipLoader|LP",
+ "LLavaLoader|LP",
+ "LLavaSamplerAdvanced|LP",
+ "LLavaSamplerSimple|LP",
+ "LLavaSimple|LP",
+ "Multimodal Generator Advanced [LP]",
+ "MultimodalGeneratorAdvanced|LP",
+ "Recognize Anything (RAM) [LP]",
+ "RecognizeAnything(RAM)|LP"
+ ],
+ {
+ "title_aux": "ComfyUI Level Pixel Advanced"
+ }
+ ],
+ "https://github.com/Lex-DRL/ComfyUI-BestResolution": [
+ [
+ "BestResolutionFromArea",
+ "BestResolutionFromAreaUpscale",
+ "BestResolutionFromAspectRatio",
+ "BestResolutionPrimCropPadStrategy",
+ "BestResolutionPrimResPriority",
+ "BestResolutionScale",
+ "BestResolutionSimple",
+ "BestResolutionUpscaledCropPad",
+ "ImageUpscaleByWithModel"
+ ],
+ {
+ "title_aux": "Best Resolution"
+ }
+ ],
+ "https://github.com/Lex-DRL/ComfyUI-StringConstructor": [
+ [
+ "StringConstructorDictAddAny",
+ "StringConstructorDictAddString",
+ "StringConstructorDictExtractString",
+ "StringConstructorDictFromText",
+ "StringConstructorDictPreview",
+ "StringConstructorFormatter",
+ "StringConstructorValidateKeys"
+ ],
+ {
+ "title_aux": "String Constructor (Text-Formatting)"
+ }
+ ],
+ "https://github.com/Lhyejin/ComfyUI-Fill-Image-for-Outpainting": [
+ [
+ "FillImageForOutpainting"
+ ],
+ {
+ "title_aux": "ComfyUI-Fill-Image-for-Outpainting"
+ }
+ ],
+ "https://github.com/LiJT/ComfyUI-Gemini-Prompt-Generator-JT": [
+ [
+ "GeminiPromptGeneratorJT"
+ ],
+ {
+ "title_aux": "Gemini prompt generator JT version"
+ }
+ ],
+ "https://github.com/Light-x02/ComfyUI-Civitai-Discovery-Hub": [
+ [
+ "CivitaiDiscoveryHubNode",
+ "ClearLoraName"
+ ],
+ {
+ "title_aux": "ComfyUI-Civitai-Discovery-Hub"
+ }
+ ],
+ "https://github.com/Light-x02/ComfyUI-FluxSettingsNode": [
+ [
+ "DisableNoise",
+ "FluxSettingsNode"
+ ],
+ {
+ "title_aux": "Flux Settings Node"
+ }
+ ],
+ "https://github.com/Light-x02/ComfyUI-Lightx02-Nodes": [
+ [
+ "FluxPipeUnpack",
+ "FluxSettingsPipe",
+ "ImageMetadataLoader",
+ "ImageMetadataSaver",
+ "LMMExtractPromptsNode",
+ "LatentSettings",
+ "Loraloadertotext",
+ "PipeHub",
+ "PreviewMask",
+ "UniversalLatentSettings",
+ "cropImage"
+ ],
+ {
+ "title_aux": "Light-x02 Nodes"
+ }
+ ],
+ "https://github.com/Light-x02/ComfyUI-checkpoint-Discovery-Hub": [
+ [
+ "CheckpointDiscoveryHub"
+ ],
+ {
+ "title_aux": "ComfyUI-checkpoint-Discovery-Hub"
+ }
+ ],
+ "https://github.com/LightSketch-ai/ComfyUI-LivePortraitNode": [
+ [
+ "LightSketch Live Portrait",
+ "Preview Video"
+ ],
+ {
+ "title_aux": "ComfyUI-LivePortraitNode (Replicate API)"
+ }
+ ],
+ "https://github.com/Lightricks/ComfyUI-LTXVideo": [
+ [
+ "AddLatentGuide",
+ "DynamicConditioning",
+ "GemmaAPITextEncode",
+ "GuiderParameters",
+ "ImageToCPU",
+ "LTXAddImageGuide",
+ "LTXAddVideoICLoRAGuide",
+ "LTXAttentioOverride",
+ "LTXAttentionBank",
+ "LTXAttnOverride",
+ "LTXFetaEnhance",
+ "LTXFlowEditCFGGuider",
+ "LTXFlowEditSampler",
+ "LTXForwardModelSamplingPred",
+ "LTXICLoRALoaderModelOnly",
+ "LTXPerturbedAttention",
+ "LTXPrepareAttnInjections",
+ "LTXQ8Patch",
+ "LTXRFForwardODESampler",
+ "LTXRFReverseODESampler",
+ "LTXReverseModelSamplingPred",
+ "LTXVAdainLatent",
+ "LTXVAddGuideAdvanced",
+ "LTXVAddLatentGuide",
+ "LTXVApplySTG",
+ "LTXVBaseSampler",
+ "LTXVExtendSampler",
+ "LTXVGemmaCLIPModelLoader",
+ "LTXVGemmaEnhancePrompt",
+ "LTXVImgToVideoConditionOnly",
+ "LTXVInContextSampler",
+ "LTXVLinearOverlapLatentTransition",
+ "LTXVLoadConditioning",
+ "LTXVLoopingSampler",
+ "LTXVMultiPromptProvider",
+ "LTXVNormalizingSampler",
+ "LTXVPatcherVAE",
+ "LTXVPerStepAdainPatcher",
+ "LTXVPerStepStatNormPatcher",
+ "LTXVPreprocessMasks",
+ "LTXVPromptEnhancer",
+ "LTXVPromptEnhancerLoader",
+ "LTXVQ8LoraModelLoader",
+ "LTXVSaveConditioning",
+ "LTXVSelectLatents",
+ "LTXVSetVideoLatentNoiseMasks",
+ "LTXVStatNormLatent",
+ "LTXVTiledSampler",
+ "LTXVTiledVAEDecode",
+ "LowVRAMAudioVAELoader",
+ "LowVRAMCheckpointLoader",
+ "LowVRAMLatentUpscaleModelLoader",
+ "ModifyLTXModel",
+ "MultimodalGuider",
+ "STGAdvancedPresets",
+ "STGGuiderAdvanced",
+ "STGGuiderNode",
+ "Set VAE Decoder Noise"
+ ],
+ {
+ "title_aux": "ComfyUI-LTXVideo"
+ }
+ ],
+ "https://github.com/Limbicnation/ComfyUI-PromptGenerator": [
+ [
+ "PromptGenerator",
+ "StyleApplier"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptGenerator"
+ }
+ ],
+ "https://github.com/Limbicnation/ComfyUI-RandomSeedGenerator": [
+ [
+ "AdvancedSeedGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-RandomSeedGenerator"
+ }
+ ],
+ "https://github.com/Limbicnation/ComfyUI-TransparencyBackgroundRemover": [
+ [
+ "AutoGrabCutRemover",
+ "GrabCutRefinement",
+ "TransparencyBackgroundRemover",
+ "TransparencyBackgroundRemoverBatch"
+ ],
+ {
+ "title_aux": "Transparency Background Remover"
+ }
+ ],
+ "https://github.com/Limbicnation/ComfyUIDepthEstimation": [
+ [
+ "DepthEstimationNode"
+ ],
+ {
+ "title_aux": "Depth Estimation Node"
+ }
+ ],
+ "https://github.com/Limbicnation/ComfyUI_FaceDetectionNode": [
+ [
+ "FaceDetectionNode",
+ "custom_nodes"
+ ],
+ {
+ "nodename_pattern": "FaceDetectionNode",
+ "title_aux": "ComfyUI Face Detection Node"
+ }
+ ],
+ "https://github.com/Limitex/ComfyUI-Calculation": [
+ [
+ "CenterCalculation",
+ "CreateQRCode"
+ ],
+ {
+ "title_aux": "ComfyUI-Calculation"
+ }
+ ],
+ "https://github.com/Limitex/ComfyUI-Diffusers": [
+ [
+ "CreateIntListNode",
+ "DiffusersClipTextEncode",
+ "DiffusersModelMakeup",
+ "DiffusersPipelineLoader",
+ "DiffusersSampler",
+ "DiffusersSchedulerLoader",
+ "DiffusersVaeLoader",
+ "LcmLoraLoader",
+ "StreamDiffusionCreateStream",
+ "StreamDiffusionFastSampler",
+ "StreamDiffusionSampler",
+ "StreamDiffusionWarmup"
+ ],
+ {
+ "title_aux": "ComfyUI-Diffusers"
+ }
+ ],
+ "https://github.com/Ling-APE/ComfyUI-PixelResolutionCalculator": [
+ [
+ "LatentSizeToPixelSize",
+ "PixelResolutionCalculator"
+ ],
+ {
+ "title_aux": "ComfyUI-PixelResolutionCalculator"
+ }
+ ],
+ "https://github.com/LingSss9/comfyui-merge": [
+ [
+ "LoadLoRAMenu",
+ "MergeLoRAsKohyaSSLike",
+ "OnlyLoadLoRAsModel",
+ "SaveLoRAModels"
+ ],
+ {
+ "author": "cyberblackcat",
+ "description": "This extension provides some nodes to support merge lora, adjust Lora Block Weight.",
+ "nickname": "CBC",
+ "title": "merge",
+ "title_aux": "comfyui-merge"
+ }
+ ],
+ "https://github.com/Loewen-Hob/rembg-comfyui-node-better": [
+ [
+ "Image Remove Background (rembg)"
+ ],
+ {
+ "title_aux": "Rembg Background Removal Node for ComfyUI (Better)"
+ }
+ ],
+ "https://github.com/LonicaMewinsky/ComfyUI-MakeFrame": [
+ [
+ "BreakFrames",
+ "BreakGrid",
+ "GetKeyFrames",
+ "MakeGrid",
+ "RandomImageFromDir"
+ ],
+ {
+ "title_aux": "ComfyBreakAnim"
+ }
+ ],
+ "https://github.com/LonicaMewinsky/ComfyUI-RawSaver": [
+ [
+ "SaveTifImage"
+ ],
+ {
+ "title_aux": "ComfyUI-RawSaver"
+ }
+ ],
+ "https://github.com/LoveEatCandy/COMFYUI-ReplacePartOfImage": [
+ [
+ "ReplacePartOfImage"
+ ],
+ {
+ "title_aux": "COMFYUI-ReplacePartOfImage"
+ }
+ ],
+ "https://github.com/Lovzu/ComfyUI-KittenTTS": [
+ [
+ "KittenTTS"
+ ],
+ {
+ "title_aux": "KittenTTS Node for Voice Generation"
+ }
+ ],
+ "https://github.com/Ltamann/ComfyUI-FastVLM-7B": [
+ [
+ "FastVLM7BNode"
+ ],
+ {
+ "title_aux": "FastVLM-7B ComfyUI Node"
+ }
+ ],
+ "https://github.com/Ltamann/ComfyUI-TBG-ETUR": [
+ [
+ "ApplyRegionalConds",
+ "ConfigureModifiedFlux",
+ "CreateRegionalCond",
+ "EdgePadNode",
+ "FlowEditForwardSampler",
+ "FlowEditGuider",
+ "FlowEditReverseSampler",
+ "FlowEditSampler",
+ "FluxAttnOverride",
+ "FluxDeGuidance",
+ "FluxForwardODESampler",
+ "FluxInverseSampler",
+ "FluxKontextResolution",
+ "FluxNoiseMixer",
+ "FluxReverseODESampler",
+ "ImageComplexityMap",
+ "InFluxFlipSigmas",
+ "InFluxModelSamplingPred",
+ "IncrementBatch",
+ "MaskConditionalPaint",
+ "MaskGrayValueScaler",
+ "MaskMultiplyAdvanced",
+ "MaskMultiplyZeroWins",
+ "MaskToDenoiseInterpolator",
+ "MaskUpdateInpaintFromConditioning",
+ "OutFluxModelSamplingPred",
+ "PAGAttention",
+ "PrepareAttnBank",
+ "QwenEditResolution",
+ "RFDoubleBlocksOverride",
+ "RFSingleBlocksOverride",
+ "RegionalStyleModelApply",
+ "SEGAttention",
+ "TBG_masked_attention"
+ ],
+ {
+ "title_aux": "TBG_Enhanced Tiled Upscaler & Refiner FLUX PRO"
+ }
+ ],
+ "https://github.com/Ltamann/ComfyUI-TBG-SAM3": [
+ [
+ "TBGLoadSAM3Model",
+ "TBGSAM3DepthMap",
+ "TBGSAM3ModelLoaderAdvanced",
+ "TBGSAM3PromptCollector",
+ "TBGSam3Segmentation",
+ "TBGSam3SegmentationBatch"
+ ],
+ {
+ "title_aux": "ComfyUI-TBG-SAM3"
+ }
+ ],
+ "https://github.com/Ltamann/ComfyUI-TBG-Takeaways": [
+ [
+ "BasicSchedulerNormalized",
+ "FLUX2JSONPromptGenerator",
+ "HexConeDenoiseMask",
+ "LogSigmaSamplerNode",
+ "LogSigmaStepSamplerNode",
+ "ModelSamplingFluxGradual",
+ "PolyExponentialSigmaAdder",
+ "PromptBatchGenerator",
+ "TBGDifferenceMask",
+ "TBGDualModelSampler",
+ "TBGKSamplerAdvancedSplitAware",
+ "TBG_FluxKontextStabilizer",
+ "TBG_Preview_Sender_WebSocked",
+ "VAEDecodeColorFix"
+ ],
+ {
+ "title_aux": "TBG\u2019s ComfyUI Development Takeaways"
+ }
+ ],
+ "https://github.com/LucipherDev/ComfyUI-AniDoc": [
+ [
+ "AniDocLoader",
+ "AniDocSampler",
+ "GetAniDocControlnetImages",
+ "LoadCoTracker"
+ ],
+ {
+ "title_aux": "ComfyUI-AniDoc"
+ }
+ ],
+ "https://github.com/LucipherDev/ComfyUI-Golden-Noise": [
+ [
+ "GoldenNoise"
+ ],
+ {
+ "title_aux": "ComfyUI-Golden-Noise"
+ }
+ ],
+ "https://github.com/LucipherDev/ComfyUI-TangoFlux": [
+ [
+ "TangoFluxLoader",
+ "TangoFluxSampler",
+ "TangoFluxVAEDecodeAndPlay"
+ ],
+ {
+ "title_aux": "ComfyUI-TangoFlux"
+ }
+ ],
+ "https://github.com/Ludobico/ComfyUI-ScenarioPrompt": [
+ [
+ "ScenarioPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-ScenarioPrompt"
+ }
+ ],
+ "https://github.com/LukeCoulson1/Comfyui_LoraCombine": [
+ [
+ "CombineLoras",
+ "LoraInfo"
+ ],
+ {
+ "title_aux": "ComfyUI LoRA Combine Node"
+ }
+ ],
+ "https://github.com/LuqP2/ImageMetaHub-ComfyUI-Save": [
+ [
+ "MetaHubSaveNode",
+ "MetaHubSaveVideoNode",
+ "MetaHubTimerNode"
+ ],
+ {
+ "title_aux": "Image MetaHub Save Node"
+ }
+ ],
+ "https://github.com/LyazS/comfyui-anime-seg": [
+ [
+ "Anime Character Seg"
+ ],
+ {
+ "title_aux": "Anime Character Segmentation node for comfyui"
+ }
+ ],
+ "https://github.com/LyazS/comfyui-nettools": [
+ [
+ "NTL_LoadImagesBase64",
+ "NTL_SendImagesWebSocket"
+ ],
+ {
+ "title_aux": "net tool node for comfyui"
+ }
+ ],
+ "https://github.com/Lysthan/ComfyUI-LYSTHAN-PPS": [
+ [
+ "LYSTHAN_PPS"
+ ],
+ {
+ "title_aux": "ComfyUI-LYSTHAN-PPS"
+ }
+ ],
+ "https://github.com/M1kep/ComfyLiterals": [
+ [
+ "Checkpoint",
+ "Float",
+ "Int",
+ "KepStringLiteral",
+ "Lora",
+ "Operation",
+ "String"
+ ],
+ {
+ "title_aux": "ComfyLiterals"
+ }
+ ],
+ "https://github.com/M1kep/ComfyUI-KepOpenAI": [
+ [
+ "KepOpenAI_ImageWithPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-KepOpenAI"
+ }
+ ],
+ "https://github.com/M1kep/ComfyUI-OtherVAEs": [
+ [
+ "OtherVAE_Taesd"
+ ],
+ {
+ "title_aux": "ComfyUI-OtherVAEs"
+ }
+ ],
+ "https://github.com/M1kep/Comfy_KepKitchenSink": [
+ [
+ "KepRotateImage"
+ ],
+ {
+ "title_aux": "Comfy_KepKitchenSink"
+ }
+ ],
+ "https://github.com/M1kep/Comfy_KepListStuff": [
+ [
+ "Empty Images",
+ "Image Overlay",
+ "ImageListLoader",
+ "Join Float Lists",
+ "Join Image Lists",
+ "KepStringList",
+ "KepStringListFromNewline",
+ "Kep_JoinListAny",
+ "Kep_RepeatList",
+ "Kep_ReverseList",
+ "Kep_VariableImageBuilder",
+ "List Length",
+ "Range(Num Steps) - Float",
+ "Range(Num Steps) - Int",
+ "Range(Step) - Float",
+ "Range(Step) - Int",
+ "Stack Images",
+ "XYAny",
+ "XYImage"
+ ],
+ {
+ "title_aux": "Comfy_KepListStuff"
+ }
+ ],
+ "https://github.com/M1kep/Comfy_KepMatteAnything": [
+ [
+ "MatteAnything_DinoBoxes",
+ "MatteAnything_GenerateVITMatte",
+ "MatteAnything_InitSamPredictor",
+ "MatteAnything_LoadDINO",
+ "MatteAnything_LoadVITMatteModel",
+ "MatteAnything_SAMLoader",
+ "MatteAnything_SAMMaskFromBoxes",
+ "MatteAnything_ToTrimap"
+ ],
+ {
+ "title_aux": "Comfy_KepMatteAnything"
+ }
+ ],
+ "https://github.com/M1kep/KepPromptLang": [
+ [
+ "Build Gif",
+ "Special CLIP Loader"
+ ],
+ {
+ "title_aux": "KepPromptLang"
+ }
+ ],
+ "https://github.com/MDMAchine/ComfyUI_MD_Nodes": [
+ [
+ "ACE_LatentVisualizer",
+ "APGGuiderForked",
+ "AceT5ConditioningAnalyzer",
+ "AceT5ConditioningScheduled",
+ "AceT5ModelLoader",
+ "AdvancedAudioPreviewAndSave",
+ "AdvancedMediaSave",
+ "AdvancedTextNode",
+ "Aesthetic_Transformer_Node_MD",
+ "AutoLayoutOptimizer",
+ "EnhancedAnnotationNode",
+ "EnhancedSeedSaver",
+ "FilenameCounterNode",
+ "FilenameTokenReplacer",
+ "GPUTemperatureProtectionEnhanced",
+ "HybridAdaptiveSigmas",
+ "LLMVRAMManager",
+ "MD_ApplyTPG",
+ "MD_AudioAutoEQ",
+ "MD_AutoMasterNode",
+ "MD_CLIPTokenFinder",
+ "MD_CustomNoiseGenerator",
+ "MD_EmptyLatentRatioSelector",
+ "MD_GlobalUpdateManager",
+ "MD_InitNoiseOptimizer",
+ "MD_Mastering_Compressor",
+ "MD_Mastering_EQ",
+ "MD_Mastering_Gain",
+ "MD_Mastering_Limiter",
+ "MD_MultiNoiseBlender",
+ "MD_OptimizerSelector",
+ "MD_Qwen_Image_Edit_Object_Replacer_Node",
+ "MD_RepoMaintenance",
+ "MD_SamplerDebug",
+ "MD_SelfCrossGuider",
+ "MD_WorkflowContextBus",
+ "MasteringChainNode",
+ "NoiseDecayScheduler_Custom",
+ "PingPongSamplerNodeFBG",
+ "PingPongSampler_Custom_Lite",
+ "SceneGeniusAutocreator",
+ "SigmaConcatenate",
+ "SigmaSmooth",
+ "SmartColorPaletteManager",
+ "SmartFilenameBuilder",
+ "TextFileLoader",
+ "UniversalGuardian",
+ "UniversalRoutingHubAdvanced",
+ "VLM_Confirmation_Gate_Node_MD",
+ "WildcardPromptBuilder",
+ "WorkflowSectionOrganizer"
+ ],
+ {
+ "title_aux": "MD Nodes"
+ }
+ ],
+ "https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": [
+ [
+ "AudioVisualizer",
+ "ColorfulStartingImage",
+ "LiteralBool",
+ "LiteralFloat",
+ "LiteralInt",
+ "LiteralString",
+ "LoadImageAdvanced",
+ "LoadImagesFromPath",
+ "LoadRandomCheckpoint",
+ "LoraTagLoader",
+ "PromptPropertyExtractor",
+ "RandomBool",
+ "RandomColor",
+ "RandomFloatInRange",
+ "RandomIntInRange",
+ "RandomSeed",
+ "RandomString",
+ "ResolutionSelector",
+ "StringCleaning",
+ "StringConcat",
+ "StringTextExtractor",
+ "StringTextSplitter",
+ "TiktokenTokenizer",
+ "WildcardProcessor",
+ "\u2699\ufe0f Prompt Property Extractor",
+ "\u26d4 Generate Negative Prompt",
+ "\u2702\ufe0f String Text Extractor",
+ "\u2702\ufe0f String Text Splitter",
+ "\u270f\ufe0f Literal Bool",
+ "\u270f\ufe0f Literal Float",
+ "\u270f\ufe0f Literal Int",
+ "\u270f\ufe0f Literal String",
+ "\u2728\ud83d\udcac Groq LLM API",
+ "\u2728\ud83d\udcdd Groq ALM API - Transcribe",
+ "\u2728\ud83d\udcf7 Groq VLM API",
+ "\ud83c\udfa8 Colorful Starting Image",
+ "\ud83c\udfb2 Load Random Checkpoint",
+ "\ud83c\udfb2 Random Bool",
+ "\ud83c\udfb2 Random Color",
+ "\ud83c\udfb2 Random Float in Range",
+ "\ud83c\udfb2 Random Int in Range",
+ "\ud83c\udfb2 Random Seed",
+ "\ud83c\udfb2 Random String",
+ "\ud83c\udfb5\ud83d\udcca Audio Visualizer",
+ "\ud83c\udff7\ufe0f LoRA Loader Prompt Tags",
+ "\ud83d\udcbe Save Text File With Path",
+ "\ud83d\udcc1 Get File Path",
+ "\ud83d\udcc2 Load Images From Path",
+ "\ud83d\udcc5 Format Date Time",
+ "\ud83d\udcd0 Resolution Image Size Selector",
+ "\ud83d\udcdd Wildcard Processor",
+ "\ud83d\udd17 String Concat / Append",
+ "\ud83d\udd20 Tiktoken Tokenizer Info",
+ "\ud83d\uddbc\ufe0f Download Image from URL",
+ "\ud83d\uddbc\ufe0f Load Image Advanced",
+ "\ud83d\uddbc\ufe0f+\ud83d\udcdd Load Text-Image Pair (Single)",
+ "\ud83d\uddbc\ufe0f+\ud83d\udcdd Load Text-Image Pairs (List)",
+ "\ud83d\uddbc\ufe0f\ud83d\udcca Metadata Extractor (List)",
+ "\ud83d\uddbc\ufe0f\ud83d\udcca Metadata Extractor (Single)",
+ "\ud83e\uddf9 String Cleaning"
+ ],
+ {
+ "title_aux": "ComfyUI-mnemic-nodes"
+ }
+ ],
+ "https://github.com/Maenvaeru/comfyui-vram-overlay": [
+ [
+ "MVU_VramOverlay"
+ ],
+ {
+ "title_aux": "comfyui-vram-overlay"
+ }
+ ],
+ "https://github.com/MajoorWaldi/ComfyUI-Majoor-ImageOps": [
+ [
+ "ImageOpsBlur",
+ "ImageOpsClamp",
+ "ImageOpsColorAjust",
+ "ImageOpsInvert",
+ "ImageOpsMerge",
+ "ImageOpsPreview",
+ "ImageOpsTransform"
+ ],
+ {
+ "title_aux": "ComfyUI-Majoor-ImageOps"
+ }
+ ],
+ "https://github.com/Makeezi/ComfyUI-promptLAB": [
+ [
+ "PromptLAB"
+ ],
+ {
+ "title_aux": "ComfyUI-promptLAB"
+ }
+ ],
+ "https://github.com/MakkiShizu/ComfyUI-MakkiTools": [
+ [
+ "AnyImageStitch_makki",
+ "AnyImagetoConditioning_flux_kontext_makki",
+ "AutoLoop_create_pseudo_loop_video_makki",
+ "BatchLoraLoader_makki",
+ "BooleanSplitter_makki",
+ "Environment_INFO_makki",
+ "GetImageNthCount_makki",
+ "ImageChannelSeparate_makki",
+ "ImageCountConcatenate_makki",
+ "ImageHeigthStitch_makki",
+ "ImageTPSWarp_makki",
+ "ImageWidthStitch_makki",
+ "Image_Resize_makki",
+ "MergeImageChannels_makki",
+ "Prism_Mirage_makki",
+ "UniversalInstaller_makki",
+ "get_folder_info_makki",
+ "int_calculate_statistics_makki",
+ "random_any_makki",
+ "show_type_makki",
+ "timer_makki",
+ "translator_m2m100_makki",
+ "translators_makki"
+ ],
+ {
+ "title_aux": "ComfyUI-MakkiTools"
+ }
+ ],
+ "https://github.com/MakkiShizu/ComfyUI-Prompt-Wildcards": [
+ [
+ "makitextwildcards",
+ "makiwildcards",
+ "makiwildcards_Advanced",
+ "textconcatenate",
+ "textconcatenate_v2"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Wildcards"
+ }
+ ],
+ "https://github.com/MakkiShizu/ComfyUI-Qwen2_5-VL": [
+ [
+ "BatchImageLoaderToLocalFiles",
+ "DownloadAndLoadQwen2_5_VLModel",
+ "Qwen2_5_VL_Run",
+ "Qwen2_5_VL_Run_Advanced"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen2_5-VL"
+ }
+ ],
+ "https://github.com/MakkiShizu/ComfyUI-animetimm": [
+ [
+ "AnimeTimmNode"
+ ],
+ {
+ "title_aux": "ComfyUI-animetimm"
+ }
+ ],
+ "https://github.com/MakkiShizu/comfyui_reimgsize": [
+ [
+ "Cropimg",
+ "Reimgsize",
+ "Resizebyratio"
+ ],
+ {
+ "title_aux": "comfyui_reimgsize"
+ }
+ ],
+ "https://github.com/Malte0621/hordeai-comfy": [
+ [
+ "AIHordeImageGenerate",
+ "AIHordeLora",
+ "AIHordeModelList",
+ "AIHordeTextualInversion"
+ ],
+ {
+ "title_aux": "HordeAI"
+ }
+ ],
+ "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes": [
+ [
+ "Image Remove Background (rembg)"
+ ],
+ {
+ "title_aux": "Batch Rembg for ComfyUI"
+ }
+ ],
+ "https://github.com/ManglerFTW/ComfyI2I": [
+ [
+ "Color Transfer",
+ "Combine and Paste",
+ "Inpaint Segments",
+ "Mask Ops"
+ ],
+ {
+ "author": "ManglerFTW",
+ "title": "ComfyI2I",
+ "title_aux": "ComfyI2I"
+ }
+ ],
+ "https://github.com/MarcusNyne/m9-prompts-comfyui": [
+ [
+ "ScramblePrompts_m9",
+ "TweakWeights_m9"
+ ],
+ {
+ "title_aux": "m9-prompts-comfyui"
+ }
+ ],
+ "https://github.com/MariusKM/ComfyUI-BadmanNodes": [
+ [
+ "BadmanBrightness",
+ "BadmanCLIPTextEncodeSDXLRegion",
+ "BadmanDesaturate",
+ "BadmanDilateErodeMask",
+ "BadmanIO",
+ "BadmanInjectLatentNoiseMasked",
+ "BadmanIntUtil",
+ "BadmanMaskBlur",
+ "BadmanSelectFromList",
+ "BadmanStringSelect",
+ "BadmanStringToInteger",
+ "BadmanWanOutpaintFrameCalculator",
+ "BadmanWanThreeFrameToVideo",
+ "BadmanWildCardProcessor",
+ "Badman_Blend",
+ "Badman_ColorTransferLab",
+ "Badman_Concat_String",
+ "Badman_HexGenerator",
+ "Badman_IO",
+ "Badman_PalletteGenerator",
+ "Badman_Print",
+ "Badman_String"
+ ],
+ {
+ "title_aux": "ComfyUI-BadmanNodes"
+ }
+ ],
+ "https://github.com/MarkoCa1/ComfyUI-Text": [
+ [
+ "CombinationText",
+ "PlaceholderText",
+ "ReplaceText",
+ "ShowText"
+ ],
+ {
+ "title_aux": "ComfyUI-Text"
+ }
+ ],
+ "https://github.com/MarkoCa1/ComfyUI_Segment_Mask": [
+ [
+ "AutomaticMask(segment anything)"
+ ],
+ {
+ "title_aux": "ComfyUI_Segment_Mask"
+ }
+ ],
+ "https://github.com/Marksusu/ComfyUI_MTCLIPEncode": [
+ [
+ "MTCLIPEncode"
+ ],
+ {
+ "title_aux": "ComfyUI_MTCLIPEncode"
+ }
+ ],
+ "https://github.com/Markus-Pasanen/batch_whisper_extension": [
+ [
+ "BatchWhisperNode"
+ ],
+ {
+ "title_aux": "batch_whisper_extension"
+ }
+ ],
+ "https://github.com/MartinDeanMoriarty/ComfyUI-DeanLogic": [
+ [
+ "ImageCount",
+ "ImageInputSwitch",
+ "ImageOutputSwitch",
+ "Int Compare"
+ ],
+ {
+ "title_aux": "ComfyUI-DeanLogic"
+ }
+ ],
+ "https://github.com/MartinDeanMoriarty/ComfyUI-NumberToText": [
+ [
+ "NumberToTextNode"
+ ],
+ {
+ "title_aux": "ComfyUI-NumberToText"
+ }
+ ],
+ "https://github.com/MaruPelkar/comfyui-conditioning-resizer": [
+ [
+ "ConditioningResizer"
+ ],
+ {
+ "title_aux": "ComfyUI Conditioning Resizer"
+ }
+ ],
+ "https://github.com/Mason-McGough/ComfyUI-Mosaica": [
+ [
+ "ApplyLUTToLabelImage",
+ "KMeans",
+ "LoadLUTFromMatplotlib",
+ "MeanShift",
+ "RandomLUT",
+ "Watershed"
+ ],
+ {
+ "title_aux": "Mosaica"
+ }
+ ],
+ "https://github.com/MasterDenis/VAE-Decode-Switch": [
+ [
+ "VAEDecodeSwitcher"
+ ],
+ {
+ "title_aux": "VAE Decode Switch for ComfyUI"
+ }
+ ],
+ "https://github.com/Mattabyte/ComfyUI-SecureApiCall": [
+ [
+ "SaveLatentToS3",
+ "SaveVideoFilesS3",
+ "SecureAPI-SecureAPI",
+ "SecureAPI-SecureAPI-AWS"
+ ],
+ {
+ "title_aux": "ComfyUI Secure API Call"
+ }
+ ],
+ "https://github.com/Maxed-Out-99/ComfyUI-MaxedOut": [
+ [
+ "CombineVideos_MXD",
+ "Crop Image By Mask",
+ "Dummy Node MXD",
+ "Flux 2 Empty Latent Image",
+ "Flux Empty Latent Image",
+ "Flux Image Scale To Total Pixels (Flux Safe)",
+ "Flux Resolution Selector",
+ "FluxResolutionMatcher",
+ "Frames_Remove_From_Start_MXD",
+ "Frames_Select_StartEnd_MXD",
+ "Get Latent Size",
+ "GroupVideoFramesMXD",
+ "Grow Blur Mask MXD",
+ "Image Scale To Total Pixels (SDXL Safe)",
+ "LatentHalfMasks",
+ "Load Image Batch MXD",
+ "LoadImageWithPromptsMXD",
+ "LoadLatent_I2V_MXD",
+ "LoadLatent_WithParams",
+ "LoadLatents_FromFolder_I2V_MXD",
+ "LoadLatents_FromFolder_WithParams",
+ "LoadVideoMXD",
+ "MxdImageComparerSave",
+ "Place Image By Mask",
+ "PreviewVideoMXD",
+ "Prompt With Guidance (Flux)",
+ "QwenImageEditSingleMXD",
+ "QwenImageEditTripleMXD",
+ "SDXLResolutionMatcher",
+ "Save Image MXD",
+ "SaveLatentMXD",
+ "SaveLatent_I2V_MXD",
+ "SaveVideoMXD",
+ "Sdxl Empty Latent Image",
+ "WAN22_I2V_Image_Scaler_MXD",
+ "Wan22FirstLastImageToVideoMXD",
+ "Wan22ImageToVideoMXD",
+ "Wan2_2EmptyLatentImageMXD",
+ "ZImageTurboEmptyLatentImage",
+ "wan22EmptyHunyuanLatentVideoMXD"
+ ],
+ {
+ "title_aux": "ComfyUI-MaxedOut"
+ }
+ ],
+ "https://github.com/Maxed-Out-99/ComfyUI-SmartModelLoaders-MXD": [
+ [
+ "CLIPLoaderUnified",
+ "DualCLIPLoaderUnified",
+ "QuadrupleCLIPLoaderUnified",
+ "TripleCLIPLoaderUnified",
+ "UNETLoaderUnified"
+ ],
+ {
+ "title_aux": "ComfyUI-SmartModelLoaders-MXD"
+ }
+ ],
+ "https://github.com/McKlinton2/comfyui-mcklinton-pack": [
+ [
+ "ColormaskNode",
+ "LoadFilteredImageBatch",
+ "MultiLayerComposeNode",
+ "SaveTextArrayToFiles"
+ ],
+ {
+ "title_aux": "ComfyUI McKlinton Pack \u2014 Mask Node"
+ }
+ ],
+ "https://github.com/Mcmillian/ComfyUI-SimpleToolsNodes": [
+ [
+ "GetModelStep",
+ "GlmPromptNode"
+ ],
+ {
+ "title_aux": "SimpleToolsNodes"
+ }
+ ],
+ "https://github.com/Me-gumin/MeComfyuiEncrypt": [
+ [
+ "ChaosDecrypt",
+ "ChaosEncrypt",
+ "PNGDecryptNode",
+ "PNGEncryptNode"
+ ],
+ {
+ "title_aux": "MeComfyuiEncrypt"
+ }
+ ],
+ "https://github.com/MeeeyoAI/ComfyUI_StringOps": [
+ [
+ "AddPrefixSuffix",
+ "AddPrefixSuffixToLines",
+ "BatchReplaceStrings",
+ "CheckSubstringPresence",
+ "CompareInt",
+ "ConditionalTextOutput",
+ "CountOccurrences",
+ "CustomCrop",
+ "DecodePreview",
+ "ExtractAndCombineLines",
+ "ExtractBeforeAfter",
+ "ExtractLinesByIndex",
+ "ExtractSpecificData",
+ "ExtractSpecificLines",
+ "ExtractSubstring",
+ "ExtractSubstringByIndices",
+ "FileCopyCutNode",
+ "FileDeleteNode",
+ "FileListAndSuffix",
+ "FileNameReplacer",
+ "FilterLinesBySubstrings",
+ "FilterLinesByWordCount",
+ "FindExcelData",
+ "FindFirstLineContent",
+ "FloatToInteger",
+ "GenerateNumbers",
+ "GenerateVideoPrompt",
+ "GenericImageLoader",
+ "GetCurrentTime",
+ "GetFloatParam",
+ "GetIntParam",
+ "GetRandomIntegerInRange",
+ "ImageAdjuster",
+ "ImageOverlayAlignment",
+ "LoadAndAdjustImage",
+ "MultiParamInputNode",
+ "NumberExtractor",
+ "ProcessString",
+ "RandomLineFromText",
+ "ReadExcelData",
+ "ReadExcelRowOrColumnDiff",
+ "ReadWebNode",
+ "RemoveContentBetweenChars",
+ "ReplaceMultiple",
+ "ReplaceNthOccurrence",
+ "SaveImagEX",
+ "SelectionParameter",
+ "ShuffleTextLines",
+ "SimpleRandomSeed",
+ "SimpleTextReplacer",
+ "SingleTextInput",
+ "SplitAndExtractText",
+ "SplitStringByDelimiter",
+ "TextConcatenation",
+ "TextConcatenator",
+ "TextConditionCheck",
+ "TextToImage",
+ "TextToList",
+ "WriteExcelData",
+ "WriteExcelImage",
+ "WriteToTxtFile"
+ ],
+ {
+ "title_aux": "ComfyUI_StringOps"
+ }
+ ],
+ "https://github.com/Meettya/ComfyUI-OneForOne": [
+ [
+ "OFO Image Fit"
+ ],
+ {
+ "title_aux": "ComfyUI-OneForOne"
+ }
+ ],
+ "https://github.com/Meisoftcoltd/ComfyUI-Demucs-AudioSeparator": [
+ [
+ "DemucsAudioSeparator"
+ ],
+ {
+ "title_aux": "ComfyUI-Demucs-AudioSeparator"
+ }
+ ],
+ "https://github.com/Meisoftcoltd/comfyui-sequential-batcher": [
+ [
+ "CombineJobs",
+ "EnumerateJob",
+ "GetJobStep",
+ "JobToList",
+ "MakeJob"
+ ],
+ {
+ "title_aux": "comfyui-sequential-batcher"
+ }
+ ],
+ "https://github.com/MergeBlockWeighted/fo_ComfyUI": [
+ [
+ "MergeBlockWeighted"
+ ],
+ {}
+ ],
+ "https://github.com/Merserk/ComfyUI-Flow-Assistor": [
+ [
+ "AddDelay",
+ "AnyPassthrough1to6",
+ "AnyPassthrough6to1",
+ "BypassControl",
+ "CLIPTextEncodePromptEnrichment",
+ "CameraAngleControl",
+ "DetailEnhanceSamplerNode",
+ "DetailEnhanceSigmasNode",
+ "DisplayText",
+ "ImageLatentResolutionExtractorNode",
+ "ImageResolutionExtractorNode",
+ "ImageResolutionFitNode",
+ "LoRAOnlineNode",
+ "MultiplicationNode",
+ "OutputAnyDebugDataNode",
+ "PromptQueue",
+ "PromptQueueFromFolder",
+ "ResolutionSelectNode",
+ "TileCompositor",
+ "TileManager",
+ "UltimateDetailSamplerNode",
+ "UltimateDetailSigmasNode",
+ "VRAMRAMCleanerNode",
+ "VisualMarqueeSelection"
+ ],
+ {
+ "title_aux": "ComfyUI-Flow-Assistor"
+ }
+ ],
+ "https://github.com/MetaGLM/ComfyUI-ZhipuAI-Platform": [
+ [
+ "VideoReportData",
+ "VideoReportGenerate",
+ "VideoReportPull"
+ ],
+ {
+ "title_aux": "ComfyUI ZhipuAI Platform"
+ }
+ ],
+ "https://github.com/Mexes1978/comfyui-comfysketch": [
+ [
+ "ComfySketch"
+ ],
+ {
+ "title_aux": "comfyui-comfysketch"
+ }
+ ],
+ "https://github.com/MichaelMaxAgent/comfyui_ML_nodes": [
+ [
+ "MLFrameRateResampler",
+ "MLFrameRateResampler_GPU",
+ "MLVideoRateConverter",
+ "RemovePoseHead",
+ "SaveImageCleanMetadata",
+ "SaveImageNoMetadata",
+ "SaveVideoNoMetadata"
+ ],
+ {
+ "title_aux": "ComfyUI ML Nodes"
+ }
+ ],
+ "https://github.com/MicheleGuidi/ComfyUI-Contextual-SAM2": [
+ [
+ "Sam2ContextSegmentation",
+ "Sam2TiledSegmentation"
+ ],
+ {
+ "title_aux": "ComfyUI-Computer-Vision"
+ }
+ ],
+ "https://github.com/MiddleKD/ComfyUI-denoise-mask-scheduler": [
+ [
+ "ApplyDenoiseMaskSchedulerWithSigma",
+ "ApplyDenoiseMaskSchedulerWithStep",
+ "DynamicImageResize"
+ ],
+ {
+ "title_aux": "ComfyUI-denoise-mask-scheduler"
+ }
+ ],
+ "https://github.com/MiddleKD/ComfyUI-mem-safe-wrapper": [
+ [
+ "MakeModelMemorySafe-safewrapper",
+ "ResetModelPatcher-safewrapper",
+ "SimpleDummyModel-safewrapper",
+ "SimpleDummyRun-safewrapper"
+ ],
+ {
+ "title_aux": "ComfyUI-mem-safe-wrapper"
+ }
+ ],
+ "https://github.com/MiddleKD/ComfyUI-productfix": [
+ [
+ "ApplyLatentInjection",
+ "DetailTransferAdd",
+ "DetailTransferLatentAdd",
+ "DynamicImageResize",
+ "GetTextMask",
+ "ResetModelPatcherCalculateWeight",
+ "VQDecoder",
+ "VQEncoder",
+ "VQLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-productfix"
+ }
+ ],
+ "https://github.com/MijnSpam/ComfyUI_SwapAndScale": [
+ [
+ "SwapAndScale"
+ ],
+ {
+ "title_aux": "Comfy swap and scale"
+ }
+ ],
+ "https://github.com/MijnSpam/UploadToPushOver": [
+ [
+ "UploadToPushOver"
+ ],
+ {
+ "title_aux": "Upload to PushOver"
+ }
+ ],
+ "https://github.com/MilitantHitchhiker/MilitantHitchhiker-SwitchbladePack": [
+ [
+ "ARC Scheduler",
+ "FluxModelSave_v2",
+ "FluxQuantNode",
+ "GOD Sampler (Advanced)",
+ "GOD Sampler (Advanced) Ext.",
+ "GOD Scheduler (Advanced)",
+ "GroqAPIPromptEnhancer",
+ "IntegratedRandomPromptGenerator",
+ "ModelAnalyserNode",
+ "ODE-EMA Sampler",
+ "TextAppender_v2"
+ ],
+ {
+ "author": "Militant Hitchhiker",
+ "description": "Militant Hitchhiker's multi-function nodes.",
+ "nickname": "Switchblade",
+ "title": "Switchblade Pack",
+ "title_aux": "MilitantHitchhiker-SwitchbladePack"
+ }
+ ],
+ "https://github.com/MilleN2ium/ComfyUI-CutomizableSave": [
+ [
+ "MyOtherNode"
+ ],
+ {
+ "title_aux": "ComfyUI-CutomizableSave"
+ }
+ ],
+ "https://github.com/Mintbeer96/ComfyUI-KerasOCR": [
+ [
+ "KerasOCR"
+ ],
+ {
+ "title_aux": "ComfyUI-KerasOCR"
+ }
+ ],
+ "https://github.com/MinusZoneAI/ComfyUI-CogVideoX-MZ": [
+ [
+ "MZ_CogVideoXLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-CogVideoX-MZ"
+ }
+ ],
+ "https://github.com/MinusZoneAI/ComfyUI-Flux1Quantize-MZ": [
+ [
+ "MZ_Flux1QuantizeUNETLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Flux1Quantize-MZ"
+ }
+ ],
+ "https://github.com/MinusZoneAI/ComfyUI-FluxExt-MZ": [
+ [
+ "MZ_Flux1CheckpointLoaderNF4_cpuDynOffload",
+ "MZ_Flux1CheckpointLoader_cpuDynOffload",
+ "MZ_Flux1PartialLoad_Patch",
+ "MZ_Flux1UnetLoader_cpuDynOffload"
+ ],
+ {
+ "title_aux": "ComfyUI-FluxExt-MZ"
+ }
+ ],
+ "https://github.com/MinusZoneAI/ComfyUI-Kolors-MZ": [
+ [
+ "MZ_ApplyCUDAGenerator",
+ "MZ_ApplySDXLSamplingSettings",
+ "MZ_ChatGLM3",
+ "MZ_ChatGLM3Embeds2Conditioning",
+ "MZ_ChatGLM3Loader",
+ "MZ_ChatGLM3_Advance_V2",
+ "MZ_ChatGLM3_V2",
+ "MZ_FakeCond",
+ "MZ_IPAdapterAdvancedKolors",
+ "MZ_IPAdapterFaceID",
+ "MZ_IPAdapterInsightFaceLoader",
+ "MZ_IPAdapterModelLoaderKolors",
+ "MZ_KolorsCLIPVisionLoader",
+ "MZ_KolorsCheckpointLoaderSimple",
+ "MZ_KolorsControlNetLoader",
+ "MZ_KolorsControlNetPatch",
+ "MZ_KolorsUNETLoader",
+ "MZ_KolorsUNETLoaderV2"
+ ],
+ {
+ "title_aux": "ComfyUI-Kolors-MZ"
+ }
+ ],
+ "https://github.com/MinusZoneAI/ComfyUI-Prompt-MZ": [
+ [
+ "MZ_BaseLLamaCPPCLIPTextEncode",
+ "MZ_BaseLLavaImageInterrogator",
+ "MZ_CustomizeInstruct",
+ "MZ_Florence2CLIPTextEncode",
+ "MZ_Florence2Captioner",
+ "MZ_ImageCaptionerConfig",
+ "MZ_ImageInterrogatorCLIPTextEncode",
+ "MZ_ImageInterrogatorModelConfig_DownloaderSelect",
+ "MZ_ImageInterrogatorModelConfig_ManualSelect",
+ "MZ_LLama3CLIPTextEncode",
+ "MZ_LLamaCPPCLIPTextEncode",
+ "MZ_LLamaCPPModelConfig_DownloaderSelect",
+ "MZ_LLamaCPPModelConfig_ManualSelect",
+ "MZ_LLamaCPPOptions",
+ "MZ_LLavaImageInterrogator",
+ "MZ_OllamaModelConfig_ManualSelect",
+ "MZ_OpenAIApiCLIPTextEncode",
+ "MZ_PaliGemmaCLIPTextEncode",
+ "MZ_PaliGemmaCaptioner",
+ "MZ_Phi3CLIPTextEncode"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-MZ"
+ }
+ ],
+ "https://github.com/MinusZoneAI/ComfyUI-StylizePhoto-MZ": [
+ [
+ "MZ_StylizePhotoControlNetApply",
+ "MZ_StylizePhotoKSamplerNode"
+ ],
+ {
+ "title_aux": "ComfyUI-StylizePhoto-MZ"
+ }
+ ],
+ "https://github.com/MinusZoneAI/ComfyUI-TrainTools-MZ": [
+ [
+ "MZ_HYDiTAdvConfig",
+ "MZ_HYDiTDatasetConfig",
+ "MZ_HYDiTInitWorkspace",
+ "MZ_HYDiTSimpleT2I",
+ "MZ_HYDiTTrain",
+ "MZ_ImagesCopyWorkspace",
+ "MZ_KohyaSSAdvConfig",
+ "MZ_KohyaSSControlnetTrain",
+ "MZ_KohyaSSDatasetConfig",
+ "MZ_KohyaSSInitWorkspace",
+ "MZ_KohyaSSLoraTrain",
+ "MZ_KohyaSSTrain",
+ "MZ_KohyaSSUseConfig",
+ "MZ_KohyaSS_KohakuBlueleaf_HYHiDInitWorkspace",
+ "MZ_KohyaSS_KohakuBlueleaf_HYHiDLoraTrain",
+ "MZ_KohyaSS_KohakuBlueleaf_HYHiDSimpleT2I",
+ "MZ_LoadImagesFromDirectoryPath",
+ "MZ_TrainToolsDebug"
+ ],
+ {
+ "title_aux": "ComfyUI-TrainTools-MZ"
+ }
+ ],
+ "https://github.com/Miosp/ComfyUI-FBCNN": [
+ [
+ "JPEG artifacts removal FBCNN"
+ ],
+ {
+ "title_aux": "ComfyUI-FBCNN"
+ }
+ ],
+ "https://github.com/Mister-Link/link-comfy-nodes": [
+ [
+ "Add Image to Batch",
+ "AdvancedStringConcat",
+ "Auto Cropper",
+ "BatchImageSave",
+ "Concat",
+ "ConvertToPixelArt",
+ "Crop to Content",
+ "Farthest Color",
+ "Fast Image Preview",
+ "Hex or 24 Bit Color",
+ "Image Rotator",
+ "Match Color Palette",
+ "Native Wan Pose Strength",
+ "Pixelation Dimensions",
+ "Pose Image Setup",
+ "PreviewAnimation",
+ "PreviewAsMarkdown",
+ "PreviewImageAlpha",
+ "Remove Background",
+ "ReplaceAlpha",
+ "Resize Image and Mask by Side",
+ "Save Folder as ZIP",
+ "Save To Zip",
+ "SaveFolderAsZip",
+ "Spritesheet Builder",
+ "Spritesheet Preview",
+ "Stabilizer Trim",
+ "Video Detailer",
+ "VideoMaskEditor",
+ "WAN Frame Calculator",
+ "WAN Frames to Add & Cut"
+ ],
+ {
+ "title_aux": "Link Comfy Nodes"
+ }
+ ],
+ "https://github.com/MitoshiroPJ/ComfyUI_save_image_sdli": [
+ [
+ "PreviewSdlImage",
+ "SaveSdlImage"
+ ],
+ {
+ "title_aux": "ComfyUI SaveImage SDLI"
+ }
+ ],
+ "https://github.com/MitoshiroPJ/comfyui_nearsighted_attention": [
+ [
+ "NearSightedAttention",
+ "NearSightedAttentionSimple",
+ "NearSightedTile",
+ "SlothfulAttention"
+ ],
+ {
+ "title_aux": "ComfyUI Nearsighted Attention"
+ }
+ ],
+ "https://github.com/Miyuutsu/comfyui-save-vpred": [
+ [
+ "CheckpointSaveVpred"
+ ],
+ {
+ "author": "miyuu",
+ "description": "Used to save SDXL V-Prediction models directly with correct tensors.",
+ "nickname": "vpred-save",
+ "title": "vpred-save",
+ "title_aux": "comfyui-save-vpred"
+ }
+ ],
+ "https://github.com/ModelTC/ComfyUI-LightVAE": [
+ [
+ "Lightx2v-VAEDecode",
+ "Lightx2v-VAEDecoderLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-LightVAE"
+ }
+ ],
+ "https://github.com/ModelTC/ComfyUI-Lightx2vWrapper": [
+ [
+ "LightX2VConfigCombiner",
+ "LightX2VConfigCombinerV2",
+ "LightX2VConfigCombinerV3",
+ "LightX2VInferenceConfig",
+ "LightX2VLoRALoader",
+ "LightX2VMemoryOptimization",
+ "LightX2VModularInference",
+ "LightX2VModularInferenceV2",
+ "LightX2VQuantization",
+ "LightX2VTalkObjectInput",
+ "LightX2VTalkObjectsCombiner",
+ "LightX2VTalkObjectsFromFiles",
+ "LightX2VTalkObjectsFromJSON",
+ "LightX2VTeaCache"
+ ],
+ {
+ "title_aux": "ComfyUI-Lightx2vWrapper"
+ }
+ ],
+ "https://github.com/Moeblack/ComfyUI-SimpleChat": [
+ [
+ "GeminiImageEdit",
+ "GeminiImageGen",
+ "SimpleChatAnimaPromptRouter",
+ "SimpleChatAnimaPromptXYMatrix",
+ "SimpleChatConfig",
+ "SimpleChatImage",
+ "SimpleChatImageGrid",
+ "SimpleChatJsonParse",
+ "SimpleChatJsonParse16",
+ "SimpleChatJsonToVars",
+ "SimpleChatMarkdownPreview",
+ "SimpleChatMustacheRender",
+ "SimpleChatMustacheVar",
+ "SimpleChatNoASS",
+ "SimpleChatPromptJsonUnpack",
+ "SimpleChatText",
+ "SimpleChatTextInput",
+ "SimpleChatTextList",
+ "SimpleChatXYCellPrefix",
+ "SimpleChatXYPlot"
+ ],
+ {
+ "title_aux": "ComfyUI-SimpleChat"
+ }
+ ],
+ "https://github.com/MohammadAboulEla/ComfyUI-iTools": [
+ [
+ "iToolsAddOverlay",
+ "iToolsCheckerBoard",
+ "iToolsCompareImage",
+ "iToolsCropImage",
+ "iToolsDomNode",
+ "iToolsFreeChat",
+ "iToolsFreeSchnell",
+ "iToolsGridFiller",
+ "iToolsKSampler",
+ "iToolsLineLoader",
+ "iToolsLoadImagePlus",
+ "iToolsLoadImages",
+ "iToolsLoadRandomImage",
+ "iToolsPaintNode",
+ "iToolsPreviewImage",
+ "iToolsPreviewText",
+ "iToolsPromptLoader",
+ "iToolsPromptRecord",
+ "iToolsPromptSaver",
+ "iToolsPromptStyler",
+ "iToolsPromptStylerExtra",
+ "iToolsRegexNode",
+ "iToolsTestNode",
+ "iToolsTextReplacer",
+ "iToolsVaePreview"
+ ],
+ {
+ "title_aux": "ComfyUI-iTools"
+ }
+ ],
+ "https://github.com/MokkaBoss1/ComfyUI_Mokkaboss1": [
+ [
+ "AnimeCosplayDir",
+ "AspectRatioCondition",
+ "ChooseImage",
+ "Colors",
+ "CombinedCrop",
+ "ConnectFloat",
+ "ConnectImage",
+ "ConnectInteger",
+ "ConnectInteger2",
+ "ConnectLatent",
+ "ConnectString",
+ "CycleInteger",
+ "DirSelector",
+ "DoubleClipTextEncode",
+ "DoubleConditioningMixer",
+ "EmbeddingLoader",
+ "FilmCharDir",
+ "FlexEmptyLatent",
+ "FloatEvaluate",
+ "FuseImages",
+ "FuseImages2",
+ "HashText",
+ "HueSatLum",
+ "HueShift",
+ "ImageDimensions",
+ "ImageDimensionsBatch",
+ "ImageOverlayResized",
+ "ImageResizeLong",
+ "ImageZigzag",
+ "IndoorBackgrounds",
+ "IndoorDir",
+ "IntEvaluate",
+ "IntFloatDict",
+ "IntStringDict",
+ "JsonSearch",
+ "KillWorkflow",
+ "LandscapeBackgrounds",
+ "LandscapeDir",
+ "LinEqEval",
+ "MakeupStylesDir",
+ "Mbsampler",
+ "OptimalCrop",
+ "Overlay",
+ "PhotomontageA",
+ "PhotomontageB",
+ "PhotomontageC",
+ "PostSamplerCrop",
+ "PresetLoad",
+ "PresetRemove",
+ "PresetSave",
+ "PromptSwitcher",
+ "QuadClipTextEncode",
+ "RandomString",
+ "SDXLEmptyLatent",
+ "SavePrompt",
+ "SaveWithMetaData",
+ "SaveWithMetaData2",
+ "SearchReplace",
+ "SimplePrompts",
+ "SpecificStylesDir",
+ "SplitImages",
+ "StringJoin",
+ "TimeStamp",
+ "TintnShift",
+ "TricolorComposition",
+ "WorkflowSettings",
+ "WrapText",
+ "X_In_a_Dress",
+ "X_In_a_Suit",
+ "X_In_a_Suit)",
+ "ZoomCrop",
+ "imageborder"
+ ],
+ {
+ "title_aux": "Node Pack mostly for manipulating strings and integers"
+ }
+ ],
+ "https://github.com/MontagenAI/ComfyUI-Montagen": [
+ [
+ "MontagenAudioAdapter",
+ "MontagenAudioConvertResourceAdapter",
+ "MontagenAudioListAdapter",
+ "MontagenCreateTimeline",
+ "MontagenEdgeTTSNode",
+ "MontagenFishAudioCloneNode",
+ "MontagenFishAudioTTSNode",
+ "MontagenHumandigitalNode",
+ "MontagenImageAdapter",
+ "MontagenImageListAdapter",
+ "MontagenRenderTimeline",
+ "MontagenResourceConvertAudioAdapter",
+ "MontagenSRTListParser",
+ "MontagenStickerAdapter",
+ "MontagenTextAdapter",
+ "MontagenTextListAdapter",
+ "MontagenVideoAdapter",
+ "MontagenVideoListAdapter"
+ ],
+ {
+ "title_aux": "ComfyUI-Montagen"
+ }
+ ],
+ "https://github.com/MoonHugo/ComfyUI-BAGEL-Hugo": [
+ [
+ "BagelByHugo"
+ ],
+ {
+ "title_aux": "ComfyUI-BAGEL-Hugo"
+ }
+ ],
+ "https://github.com/MoonHugo/ComfyUI-BiRefNet-Hugo": [
+ [
+ "BiRefNet_Hugo"
+ ],
+ {
+ "title_aux": "ComfyUI-BiRefNet-Hugo"
+ }
+ ],
+ "https://github.com/MoonHugo/ComfyUI-FFmpeg": [
+ [
+ "AddAudio",
+ "AddImgWatermark",
+ "AddTextWatermark",
+ "ExtractAudio",
+ "Frames2Video",
+ "ImageCopy",
+ "ImagePath2Tensor",
+ "ImagesSave",
+ "LoadImageFromDir",
+ "MergingVideoByPlenty",
+ "MergingVideoByTwo",
+ "MultiCuttingVideo",
+ "PipVideo",
+ "SingleCuttingVideo",
+ "StitchingVideo",
+ "Video2Frames",
+ "VideoFlip",
+ "VideoPlayback",
+ "VideoTransition"
+ ],
+ {
+ "title_aux": "ComfyUI-FFmpeg"
+ }
+ ],
+ "https://github.com/MoonHugo/ComfyUI-StableAudioOpen": [
+ [
+ "Text2Audio"
+ ],
+ {
+ "title_aux": "ComfyUI-StableAudioOpen"
+ }
+ ],
+ "https://github.com/MoonMoon82/ClipVision_Tools": [
+ [
+ "CalcEmbeds",
+ "CompareEmbeds",
+ "Cond2Embeds",
+ "DBLoader",
+ "EditDB",
+ "EditResults",
+ "EmbedsInfo",
+ "FolderScores",
+ "GenerateDB",
+ "ImageSearcher",
+ "LoadDB",
+ "ResultBrowser",
+ "ResultBrowserAdvanced",
+ "ResultCombiner",
+ "ResultSubtract",
+ "ScaleEmbeds"
+ ],
+ {
+ "title_aux": "ClipVision_Tools"
+ }
+ ],
+ "https://github.com/MovieLabs/comfyui-movielabs-util": [
+ [
+ "PublishAsset",
+ "PublishBlender"
+ ],
+ {
+ "title_aux": "MovieLabs ComfyUI Nodes for Publishing Workflow"
+ }
+ ],
+ "https://github.com/MrForExample/ComfyUI-3D-Pack": [
+ [],
+ {
+ "nodename_pattern": "^\\[Comfy3D\\]",
+ "title_aux": "ComfyUI-3D-Pack"
+ }
+ ],
+ "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved": [
+ [],
+ {
+ "nodename_pattern": "^\\[AnimateAnyone\\]",
+ "title_aux": "ComfyUI-AnimateAnyone-Evolved"
+ }
+ ],
+ "https://github.com/MrSamSeen/ComfyUI_SSBeforeAfterNode": [
+ [
+ "SSBeforeAndAfterVideo",
+ "SSBeforeAndAfterVideoWithDepthMap"
+ ],
+ {
+ "title_aux": "ComfyUI_SSBeforeAfterNode"
+ }
+ ],
+ "https://github.com/MrSamSeen/ComfyUI_SSStereoscope": [
+ [
+ "SBS_External_Depthmap_by_SamSeen",
+ "SBS_Image_Uploader",
+ "SBS_V2_by_SamSeen",
+ "SBS_VR_Panorama_by_SamSeen",
+ "SBS_Video_Combiner",
+ "SBS_Video_Uploader"
+ ],
+ {
+ "title_aux": "SideBySide_Stereoscope"
+ }
+ ],
+ "https://github.com/Munkyfoot/ComfyUI-TextOverlay": [
+ [
+ "Text Overlay"
+ ],
+ {
+ "title_aux": "ComfyUI-TextOverlay"
+ }
+ ],
+ "https://github.com/MushroomFleet/ComfyUI-DJZ-Offsquare": [
+ [
+ "DJZ_Offsquare",
+ "DJZ_Offsquare_V2"
+ ],
+ {
+ "title_aux": "ComfyUI-DJZ-Offsquare"
+ }
+ ],
+ "https://github.com/MushroomFleet/ComfyUI-DJZ-POML": [
+ [
+ "ZenkaiPOMLProcessor",
+ "ZenkaiPOMLTemplate"
+ ],
+ {
+ "title_aux": "Zenkai-POML for ComfyUI"
+ }
+ ],
+ "https://github.com/MushroomFleet/ComfyUI-FLUX2-JSON": [
+ [
+ "FLUX2_CameraRig",
+ "FLUX2_ColorPalette",
+ "FLUX2_ColorPalettePreset",
+ "FLUX2_PromptAssembler",
+ "FLUX2_SceneBuilder",
+ "FLUX2_StyleSelector",
+ "FLUX2_SubjectArray",
+ "FLUX2_SubjectCreator"
+ ],
+ {
+ "title_aux": "ComfyUI-FLUX2-JSON"
+ }
+ ],
+ "https://github.com/MushroomFleet/ComfyUI-Variationator": [
+ [
+ "PromptActionModifier",
+ "PromptBatchVariation",
+ "PromptCameraModifier",
+ "PromptColorGrading",
+ "PromptCombiner",
+ "PromptComposition",
+ "PromptDetailModifier",
+ "PromptDistanceModifier",
+ "PromptEraModifier",
+ "PromptLightingModifier",
+ "PromptLocationModifier",
+ "PromptModifierInfo",
+ "PromptMoodModifier",
+ "PromptMultiStyle",
+ "PromptPresetCollection",
+ "PromptRandomModifier",
+ "PromptSeasonalModifier",
+ "PromptSmartVariation",
+ "PromptStyleTransform",
+ "PromptWeatherModifier"
+ ],
+ {
+ "title_aux": "ComfyUI-Variationator"
+ }
+ ],
+ "https://github.com/MushroomFleet/ComfyUI-Zero2JSON": [
+ [
+ "Z2J_Background",
+ "Z2J_BatchGenerator",
+ "Z2J_CameraAngle",
+ "Z2J_CameraDistance",
+ "Z2J_CameraDoF",
+ "Z2J_CameraFocus",
+ "Z2J_Composition",
+ "Z2J_Lighting",
+ "Z2J_Mood",
+ "Z2J_ProfileInfo",
+ "Z2J_Scene",
+ "Z2J_SeedMixer",
+ "Z2J_Style",
+ "Z2J_SubjectAction",
+ "Z2J_SubjectDescription",
+ "Z2J_SubjectPose",
+ "Z2J_SubjectPosition"
+ ],
+ {
+ "title_aux": "ComfyUI-Zero2JSON"
+ }
+ ],
+ "https://github.com/MushroomFleet/ComfyUI_PromptExtractor_nodes": [
+ [
+ "DJZ_PromptExtractor",
+ "DJZ_PromptExtractorBatch",
+ "DJZ_PromptExtractorFromPath",
+ "DJZ_PromptExtractorV2",
+ "DJZ_PromptExtractorV2_Batch",
+ "DJZ_PromptExtractorV2_StringNavigator"
+ ],
+ {
+ "title_aux": "ComfyUI_PromptExtractor_nodes"
+ }
+ ],
+ "https://github.com/MushroomFleet/DJZ-Pedalboard": [
+ [
+ "DJZ_Pedalboard"
+ ],
+ {
+ "title_aux": "DJZ-Pedalboard"
+ }
+ ],
+ "https://github.com/MuziekMagie/ComfyUI-Matchering": [
+ [
+ "Matchering",
+ "MatcheringAdvanced",
+ "MatcheringLimiterConfig"
+ ],
+ {
+ "title_aux": "ComfyUI-Matchering"
+ }
+ ],
+ "https://github.com/MzMaXaM/ComfyUi-MzMaXaM": [
+ [
+ "KSamplerWithVAE",
+ "SelectLatentSize1MP",
+ "SelectLatentSize2MP",
+ "TextEncode3in1",
+ "UpscaleImageBy1_5x",
+ "UpscaleLatentBy1_5x",
+ "selectLatentSizePlus"
+ ],
+ {
+ "title_aux": "ComfyUi-MzMaXaM"
+ }
+ ],
+ "https://github.com/N3rd00d/ComfyUI-Paint3D-Nodes": [
+ [
+ "3D_GenerateDepthImage",
+ "3D_GenerateInpaintMask",
+ "3D_GenerateInpaintUVMapMask",
+ "3D_GeneratePreviewVideo",
+ "3D_LoadMeshModel",
+ "3D_Projection",
+ "3D_SaveUVMapImage",
+ "3D_TrainConfig",
+ "3D_TrainConfigPipe"
+ ],
+ {
+ "title_aux": "ComfyUI-Paint3D-Nodes"
+ }
+ ],
+ "https://github.com/NHLStenden/ComfyUI-ImageBag": [
+ [
+ "EnhancedImageColourTransferNode",
+ "FilmGrainNoiseNode"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageBag"
+ }
+ ],
+ "https://github.com/NMWave/ComfyUI-Nader-Tagging": [
+ [
+ "Load Text List",
+ "Shorten Sentences",
+ "Split Sentences",
+ "Split Tags",
+ "Tag Alternating Combiner",
+ "Tag Duplicate Remover",
+ "Token Counter"
+ ],
+ {
+ "title_aux": "Image Captioning and Tagging Assistor Nodes"
+ }
+ ],
+ "https://github.com/NOLABEL-VFX/ComfyUI-NL_Nodes": [
+ [
+ "NLConstantColor",
+ "NLContextDebug",
+ "NLRead",
+ "NLWanVideoImageToVideoEncodeV2",
+ "NLWorkflowFPS",
+ "NLWorkflowFrameRange",
+ "NLWorkflowProjectPath",
+ "NLWorkflowResolution",
+ "NLWrite"
+ ],
+ {
+ "title_aux": "ComfyUI-NL_Nodes"
+ }
+ ],
+ "https://github.com/NVIDIAGameWorks/ComfyUI-RTX-Remix": [
+ [
+ "RTXRemixCloseProject",
+ "RTXRemixCreateLayer",
+ "RTXRemixDefineLayerId",
+ "RTXRemixDeleteFile",
+ "RTXRemixDownloadModel",
+ "RTXRemixEndContext",
+ "RTXRemixGetDefaultDirectory",
+ "RTXRemixGetEditTarget",
+ "RTXRemixGetLayers",
+ "RTXRemixGetLoadedProject",
+ "RTXRemixGetTextures",
+ "RTXRemixIngestTexture",
+ "RTXRemixInvertBool",
+ "RTXRemixLayerType",
+ "RTXRemixLayerTypes",
+ "RTXRemixMuteLayer",
+ "RTXRemixOpenProject",
+ "RTXRemixRemoveLayer",
+ "RTXRemixRestAPIDetails",
+ "RTXRemixSaveLayer",
+ "RTXRemixSaveTexture",
+ "RTXRemixSetEditTarget",
+ "RTXRemixSetTexture",
+ "RTXRemixStartContext",
+ "RTXRemixStrToList",
+ "RTXRemixStringConcatenate",
+ "RTXRemixStringConstant",
+ "RTXRemixSwitch",
+ "RTXRemixTextureTypeToUSDAttribute",
+ "RTXRemixTexturesType",
+ "RTXRemixTexturesTypes"
+ ],
+ {
+ "title_aux": "ComfyUI-RTX-Remix"
+ }
+ ],
+ "https://github.com/Nakamura2828/ComfyUI-JK-TextTools": [
+ [
+ "JK_BBoxToMask",
+ "JK_BBoxToSAM3Query",
+ "JK_BBoxesToMask",
+ "JK_DetectionQuery",
+ "JK_DetectionToBBox",
+ "JK_JSONPrettyPrinter",
+ "JK_JSONToBBox",
+ "JK_ListIndexSelector",
+ "JK_MaskToBBox",
+ "JK_SEGsToMask",
+ "JK_SEGsToSAM3Query",
+ "JK_StringIndexSelector",
+ "JK_StringJoiner",
+ "JK_StringSplitter"
+ ],
+ {
+ "title_aux": "ComfyUI-JK-TextTools"
+ }
+ ],
+ "https://github.com/Nakamura2828/ComfyUI-JK-ToRetro": [
+ [
+ "JK_ImageToRetro"
+ ],
+ {
+ "title_aux": "ComfyUI-JK-ToRetro"
+ }
+ ],
+ "https://github.com/NakamuraShippo/ComfyUI-NS-ManySliders": [
+ [
+ "NS_ManySliders"
+ ],
+ {
+ "title_aux": "ComfyUI-NS-ManySliders"
+ }
+ ],
+ "https://github.com/NakamuraShippo/ComfyUI-NS-PromptList": [
+ [
+ "NS-PromptList"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptList"
+ }
+ ],
+ "https://github.com/NakamuraShippo/ComfyUI-NS-Util": [
+ [
+ "AlbedoMapGenerator",
+ "NS-FlexPreset",
+ "NS-ManySliders",
+ "NS-PromptList",
+ "NS-ToonFilter",
+ "SimpleLLMAddDocument",
+ "SimpleLLMAddMemory",
+ "SimpleLLMAgent",
+ "SimpleLLMAgentToTool",
+ "SimpleLLMAgentWithRules",
+ "SimpleLLMChainOfThought",
+ "SimpleLLMConfigClaude",
+ "SimpleLLMConfigGemini",
+ "SimpleLLMConfigOllama",
+ "SimpleLLMConfigOpenAI",
+ "SimpleLLMDisplayText",
+ "SimpleLLMLoadWorkflow",
+ "SimpleLLMMemoryBank",
+ "SimpleLLMMergeText",
+ "SimpleLLMRAGQuery",
+ "SimpleLLMRunPrompt",
+ "SimpleLLMStringViewer",
+ "SimpleLLMTextInput",
+ "SimpleLLMTextOutput",
+ "SimpleLLMVectorStore"
+ ],
+ {
+ "title_aux": "ComfyUI-NS-Util"
+ }
+ ],
+ "https://github.com/NeoDroleDeGueule/NDDG_Great_Nodes": [
+ [
+ "GreatConditioningModifier",
+ "GreatMultiplySigmas",
+ "GreatRandomOrganicGradientNode",
+ "ImageBlendNode",
+ "InteractiveOrganicGradientNode"
+ ],
+ {
+ "title_aux": "NDDG_Great_Nodes"
+ }
+ ],
+ "https://github.com/NeoGriever/ComfyUI-NeoGriever": [
+ [
+ "NGs_BetterCLIPTextEncode",
+ "NGs_Checkerboard_Generator",
+ "NGs_Create_Solid_Color",
+ "NGs_Discord_Webhook",
+ "NGs_Fill_with_Color",
+ "NGs_Image_Progress_Bar",
+ "NGs_Multimask_Read",
+ "NGs_Multimask_Write",
+ "NGs_ResolutionProvider",
+ "NGs_Sliders_FLOAT",
+ "NGs_Sliders_INT",
+ "NGs_Sliders_PERCENTAGECUT",
+ "NGs_String_Operator",
+ "NGs_String_Squisher",
+ "NGs_Tag_Source",
+ "NGs_TextBox_JOIN",
+ "NGs_TextBox_SIMPLE",
+ "NGs_TextBox_x2",
+ "NGs_TextBox_x3",
+ "NGs_Text_Cut_String"
+ ],
+ {
+ "title_aux": "ComfyUI - NeoGriever"
+ }
+ ],
+ "https://github.com/NeonLightning/neonllama": [
+ [
+ "OllamaPromptFromIdea"
+ ],
+ {
+ "title_aux": "neonllama"
+ }
+ ],
+ "https://github.com/NeuralSamurAI/ComfyUI-Dimensional-Latent-Perlin": [
+ [
+ "NoisyLatentPerlinD"
+ ],
+ {
+ "title_aux": "Dimensional Latent Perlin for ComfyUI"
+ }
+ ],
+ "https://github.com/NeuralSamurAI/ComfyUI-FluxPseudoNegativePrompt": [
+ [
+ "FluxPseudoNegativeNode"
+ ],
+ {
+ "title_aux": "FluxPseudoNegative"
+ }
+ ],
+ "https://github.com/NeuralSamurAI/ComfyUI-PromptJSON": [
+ [
+ "PromptJSON"
+ ],
+ {
+ "title_aux": "PromptJSON Node for ComfyUI"
+ }
+ ],
+ "https://github.com/NeuralSamurAI/Comfyui-Superprompt-Unofficial": [
+ [
+ "SuperPrompterNode"
+ ],
+ {
+ "title_aux": "SuperPrompter Node for ComfyUI"
+ }
+ ],
+ "https://github.com/NeuroSenko/ComfyUI_LLM_SDXL_Adapter": [
+ [
+ "ApplyLLMToSDXLAdapter",
+ "LLMAdapterLoader",
+ "LLMAdapterLoaderCustom",
+ "LLMGGUFModelLoader",
+ "LLMModelLoader",
+ "LLMTextEncoder",
+ "T5GEMMALoader",
+ "T5GEMMATextEncoder",
+ "t5gemmaApplyLLMToSDXLAdapter"
+ ],
+ {
+ "title_aux": "ComfyUI LLM SDXL Adapter"
+ }
+ ],
+ "https://github.com/NewBieAI-Lab/ComfyUI-MltoXml": [
+ [
+ "MltoXml"
+ ],
+ {
+ "title_aux": "ComfyUI-MltoXml"
+ }
+ ],
+ "https://github.com/NewLouwa/ComfyUI-Model_preset_Pilot": [
+ [
+ "KSamplerHelper",
+ "ModelPresetManager",
+ "PresetKSampler",
+ "PresetToKSampler",
+ "PreviewImage"
+ ],
+ {
+ "title_aux": "ComfyUI Model Preset Pilot"
+ }
+ ],
+ "https://github.com/NewNoviceChen/ComfyUI-Simple-IndexTTs": [
+ [
+ "AutoLoadModelNode",
+ "BatchTTsNode",
+ "EmotionFromAudioNode",
+ "EmotionFromTensorNode",
+ "EmotionFromTextNode",
+ "MergeEmotionNode",
+ "TTsNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Simple-IndexTTs"
+ }
+ ],
+ "https://github.com/NewNoviceChen/ComfyUI-XingLiu": [
+ [
+ "Image2ImageByAlpha",
+ "Image2ImageCustom",
+ "Image2ImageCustomAlpha",
+ "Image2ImageF1ContentNode",
+ "Image2VideoKlingNode(can`t use)",
+ "MakeAuth",
+ "MakeControlNet",
+ "MakeHiResFix",
+ "MakeLora",
+ "MergeControlNet",
+ "MergeImageListNode",
+ "MergeLora",
+ "Text2ImageByAlpha",
+ "Text2ImageCustom",
+ "Text2ImageCustomAlpha",
+ "Text2ImageF1ContentNode",
+ "Text2VideoKlingNode",
+ "UploadLibLib"
+ ],
+ {
+ "title_aux": "ComfyUI-XingLiu"
+ }
+ ],
+ "https://github.com/NexusEast/ComfyUI_ContactSheet_Auto": [
+ [
+ "SimpleGridImage",
+ "VideoIntervalCalculator"
+ ],
+ {
+ "title_aux": "ComfyUI_ContactSheet_Auto"
+ }
+ ],
+ "https://github.com/NguynHungNguyen/Segment-Bedroom-Interior": [
+ [
+ "BedroomFurnitureMask"
+ ],
+ {
+ "title_aux": "Segment Any Bedroom Interior"
+ }
+ ],
+ "https://github.com/NicholasMcCarthy/ComfyUI_TravelSuite": [
+ [
+ "LatentTravel"
+ ],
+ {
+ "title_aux": "ComfyUI_TravelSuite"
+ }
+ ],
+ "https://github.com/NickPittas/ComfyUI_CameraAngleSelector": [
+ [
+ "CameraAngleSelector"
+ ],
+ {
+ "title_aux": "ComfyUI_CameraAngleSelector"
+ }
+ ],
+ "https://github.com/NidAll/ComfyUI_PromptStyler": [
+ [
+ "PromptStylerConditioning"
+ ],
+ {
+ "title_aux": "ComfyUI_PromptStyler"
+ }
+ ],
+ "https://github.com/Nikosis/ComfyUI-Nikosis-Nodes": [
+ [
+ "AspectRatioNikosis",
+ "PromptCameraAngleSelectorNikosis",
+ "PromptMultipleStylesSelectorNikosis",
+ "TextConcatenateNikosis"
+ ],
+ {
+ "title_aux": "ComfyUI-Nikosis-Nodes"
+ }
+ ],
+ "https://github.com/Nikosis/ComfyUI-Nikosis-Preprocessors": [
+ [
+ "DepthAnythingV2Nikosis",
+ "EdgePreprocessorNikosis",
+ "LaplacianPreprocessorNikosis",
+ "LineArtPreprocessorNikosis",
+ "LineArtSketchPreprocessorNikosis"
+ ],
+ {
+ "title_aux": "ComfyUI-Nikosis-Preprocessors"
+ }
+ ],
+ "https://github.com/NimaNzrii/comfyui-photoshop": [
+ [
+ "ClipPass",
+ "PhotoshopConnection",
+ "PhotoshopToComfyUI",
+ "SendToPhotoshop",
+ "modelPass",
+ "\ud83d\udd39 Photoshop RemoteConnection",
+ "\ud83d\udd39ClipPass",
+ "\ud83d\udd39Photoshop ComfyUI Plugin",
+ "\ud83d\udd39SendTo Photoshop Plugin",
+ "\ud83d\udd39modelPass"
+ ],
+ {
+ "title_aux": "comfyui-photoshop"
+ }
+ ],
+ "https://github.com/NimaNzrii/comfyui-popup_preview": [
+ [
+ "PreviewPopup"
+ ],
+ {
+ "title_aux": "comfyui-popup_preview"
+ }
+ ],
+ "https://github.com/Niutonian/ComfyUi-NoodleWebcam": [
+ [
+ "WebcamNode"
+ ],
+ {
+ "title_aux": "ComfyUi-NoodleWebcam"
+ }
+ ],
+ "https://github.com/Niutonian/comfyui-niutonian-smart-image": [
+ [
+ "SmartBatchProcessor",
+ "SmartBorderFrame",
+ "SmartCollageMaker",
+ "SmartGridStitch",
+ "SmartImageSplitter",
+ "SmartImageStitch",
+ "SmartPanoramaStitch"
+ ],
+ {
+ "title_aux": "comfyui-niutonian-smart-image"
+ }
+ ],
+ "https://github.com/Niutonian/comfyui_Niutonian_GLM_4_6V": [
+ [
+ "NiutonianGLM46VAgenticSampler",
+ "NiutonianGLM46VDescriber",
+ "NiutonianGLM46VLoader",
+ "NiutonianGLM46VPromptGenerator"
+ ],
+ {
+ "title_aux": "comfyui_Niutonian_GLM_4_6V"
+ }
+ ],
+ "https://github.com/Njbx/ComfyUI-LTX13B-Blockswap": [
+ [
+ "LTXBlockswap"
+ ],
+ {
+ "title_aux": "ComfyUI-LTX13B-Blockswap"
+ }
+ ],
+ "https://github.com/Nlar/ComfyUI_CartoonSegmentation": [
+ [
+ "AnimeSegmentation",
+ "KenBurnsConfigLoader",
+ "KenBurns_Processor",
+ "LoadImageFileName",
+ "LoadImageFilename"
+ ],
+ {
+ "author": "Nels Larsen",
+ "description": "This extension offers a front end to the Cartoon Segmentation Project (https://github.com/CartoonSegmentation/CartoonSegmentation)",
+ "nickname": "CfyCS",
+ "title": "ComfyUI_CartoonSegmentation",
+ "title_aux": "ComfyUI_CartoonSegmentation"
+ }
+ ],
+ "https://github.com/No-22-Github/ComfyUI_RWKV_Studio": [
+ [
+ "RWKV_ModelLoader_V7",
+ "RWKV_Translator_Node",
+ "RWKV_Translator_Node_DE_CPU",
+ "RWKV_Translator_Node_DE_CUDA"
+ ],
+ {
+ "title_aux": "ComfyUI_RWKV_Studio"
+ }
+ ],
+ "https://github.com/Nojahhh/ComfyUI_GLM4_Wrapper": [
+ [
+ "GLM-4 Inferencing",
+ "GLM-4 Model Loader",
+ "GLM-4 Prompt Enhancer",
+ "GLM-4Inference",
+ "GLM-4ModelLoader",
+ "GLM-4PromptEnhancer"
+ ],
+ {
+ "title_aux": "ComfyUI GLM-4 Wrapper"
+ }
+ ],
+ "https://github.com/Noma-Machiko/ComfyUI-ToDevice": [
+ [
+ "ToCPU",
+ "ToGPU"
+ ],
+ {
+ "title_aux": "ComfyUI-ToDevice"
+ }
+ ],
+ "https://github.com/NotHarroweD/Harronode": [
+ [
+ "Harronode"
+ ],
+ {
+ "author": "HarroweD and quadmoon (https://github.com/traugdor)",
+ "description": "This extension to ComfyUI will build a prompt for the Harrlogos LoRA for SDXL.",
+ "nickname": "Harronode",
+ "nodename_pattern": "Harronode",
+ "title": "Harrlogos Prompt Builder Node",
+ "title_aux": "Harrlogos Prompt Builder Node"
+ }
+ ],
+ "https://github.com/Nourepide/ComfyUI-Allor": [
+ [
+ "AlphaChanelAdd",
+ "AlphaChanelAddByMask",
+ "AlphaChanelAsMask",
+ "AlphaChanelRemove",
+ "AlphaChanelRestore",
+ "ClipClamp",
+ "ClipVisionClamp",
+ "ClipVisionOutputClamp",
+ "ConditioningClamp",
+ "ControlNetClamp",
+ "GligenClamp",
+ "ImageBatchCopy",
+ "ImageBatchFork",
+ "ImageBatchGet",
+ "ImageBatchJoin",
+ "ImageBatchPermute",
+ "ImageBatchRemove",
+ "ImageClamp",
+ "ImageCompositeAbsolute",
+ "ImageCompositeAbsoluteByContainer",
+ "ImageCompositeRelative",
+ "ImageCompositeRelativeByContainer",
+ "ImageContainer",
+ "ImageContainerInheritanceAdd",
+ "ImageContainerInheritanceMax",
+ "ImageContainerInheritanceScale",
+ "ImageContainerInheritanceSum",
+ "ImageDrawArc",
+ "ImageDrawArcByContainer",
+ "ImageDrawChord",
+ "ImageDrawChordByContainer",
+ "ImageDrawEllipse",
+ "ImageDrawEllipseByContainer",
+ "ImageDrawLine",
+ "ImageDrawLineByContainer",
+ "ImageDrawPieslice",
+ "ImageDrawPiesliceByContainer",
+ "ImageDrawPolygon",
+ "ImageDrawRectangle",
+ "ImageDrawRectangleByContainer",
+ "ImageDrawRectangleRounded",
+ "ImageDrawRectangleRoundedByContainer",
+ "ImageEffectsAdjustment",
+ "ImageEffectsGrayscale",
+ "ImageEffectsLensBokeh",
+ "ImageEffectsLensChromaticAberration",
+ "ImageEffectsLensOpticAxis",
+ "ImageEffectsLensVignette",
+ "ImageEffectsLensZoomBurst",
+ "ImageEffectsNegative",
+ "ImageEffectsSepia",
+ "ImageFilterBilateralBlur",
+ "ImageFilterBlur",
+ "ImageFilterBoxBlur",
+ "ImageFilterContour",
+ "ImageFilterDetail",
+ "ImageFilterEdgeEnhance",
+ "ImageFilterEdgeEnhanceMore",
+ "ImageFilterEmboss",
+ "ImageFilterFindEdges",
+ "ImageFilterGaussianBlur",
+ "ImageFilterGaussianBlurAdvanced",
+ "ImageFilterMax",
+ "ImageFilterMedianBlur",
+ "ImageFilterMin",
+ "ImageFilterMode",
+ "ImageFilterRank",
+ "ImageFilterSharpen",
+ "ImageFilterSmooth",
+ "ImageFilterSmoothMore",
+ "ImageFilterStackBlur",
+ "ImageNoiseBeta",
+ "ImageNoiseBinomial",
+ "ImageNoiseBytes",
+ "ImageNoiseGaussian",
+ "ImageSegmentation",
+ "ImageSegmentationCustom",
+ "ImageSegmentationCustomAdvanced",
+ "ImageText",
+ "ImageTextMultiline",
+ "ImageTextMultilineOutlined",
+ "ImageTextOutlined",
+ "ImageTransformCropAbsolute",
+ "ImageTransformCropCorners",
+ "ImageTransformCropRelative",
+ "ImageTransformPaddingAbsolute",
+ "ImageTransformPaddingRelative",
+ "ImageTransformResizeAbsolute",
+ "ImageTransformResizeClip",
+ "ImageTransformResizeRelative",
+ "ImageTransformRotate",
+ "ImageTransformTranspose",
+ "LatentClamp",
+ "MaskClamp",
+ "ModelClamp",
+ "StyleModelClamp",
+ "UpscaleModelClamp",
+ "VaeClamp"
+ ],
+ {
+ "title_aux": "Allor Plugin"
+ }
+ ],
+ "https://github.com/NudeJS-dev/ComfyUI-NudeJS-Image2Prompt": [
+ [
+ "Image2Prompt",
+ "Text2Prompt"
+ ],
+ {
+ "title_aux": "ComfyUI-NudeJS-Image2Prompt"
+ }
+ ],
+ "https://github.com/Nuked88/ComfyUI-N-Nodes": [
+ [
+ "CLIPTextEncodeAdvancedNSuite [n-suite]",
+ "DynamicPrompt [n-suite]",
+ "Float Variable [n-suite]",
+ "FrameInterpolator [n-suite]",
+ "GPT Loader Simple [n-suite]",
+ "GPT Sampler [n-suite]",
+ "ImagePadForOutpaintAdvanced [n-suite]",
+ "Integer Variable [n-suite]",
+ "Llava Clip Loader [n-suite]",
+ "LoadFramesFromFolder [n-suite]",
+ "LoadImageFromFolder [n-suite]",
+ "LoadVideo [n-suite]",
+ "SaveVideo [n-suite]",
+ "SetMetadataForSaveVideo [n-suite]",
+ "String Variable [n-suite]"
+ ],
+ {
+ "title_aux": "ComfyUI-N-Nodes"
+ }
+ ],
+ "https://github.com/NyaFuP/ComfyUI_Preview_Selector": [
+ [
+ "NFPreviewSelector"
+ ],
+ {
+ "title_aux": "NF Preview Selector"
+ }
+ ],
+ "https://github.com/NyaamZ/efficiency-nodes-ED": [
+ [
+ "Context To BasicPipe",
+ "Context To DetailerPipe",
+ "Detailer (SEGS) \ud83d\udcacED",
+ "Efficient Loader \ud83d\udcacED",
+ "Embedding Stacker \ud83d\udcacED",
+ "Ext Model Input \ud83d\udcacED",
+ "FaceDetailer \ud83d\udcacED",
+ "Get Booru Tag \ud83d\udcacED",
+ "Int Holder \ud83d\udcacED",
+ "KSampler (Efficient) \ud83d\udcacED",
+ "KSampler Text \ud83d\udcacED",
+ "LoRA Stacker \ud83d\udcacED",
+ "Load Image \ud83d\udcacED",
+ "MaskDetailer \ud83d\udcacED",
+ "Refiner Script \ud83d\udcacED",
+ "Regional Processor \ud83d\udcacED",
+ "Regional Script \ud83d\udcacED",
+ "Regional Stacker \ud83d\udcacED",
+ "SUPIR Model Loader \ud83d\udcacED",
+ "SUPIR Sampler \ud83d\udcacED",
+ "Save Image \ud83d\udd14ED",
+ "Simple Text \ud83d\udcacED",
+ "TIPO Script \ud83d\udcacED",
+ "Ultimate SD Upscale \ud83d\udcacED",
+ "Wildcard Encode \ud83d\udcacED"
+ ],
+ {
+ "author": "NyaamZ",
+ "description": "Expansion of Efficiency Nodes for ComfyUI. Significant UX improvements.",
+ "nickname": "Efficiency Nodes ED",
+ "title": "Efficiency Nodes ExtendeD",
+ "title_aux": "Efficiency Nodes ExtendeD"
+ }
+ ],
+ "https://github.com/Nynxz/ComfyUI-NynxzNodes": [
+ [
+ "nynxz.CompareVideo.Options",
+ "nynxz.Create.CompareVideo.Fade",
+ "nynxz.Create.CompareVideo.Wipe",
+ "nynxz.Parse.StringTemplate"
+ ],
+ {
+ "title_aux": "ComfyUI-NynxzNodes"
+ }
+ ],
+ "https://github.com/OKIE5/ComfyUI-CN-Pre": [
+ [
+ "CN Pre+Loaders: Segmentation",
+ "Image: Levels"
+ ],
+ {
+ "title_aux": "ComfyUI-CN-Pre"
+ }
+ ],
+ "https://github.com/Off-Live/ComfyUI-off-suite": [
+ [
+ "Apply CLAHE",
+ "Cached Image Load From URL",
+ "CalcMaskBound",
+ "Crop Center wigh SEGS",
+ "Crop Center with SEGS",
+ "Dilate Mask for Each Face",
+ "GW Number Formatting",
+ "Grid Image from batch (OFF)",
+ "Image Crop Fit",
+ "Image Resize Fit",
+ "OFF SEGS to Image",
+ "Paste Face Segment to Image",
+ "Query Gender and Age",
+ "RandomSeedfromList",
+ "SEGS to Face Crop Data",
+ "Safe Mask to Image",
+ "VAE Encode For Inpaint V2",
+ "Watermarking"
+ ],
+ {
+ "title_aux": "ComfyUI-off-suite"
+ }
+ ],
+ "https://github.com/OhSeongHyeon/comfyui-watdafox-nodes": [
+ [
+ "BFParameters",
+ "BFParametersSimple",
+ "CheckpointComboParameter",
+ "CheckpointLoaderWithOuputDirByModelName",
+ "CyclicInteger",
+ "DetailerSchedulerComboParameter",
+ "KsamplerSamplersComboParameter",
+ "KsamplerSchedulersComboParameter",
+ "OuputDirByModelName",
+ "RandomImageSizeAdvanced",
+ "RandomImageSizeAdvancedYAML",
+ "RandomInteger",
+ "UnetComboParameter",
+ "UniqueStringList",
+ "UniqueStringListAdvanced",
+ "VAEComboParameter"
+ ],
+ {
+ "title_aux": "comfyui-watdafox-nodes"
+ }
+ ],
+ "https://github.com/OneThingAI/ComfyUI_Onething_CV": [
+ [
+ "OneThingAI ImageToText"
+ ],
+ {
+ "title_aux": "ComfyUI OneThing CV Node"
+ }
+ ],
+ "https://github.com/OneThingAI/ComfyUI_Onething_Image": [
+ [
+ "OneThingAILoader",
+ "OnethingAIFlux",
+ "OnethingAIImageGemini",
+ "OnethingAIImageHunyuan",
+ "OnethingAIImageOpenAI",
+ "OnethingAIImageSeedream",
+ "OnethingAIImageWanxiang"
+ ],
+ {
+ "title_aux": "ComfyUI OneThing AI Node"
+ }
+ ],
+ "https://github.com/Onionman61/ComfyUI-ModelScope-Kontext": [
+ [
+ "ModelScopeUniversalAPI"
+ ],
+ {
+ "title_aux": "ComfyUI ModelScope Kontext API Node"
+ }
+ ],
+ "https://github.com/OpalSky-AI/OpalSky_Nodes": [
+ [
+ "PromptAssistantOpalSky",
+ "StringSwitchOpalSky",
+ "string_switch_opalsky"
+ ],
+ {
+ "title_aux": "OpalSky Nodes"
+ }
+ ],
+ "https://github.com/OpenAssetIO/OpenAssetIO-ComfyUI": [
+ [
+ "OpenAssetIOPublishImage",
+ "OpenAssetIOResolveImage"
+ ],
+ {
+ "title_aux": "OpenAssetIO"
+ }
+ ],
+ "https://github.com/OuticNZ/ComfyUI-Simple-Of-Complex": [
+ [
+ "Prompt Tidy",
+ "Text Switch 2 Way",
+ "Text With Context"
+ ],
+ {
+ "title_aux": "ComfyUI-Simple-Of-Complex"
+ }
+ ],
+ "https://github.com/OwlvChirotha/ComfyUI-MultiTranslator": [
+ [
+ "ChatGPTServiceConnectorNode",
+ "DeepSeekServiceConnectorNode",
+ "GeminiServiceConnectorNode",
+ "GeneralLLMServiceConnectorNode",
+ "KimiServiceConnectorNode",
+ "LLMLocalModelLoaderNode",
+ "LLMTranslatorNode",
+ "OllamaLLMConnectorNode",
+ "SiliconFlowServiceConnectorNode",
+ "TranslatorNode",
+ "ZhiPuServiceConnectorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-MultiTranslator"
+ }
+ ],
+ "https://github.com/OwlvChirotha/ComfyUI-Owlv_Nodes": [
+ [
+ "AddCustomKontextPreset",
+ "KontextTextEncode",
+ "RemoveCustomKontextPreset",
+ "SaveImageDir"
+ ],
+ {
+ "title_aux": "ComfyUI-Owlv_Nodes"
+ }
+ ],
+ "https://github.com/PCMonsterx/ComfyUI-CSV-Loader": [
+ [
+ "ArtistsCSVLoader",
+ "ArtmovementsCSVLoader",
+ "CharactersCSVLoader",
+ "ColorsCSVLoader",
+ "CompositionCSVLoader",
+ "LightingCSVLoader",
+ "Load Artists CSV",
+ "Load Artmovements CSV",
+ "Load Characters CSV",
+ "Load Colors CSV",
+ "Load Composition CSV",
+ "Load Lighting CSV",
+ "Load Negative CSV",
+ "Load Positive CSV",
+ "Load Settings CSV",
+ "Load Styles CSV",
+ "NegativeCSVLoader",
+ "PositiveCSVLoader",
+ "SettingsCSVLoader",
+ "StylesCSVLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-CSV-Loader"
+ }
+ ],
+ "https://github.com/PICOPON/ComfyUI-API-OpenAI-Node": [
+ [
+ "OpenAINode"
+ ],
+ {
+ "title_aux": "ComfyUI OpenAI Node"
+ }
+ ],
+ "https://github.com/PROJECTMAD/PROJECT-MAD-NODES": [
+ [
+ "MultiScheduledLoraLoader",
+ "VisualPromptGallery"
+ ],
+ {
+ "title_aux": "PROJECT-MAD-NODES"
+ }
+ ],
+ "https://github.com/Pablerdo/ComfyUI-MultiCutAndDrag": [
+ [
+ "BatchImageToMask",
+ "LoadImageFromBase64",
+ "LoadImagesFromBase64Array",
+ "MapTrajectoriesToSegmentedMasks",
+ "MultiCutAndDragOnPath"
+ ],
+ {
+ "title_aux": "ComfyUI-MultiCutAndDrag"
+ }
+ ],
+ "https://github.com/Pablerdo/ComfyUI-ResizeZeptaPayload": [
+ [
+ "ResizeImageBatch",
+ "ResizeTrajectories"
+ ],
+ {
+ "title_aux": "ComfyUI-ResizeZeptaPayload"
+ }
+ ],
+ "https://github.com/Pablerdo/ComfyUI-StableVirtualCameraWrapper": [
+ [
+ "SVCFly",
+ "SVCFly_Bash"
+ ],
+ {
+ "title_aux": "Stable Virtual Camera"
+ }
+ ],
+ "https://github.com/Pablerdo/ComfyUI-ZeptaframePromptMerger": [
+ [
+ "MergePrompts"
+ ],
+ {
+ "title_aux": "ComfyUI-ZeptaframePromptMerger"
+ }
+ ],
+ "https://github.com/Paddel87/ComfyUI_fal_image": [
+ [
+ "FALContextStore",
+ "FALImage2Image",
+ "FALModelSelectImage",
+ "FALText2Image"
+ ],
+ {
+ "title_aux": "ComfyUI_fal_image"
+ }
+ ],
+ "https://github.com/PanicTitan/ComfyUI-Fooocus-V2-Expansion": [
+ [
+ "FooocusV2Expansion"
+ ],
+ {
+ "title_aux": "ComfyUI-Fooocus-V2-Expansion"
+ }
+ ],
+ "https://github.com/PanicTitan/ComfyUI-Gallery": [
+ [
+ "GalleryNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Gallery"
+ }
+ ],
+ "https://github.com/Parameshvadivel/ComfyUI-SVGview": [
+ [
+ "SVGPreview"
+ ],
+ {
+ "title_aux": "ComfyUI-SVGview"
+ }
+ ],
+ "https://github.com/ParisNeo/lollms_nodes_suite": [
+ [
+ "Artbot",
+ "Lollms",
+ "Lollms_Text_Gen",
+ "Lollms_Text_Saver",
+ "RandomizeVideo"
+ ],
+ {
+ "title_aux": "lollms_nodes_suite"
+ }
+ ],
+ "https://github.com/ParmanBabra/ComfyUI-Malefish-Custom-Scripts": [
+ [
+ "CSVPromptsLoader",
+ "CombinePrompt",
+ "MultiLoraLoader",
+ "RandomPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-Malefish-Custom-Scripts"
+ }
+ ],
+ "https://github.com/PatrickBorkowicz/ComfyUI-ImmichUploader": [
+ [
+ "ImmichUpload"
+ ],
+ {
+ "title_aux": "ComfyUI-ImmichUploader"
+ }
+ ],
+ "https://github.com/PauldeLavallaz/ComfyUI-CartesiaTTS": [
+ [
+ "CartesiaTTSNode"
+ ],
+ {
+ "title_aux": "ComfyUI-CartesiaTTS"
+ }
+ ],
+ "https://github.com/PauldeLavallaz/comfyui_claude_prompt_generator": [
+ [
+ "ClaudeCustomPrompt"
+ ],
+ {
+ "title_aux": "Claude Prompt Generator"
+ }
+ ],
+ "https://github.com/Pedreiro-Digital-Studio-Ltda/ComfyUI-PromptPerfect": [
+ [
+ "PromptPerfectGPT"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptPerfect"
+ }
+ ],
+ "https://github.com/PenguinTeo/Comfyui-GeminiBanana": [
+ [
+ "Gemini3ImageNode"
+ ],
+ {
+ "title_aux": "GeminiBanana for ComfyUI"
+ }
+ ],
+ "https://github.com/PenguinTeo/Comfyui-TextEditor-Penguin": [
+ [
+ "PenguinTextOnImage"
+ ],
+ {
+ "title_aux": "Comfyui-TextEditor-Penguin"
+ }
+ ],
+ "https://github.com/Pfaeff/pfaeff-comfyui": [
+ [
+ "AstropulsePixelDetector",
+ "BackgroundRemover",
+ "ImagePadForBetterOutpaint",
+ "Inpainting",
+ "InpaintingPipelineLoader"
+ ],
+ {
+ "title_aux": "pfaeff-comfyui"
+ }
+ ],
+ "https://github.com/Phando/ComfyUI-PhandoNodes": [
+ [
+ "SearchBySubstring",
+ "TextConcatenateDynamic"
+ ],
+ {
+ "title_aux": "ComfyUI-PhandoNodes"
+ }
+ ],
+ "https://github.com/Pheat-AI/Remade_nodes": [
+ [
+ "Batch Enlarged Overlay",
+ "Batch Image Blend by Mask",
+ "Batch Image Overlay",
+ "CannyImageCropper",
+ "MaskBoundingBox",
+ "Place Canny On Canvas",
+ "REMADE Batch Color Blend",
+ "REMADE Batch Image Blend",
+ "REMADE Batch Image Composite Masked",
+ "REMADE Batch Image Select Channel",
+ "Remove Black To Transparent",
+ "Shrink Canny Image"
+ ],
+ {
+ "title_aux": "Remade_nodes"
+ }
+ ],
+ "https://github.com/PiePieDesign/PiePieTweaks": [
+ [
+ "PiePiePreviewImage",
+ "PiePieResolutionFromMegapixels",
+ "PiePieResolutionPicker",
+ "PiePieTextConcatenate",
+ "PiePie_Lucidflux"
+ ],
+ {
+ "title_aux": "PiePieTweaks"
+ }
+ ],
+ "https://github.com/PiggyDance/ComfyUI_OpenCV": [
+ [
+ "OpenCV_CvtColor",
+ "OpenCV_GaussianBlur",
+ "OpenCV_MedianBlur"
+ ],
+ {
+ "title_aux": "ComfyUI_OpenCV"
+ }
+ ],
+ "https://github.com/Pigidiy/ComfyUI-LikeSpiderAI-SaveMP3": [
+ [
+ "SaveAudioAsMP3"
+ ],
+ {
+ "title_aux": "ComfyUI-LikeSpiderAI-SaveMP3"
+ }
+ ],
+ "https://github.com/Pigidiy/ComfyUI-LikeSpiderAI-UI": [
+ [
+ "AudioExport"
+ ],
+ {
+ "title_aux": "ComfyUI-LikeSpiderAI-UI"
+ }
+ ],
+ "https://github.com/Pirog17000/Pirogs-Nodes": [
+ [
+ "BatchCropFromMaskSimple",
+ "BatchUncropSimple",
+ "BlendImages",
+ "BlurByMask",
+ "BlurMask",
+ "CLIPTextEncodeFluxMultiple",
+ "CLIPTextEncodeMultiple",
+ "CropImage",
+ "CropMaskByBBox",
+ "DSLRNoise",
+ "GetImageSize",
+ "GradientMaskGenerator",
+ "ImageBlendByMask",
+ "ImageScalePro",
+ "InvertMask",
+ "KSamplerMultiSeed",
+ "KSamplerMultiSeedPlus",
+ "LMStudioQuery",
+ "LMStudioUnloadModel",
+ "LensSimulatedBloom",
+ "PreviewImageQueue",
+ "PromptRandomizer",
+ "StringCombine",
+ "TestResetButton",
+ "Watermark"
+ ],
+ {
+ "title_aux": "Pirog's Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/PixWizardry/ComfyUI_PixQwenImageEditEnhanced": [
+ [
+ "PixQwenImageEditEnhanced"
+ ],
+ {
+ "title_aux": "ComfyUI_PixQwenImageEditEnhanced"
+ }
+ ],
+ "https://github.com/PixelFunAI/ComfyUI_PixelFun": [
+ [
+ "HunyuanLoadAndEditLoraBlocks",
+ "HunyuanLoadFromBlockCache",
+ "HunyuanLoraFromJson",
+ "HunyuanLoraFromPrompt"
+ ],
+ {
+ "title_aux": "Hunyuan LoRA Loader Nodes"
+ }
+ ],
+ "https://github.com/PixelML/ComfyUI-PixelML-CustomNodes": [
+ [
+ "AgenticflowAIVariable",
+ "BooleanInput_PixelML",
+ "FloatInput_PixelML",
+ "IntegerInput_PixelML",
+ "LoadImageFromURL_PixelML",
+ "SaveImage_PixelML",
+ "StringInput_PixelML"
+ ],
+ {
+ "title_aux": "PixelML ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/Pixelailabs/Joy_Caption_Two_PixelaiLabs": [
+ [
+ "SimpleLLMCaption",
+ "SimpleLLMCaptionAdvanced",
+ "SimpleLLMCaptionBatch",
+ "SimpleLLMCaptionLoader"
+ ],
+ {
+ "title_aux": "Joy Caption Two - PixelaiLabs Edition"
+ }
+ ],
+ "https://github.com/PnthrLeo/comfyUI-PL-data-tools": [
+ [
+ "AreasGenerator",
+ "BatchImageGetter",
+ "CloseImagesSearcher"
+ ],
+ {
+ "title_aux": "comfyUI-PL-data-tools"
+ }
+ ],
+ "https://github.com/Polygoningenieur/ComfyUI-IC-Light-Video": [
+ [
+ "BackgroundScaler",
+ "CalculateNormalsFromImages",
+ "DetailTransfer",
+ "ICLightConditioning",
+ "ICLightVideo",
+ "LightSource",
+ "LoadAndApplyICLightUnet",
+ "LoadHDRImage"
+ ],
+ {
+ "title_aux": "ComfyUI-IC-Light-Video"
+ }
+ ],
+ "https://github.com/Pondowner857/comfy_Pond_Nodes_V2": [
+ [
+ "RemoteWorkflowExecutor"
+ ],
+ {
+ "title_aux": "ComfyUI Remote Workflow Executor"
+ }
+ ],
+ "https://github.com/Poseidon-fan/ComfyUI-RabbitMQ-Publisher": [
+ [
+ "Publish Image To RabbitMQ"
+ ],
+ {
+ "title_aux": "ComfyUI-RabbitMQ-Publisher"
+ }
+ ],
+ "https://github.com/Positliver/comfyui-zegr": [
+ [
+ "ZEGR_ALI_UF",
+ "ZEGR_LF",
+ "ZEGR_WD"
+ ],
+ {
+ "title_aux": "comfyui-zegr"
+ }
+ ],
+ "https://github.com/Poukpalaova/ComfyUI-FRED-Nodes_v2": [
+ [
+ "FRED_AutoCropImage_Native_Ratio",
+ "FRED_AutoImageTile_from_Mask",
+ "FRED_AutoLoraLoader_5_stacks_simple",
+ "FRED_AutoLoraLoader_Dynamic",
+ "FRED_CheckpointLoaderWithName",
+ "FRED_CropFace",
+ "FRED_ExecutionTime",
+ "FRED_ExtractKSampler_parameter",
+ "FRED_ExtractLora_parameter",
+ "FRED_ImageLoad",
+ "FRED_ImageQualityInspector",
+ "FRED_ImageSaver",
+ "FRED_ImageSaver_v2",
+ "FRED_ImageUncropFromBBox",
+ "FRED_Image_Sharpening_Blur_Level",
+ "FRED_JpegArtifact_Simulator",
+ "FRED_Multi_Linear_Slider",
+ "FRED_RestoreFaceWithMask",
+ "FRED_Save_Text_File",
+ "FRED_Simplified_Parameters_Panel",
+ "FRED_Text_to_XMP",
+ "FRED_UNETLoaderWithName",
+ "FRED_WildcardConcat_Dynamic"
+ ],
+ {
+ "title_aux": "ComfyUI FRED Nodes v2"
+ }
+ ],
+ "https://github.com/PowerHouseMan/ComfyUI-AdvancedLivePortrait": [
+ [
+ "AdvancedLivePortrait",
+ "ExpData",
+ "ExpressionEditor",
+ "LoadExpData",
+ "PrintExpData:",
+ "SaveExpData"
+ ],
+ {
+ "title_aux": "ComfyUI-AdvancedLivePortrait"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-BGPSeg": [
+ [
+ "BGPSegSegmentation",
+ "LoadBGPSegModels"
+ ],
+ {
+ "title_aux": "ComfyUI-BGPSeg"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-Cadrille": [
+ [
+ "CADRecodeInference",
+ "CadQueryExecute",
+ "CadrilleImageInference",
+ "CadrilleInference",
+ "CadrilleTextInference",
+ "LoadCADRecodeModel",
+ "LoadCadrilleModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Cadrille"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-CameraPack": [
+ [
+ "CreateLoad3DCamera",
+ "DA3ToLoad3DCamera"
+ ],
+ {
+ "title_aux": "ComfyUI-CameraPack"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-DepthAnythingV3": [
+ [
+ "DA3_CreateCameraParams",
+ "DA3_EnableTiledProcessing",
+ "DA3_FilterGaussians",
+ "DA3_MultiViewPointCloud",
+ "DA3_ParseCameraPose",
+ "DA3_PreviewPointCloud",
+ "DA3_Save3DGaussians",
+ "DA3_SavePointCloud",
+ "DA3_To3DGaussians",
+ "DA3_ToMesh",
+ "DA3_ToPointCloud",
+ "DepthAnythingV3_3D",
+ "DepthAnythingV3_Advanced",
+ "DepthAnythingV3_MultiView",
+ "DepthAnything_V3",
+ "DownloadAndLoadDepthAnythingV3Model"
+ ],
+ {
+ "title_aux": "ComfyUI-DepthAnythingV3"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-GeometryPack": [
+ [
+ "GeomPackAddNormalsToPointCloud",
+ "GeomPackAlphaWrap",
+ "GeomPackBackdraftView",
+ "GeomPackBooleanBlender",
+ "GeomPackBooleanCGAL",
+ "GeomPackCheckNormals",
+ "GeomPackCombineMeshes",
+ "GeomPackCombineMeshesBatch",
+ "GeomPackComputeNormals",
+ "GeomPackConnectedComponents",
+ "GeomPackCreatePrimitive",
+ "GeomPackDegenerateFaces",
+ "GeomPackDepthNormalsToMesh",
+ "GeomPackDetectSelfIntersections",
+ "GeomPackExtractSkeleton",
+ "GeomPackFillHoles",
+ "GeomPackFixNormals",
+ "GeomPackFixSelfIntersectionsByPerturbation",
+ "GeomPackFixSelfIntersectionsByRemoval",
+ "GeomPackGetMeshFilename",
+ "GeomPackLoadMesh",
+ "GeomPackLoadMeshBatch",
+ "GeomPackLoadMeshBlend",
+ "GeomPackLoadMeshFBX",
+ "GeomPackLoadMeshGlob",
+ "GeomPackLoadMeshPath",
+ "GeomPackMergeVertices",
+ "GeomPackMeshFix",
+ "GeomPackMeshFromSkeleton",
+ "GeomPackMeshInfo",
+ "GeomPackMeshQuality",
+ "GeomPackMeshToMeshDistance",
+ "GeomPackMeshToPointCloud",
+ "GeomPackNormalizeMeshToBBox",
+ "GeomPackOpenEdges",
+ "GeomPackPointToMeshDistance",
+ "GeomPackPreviewGaussian",
+ "GeomPackPreviewMesh",
+ "GeomPackPreviewMeshAnalysis",
+ "GeomPackPreviewMeshDual",
+ "GeomPackPreviewMeshMulti",
+ "GeomPackPreviewMeshUV",
+ "GeomPackPreviewMeshVTK",
+ "GeomPackPreviewMeshVTKBatch",
+ "GeomPackReconstructSurface",
+ "GeomPackRemesh",
+ "GeomPackRemeshBlender",
+ "GeomPackRemeshCGAL",
+ "GeomPackRemeshGPU",
+ "GeomPackRemeshSelfIntersections",
+ "GeomPackRemeshWithTexture",
+ "GeomPackRemoveDegenerateFaces",
+ "GeomPackSaveMesh",
+ "GeomPackSaveMeshBatch",
+ "GeomPackSplitByField",
+ "GeomPackSubsamplePointCloud",
+ "GeomPackTextureToGeometry",
+ "GeomPackTransformMesh",
+ "GeomPackUVUnwrap",
+ "GeomPackVisualizeNormalField",
+ "RefineMesh",
+ "ScrambleIntField"
+ ],
+ {
+ "title_aux": "ComfyUI libigl"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-Grounding": [
+ [
+ "BatchCropAndPadFromMask",
+ "BboxVisualizer",
+ "DownLoadSAM2Model",
+ "GroundingDetector",
+ "GroundingMaskDetector",
+ "GroundingMaskModelLoader",
+ "GroundingModelLoader",
+ "Sam2Segment"
+ ],
+ {
+ "title_aux": "ComfyUI-Grounding"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-HunyuanX": [
+ [
+ "HunyuanX_ApplyAndSaveTexturedMesh",
+ "HunyuanX_BakeMultiViews",
+ "HunyuanX_BakeMultiviewTextures",
+ "HunyuanX_CameraConfig",
+ "HunyuanX_DecodeLatents",
+ "HunyuanX_EncodeDINO",
+ "HunyuanX_ExportMesh",
+ "HunyuanX_GenerateLatents",
+ "HunyuanX_GenerateMultiviewPBR",
+ "HunyuanX_ImageToLatents",
+ "HunyuanX_ImageWithAlphaInput",
+ "HunyuanX_InPaint",
+ "HunyuanX_InpaintTextures",
+ "HunyuanX_LoadDiT",
+ "HunyuanX_LoadDinoModel",
+ "HunyuanX_LoadImageWithTransparency",
+ "HunyuanX_LoadMesh",
+ "HunyuanX_LoadMultiViewModel",
+ "HunyuanX_LoadVAE",
+ "HunyuanX_MeshGenerator",
+ "HunyuanX_MeshUVWrap",
+ "HunyuanX_MultiViewsGenerator",
+ "HunyuanX_PostprocessMesh",
+ "HunyuanX_PrepareImageForDINO",
+ "HunyuanX_PreviewTrimesh",
+ "HunyuanX_RenderConditioningMaps",
+ "HunyuanX_RenderRGBMultiview",
+ "HunyuanX_VAEDecode",
+ "HunyuanX_VAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-HunyuanX"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-MIDI3D": [
+ [
+ "CombineMasksToInstance",
+ "DownloadAndLoadMIDI3DModel",
+ "MIDI3DLoadTextureModels",
+ "MIDI3DPreprocess",
+ "MIDI3DPreprocessFromFiles",
+ "MIDI3DProcess",
+ "MIDI3DSceneToTrimesh",
+ "MIDI3DTexture",
+ "RGBToInstanceMask"
+ ],
+ {
+ "title_aux": "ComfyUI-MIDI3D"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-MeshCraft": [
+ [
+ "HunyuanX_ApplyAndSaveTexturedMesh",
+ "HunyuanX_BakeMultiViews",
+ "HunyuanX_BakeMultiviewTextures",
+ "HunyuanX_CameraConfig",
+ "HunyuanX_DecodeLatents",
+ "HunyuanX_EncodeDINO",
+ "HunyuanX_ExportMesh",
+ "HunyuanX_GenerateLatents",
+ "HunyuanX_GenerateMultiviewPBR",
+ "HunyuanX_ImageToLatents",
+ "HunyuanX_ImageWithAlphaInput",
+ "HunyuanX_InPaint",
+ "HunyuanX_InpaintTextures",
+ "HunyuanX_LoadDiT",
+ "HunyuanX_LoadDinoModel",
+ "HunyuanX_LoadImageWithTransparency",
+ "HunyuanX_LoadMesh",
+ "HunyuanX_LoadMultiViewModel",
+ "HunyuanX_LoadVAE",
+ "HunyuanX_MeshGenerator",
+ "HunyuanX_MeshUVWrap",
+ "HunyuanX_MultiViewsGenerator",
+ "HunyuanX_PostprocessMesh",
+ "HunyuanX_PrepareImageForDINO",
+ "HunyuanX_PreviewTrimesh",
+ "HunyuanX_RenderConditioningMaps",
+ "HunyuanX_RenderRGBMultiview",
+ "HunyuanX_VAEDecode",
+ "HunyuanX_VAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-MeshCraft"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-NeurCADRecon": [
+ [
+ "LoadNeurCADReconModel",
+ "NeurCADReconInference",
+ "NeurCADReconLoadCheckpoint",
+ "NeurCADReconTrain"
+ ],
+ {
+ "title_aux": "ComfyUI-NeurCADRecon"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-SAM3": [
+ [
+ "LoadSAM3Model",
+ "SAM3BBoxCollector",
+ "SAM3CombineBoxes",
+ "SAM3CombinePoints",
+ "SAM3CreateBox",
+ "SAM3CreatePoint",
+ "SAM3Grounding",
+ "SAM3MultiRegionCollector",
+ "SAM3MultipromptSegmentation",
+ "SAM3PointCollector",
+ "SAM3Propagate",
+ "SAM3Segmentation",
+ "SAM3VideoOutput",
+ "SAM3VideoSegmentation"
+ ],
+ {
+ "title_aux": "ComfyUI-SAM3"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-SAM3DBody": [
+ [
+ "LoadSAM3DBodyModel",
+ "SAM3DBodyAddMeshToSkeleton",
+ "SAM3DBodyExportFBX",
+ "SAM3DBodyExportMesh",
+ "SAM3DBodyExportMultipleFBX",
+ "SAM3DBodyGetVertices",
+ "SAM3DBodyLoadMesh",
+ "SAM3DBodyLoadSkeleton",
+ "SAM3DBodyPreviewRiggedMesh",
+ "SAM3DBodyProcess",
+ "SAM3DBodyProcessAdvanced",
+ "SAM3DBodyProcessMultiple",
+ "SAM3DBodySaveSkeleton",
+ "SAM3DBodySelectMesh",
+ "SAM3DBodyVisualize"
+ ],
+ {
+ "title_aux": "ComfyUI-SAM3DBody"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-SECADNET": [
+ [
+ "LoadSECADNetModel",
+ "MeshToVoxel",
+ "SECADNetFinetune",
+ "SECADNetInference",
+ "SECADNetLatentToMesh"
+ ],
+ {
+ "title_aux": "ComfyUI-SECADNET"
+ }
+ ],
+ "https://github.com/PozzettiAndrea/ComfyUI-Sharp": [
+ [
+ "LoadImageWithExif",
+ "LoadSharpModel",
+ "SharpPredict"
+ ],
+ {
+ "title_aux": "ComfyUI-Sharp"
+ }
+ ],
+ "https://github.com/PressWagon/ComfyUI-StringsAndThings": [
+ [
+ "DebugString",
+ "FormatConcatStrings",
+ "FormattingSingle",
+ "FourierAnalysisNode",
+ "ImageDifference",
+ "MosaicEffectNode",
+ "PWLoraNameCollector",
+ "PWLoraSelector",
+ "TextEmbeddingsInterrogator"
+ ],
+ {
+ "title_aux": "ComfyUI-StringsAndThings"
+ }
+ ],
+ "https://github.com/ProGamerGov/ComfyUI_preview360panorama": [
+ [
+ "PanoramaVideoViewerNode",
+ "PanoramaViewerNode"
+ ],
+ {
+ "title_aux": "Preview 360 Panorama for ComfyUI"
+ }
+ ],
+ "https://github.com/ProGamerGov/ComfyUI_pytorch360convert": [
+ [
+ "Apply Circular Padding Model",
+ "Apply Circular Padding VAE",
+ "Create 180 To 360 Mask",
+ "Create Pole Mask",
+ "Create Seam Mask",
+ "Crop 360 to 180 Equirectangular",
+ "Crop Image with Coords",
+ "Crop Stereo to Monoscopic",
+ "Cubemap to Equirectangular",
+ "Equirectangular Mask to Face",
+ "Equirectangular Rotation",
+ "Equirectangular to Cubemap",
+ "Equirectangular to Face",
+ "Equirectangular to Perspective",
+ "Face Mask to Equirectangular",
+ "Face to Equirectangular",
+ "Mask Equirectangular Rotation",
+ "Masked Diff C2E",
+ "Merge Monoscopic into Stereo",
+ "Pad 180 to 360 Equirectangular",
+ "Paste Image with Coords",
+ "Roll Image Axes",
+ "Roll Mask Axes",
+ "Split Cubemap Faces",
+ "Stack Cubemap Faces"
+ ],
+ {
+ "title_aux": "ComfyUI_pytorch360convert"
+ }
+ ],
+ "https://github.com/ProGamerGov/ComfyUI_pytorch360convert_video": [
+ [
+ "Create 360 Sweep Frames",
+ "Create 360 Sweep Frames Tensor",
+ "Create360SweepVideoFramesNode",
+ "Create360SweepVideoFramesTensorNode"
+ ],
+ {
+ "title_aux": "ComfyUI_pytorch360convert_video"
+ }
+ ],
+ "https://github.com/PrunaAI/ComfyUI_pruna": [
+ [
+ "CacheModelAdaptive",
+ "CacheModelAuto",
+ "CacheModelPeriodic",
+ "PrunaCompileModel"
+ ],
+ {
+ "title_aux": "Pruna nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/Pseudotools/Pseudocomfy": [
+ [
+ "PseudoApplyDenseDiffusionSDXL",
+ "PseudoApplyIPAdaperSDXL",
+ "PseudoConcatStrings",
+ "PseudoFloatToInt",
+ "PseudoIPAdapterUnifiedLoaderClone",
+ "PseudoLoadModelSnapshot",
+ "PseudoMaskAggregate",
+ "PseudoMaskBlur",
+ "PseudoMaskClamp",
+ "PseudoMaskInvert",
+ "PseudoMaskRemap",
+ "PseudoMaskReshape",
+ "PseudoPreviewStrings",
+ "PseudoProcessEnvironmentalPrompts",
+ "PseudoProcessImagePrompt",
+ "PseudoProcessMaterialPrompts",
+ "PseudoRemapNormalizedFloat",
+ "PseudoSaveImageWithEmbeddedMasks",
+ "PseudoUnpackModelSnapshot"
+ ],
+ {
+ "title_aux": "Pseudocomfy"
+ }
+ ],
+ "https://github.com/Pun0110/ComfyUI-CSV-Styler": [
+ [
+ "PT.CSV Styler"
+ ],
+ {
+ "title_aux": "CSV Styler"
+ }
+ ],
+ "https://github.com/Q-Bug4/Comfyui-Qb-DateNodes": [
+ [
+ "DateTimeFormatterNode"
+ ],
+ {
+ "title_aux": "Comfyui-Qb-Date-Nodes"
+ }
+ ],
+ "https://github.com/Q-Bug4/Comfyui-Simple-Json-Node": [
+ [
+ "JSONArrayIteratorNode",
+ "JSONGeneratorNode",
+ "JSONKeyCheckerNode",
+ "JSONLengthNode",
+ "JSONMergeNode",
+ "JSONModifierNode",
+ "JSONObjectIteratorNode",
+ "JSONParserNode",
+ "JSONStringifierNode",
+ "RandomJSONValueNode"
+ ],
+ {
+ "title_aux": "Simple JSON Parser Node for ComfyUI"
+ }
+ ],
+ "https://github.com/Q-Bug4/comfyui-qbug-batch": [
+ [
+ "CrossJoinSelector",
+ "ListFiles",
+ "NoPreviewSaveImage"
+ ],
+ {
+ "title_aux": "comfyui-qbug-batch"
+ }
+ ],
+ "https://github.com/QL-boy/ComfyUI-Advanced-Tile-Processing": [
+ [
+ "CustomTileMerger",
+ "CustomTileSplitter"
+ ],
+ {
+ "title_aux": "ComfyUI-Advanced-Tile-Processing"
+ }
+ ],
+ "https://github.com/QaisMalkawi/ComfyUI-QaisHelper": [
+ [
+ "Bool Binary Operation",
+ "Bool Unary Operation",
+ "Item Debugger",
+ "Item Switch",
+ "Nearest SDXL Resolution",
+ "SDXL Resolution",
+ "Size Swapper"
+ ],
+ {
+ "title_aux": "ComfyUI-Qais-Helper"
+ }
+ ],
+ "https://github.com/QijiTec/ComfyUI-RED-UNO": [
+ [
+ "REDUNOGenerate",
+ "REDUNOModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-RED-UNO"
+ }
+ ],
+ "https://github.com/QuackPhuc/ComfyUI-FisheyeTransform": [
+ [
+ "FisheyeRedistort",
+ "FisheyeStrengthEstimate",
+ "FisheyeUndistort"
+ ],
+ {
+ "title_aux": "ComfyUI-FisheyeTransform"
+ }
+ ],
+ "https://github.com/QuietNoise/comfyui_queue_manager": [
+ [
+ "Workflow Name"
+ ],
+ {
+ "title_aux": "ComfyUI Queue Manager"
+ }
+ ],
+ "https://github.com/R5-Revo/llm-node-comfyui": [
+ [
+ "UniversalLLMNode"
+ ],
+ {
+ "title_aux": "Universal LLM Node for ComfyUI"
+ }
+ ],
+ "https://github.com/RCAKangle/ComfyUI_LLM_Embeder": [
+ [
+ "ChatHistoryViewer",
+ "ChatNode",
+ "LLMConfigNode"
+ ],
+ {
+ "title_aux": "ComfyUI_LLM_Embeder"
+ }
+ ],
+ "https://github.com/RUiNtheExtinct/comfyui-save-file-extended": [
+ [
+ "LoadAudioExtended",
+ "LoadImageExtended",
+ "LoadVideoExtended",
+ "SaveAudioExtended",
+ "SaveAudioMP3Extended",
+ "SaveAudioOpusExtended",
+ "SaveImageExtended",
+ "SaveVideoExtended",
+ "SaveWEBMExtended",
+ "SaveWorkflowExtended"
+ ],
+ {
+ "title_aux": "comfyui-save-file-extended"
+ }
+ ],
+ "https://github.com/Raapys/ComfyUI-LatentGC_Aggressive": [
+ [
+ "LatentGC"
+ ],
+ {
+ "title_aux": "LatentGC Aggressive"
+ }
+ ],
+ "https://github.com/RainyN0077/ComfyUI-PromptSE": [
+ [
+ "PromptSE"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptSE"
+ }
+ ],
+ "https://github.com/RamonGuthrie/ComfyUI-RBG-ImageStitchPlus": [
+ [
+ "RBGImageStitchPlus",
+ "RBGPadPro"
+ ],
+ {
+ "title_aux": "ComfyUI-RBG-ImageStitchPlus"
+ }
+ ],
+ "https://github.com/RamonGuthrie/ComfyUI-RBG-SmartSeedVariance": [
+ [
+ "RBG_Smart_Seed_Variance"
+ ],
+ {
+ "title_aux": "ComfyUI-RBG-SmartSeedVariance"
+ }
+ ],
+ "https://github.com/Randy420Marsh/civitai-api-url-resolver": [
+ [
+ "CivitaiShareToDirectURL"
+ ],
+ {
+ "title_aux": "Civitai URL Resolver for ComfyUI"
+ }
+ ],
+ "https://github.com/Rathius-Saranoth/Rathius_ComfyNodes": [
+ [
+ "LoadTextFile_Rathius",
+ "SimpleTextMixer"
+ ],
+ {
+ "title_aux": "Rathius_ComfyNodes"
+ }
+ ],
+ "https://github.com/Raykosan/ComfyUI_RS-SaturationNode": [
+ [
+ "RS_SaturationSwitch"
+ ],
+ {
+ "title_aux": "ComfyUI_RS-SaturationNode"
+ }
+ ],
+ "https://github.com/Raykosan/ComfyUI_RaykoStudio": [
+ [
+ "RS_RusTextOverlay"
+ ],
+ {
+ "title_aux": "ComfyUI_RaykoStudio"
+ }
+ ],
+ "https://github.com/RaymondProduction/comfyui-zerna-pack": [
+ [
+ "CLIPDynamicPromptEncoder //Zerna Pack",
+ "DynamicPromptInjector //Zerna Pack",
+ "LastImage //Zerna Pack",
+ "UnzipPrompt //Zerna Pack"
+ ],
+ {
+ "author": "Raymond",
+ "description": "A set of nodes for batch processing of text and images.",
+ "nickname": "Zerna Pack",
+ "title": "Zerna Pack",
+ "title_aux": "Zerna Pack"
+ }
+ ],
+ "https://github.com/ReBeating/ComfyUI-Artist-Selector": [
+ [
+ "ArtistLoader",
+ "LoadArtistTag"
+ ],
+ {
+ "title_aux": "ComfyUI-Artist-Selector"
+ }
+ ],
+ "https://github.com/RegulusAlpha/ComfyUI-DynPromptSimplified": [
+ [
+ "DynPromptExpand"
+ ],
+ {
+ "title_aux": "ComfyUI Dynamic Prompting Simplified"
+ }
+ ],
+ "https://github.com/ReinerBforartists/comfyui_auto_prompt_schedule": [
+ [
+ "AutoPromptSchedule"
+ ],
+ {
+ "title_aux": "Auto Prompt Schedule"
+ }
+ ],
+ "https://github.com/ReinerBforartists/comfyui_text_line_combine": [
+ [
+ "CombineTextLines"
+ ],
+ {
+ "title_aux": "ComfyUI_Text_Line_Combine"
+ }
+ ],
+ "https://github.com/Reithan/negative_rejection_steering": [
+ [
+ "NRS"
+ ],
+ {
+ "title_aux": "Negative Rejection Steering"
+ }
+ ],
+ "https://github.com/RenderRift/ComfyUI-RenderRiftNodes": [
+ [
+ "AnalyseMetadata",
+ "DateIntegerNode",
+ "DisplayMetaOptions",
+ "LoadImageWithMeta",
+ "MetadataOverlayNode",
+ "VideoPathMetaExtraction"
+ ],
+ {
+ "title_aux": "ComfyUI-RenderRiftNodes"
+ }
+ ],
+ "https://github.com/Revmagi/DDM_bundle": [
+ [
+ "DDM_GetNode",
+ "DDM_SetNode"
+ ],
+ {
+ "title_aux": "DDM Bundle - ComfyUI Custom Nodes"
+ }
+ ],
+ "https://github.com/RhizoNymph/ComfyUI-CLIPSlider": [
+ [
+ "CLIPSlider"
+ ],
+ {
+ "title_aux": "ComfyUI-CLIPSlider"
+ }
+ ],
+ "https://github.com/RhizoNymph/ComfyUI-ColorWheel": [
+ [
+ "AccurateColorWheelNode"
+ ],
+ {
+ "title_aux": "ComfyUI-ColorWheel"
+ }
+ ],
+ "https://github.com/RhizoNymph/ComfyUI-Latte": [
+ [
+ "LatteVideoGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-Latte"
+ }
+ ],
+ "https://github.com/Rhovanx/wan_vace_auto_joiner": [
+ [
+ "WanVaceAutoJoiner",
+ "WanVaceAutoJoinerFinalize",
+ "WanVaceAutoJoinerSave"
+ ],
+ {
+ "title_aux": "Wan Vace Auto Joiner"
+ }
+ ],
+ "https://github.com/RiceRound/ComfyUI_CryptoCat": [
+ [
+ "CryptoCatImage",
+ "DecodeCryptoNode",
+ "ExcuteCryptoNode",
+ "RandomSeedNode",
+ "SaveCryptoBridgeNode",
+ "SaveCryptoNode"
+ ],
+ {
+ "title_aux": "ComfyUI Compression and Encryption Node"
+ }
+ ],
+ "https://github.com/RiceRound/ComfyUI_RiceRound": [
+ [
+ "RiceRoundAdvancedChoiceNode",
+ "RiceRoundBooleanNode",
+ "RiceRoundDecryptNode",
+ "RiceRoundDownloadImageAndMaskNode",
+ "RiceRoundDownloadImageNode",
+ "RiceRoundDownloadMaskNode",
+ "RiceRoundEncryptNode",
+ "RiceRoundFloatNode",
+ "RiceRoundImageBridgeNode",
+ "RiceRoundImageNode",
+ "RiceRoundImageUrlNode",
+ "RiceRoundInputTextNode",
+ "RiceRoundIntNode",
+ "RiceRoundMaskBridgeNode",
+ "RiceRoundOutputBooleanNode",
+ "RiceRoundOutputFloatNode",
+ "RiceRoundOutputImageBridgeNode",
+ "RiceRoundOutputImageNode",
+ "RiceRoundOutputIntNode",
+ "RiceRoundOutputMaskBridgeNode",
+ "RiceRoundOutputTextNode",
+ "RiceRoundRandomSeedNode",
+ "RiceRoundSimpleChoiceNode",
+ "RiceRoundSimpleImageNode",
+ "RiceRoundStrToBooleanNode",
+ "RiceRoundStrToFloatNode",
+ "RiceRoundStrToIntNode",
+ "RiceRoundUploadImageNode"
+ ],
+ {
+ "title_aux": "RiceRound Cloud Node"
+ }
+ ],
+ "https://github.com/Rinsanga1/comfyui-florence2xy": [
+ [
+ "Florence2toCoordinatesButxy",
+ "LoadImageWithName"
+ ],
+ {
+ "title_aux": "comfyui-florence2xy"
+ }
+ ],
+ "https://github.com/Rizzlord/ComfyUI-RizzNodes": [
+ [
+ "BatchImagesToGrid",
+ "CreateImage",
+ "LoadMultiviewImages",
+ "Quadremesh",
+ "RizzAlphaMargin",
+ "RizzAudioMixer",
+ "RizzBatchImageLoader",
+ "RizzBlur",
+ "RizzChannelPack",
+ "RizzChannelSplit",
+ "RizzClean",
+ "RizzCropAndScaleFromMask",
+ "RizzDynamicPromptGenerator",
+ "RizzEditClips",
+ "RizzEditImage",
+ "RizzExtractAllFrames",
+ "RizzExtractFrames",
+ "RizzGDSPatcher",
+ "RizzImageEffects",
+ "RizzLoadAudio",
+ "RizzLoadImage",
+ "RizzLoadLatestImage",
+ "RizzLoadLatestMesh",
+ "RizzLoadVideo",
+ "RizzMakeTileable",
+ "RizzModelBatchLoader",
+ "RizzPasteAndUnscale",
+ "RizzPreviewAudio",
+ "RizzPreviewImage",
+ "RizzPreviewTiling",
+ "RizzPreviewVideo",
+ "RizzSaveAudio",
+ "RizzSaveImage",
+ "RizzSaveVideo",
+ "RizzSeparateVideoAudio",
+ "RizzTextcombine",
+ "RizzUpscaleImageBatch",
+ "RizzVideoEffects",
+ "SaveMultiviewImages",
+ "SimplifyMesh",
+ "SplitImageBatch",
+ "VideoSecondsToLength"
+ ],
+ {
+ "title_aux": "ComfyUI-RizzNodes"
+ }
+ ],
+ "https://github.com/RodrigoSKohl/ComfyUI-Panoramic-ImgStitcher": [
+ [
+ "Image Stitching Node"
+ ],
+ {
+ "title_aux": "Panoramic Image Stitcher"
+ }
+ ],
+ "https://github.com/RodrigoSKohl/InteriorDesign-for-ComfyUI": [
+ [
+ "Control Items",
+ "Image Normalize",
+ "Interior Design Segmentator"
+ ],
+ {
+ "title_aux": "Interior Design for Comfyui"
+ }
+ ],
+ "https://github.com/RodrigoSKohl/comfyui-tryoff-anyone": [
+ [
+ "TryOffAnyoneNode"
+ ],
+ {
+ "title_aux": "TryOff Anyone"
+ }
+ ],
+ "https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control": [
+ [
+ "LatentAddTransform",
+ "LatentInterpolateTransform",
+ "LatentMirror",
+ "LatentNormalize",
+ "LatentShift",
+ "MirrorTransform",
+ "MultiplyTransform",
+ "OffsetCombine",
+ "OneTimeLatentAddTransform",
+ "OneTimeLatentInterpolateTransform",
+ "OneTimeMirrorTransform",
+ "OneTimeMultiplyTransform",
+ "OneTimeShiftTransform",
+ "ShiftTransform",
+ "TransformHijack",
+ "TransformOffset",
+ "TransformSampler",
+ "TransformSamplerAdvanced",
+ "TransformsCombine"
+ ],
+ {
+ "title_aux": "Advanced Latent Control"
+ }
+ ],
+ "https://github.com/Ron-Digital/ComfyUI-SceneGenerator": [
+ [
+ "Scene Generator"
+ ],
+ {
+ "title_aux": "ComfyUI-SceneGenerator"
+ }
+ ],
+ "https://github.com/RunningOverGlowies/ComfyUI-PromptUtils": [
+ [
+ "FilenameGenerator",
+ "PromptWildcards"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptUtils"
+ }
+ ],
+ "https://github.com/Runware/ComfyUI-Runware": [
+ [
+ "Runware 3D Inference",
+ "Runware 3D Inference Inputs",
+ "Runware API Manager",
+ "Runware Accelerator Options",
+ "Runware Alibaba Provider Settings",
+ "Runware Audio Inference",
+ "Runware Audio Inference Inputs",
+ "Runware Audio Inputs Combine",
+ "Runware Audio Model Search",
+ "Runware Audio Sections",
+ "Runware Background Removal",
+ "Runware BlackForest Labs Provider Settings",
+ "Runware Bria Provider Mask",
+ "Runware Bria Provider Settings",
+ "Runware Bytedance Provider Settings",
+ "Runware ControlNet",
+ "Runware ControlNet Combine",
+ "Runware ControlNet PreProcessor",
+ "Runware ElevenLabs Provider Settings",
+ "Runware ElevenLabs Provider Settings Sections",
+ "Runware Embedding Search",
+ "Runware Embeddings Combine",
+ "Runware Frame Images",
+ "Runware Google Provider Settings",
+ "Runware IPAdapter",
+ "Runware IPAdapters Combine",
+ "Runware Image Caption",
+ "Runware Image Inference",
+ "Runware Image Inference Inputs",
+ "Runware Image Inference Ultralytics",
+ "Runware Image Masking",
+ "Runware Image Upscaler",
+ "Runware Imagen Inference",
+ "Runware Input Audios",
+ "Runware KlingAI Provider Settings",
+ "Runware Kontext Inference",
+ "Runware Lightricks Provider Settings",
+ "Runware Lora Combine",
+ "Runware Lora Search",
+ "Runware Luma Provider Settings",
+ "Runware Media Upload",
+ "Runware Midjourney Provider Settings",
+ "Runware MiniMax Provider Settings",
+ "Runware Mirelo Provider Settings",
+ "Runware Model Search",
+ "Runware Multi Inference",
+ "Runware OpenAI Provider Settings",
+ "Runware Outpaint",
+ "Runware PhotoMaker V2",
+ "Runware Pixverse Provider Settings",
+ "Runware Reference Images",
+ "Runware Reference Videos",
+ "Runware Reference Voices",
+ "Runware Refiner",
+ "Runware Runway Provider Settings",
+ "Runware Safety Inputs",
+ "Runware Save 3D",
+ "Runware Save Image",
+ "Runware Settings",
+ "Runware Speech Inputs Combine",
+ "Runware Sync Provider Settings",
+ "Runware Sync Segment",
+ "Runware VAE Search",
+ "Runware Vectorize",
+ "Runware Video Advanced Feature Inputs",
+ "Runware Video Audio Input",
+ "Runware Video Background Removal",
+ "Runware Video Inference",
+ "Runware Video Inference Inputs",
+ "Runware Video Inference Outputs",
+ "Runware Video Inputs Frame Images",
+ "Runware Video Inputs References",
+ "Runware Video Model Search",
+ "Runware Video Speech Input",
+ "Runware Video Transcription",
+ "Runware Video Upscaler",
+ "Runware Vidu Provider Settings",
+ "Runware Wan Animate Advanced Feature Settings",
+ "Runware xAI Provider Settings",
+ "Runware3DInference",
+ "Runware3DInferenceInputs",
+ "RunwareAlibabaProviderSettings",
+ "RunwareAudioInferenceInputs",
+ "RunwareAudioInput",
+ "RunwareAudioInputCombine",
+ "RunwareBlackForestProviderSettings",
+ "RunwareBriaProviderMask",
+ "RunwareBriaProviderSettings",
+ "RunwareBytedanceProviderSettings",
+ "RunwareFrameImages",
+ "RunwareGoogleProviderSettings",
+ "RunwareKlingProviderSettings",
+ "RunwareLightricksProviderSettings",
+ "RunwareLumaProviderSettings",
+ "RunwareMidjourneyProviderSettings",
+ "RunwareMiniMaxProviderSettings",
+ "RunwareMireloProviderSettings",
+ "RunwareOpenAIProviderSettings",
+ "RunwarePixverseProviderSettings",
+ "RunwareRunwayProviderSettings",
+ "RunwareSafetyInputs",
+ "RunwareSave3D",
+ "RunwareSettings",
+ "RunwareSpeechInput",
+ "RunwareSpeechInputCombine",
+ "RunwareSyncProviderSettings",
+ "RunwareSyncSegment",
+ "RunwareUltralyticsInputs",
+ "RunwareUltralyticsProviderSettings",
+ "RunwareVectorize",
+ "RunwareVideoAdvancedFeatureInputs",
+ "RunwareVideoBgRemoval",
+ "RunwareVideoInferenceOutputs",
+ "RunwareVideoInputsFrameImages",
+ "RunwareVideoInputsReferences",
+ "RunwareVideoUpscaler",
+ "RunwareWanAnimateAdvancedFeatureSettings",
+ "RunwareXAIProviderSettings",
+ "txt2vid"
+ ],
+ {
+ "title_aux": "Runware.ai ComfyUI Inference API Integration"
+ }
+ ],
+ "https://github.com/RyukoMatoiFan/ComfyUI-STARFlow": [
+ [
+ "STARFlowCheckpointLoader",
+ "STARFlowSampler",
+ "STARFlowT5TextEncode",
+ "STARFlowVAEDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-STARFlow"
+ }
+ ],
+ "https://github.com/RyukoMatoiFan/ComfyUI-Switti": [
+ [
+ "SwittiCheckpointLoader",
+ "SwittiDualCLIPLoader",
+ "SwittiPipelineBuilder",
+ "SwittiSampler",
+ "SwittiVAECheckpointLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Switti"
+ }
+ ],
+ "https://github.com/Ryuukeisyou/comfyui_face_parsing": [
+ [
+ "BBoxDecompose(FaceParsing)",
+ "BBoxDetect(FaceParsing)",
+ "BBoxDetectorLoader(FaceParsing)",
+ "BBoxListItemSelect(FaceParsing)",
+ "BBoxResize(FaceParsing)",
+ "ColorAdjust(FaceParsing)",
+ "FaceParse(FaceParsing)",
+ "FaceParsingModelLoader(FaceParsing)",
+ "FaceParsingProcessorLoader(FaceParsing)",
+ "FaceParsingResultsParser(FaceParsing)",
+ "GuidedFilter(FaceParsing)",
+ "ImageCropWithBBox(FaceParsing)",
+ "ImageCropWithBBoxList(FaceParsing)",
+ "ImageInsertWithBBox(FaceParsing)",
+ "ImageListSelect(FaceParsing)",
+ "ImagePadWithBBox(FaceParsing)",
+ "ImageResizeCalculator(FaceParsing)",
+ "ImageResizeWithBBox(FaceParsing)",
+ "ImageSize(FaceParsing)",
+ "MaskBatchComposite(FaceParsing)",
+ "MaskBlackOut(FaceParsing)",
+ "MaskBorderDissolve(FaceParsing)",
+ "MaskBorderDissolveAdvanced(FaceParsing)",
+ "MaskComposite(FaceParsing)",
+ "MaskCropWithBBox(FaceParsing)",
+ "MaskInsertWithBBox(FaceParsing)",
+ "MaskListSelect(FaceParsing)",
+ "MaskToBBoxList(FaceParsing)"
+ ],
+ {
+ "title_aux": "comfyui_face_parsing"
+ }
+ ],
+ "https://github.com/Ryuukeisyou/comfyui_io_helpers": [
+ [
+ "ImageLoadAsMaskByPath(IOHelpers)",
+ "ImageLoadByPath(IOHelpers)",
+ "ImageLoadFromBase64(IOHelpers)",
+ "ImageSaveAsBase64(IOHelpers)",
+ "ImageSaveToPath(IOHelpers)",
+ "TypeConversion(IOHelpers)",
+ "VHSFileNamesToStrings(IOHelpers)"
+ ],
+ {
+ "title_aux": "comfyui_io_helpers"
+ }
+ ],
+ "https://github.com/S4MUEL-404/ComfyUI-Prepack": [
+ [
+ "PrepackCalculator",
+ "PrepackCondArea",
+ "PrepackGetPipe",
+ "PrepackKsampler",
+ "PrepackKsamplerAdvanced",
+ "PrepackLoras",
+ "PrepackLorasAndMSSD3",
+ "PrepackModelDualCLIP",
+ "PrepackModelSingleCLIP",
+ "PrepackNumberTypeConverter",
+ "PrepackSeed",
+ "PrepackSetPipe",
+ "\ud83d\udc80Prepack Calculator",
+ "\ud83d\udc80Prepack Int Combine",
+ "\ud83d\udc80Prepack Int Split",
+ "\ud83d\udc80Prepack Logic Int",
+ "\ud83d\udc80Prepack Logic String",
+ "\ud83d\udc80Prepack Merge Selector",
+ "\ud83d\udc80Prepack Number Type Converter",
+ "\ud83d\udc80Prepack Save By File Name"
+ ],
+ {
+ "title_aux": "ComfyUI Prepack"
+ }
+ ],
+ "https://github.com/S4MUEL-404/ComfyUI-PromptsO": [
+ [
+ "\ud83d\udc80S4AnyToString",
+ "\ud83d\udc80S4ImageWithGemini",
+ "\ud83d\udc80S4ImageWithGrok",
+ "\ud83d\udc80S4PromptsCombine",
+ "\ud83d\udc80S4PromptsFromJanusPro",
+ "\ud83d\udc80S4PromptsInput",
+ "\ud83d\udc80S4PromptsReplace",
+ "\ud83d\udc80S4PromptsSplit",
+ "\ud83d\udc80S4TextWithDeepseek",
+ "\ud83d\udc80S4TextWithGemini",
+ "\ud83d\udc80S4TextWithGrok",
+ "\ud83d\udc80S4TextWithOpenAI"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptsO"
+ }
+ ],
+ "https://github.com/S4MUEL-404/ComfyUI-S4Motion": [
+ [
+ "\ud83d\udc80Motion Config",
+ "\ud83d\udc80Motion Distortion",
+ "\ud83d\udc80Motion Mask",
+ "\ud83d\udc80Motion Opacity",
+ "\ud83d\udc80Motion Position",
+ "\ud83d\udc80Motion Position On Path",
+ "\ud83d\udc80Motion Rotation",
+ "\ud83d\udc80Motion Scale",
+ "\ud83d\udc80Motion Shake",
+ "\ud83d\udc80Video Combine",
+ "\ud83d\udc80Video Crop",
+ "\ud83d\udc80Video Frames",
+ "\ud83d\udc80Video Info",
+ "\ud83d\udc80Video Resize"
+ ],
+ {
+ "title_aux": "ComfyUI S4Motion"
+ }
+ ],
+ "https://github.com/S4MUEL-404/ComfyUI-S4Tool-Image": [
+ [
+ "ImageAdjustment",
+ "ImageAdjustmentColor",
+ "ImageBlendWithAlpha",
+ "ImageBoard",
+ "ImageColor",
+ "ImageColorPicker",
+ "ImageCombine",
+ "ImageCropToFit",
+ "ImageFromBase64",
+ "ImageFromFolder",
+ "ImageFromFolderByIndex",
+ "ImageFromURL",
+ "ImageGetColor",
+ "ImageMaskExpand",
+ "ImageOverlay",
+ "ImagePalette",
+ "ImagePalette631",
+ "ImagePaletteContrary",
+ "ImagePrimaryColor",
+ "ImageRMBG",
+ "ImageRemoveAlpha",
+ "ImageResize",
+ "ImageSAM",
+ "ImageSAM2",
+ "ImageTilingPattern",
+ "ImageToBase64"
+ ],
+ {
+ "title_aux": "ComfyUI S4Tool Image"
+ }
+ ],
+ "https://github.com/S4MUEL-404/ComfyUI-S4Tool-Text": [
+ [
+ "S4Tools Text Basic",
+ "S4Tools Text Font Base64",
+ "S4Tools Text Font URL",
+ "S4Tools Text Font file",
+ "S4Tools Text Style"
+ ],
+ {
+ "title_aux": "ComfyUI S4Tool Text"
+ }
+ ],
+ "https://github.com/SEkINVR/ComfyUI-SaveAs": [
+ [
+ "ComfyUISaveAs"
+ ],
+ {
+ "title_aux": "ComfyUI SaveAS"
+ }
+ ],
+ "https://github.com/SKBv0/ComfyUI_BlendPack": [
+ [
+ "BlendJoiner",
+ "BlendVideoCombine"
+ ],
+ {
+ "title_aux": "ComfyUI_BlendPack"
+ }
+ ],
+ "https://github.com/SKBv0/ComfyUI_SKBundle": [
+ [
+ "AspectRatioAdvanced",
+ "DisplayEverything",
+ "ImageComparer",
+ "LensFlare",
+ "MultiFloat",
+ "MultiTextNode",
+ "PaintPro",
+ "SKB_AnySwitch",
+ "SeamlessTexture",
+ "TextBox",
+ "TitlePlus"
+ ],
+ {
+ "title_aux": "ComfyUI SKBundle"
+ }
+ ],
+ "https://github.com/SKBv0/ComfyUI_SpideyReroute": [
+ [
+ "SpideyReroute"
+ ],
+ {
+ "title_aux": "ComfyUI_SpideyReroute"
+ }
+ ],
+ "https://github.com/SKFRMSEHF/comfyui_SK_Loader": [
+ [
+ "SK_CheckpointLoader",
+ "SK_CheckpointLoaderSimple",
+ "SK_LoraLoader",
+ "SK_PowerLoraLoader",
+ "SK_UNETLoader",
+ "SK_VAELoader",
+ "SK_unCLIPCheckpointLoader"
+ ],
+ {
+ "title_aux": "SK-ComfyUI-FolderingLoader"
+ }
+ ],
+ "https://github.com/SLAPaper/ComfyUI-Image-Selector": [
+ [
+ "ImageDuplicator",
+ "ImageSelector",
+ "LatentDuplicator",
+ "LatentSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Selector"
+ }
+ ],
+ "https://github.com/SLVGITHUB/QWEN3_TTS_DVA": [
+ [
+ "QwenTTSAudioSaver",
+ "QwenTTSBatchGenerate",
+ "QwenTTSEmotionMixer",
+ "QwenTTSGenerate",
+ "QwenTTSModelLoader",
+ "QwenTTSVoiceClone"
+ ],
+ {
+ "title_aux": "DVA_Qwen_TTS"
+ }
+ ],
+ "https://github.com/SOELexicon/ComfyUI-LexMSDBNodes": [
+ [
+ "MSSqlSelectNode",
+ "MSSqlTableNode"
+ ],
+ {
+ "title_aux": "LexMSDBNodes"
+ }
+ ],
+ "https://github.com/SOELexicon/ComfyUI-LexTools": [
+ [
+ "AesthetlcScoreSorter",
+ "AgeClassifierNode",
+ "ArtOrHumanClassifierNode",
+ "CalculateAestheticScore",
+ "DocumentClassificationNode",
+ "FoodCategoryClassifierNode",
+ "ImageAspectPadNode",
+ "ImageCaptioning",
+ "ImageFilterByFloatScoreNode",
+ "ImageFilterByIntScoreNode",
+ "ImageQualityScoreNode",
+ "ImageRankingNode",
+ "ImageScaleToMin",
+ "LoadAesteticModel",
+ "MD5ImageHashNode",
+ "NSFWClassifierNode",
+ "SamplerPropertiesNode",
+ "ScoreConverterNode",
+ "SeedIncrementerNode",
+ "SegformerNode",
+ "SegformerNodeMasks",
+ "SegformerNodeMergeSegments",
+ "StepCfgIncrementNode",
+ "WatermarkDetectionNode"
+ ],
+ {
+ "title_aux": "ComfyUI-LexTools"
+ }
+ ],
+ "https://github.com/SS-snap/ComfyUI-Ad_scheduler": [
+ [
+ "AD_Scheduler"
+ ],
+ {
+ "title_aux": "ComfyUI-Ad-scheduler"
+ }
+ ],
+ "https://github.com/SS-snap/ComfyUI-LBW_flux": [
+ [
+ "LoraBlockWeight_Flux"
+ ],
+ {
+ "title_aux": "ComfyUI-LBW_flux"
+ }
+ ],
+ "https://github.com/SS-snap/ComfyUI-Snap_Processing": [
+ [
+ "AreaCalculator",
+ "PyQtCanvasNode",
+ "Snapload"
+ ],
+ {
+ "title_aux": "Snap Processing for Comfyui"
+ }
+ ],
+ "https://github.com/SS-snap/Comfyui_SSsnap_pose-Remapping": [
+ [
+ "ApplyPoseScalesToFrames",
+ "CalculatePoseScales",
+ "ConvertPoseToStandardFormat",
+ "RenderKps"
+ ],
+ {
+ "title_aux": "Comfyui_SSsnap_pose-Remapping"
+ }
+ ],
+ "https://github.com/SXQBW/ComfyUI-Qwen": [
+ [
+ "Qwen2_Chat_Zho",
+ "Qwen2_ModelLoader_Zho",
+ "Qwen2_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen"
+ }
+ ],
+ "https://github.com/SXQBW/ComfyUI-Qwen-Omni": [
+ [
+ "QwenOmniCombined",
+ "VideoUploader"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen-Omni"
+ }
+ ],
+ "https://github.com/SXQBW/ComfyUI-Qwen-VL": [
+ [
+ "QwenVisionParser"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen-VL"
+ }
+ ],
+ "https://github.com/SaTaNoob/ComfyUI-Z-Image-Turbo-Resolutions": [
+ [
+ "ZImageTurboResolutions"
+ ],
+ {
+ "title_aux": "ComfyUI-Z-Image-Turbo-Resolutions"
+ }
+ ],
+ "https://github.com/Saganaki22/ComfyUI-Maya1_TTS": [
+ [
+ "Maya1TTS_Barebones",
+ "Maya1TTS_Combined"
+ ],
+ {
+ "title_aux": "Maya1 TTS"
+ }
+ ],
+ "https://github.com/Saganaki22/ComfyUI-Seedream4_Replicate": [
+ [
+ "Seedream4_Replicate"
+ ],
+ {
+ "title_aux": "Seedream4 Replicate"
+ }
+ ],
+ "https://github.com/Saganaki22/ComfyUI-Step_Audio_EditX_TTS": [
+ [
+ "StepAudio_AudioEdit",
+ "StepAudio_VoiceClone"
+ ],
+ {
+ "title_aux": "Step Audio EditX TTS"
+ }
+ ],
+ "https://github.com/Saganaki22/ComfyUI-dotWaveform": [
+ [
+ "DottedWaveformVisualizer"
+ ],
+ {
+ "title_aux": "dotWaveform"
+ }
+ ],
+ "https://github.com/SamKhoze/ComfyUI-DeepFuze": [
+ [
+ "DeepFuze Save",
+ "DeepFuzeAdavance",
+ "DeepFuzeFaceSwap",
+ "DeepfuzePreview",
+ "LLM_node",
+ "PlayBackAudio",
+ "TTS_generation"
+ ],
+ {
+ "title_aux": "DeepFuze"
+ }
+ ],
+ "https://github.com/SamLiu1000/ComfyUI_Rabbit-Camera-Perspective": [
+ [
+ "RabbitCameraSelector"
+ ],
+ {
+ "title_aux": "ComfyUI_Rabbit-Camera-Perspective"
+ }
+ ],
+ "https://github.com/SamLiu1000/ComfyUI_Resolution-and-Ratio": [
+ [
+ "ResolutionAndRatio"
+ ],
+ {
+ "title_aux": "ComfyUI_Resolution-and-Ratio"
+ }
+ ],
+ "https://github.com/SamTyurenkov/comfyui-vace-preprocessors": [
+ [
+ "CombineLayoutTracksNode",
+ "VideoLayoutTrackAnnotatorNode"
+ ],
+ {
+ "title_aux": "comfyui_vace_preprocessors"
+ }
+ ],
+ "https://github.com/SamTyurenkov/comfyui_chatgpt": [
+ [
+ "BananaImageEditNode",
+ "BananaImageGenerationNode",
+ "ChatGPTImageEditNode",
+ "ChatGPTImageGenerationNode",
+ "ImageToBase64"
+ ],
+ {
+ "title_aux": "comfyui_chatgpt"
+ }
+ ],
+ "https://github.com/Sampkao/ComfyUI-Amage": [
+ [
+ "Amage All in One",
+ "Amage FPS Converter",
+ "Amage STT",
+ "Amage Text"
+ ],
+ {
+ "title_aux": "ComfyUI-Amage"
+ }
+ ],
+ "https://github.com/San4itos/ComfyUI-Save-Images-as-Video": [
+ [
+ "ConvertVideoFFmpeg_san4itos",
+ "LoadVideoByPath_san4itos",
+ "SaveFramesToVideoFFmpeg_san4itos"
+ ],
+ {
+ "title_aux": "Save Images to Video (FFmpeg) for ComfyUI"
+ }
+ ],
+ "https://github.com/SanDiegoDude/ComfyUI-DeepStereo": [
+ [
+ "ColorPickerNode",
+ "DepthMapProcessor",
+ "ImageEffectsTransformer",
+ "ImageResizeAndTransform",
+ "MiDaSDepthEstimator",
+ "ProceduralTextureGenerator",
+ "RandomDotStereogramGenerator",
+ "RandomNoiseGenerator",
+ "StereogramGenerator",
+ "TextureTransformer"
+ ],
+ {
+ "title_aux": "ComfyUI-DeepStereo"
+ }
+ ],
+ "https://github.com/SanDiegoDude/ComfyUI-Kontext-API": [
+ [
+ "FalKontextMaxMultiImageNode",
+ "KontextAPINode"
+ ],
+ {
+ "title_aux": "ComfyUI-Kontext-API"
+ }
+ ],
+ "https://github.com/SanDiegoDude/ComfyUI-SaveAudioMP3": [
+ [
+ "SaveAudioMP3"
+ ],
+ {
+ "title_aux": "ComfyUI-SaveAudioMP3"
+ }
+ ],
+ "https://github.com/SanDiegoDude/ComfyUI-Soprano-TTS": [
+ [
+ "SopranoTTS"
+ ],
+ {
+ "title_aux": "ComfyUI-Soprano-TTS"
+ }
+ ],
+ "https://github.com/SanDiegoDude/SCG_LocalVLM": [
+ [
+ "Qwen",
+ "Qwen2.5",
+ "Qwen2.5VL",
+ "QwenVL"
+ ],
+ {
+ "title_aux": "SCG_LocalVLM"
+ }
+ ],
+ "https://github.com/Santat2023/ComfyUiRagNodes": [
+ [
+ "MyNodesForDB",
+ "MyNodesForLLM",
+ "MyNodesForRAG"
+ ],
+ {
+ "title_aux": "ComfyUiRagCustomNodes"
+ }
+ ],
+ "https://github.com/Santodan/santodan-custom-nodes-comfyui": [
+ [
+ "ExcludedLoras",
+ "ExtractAndApplyLoRAs",
+ "ListSelector",
+ "LoRACachePreloader",
+ "LoraMetadataHub",
+ "ModelAssembler",
+ "PromptListWithTemplates",
+ "RandomLoRACustom",
+ "RandomLoRACustomModel",
+ "RandomLoRAFolder",
+ "RandomLoRAFolderModel",
+ "Save Workflow & Shutdown",
+ "SaveWorkflowAndShutdown",
+ "SplitBatchWithPrefix",
+ "WildcardManager"
+ ],
+ {
+ "title_aux": "Santodan Random LoRA Node"
+ }
+ ],
+ "https://github.com/Saquib764/omini-kontext": [
+ [
+ "NunchakuOminiKontextPatch",
+ "OminiKontextConditioning",
+ "OminiKontextEditor",
+ "OminiKontextModelPatch",
+ "OminiQwenImageEditModelPatch"
+ ],
+ {
+ "title_aux": "Omini Kontext"
+ }
+ ],
+ "https://github.com/SatadalAI/SATA_UtilityNode": [
+ [
+ "Latent Machine",
+ "Latent_Machine",
+ "Preview Machine",
+ "Preview_Machine",
+ "Prompt Autocomplete",
+ "Prompt Machine",
+ "PromptAutocomplete",
+ "Prompt_Machine",
+ "Resolution Machine",
+ "Resolution_Machine",
+ "Save Machine",
+ "Save_Machine",
+ "Upscale Machine",
+ "Upscale_Machine"
+ ],
+ {
+ "title_aux": "SATA UtilityNode Node for ComfyUI"
+ }
+ ],
+ "https://github.com/SaturMars/ComfyUI-NVVFR": [
+ [
+ "NVVFR"
+ ],
+ {
+ "title_aux": "ComfyUI-NVVFR"
+ }
+ ],
+ "https://github.com/SaturMars/ComfyUI-QwenImageLoraConverter": [
+ [
+ "QwenLoraConverterNode"
+ ],
+ {
+ "title_aux": "ComfyUI Qwen LoRA Converter Node"
+ }
+ ],
+ "https://github.com/SayanoAI/Comfy-RVC": [
+ [
+ "Any2ListNode",
+ "AudioBatchValueNode",
+ "AudioInfoNode",
+ "AudioTranscriptionNode",
+ "BatchedTranscriptionEncoderNode",
+ "DownloadAudio",
+ "ImageRepeatInterleavedNode",
+ "LatentRepeatInterleavedNode",
+ "List2AnyNode",
+ "LoadHubertModel",
+ "LoadPitchExtractionParams",
+ "LoadRVCModelNode",
+ "LoadWhisperModelNode",
+ "MergeAudioNode",
+ "MergeImageBatches",
+ "MergeLatentBatches",
+ "MuseAudioFeatureExtractionNode",
+ "MuseImageFeatureExtractionNode",
+ "MuseTalkNode",
+ "ProcessAudioNode",
+ "RVC-Studio.LoadAudio",
+ "RVC-Studio.PreviewAudio",
+ "RVCNode",
+ "RVCProcessDatasetNode",
+ "RVCTrainModelNode",
+ "RVCTrainParamsNode",
+ "SimpleMathNode",
+ "SliceNode",
+ "SortImagesNode",
+ "UVR5Node",
+ "ZipNode"
+ ],
+ {
+ "title_aux": "Comfy-RVC"
+ }
+ ],
+ "https://github.com/Sayene/comfyui-base64-to-image-size": [
+ [
+ "LoadImageFromBase64Size"
+ ],
+ {
+ "title_aux": "comfyui-base64-to-image-size"
+ }
+ ],
+ "https://github.com/Scholar01/ComfyUI-Keyframe": [
+ [
+ "KeyframeApply",
+ "KeyframeInterpolationPart",
+ "KeyframePart"
+ ],
+ {
+ "title_aux": "SComfyUI-Keyframe"
+ }
+ ],
+ "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": [
+ [
+ "CombinedDiffusersLoader",
+ "DiffusersClipLoader",
+ "DiffusersUNETLoader",
+ "DiffusersVAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-DiffusersLoader"
+ }
+ ],
+ "https://github.com/Scorpiosis0/ComfyUI-WtlNodes": [
+ [
+ "Brightness",
+ "CameraDepthDOF",
+ "Contrast",
+ "DepthDOF",
+ "Dither",
+ "DualEaseCosineScheduler",
+ "EmptyLatent",
+ "Exposure",
+ "HighlightShadow",
+ "Hue",
+ "ImageResize",
+ "ImageRotate",
+ "ImageRotation",
+ "ImageTranslation",
+ "ImageZoom",
+ "LatentNoise",
+ "MaskFilter",
+ "MaskProcessor",
+ "MaskResize",
+ "MaskRotation",
+ "MaskTranslation",
+ "MaskZoom",
+ "RAMImageCompare",
+ "RAMPreviewImage",
+ "Saturation",
+ "SigmaVisualizer",
+ "Temperature"
+ ],
+ {
+ "title_aux": "WtlNodes"
+ }
+ ],
+ "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode": [
+ [
+ "OllamaCLIPTextEncode",
+ "OllamaPromptGenerator"
+ ],
+ {
+ "author": "Michael Standen",
+ "description": "Use AI to generate prompts and perform CLIP text encoding",
+ "nickname": "Ollama Prompt Encode",
+ "title": "Ollama Prompt Encode",
+ "title_aux": "Ollama Prompt Encode"
+ }
+ ],
+ "https://github.com/SeaArtLab/ComfyUI-Long-CLIP": [
+ [
+ "LongCLIPTextEncodeFlux",
+ "SeaArtLongClip",
+ "SeaArtLongXLClipMerge"
+ ],
+ {
+ "title_aux": "ComfyUI-Long-CLIP"
+ }
+ ],
+ "https://github.com/Sean-Bradley/ComfyUI-Get-Line": [
+ [
+ "Get Line"
+ ],
+ {
+ "title_aux": "ComfyUI-Get-Line"
+ }
+ ],
+ "https://github.com/Sean-Bradley/ComfyUI-Image-Compare": [
+ [
+ "ImageCompareNode"
+ ],
+ {
+ "title_aux": "ComfyUI Image Compare"
+ }
+ ],
+ "https://github.com/Sean-Bradley/ComfyUI-Remove-Background": [
+ [
+ "SBCODERemoveBackground"
+ ],
+ {
+ "title_aux": "Remove Background"
+ }
+ ],
+ "https://github.com/Sean-Bradley/ComfyUI-Sonic": [
+ [
+ "SONICSampler",
+ "SONICTLoader",
+ "SONIC_PreData"
+ ],
+ {
+ "title_aux": "ComfyUI-Sonic"
+ }
+ ],
+ "https://github.com/Sean-Bradley/ComfyUI-Video-Reverse": [
+ [
+ "VideoReverseNode"
+ ],
+ {
+ "title_aux": "ComfyUI Video Reverse"
+ }
+ ],
+ "https://github.com/Sean-Bradley/ComfyUI-Virtual-Webcam": [
+ [
+ "VirtualCamNode"
+ ],
+ {
+ "title_aux": "ComfyUI Virtual Webcam"
+ }
+ ],
+ "https://github.com/Sean-Bradley/ComfyUI-Voice-Clone": [
+ [
+ "DetectWatermarkNode",
+ "VoiceCloneNode",
+ "VoiceReplaceNode"
+ ],
+ {
+ "title_aux": "ComfyUI Voice Clone"
+ }
+ ],
+ "https://github.com/SeanScripts/ComfyUI-PixtralLlamaMolmoVision": [
+ [
+ "AutoVisionModelLoader",
+ "JoinString",
+ "LlamaVisionGenerateText",
+ "LlamaVisionModelLoader",
+ "MolmoGenerateText",
+ "MolmoModelLoader",
+ "ParseBoundingBoxes",
+ "ParsePoints",
+ "PixtralGenerateText",
+ "PixtralModelLoader",
+ "PlotPoints",
+ "RegexFindAll",
+ "RegexSearch",
+ "RegexSplitString",
+ "RegexSubstitution",
+ "SelectIndex",
+ "SliceList"
+ ],
+ {
+ "title_aux": "ComfyUI-PixtralLlamaMolmoVision"
+ }
+ ],
+ "https://github.com/SeanScripts/ComfyUI-Unload-Model": [
+ [
+ "UnloadAllModels",
+ "UnloadModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Unload-Model"
+ }
+ ],
+ "https://github.com/SeargeDP/ComfyUI_Searge_LLM": [
+ [
+ "Searge_AdvOptionsNode",
+ "Searge_LLM_Node",
+ "Searge_Output_Node"
+ ],
+ {
+ "title_aux": "Searge-LLM for ComfyUI v1.0"
+ }
+ ],
+ "https://github.com/SeargeDP/SeargeSDXL": [
+ [
+ "SeargeAdvancedParameters",
+ "SeargeCheckpointLoader",
+ "SeargeConditionMixing",
+ "SeargeConditioningMuxer2",
+ "SeargeConditioningMuxer5",
+ "SeargeConditioningParameters",
+ "SeargeControlnetAdapterV2",
+ "SeargeControlnetModels",
+ "SeargeCustomAfterUpscaling",
+ "SeargeCustomAfterVaeDecode",
+ "SeargeCustomPromptMode",
+ "SeargeDebugPrinter",
+ "SeargeEnablerInputs",
+ "SeargeFloatConstant",
+ "SeargeFloatMath",
+ "SeargeFloatPair",
+ "SeargeFreeU",
+ "SeargeGenerated1",
+ "SeargeGenerationParameters",
+ "SeargeHighResolution",
+ "SeargeImage2ImageAndInpainting",
+ "SeargeImageAdapterV2",
+ "SeargeImageSave",
+ "SeargeImageSaving",
+ "SeargeInput1",
+ "SeargeInput2",
+ "SeargeInput3",
+ "SeargeInput4",
+ "SeargeInput5",
+ "SeargeInput6",
+ "SeargeInput7",
+ "SeargeIntegerConstant",
+ "SeargeIntegerMath",
+ "SeargeIntegerPair",
+ "SeargeIntegerScaler",
+ "SeargeLatentMuxer3",
+ "SeargeLoraLoader",
+ "SeargeLoras",
+ "SeargeMagicBox",
+ "SeargeModelSelector",
+ "SeargeOperatingMode",
+ "SeargeOutput1",
+ "SeargeOutput2",
+ "SeargeOutput3",
+ "SeargeOutput4",
+ "SeargeOutput5",
+ "SeargeOutput6",
+ "SeargeOutput7",
+ "SeargeParameterProcessor",
+ "SeargePipelineStart",
+ "SeargePipelineTerminator",
+ "SeargePreviewImage",
+ "SeargePromptAdapterV2",
+ "SeargePromptCombiner",
+ "SeargePromptStyles",
+ "SeargePromptText",
+ "SeargeSDXLBasePromptEncoder",
+ "SeargeSDXLImage2ImageSampler",
+ "SeargeSDXLImage2ImageSampler2",
+ "SeargeSDXLPromptEncoder",
+ "SeargeSDXLRefinerPromptEncoder",
+ "SeargeSDXLSampler",
+ "SeargeSDXLSampler2",
+ "SeargeSDXLSamplerV3",
+ "SeargeSamplerInputs",
+ "SeargeSaveFolderInputs",
+ "SeargeSeparator",
+ "SeargeStylePreprocessor",
+ "SeargeTextInputV2",
+ "SeargeUpscaleModelLoader",
+ "SeargeUpscaleModels",
+ "SeargeVAELoader"
+ ],
+ {
+ "title_aux": "SeargeSDXL"
+ }
+ ],
+ "https://github.com/Seb-Lis/ComfyUI_Gemini_3_Pro_API_node": [
+ [
+ "GeminiImageGen"
+ ],
+ {
+ "title_aux": "ComfyUI_Gemini_3_Pro_API_node"
+ }
+ ],
+ "https://github.com/Seb-Lis/ComfyUI_Node_Pack": [
+ [
+ "GenerationTime",
+ "ImageGrid",
+ "KSamplerControl",
+ "TextLabel"
+ ],
+ {
+ "title_aux": "ComfyUI_Node_Pack"
+ }
+ ],
+ "https://github.com/Seb-Lis/comfyui-image-labeler": [
+ [
+ "AddTextLabel"
+ ],
+ {
+ "title_aux": "comfyui-image-labeler"
+ }
+ ],
+ "https://github.com/Sekiun/ComfyUI-WebpToPNGSequence": [
+ [
+ "WebpToPngSequence"
+ ],
+ {
+ "title_aux": "ComfyUI-WebpToPNGSequence"
+ }
+ ],
+ "https://github.com/Semonxue/Comfyui-flexai": [
+ [
+ "flexai:openai_image",
+ "flexai:openai_text"
+ ],
+ {
+ "title_aux": "ComfyUI FlexAI Nodes"
+ }
+ ],
+ "https://github.com/Semper-Sursum/HF-Flux-ComfyUI": [
+ [
+ "HuggingFaceTextToImage"
+ ],
+ {
+ "title_aux": "HF-Flux-ComfyUI"
+ }
+ ],
+ "https://github.com/SergPoletaev/ComfyUI-SPoletNodes": [
+ [
+ "EnhancedVideoPreview",
+ "GetImageSizeWithPreview",
+ "Save Images & Preview",
+ "UltimateMemoryCleaner",
+ "Video Concat (FFmpeg)",
+ "VideoBatchCrossfade"
+ ],
+ {
+ "title_aux": "ComfyUI-SPoletNodes"
+ }
+ ],
+ "https://github.com/ServiceStack/comfy-asset-downloader": [
+ [
+ "AssetDownloader"
+ ],
+ {
+ "title_aux": "ComfyUI Asset Downloader"
+ }
+ ],
+ "https://github.com/SethRobinson/comfyui-workflow-to-api-converter-endpoint": [
+ [
+ "WorkflowToAPIConverter"
+ ],
+ {
+ "title_aux": "Workflow to API Converter Endpoint"
+ }
+ ],
+ "https://github.com/Shadowwalker0P/CryptoNoise-Ksampler": [
+ [
+ "CryptoNoise_KSampler"
+ ],
+ {
+ "title_aux": "CryptoNoise-Ksampler"
+ }
+ ],
+ "https://github.com/Shakker-Labs/ComfyUI-IPAdapter-Flux": [
+ [
+ "ApplyIPAdapterFlux",
+ "ApplyIPAdapterFluxAdvanced",
+ "IPAdapterFluxLoader",
+ "IPAdapterFluxLoaderAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-IPAdapter-Flux"
+ }
+ ],
+ "https://github.com/ShammiG/ComfyUI-Image_Properties_SG": [
+ [
+ "LoadImageandviewPropertiesSG",
+ "PreviewImageandviewPropertiesSG",
+ "SaveImageFormatQualityPropertiesSG",
+ "ViewImagePropertiesSG"
+ ],
+ {
+ "title_aux": "ComfyUI Image Properties SG"
+ }
+ ],
+ "https://github.com/ShammiG/ComfyUI-Show-Clock-in-CMD-Console-SG": [
+ [
+ "ShowClockinCMDconsoleSG"
+ ],
+ {
+ "title_aux": "ComfyUI Show Clock in CMD Console SG"
+ }
+ ],
+ "https://github.com/ShammiG/ComfyUI-Show_Any_Text_in_CMD_Console-SG": [
+ [
+ "ShowAnyTextInCMDconsoleSG"
+ ],
+ {
+ "title_aux": "ComfyUI-Show_Any_Text_in_CMD_Console-SG"
+ }
+ ],
+ "https://github.com/ShammiG/ComfyUI-Simple_Readable_Metadata-SG": [
+ [
+ "SaveNegativePromptSG",
+ "SavePositivePromptSG",
+ "Simple Readable Metadata Text Viewer-SG",
+ "SimpleReadableMetadataMAXSG",
+ "SimpleReadableMetadataSG",
+ "SimpleReadableMetadataSaveTextSG",
+ "SimpleReadableMetadataVideoSG"
+ ],
+ {
+ "title_aux": "ComfyUI-Simple_Readable_Metadata-SG"
+ }
+ ],
+ "https://github.com/ShammiG/ComfyUI-VAE-Timestamp-Clock-SG": [
+ [
+ "VAEClockStartSG",
+ "VAEClockStopSG"
+ ],
+ {
+ "title_aux": "ComfyUI VAE Timestamp Clock SG"
+ }
+ ],
+ "https://github.com/ShammiG/ComfyUI_Text_Tools_SG": [
+ [
+ "Text Tools Editor-SG",
+ "Text Tools Load Text FilePath-SG",
+ "Text Tools Load Text-SG",
+ "Text Tools Merge Text Multi-SG",
+ "Text Tools Merge Text-SG",
+ "Text Tools Save Text File-SG",
+ "Text Tools Viewer-SG"
+ ],
+ {
+ "title_aux": "ComfyUI_Text_Tools_SG"
+ }
+ ],
+ "https://github.com/Shannooty/ComfyUI-Timer-Nodes": [
+ [
+ "TimerStart",
+ "TimerStringConcat"
+ ],
+ {
+ "title_aux": "ComfyUI Timer Nodes"
+ }
+ ],
+ "https://github.com/Shellishack/comfyui_remote_media_io": [
+ [
+ "LoadRemoteAudio",
+ "LoadRemoteImage",
+ "LoadRemoteVideo",
+ "SaveAudioToRemote",
+ "SaveImageToRemote",
+ "SaveVideoToRemote"
+ ],
+ {
+ "title_aux": "comfyui_remote_media_io"
+ }
+ ],
+ "https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting": [
+ [
+ "CropImageByRect",
+ "INPAINT_ColorCorrection",
+ "INPAINT_CropImage",
+ "INPAINT_InpaintingWithModel",
+ "INPAINT_LoadModel",
+ "INPAINT_PasteBackCropImage",
+ "INPAINT_VAEDecode",
+ "INPAINT_VAEEncode",
+ "ImagePostprocess",
+ "ImagePreprocess"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Inpainting"
+ }
+ ],
+ "https://github.com/Shiba-2-shiba/ComfyUI-HSWQ-Quantizer": [
+ [
+ "HSWQAdvancedBenchmark",
+ "HSWQFP8ConverterNodeLegacy",
+ "SDXLHSWQCalibrationNode",
+ "SDXLHSWQFP8QuantizerNode"
+ ],
+ {
+ "title_aux": "ComfyUI-HSWQ-Quantizer"
+ }
+ ],
+ "https://github.com/Shiba-2-shiba/ComfyUI-Magcache-for-SDXL": [
+ [
+ "MagCacheSDXL",
+ "MagCacheSDXLCalibration"
+ ],
+ {
+ "title_aux": "ComfyUI-Magcache-for-SDXL"
+ }
+ ],
+ "https://github.com/Shiba-2-shiba/ComfyUI-Unofficial-HSWQ-QuantizerHSWQ-Quantizer": [
+ [
+ "HSWQAdvancedBenchmark",
+ "HSWQFP8ConverterNodeLegacy",
+ "SDXLHSWQCalibrationNode",
+ "SDXLHSWQFP8QuantizerNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Unofficial-HSWQ-QuantizerHSWQ-Quantizer"
+ }
+ ],
+ "https://github.com/Shiba-2-shiba/ComfyUI_DiffusionModel_fp8_converter": [
+ [
+ "ClipFP8ConverterNode",
+ "ModelFP8ConverterNode"
+ ],
+ {
+ "title_aux": "ComfyUI_DiffusionModel_fp8_converter"
+ }
+ ],
+ "https://github.com/Shiba-2-shiba/ComfyUI_FreeU_V2_advanced": [
+ [
+ "FreeU_B_Scaling",
+ "FreeU_S_Scaling_AdaptiveCap",
+ "FreeU_V2_timestepadd"
+ ],
+ {
+ "title_aux": "ComfyUI_FreeU_V2_advanced"
+ }
+ ],
+ "https://github.com/Shiba-2-shiba/ComfyUI_FreeU_V2_timestepadd": [
+ [
+ "FreeU_B_Scaling",
+ "FreeU_S_Scaling_AdaptiveCap",
+ "FreeU_V2_timestepadd"
+ ],
+ {
+ "title_aux": "ComfyUI_FreeU_V2_timestepadd"
+ }
+ ],
+ "https://github.com/Shiba-2-shiba/comfyui-color-ascii-art-node": [
+ [
+ "ASCIIArtNodeV3"
+ ],
+ {
+ "title_aux": "ComfyUI-color-ascii-art-node"
+ }
+ ],
+ "https://github.com/Shibiko-AI/ShibikoAI-ComfyUI-Tools": [
+ [
+ "BboxInsertImage",
+ "BboxSplit",
+ "Cascade",
+ "ImageFilters",
+ "LMS_VisionController",
+ "Luts",
+ "LutsAdvanced",
+ "RemoveAreaByMask",
+ "RemoveBackground",
+ "RemoveNoise",
+ "SeedGenerator",
+ "Waifu2x"
+ ],
+ {
+ "title_aux": "Shibiko AI ComfyUI Tools"
+ }
+ ],
+ "https://github.com/ShinChven/sc-comfy-nodes": [
+ [
+ "Aspect Ratio",
+ "Rescale Node",
+ "Width & Height"
+ ],
+ {
+ "title_aux": "ShinChven's Custom Nodes Package"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-Apply_Style_Model_Adjust": [
+ [
+ "ApplyStyleModelAdjust"
+ ],
+ {
+ "title_aux": "Apply Style Model Adjust for ComfyUI"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-AstralAnimator": [
+ [
+ "AstralAnimator"
+ ],
+ {
+ "title_aux": "ComfyUI-AstralAnimator"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-Audio_Quality_Enhancer": [
+ [
+ "AudioQualityEffects",
+ "AudioQualityEnhancer"
+ ],
+ {
+ "title_aux": "ComfyUI-Audio_Quality_Enhancer"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-CohernetVideoSampler": [
+ [
+ "CohernetVideoSampler"
+ ],
+ {
+ "title_aux": "ComfyUI Coherent Video Sampler Node"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-DeepSeek_R1-Chat": [
+ [
+ "ComfyUIDeepSeekChat"
+ ],
+ {
+ "title_aux": "ComfyUI DeepSeek_R1 Chat Node"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-EmptyHunyuanLatent": [
+ [
+ "EmptyHunyuanLatentForImage",
+ "EmptyHunyuanLatentForVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-EmptyHunyuanLatent"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-FramePackWrapper_Plus": [
+ [
+ "DownloadAndLoadFramePackModel",
+ "FramePackFindNearestBucket",
+ "FramePackLoraSelect",
+ "FramePackSampler",
+ "FramePackSampler_F1",
+ "FramePackTimestampedTextEncode",
+ "FramePackTorchCompileSettings",
+ "LoadFramePackModel"
+ ],
+ {
+ "title_aux": "ComfyUI-FramePackWrapper_Plus"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-FreeMemory": [
+ [
+ "FreeMemoryCLIP",
+ "FreeMemoryImage",
+ "FreeMemoryLatent",
+ "FreeMemoryModel",
+ "FreeMemoryString"
+ ],
+ {
+ "title_aux": "ComfyUI-FreeMemory"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-FreeVC_wrapper": [
+ [
+ "FreeVC Voice Conversion"
+ ],
+ {
+ "title_aux": "ComfyUI-FreeVC_wrapper"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-Gemini_Flash_2.0_Exp": [
+ [
+ "AudioRecorder",
+ "GeminiFlash"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemini_Flash_2.0_Exp"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-Gemini_TTS": [
+ [
+ "GeminiTTS"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemini_TTS"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-HiggsAudio_Wrapper": [
+ [
+ "HiggsAudio",
+ "LoadHiggsAudioModel",
+ "LoadHiggsAudioPrompt",
+ "LoadHiggsAudioSystemPrompt",
+ "LoadHiggsAudioTokenizer"
+ ],
+ {
+ "title_aux": "ComfyUI-HiggsAudio_Wrapper"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-HunyuanVideoSamplerSave": [
+ [
+ "EmptyVideoLatentForHunyuan",
+ "HunyuanVideoSamplerSave",
+ "ImageMotionInfluance",
+ "ResizeImageForHunyuan"
+ ],
+ {
+ "title_aux": "ComfyUI-HunyuanVideoSamplerSave"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-HunyuanVideoStyler": [
+ [
+ "HunyuanVideoStyler"
+ ],
+ {
+ "title_aux": "ComfyUI-HunyuanVideoStyler"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-ImageMotionGuider": [
+ [
+ "ImageMotionGuider"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageMotionGuider"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-Janus_pro_vision": [
+ [
+ "UnifiedVisionAnalyzer",
+ "VisionModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI Janus Pro Vision"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-JoyHallo_wrapper": [
+ [
+ "JoyHallo_wrapper"
+ ],
+ {
+ "title_aux": "ComfyUI-JoyHallo_wrapper"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-LatentSyncWrapper": [
+ [
+ "LatentSyncNode",
+ "VideoLengthAdjuster"
+ ],
+ {
+ "title_aux": "ComfyUI-LatentSyncWrapper"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-NanoBanano": [
+ [
+ "ComfyUI_NanoBanana"
+ ],
+ {
+ "title_aux": "ComfyUI-NanoBanano"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-Orpheus-TTS": [
+ [
+ "OrpheusAudioEffects",
+ "OrpheusGenerate",
+ "OrpheusModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Orpheus-TTS"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-PS_Flatten_Image": [
+ [
+ "FlattenImage"
+ ],
+ {
+ "title_aux": "ComfyUI-PS_Flatten_Image"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-PixArt_XL": [
+ [
+ "PA_BaseModelLoader_fromhub",
+ "PA_Generation"
+ ],
+ {
+ "title_aux": "ComfyUI-PixArt_XL"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-SVDResizer": [
+ [
+ "SVDResizer",
+ "SVDRsizer"
+ ],
+ {
+ "title_aux": "ComfyUI-SVDResizer"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-ThinkSound_Wrapper": [
+ [
+ "ThinkSoundFeatureUtilsLoader",
+ "ThinkSoundModelLoader",
+ "ThinkSoundSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-ThinkSound_Wrapper"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-Veo2-Experimental": [
+ [
+ "VeoTextToVideo",
+ "VeoToVHS",
+ "VeoVideoPreview"
+ ],
+ {
+ "title_aux": "ComfyUI-Veo2-Experimental"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-VideoUpscale_WithModel": [
+ [
+ "Free_Video_Memory",
+ "Video_Upscale_With_Model"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoUpscale_WithModel"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI-WanVideoKsampler": [
+ [
+ "WanVideoKsampler"
+ ],
+ {
+ "title_aux": "ComfyUI-WanVideoKsampler"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI_ChatterBox_Voice": [
+ [
+ "ChatterBoxVoiceCapture",
+ "ChatterBoxVoiceTTS",
+ "ChatterBoxVoiceVC"
+ ],
+ {
+ "title_aux": "ComfyUI_ChatterBox_Voice"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI_Gemini_Flash": [
+ [
+ "Gemini_Flash_002"
+ ],
+ {
+ "title_aux": "ComfyUI_Gemini_Flash"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI_Hedra": [
+ [
+ "HedraImageToVideo"
+ ],
+ {
+ "title_aux": "ComfyUI Hedra Node"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI_pixtral_large": [
+ [
+ "ComfyUIPixtralLarge",
+ "MultiImagesInput",
+ "preview_text"
+ ],
+ {
+ "title_aux": "ComfyUI Pixtral Large Extension"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI_pixtral_vision": [
+ [
+ "ComfyUIPixtralVision",
+ "MultiImagesInput",
+ "preview_text"
+ ],
+ {
+ "title_aux": "ComfyUI_pixtral_vision"
+ }
+ ],
+ "https://github.com/ShmuelRonen/ComfyUI_wav2lip": [
+ [
+ "LoadAudio",
+ "Wav2Lip"
+ ],
+ {
+ "title_aux": "Wav2Lip Node for ComfyUI"
+ }
+ ],
+ "https://github.com/ShmuelRonen/DJ_VideoAudioMixer": [
+ [
+ "DJ_VideoAudioMixer"
+ ],
+ {
+ "title_aux": "DJ_VideoAudioMixer"
+ }
+ ],
+ "https://github.com/ShmuelRonen/FluxKontextCreator": [
+ [
+ "FluxKontextCreator",
+ "FluxKontextCreatorExperimental"
+ ],
+ {
+ "title_aux": "Flux Kontext Creator for ComfyUI"
+ }
+ ],
+ "https://github.com/ShmuelRonen/comfyui-openai_fm": [
+ [
+ "OpenAIFMNode"
+ ],
+ {
+ "title_aux": "comfyui-openai_fm"
+ }
+ ],
+ "https://github.com/ShmuelRonen/flux_pro_integrative": [
+ [
+ "FluxProIntegrative"
+ ],
+ {
+ "title_aux": "ComfyUI Flux Pro Integrative - Enhanced Flux API Node"
+ }
+ ],
+ "https://github.com/ShmuelRonen/google_moogle": [
+ [
+ "googletrans"
+ ],
+ {
+ "title_aux": "Google Moogle"
+ }
+ ],
+ "https://github.com/ShmuelRonen/multi-lora-stack": [
+ [
+ "MultiLoRAStack",
+ "MultiLoRAStackModelOnly"
+ ],
+ {
+ "title_aux": "multi-lora-stack"
+ }
+ ],
+ "https://github.com/ShootTheSound/comfyUI-Realtime-Lora": [
+ [
+ "ApplyTrainedLora",
+ "ClippyRebornImageLoader",
+ "FLUXSelectiveLoRALoader",
+ "ImageOfDayLoader",
+ "LoRALoaderWithAnalysis",
+ "LoRALoaderWithAnalysisV2",
+ "ModelDiffToLoRA",
+ "MusubiFluxKleinLoraTrainer",
+ "MusubiQwenImageEditLoraTrainer",
+ "MusubiQwenImageLoraTrainer",
+ "MusubiWanLoraTrainer",
+ "MusubiZImageBaseLoraTrainer",
+ "MusubiZImageLoraTrainer",
+ "QwenSelectiveLoRALoader",
+ "RealtimeLoraTrainer",
+ "SD15LoraTrainer",
+ "SDXLLoraTrainer",
+ "SDXLSelectiveLoRALoader",
+ "ScheduledLoRALoader",
+ "WanSelectiveLoRALoader",
+ "ZImageSelectiveLoRALoader"
+ ],
+ {
+ "title_aux": "Realtime LoRA Trainer"
+ }
+ ],
+ "https://github.com/Shraknard/ComfyUI-Remover": [
+ [
+ "Remover"
+ ],
+ {
+ "title_aux": "ComfyUI-Remover"
+ }
+ ],
+ "https://github.com/Siberpone/lazy-pony-prompter": [
+ [
+ "LPP_Danbooru",
+ "LPP_Deleter",
+ "LPP_Derpibooru",
+ "LPP_E621",
+ "LPP_Loader_Danbooru",
+ "LPP_Loader_Derpibooru",
+ "LPP_Loader_E621",
+ "LPP_Saver"
+ ],
+ {
+ "title_aux": "Lazy Pony Prompter"
+ }
+ ],
+ "https://github.com/SidDays/ComfyUI-YuGiOh": [
+ [
+ "YuGiOhCardGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-YuGiOh"
+ }
+ ],
+ "https://github.com/SiegeKeebsOffical/comfyui-lmstudio": [
+ [
+ "LMStudioConnectivityV2",
+ "LMStudioGenerate",
+ "LMStudioGenerateAdvance",
+ "LMStudioGenerateV2",
+ "LMStudioOptionsV2",
+ "LMStudioSequentialPrompt",
+ "LMStudioSequentialPromptAdvanced",
+ "LMStudioVision"
+ ],
+ {
+ "title_aux": "comfyui-lmstudio"
+ }
+ ],
+ "https://github.com/Siempreflaco/ComfyUI-NCNodes": [
+ [
+ "Load3DMesh",
+ "NCAudioRecorderNode",
+ "NCImageProcessor",
+ "NCIncrementINT",
+ "NCLineCounter"
+ ],
+ {
+ "title_aux": "ComfyUI-NCNodes"
+ }
+ ],
+ "https://github.com/Sieyalixnet/ComfyUI_Textarea_Loaders": [
+ [
+ "CheckPointLoader_Text",
+ "EmptyLatentImage_Text",
+ "LoRALoader_Text",
+ "LoadImage_Text"
+ ],
+ {
+ "title_aux": "ComfyUI_Textarea_Loaders"
+ }
+ ],
+ "https://github.com/SignalCha1n/comfyui-ComfySnap": [
+ [
+ "FaceAvoidRandomY",
+ "LowQualityDigitalLook",
+ "SnapBasicFilters",
+ "SnapTextOverlay"
+ ],
+ {
+ "title_aux": "Snap Style Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/SijieMei/ComfyUI-promptHistory": [
+ [
+ "PromptHistory"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-History"
+ }
+ ],
+ "https://github.com/SilentZhang/comfyui-encrypt": [
+ [
+ "RSAEncryptNode",
+ "RSAKeyGeneratorNode"
+ ],
+ {
+ "title_aux": "comfyui-encrypt"
+ }
+ ],
+ "https://github.com/SilverAndJade/comfyui-silver-nodes": [
+ [
+ "SilverCivitAILoader",
+ "SilverFileTextLoader",
+ "SilverFlickrRandomImage",
+ "SilverFolderFilePathLoader",
+ "SilverFolderImageLoader",
+ "SilverFolderVideoLoader",
+ "SilverLoraModelLoader",
+ "SilverRandomFromList",
+ "SilverStringReplacer",
+ "SilverUrlImageLoader",
+ "SilverWebImageLoader"
+ ],
+ {
+ "title_aux": "ComfyUI Silver Nodes"
+ }
+ ],
+ "https://github.com/Simlym/comfyui-prompt-helper": [
+ [
+ "PromptProcessor"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Helper"
+ }
+ ],
+ "https://github.com/SimonHeese/ComfyUI_AnimationNodes/raw/refs/heads/main/animated_offset_pad.py": [
+ [
+ "AnimatedOffsetPadding"
+ ],
+ {
+ "title_aux": "ComfyUI_AnimationNodes"
+ }
+ ],
+ "https://github.com/Sinphaltimus/comfyui_fedcoms_node_pack": [
+ [
+ "EnhancedModelMetadataReader",
+ "ModelDataExtractor",
+ "ModelMetadataReader"
+ ],
+ {
+ "title_aux": "comfyui_fedcoms_node_pack"
+ }
+ ],
+ "https://github.com/SipherAGI/comfyui-animatediff": [
+ [
+ "AnimateDiffCombine",
+ "AnimateDiffLoraLoader",
+ "AnimateDiffModuleLoader",
+ "AnimateDiffSampler",
+ "AnimateDiffSlidingWindowOptions",
+ "ImageSizeAndBatchSize",
+ "LoadVideo"
+ ],
+ {
+ "title_aux": "AnimateDiff"
+ }
+ ],
+ "https://github.com/SleeeepyZhou/ComfyUI-CNtranslator": [
+ [
+ "CNtranslator",
+ "TextShow"
+ ],
+ {
+ "title_aux": "CNtranslator"
+ }
+ ],
+ "https://github.com/Slickytail/ComfyUI-InstantX-IPAdapter-SD3": [
+ [
+ "ApplyIPAdapterSD3",
+ "IPAdapterSD3Loader"
+ ],
+ {
+ "title_aux": "ComfyUI-InstantX-IPAdapter-SD3"
+ }
+ ],
+ "https://github.com/Slickytail/ComfyUI-RegionalAdaptiveSampling": [
+ [
+ "RegionalAdaptiveSampling"
+ ],
+ {
+ "title_aux": "ComfyUI-RegionalAdaptiveSampling"
+ }
+ ],
+ "https://github.com/SlothHole/Imitatoes": [
+ [
+ "ImitatoesSelfImprovingPrompt"
+ ],
+ {
+ "title_aux": "Imitatoes"
+ }
+ ],
+ "https://github.com/Smirnov75/ComfyUI-mxToolkit": [
+ [
+ "mxSeed",
+ "mxSlider",
+ "mxSlider2D",
+ "mxStop"
+ ],
+ {
+ "title_aux": "ComfyUI-mxToolkit"
+ }
+ ],
+ "https://github.com/Smuzzies/comfyui_meme_maker": [
+ [
+ "MemeMaker"
+ ],
+ {
+ "title_aux": "comfyui_meme_maker"
+ }
+ ],
+ "https://github.com/SnJake/SnJake_Baikal_Swin_Anime": [
+ [
+ "SnJakeAnimeUpscaleCheckpointLoader",
+ "SnJakeAnimeUpscaleInference"
+ ],
+ {
+ "title_aux": "SnJake_Baikal_Swin_Anime"
+ }
+ ],
+ "https://github.com/SnJake/SnJake_JPG_Artifacts_Noise_Cleaner": [
+ [
+ "SnJakeArtifactsRemover"
+ ],
+ {
+ "title_aux": "JPG & Noise Remover for ComfyUI"
+ }
+ ],
+ "https://github.com/SnJake/SnJake_Sapsan-VFI": [
+ [
+ "SnJakeSapsanVFICheckpointLoader",
+ "SnJakeSapsanVFIInterpolate"
+ ],
+ {
+ "title_aux": "SnJake_Sapsan-VFI"
+ }
+ ],
+ "https://github.com/SofianeAlla/ComfyUI-BespokeAI-3D": [
+ [
+ "BespokeAI3DGeneration",
+ "BespokeAI3DGenerationFromURL",
+ "BespokeAI3DPreview"
+ ],
+ {
+ "title_aux": "ComfyUI-BespokeAI-3D"
+ }
+ ],
+ "https://github.com/SoftMeng/ComfyUI-DeepCache-Fix": [
+ [
+ "DeepCache_Fix"
+ ],
+ {
+ "title_aux": "ComfyUI-DeepCache-Fix"
+ }
+ ],
+ "https://github.com/SoftMeng/ComfyUI-PIL": [
+ [
+ "PIL Effects (Mexx)",
+ "PIL Merge Image (Mexx)",
+ "PIL Remove Black Dots (Mexx)",
+ "PIL TITLE (Mexx)",
+ "PIL_Effects",
+ "PIL_MergeImage",
+ "PIL_RemoveBlackDots",
+ "PIL_TITLE"
+ ],
+ {
+ "title_aux": "ComfyUI-PIL"
+ }
+ ],
+ "https://github.com/SoftMeng/ComfyUI_ImageToText": [
+ [
+ "ComfyUI_ImageToText"
+ ],
+ {
+ "title_aux": "ComfyUI_ImageToText"
+ }
+ ],
+ "https://github.com/SoftMeng/ComfyUI_Mexx_Poster": [
+ [
+ "ComfyUI_Mexx_Poster"
+ ],
+ {
+ "title_aux": "ComfyUI_Mexx_Poster"
+ }
+ ],
+ "https://github.com/SoftMeng/ComfyUI_Mexx_Styler": [
+ [
+ "MexxSDXLPromptStyler",
+ "MexxSDXLPromptStylerAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI_Mexx_Styler"
+ }
+ ],
+ "https://github.com/SongGuo11/ComfyUI-SaveAnything-SG11": [
+ [
+ "SG11_SaveAnything"
+ ],
+ {
+ "title_aux": "ComfyUI SaveAnything Node (SG11)"
+ }
+ ],
+ "https://github.com/Sorcerio/MBM-Music-Visualizer": [
+ [
+ "mbmAudioFeatureCalculator",
+ "mbmAudioLoader",
+ "mbmImageConcat",
+ "mbmPromptSequenceBuilder",
+ "mbmPromptSequenceBuilderAdv",
+ "mbmPromptSequenceInterpolator",
+ "mbmPromptSequenceLoader",
+ "mbmPromptSequenceRenderer"
+ ],
+ {
+ "title_aux": "MBM's Music Visualizer"
+ }
+ ],
+ "https://github.com/SorenWeile/ComfyUI_MetaSaver": [
+ [
+ "MetaSaver",
+ "MetaSaverDynamic"
+ ],
+ {
+ "title_aux": "ComfyUI_MetaSaver"
+ }
+ ],
+ "https://github.com/SozeInc/ComfyUI-Mobile": [
+ [
+ "Send Notification (Mobile)",
+ "Send_Notification",
+ "Settings Launcher (Mobile)",
+ "Settings_Launcher",
+ "Ultimate Concat (Mobile)",
+ "Ultimate_Concat"
+ ],
+ {
+ "title_aux": "ComfyUI-Mobile"
+ }
+ ],
+ "https://github.com/SozeInc/ComfyUI_Soze": [
+ [
+ "Append To Text File",
+ "CSV Reader",
+ "CSV Reader X Checkpoint",
+ "CSV Reader X Lora",
+ "CSV Writer",
+ "Checkpoint File Loader",
+ "ComfyDeploy API Boolean Parameters",
+ "ComfyDeploy API Float Parameters",
+ "ComfyDeploy API Image Parameters",
+ "ComfyDeploy API Int Parameters",
+ "ComfyDeploy API Mixed Parameters",
+ "ComfyDeploy API Node",
+ "ComfyDeploy API String Parameters",
+ "Create Image Batch From JSON Array",
+ "ElevenLabs Voice Retriever",
+ "Empty Images",
+ "File Loader",
+ "Get Most Common Image Colors",
+ "Image Batch Process Switch",
+ "Image List Loader",
+ "Image Overlay",
+ "Image Resize With Aspect Correction",
+ "Is String Empty",
+ "JSON Array Iterator",
+ "JSON File Loader",
+ "JSON Value Parser",
+ "Load Files From Folder",
+ "Load Image",
+ "Load Image From URL",
+ "Load Images From Filepath",
+ "Load Images From Folder",
+ "Load Images From Folder X Lora",
+ "Load Images From JSONArray",
+ "Lora File Loader",
+ "Multi Find And Replace",
+ "Multi Image Batch",
+ "Multiline Concatenate Strings",
+ "Output Filename",
+ "Pad Mask",
+ "Prompt Cache",
+ "Prompt X Lora",
+ "Range(Num Steps) - Float",
+ "Range(Num Steps) - Int",
+ "Range(Step) - Float",
+ "Range(Step) - Int",
+ "Shrink Image",
+ "Simple JSON Parser",
+ "Special Character Replacer",
+ "String Functions",
+ "Text Contains (Return Bool)",
+ "Text Contains (Return String)",
+ "Variable Image Builder",
+ "XY Any",
+ "XY Image"
+ ],
+ {
+ "title_aux": "Quality of Life Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/SparknightLLC/ComfyUI-ConditionalInterrupt": [
+ [
+ "Conditional Interrupt",
+ "ConditionalInterrupt"
+ ],
+ {
+ "title_aux": "ComfyUI-ConditionalInterrupt"
+ }
+ ],
+ "https://github.com/SparknightLLC/ComfyUI-GPENO": [
+ [
+ "GPENO Face Restoration"
+ ],
+ {
+ "author": "yangxy (yangtao9009@gmail.com)",
+ "title_aux": "ComfyUI-GPENO"
+ }
+ ],
+ "https://github.com/SparknightLLC/ComfyUI-ImageAutosize": [
+ [
+ "ImageAutosize"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageAutosize"
+ }
+ ],
+ "https://github.com/SparknightLLC/ComfyUI-ImageAutotone": [
+ [
+ "ImageAutotone"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageAutotone"
+ }
+ ],
+ "https://github.com/SparknightLLC/ComfyUI-LatentClamp": [
+ [
+ "LatentClamp"
+ ],
+ {
+ "title_aux": "ComfyUI-LatentClamp"
+ }
+ ],
+ "https://github.com/SparknightLLC/ComfyUI-LatentOrientation": [
+ [
+ "LatentOrient"
+ ],
+ {
+ "title_aux": "ComfyUI-LatentOrientation"
+ }
+ ],
+ "https://github.com/SparknightLLC/ComfyUI-MakeSeamlessTexture": [
+ [
+ "SeamlessTextureHalfShift",
+ "SeamlessTextureMirroredCollage",
+ "SeamlessTexturePreProcessor",
+ "SeamlessTextureRadialMask",
+ "SeamlessTextureTiledPreview"
+ ],
+ {
+ "title_aux": "ComfyUI-MakeSeamlessTexture"
+ }
+ ],
+ "https://github.com/SparknightLLC/ComfyUI-MaskArbiter": [
+ [
+ "GroundingDinoSAM2SegmentList",
+ "MaskArbiter"
+ ],
+ {
+ "title_aux": "ComfyUI-MaskArbiter"
+ }
+ ],
+ "https://github.com/SparknightLLC/ComfyUI-ModelSamplingSD3Advanced": [
+ [
+ "ModelSamplingSD3Advanced"
+ ],
+ {
+ "title_aux": "ComfyUI-ModelSamplingSD3Advanced"
+ }
+ ],
+ "https://github.com/SparknightLLC/ComfyUI-SpectralVAEDetailer": [
+ [
+ "LatentDetailer",
+ "SpectralVAEDetailer"
+ ],
+ {
+ "title_aux": "ComfyUI-SpectralVAEDetailer"
+ }
+ ],
+ "https://github.com/SparknightLLC/ComfyUI-WeightedRandomChoice": [
+ [
+ "WeightedRandomChoice"
+ ],
+ {
+ "title_aux": "ComfyUI-WeightedRandomChoice"
+ }
+ ],
+ "https://github.com/SpenserCai/ComfyUI-FunAudioLLM": [
+ [
+ "CosyVoiceCrossLingualNode",
+ "CosyVoiceInstructNode",
+ "CosyVoiceLoadSpeakerModelFromUrlNode",
+ "CosyVoiceLoadSpeakerModelNode",
+ "CosyVoiceSFTNode",
+ "CosyVoiceSaveSpeakerModelNode",
+ "CosyVoiceZeroShotNode",
+ "SenseVoiceNode"
+ ],
+ {
+ "title_aux": "ComfyUI-FunAudioLLM"
+ }
+ ],
+ "https://github.com/Spin256/spin256-comfyui": [
+ [
+ "Spin256IntSelector",
+ "Spin256SizeSelector",
+ "Spin256StringSelector"
+ ],
+ {
+ "title_aux": "spin256-comfyui"
+ }
+ ],
+ "https://github.com/SquirrelRat/MultiString-Prompts": [
+ [
+ "MultiStringPrompts",
+ "MultiStringPromptsEncode"
+ ],
+ {
+ "title_aux": "MultiString Prompts"
+ }
+ ],
+ "https://github.com/SquirrelRat/WanVideoLooper": [
+ [
+ "WanVideoLooper",
+ "WanVideoLooperPrompts",
+ "WanVideoLoraSequencer"
+ ],
+ {
+ "title_aux": "WanVideoLooper"
+ }
+ ],
+ "https://github.com/SshunWang/ComfyUI_CosyVoice": [
+ [
+ "CosyVoice2Node",
+ "CosyVoiceDubbingNode",
+ "CosyVoiceNode",
+ "TextNode"
+ ],
+ {
+ "title_aux": "ComfyUI for CosyVoice"
+ }
+ ],
+ "https://github.com/Stability-AI/ComfyUI-SAI_API": [
+ [
+ "Stability Conservative Upscale",
+ "Stability Control Sketch",
+ "Stability Control Structure",
+ "Stability Control Style",
+ "Stability Creative Upscale",
+ "Stability Erase",
+ "Stability Fast Upscale",
+ "Stability Image Core",
+ "Stability Image Ultra",
+ "Stability Inpainting",
+ "Stability Outpainting",
+ "Stability Remove Background",
+ "Stability Replace Background and Relight",
+ "Stability SD3",
+ "Stability Search And Recolor",
+ "Stability Search and Replace"
+ ],
+ {
+ "title_aux": "Stability API nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/Stability-AI/stability-ComfyUI-nodes": [
+ [
+ "ColorBlend",
+ "ControlLoraSave",
+ "GetImageSize"
+ ],
+ {
+ "title_aux": "stability-ComfyUI-nodes"
+ }
+ ],
+ "https://github.com/StableLlama/ComfyUI-basic_data_handling": [
+ [
+ "Basic data handling: Boolean And",
+ "Basic data handling: Boolean Nand",
+ "Basic data handling: Boolean Nor",
+ "Basic data handling: Boolean Not",
+ "Basic data handling: Boolean Or",
+ "Basic data handling: Boolean Xor",
+ "Basic data handling: CastToBoolean",
+ "Basic data handling: CastToDict",
+ "Basic data handling: CastToFloat",
+ "Basic data handling: CastToInt",
+ "Basic data handling: CastToList",
+ "Basic data handling: CastToSet",
+ "Basic data handling: CastToString",
+ "Basic data handling: CompareLength",
+ "Basic data handling: ContinueFlow",
+ "Basic data handling: DataListAll",
+ "Basic data handling: DataListAny",
+ "Basic data handling: DataListAppend",
+ "Basic data handling: DataListContains",
+ "Basic data handling: DataListCount",
+ "Basic data handling: DataListCreate",
+ "Basic data handling: DataListCreateFromBoolean",
+ "Basic data handling: DataListCreateFromFloat",
+ "Basic data handling: DataListCreateFromInt",
+ "Basic data handling: DataListCreateFromString",
+ "Basic data handling: DataListEnumerate",
+ "Basic data handling: DataListExtend",
+ "Basic data handling: DataListFilter",
+ "Basic data handling: DataListFilterSelect",
+ "Basic data handling: DataListFirst",
+ "Basic data handling: DataListGetItem",
+ "Basic data handling: DataListIndex",
+ "Basic data handling: DataListInsert",
+ "Basic data handling: DataListLast",
+ "Basic data handling: DataListLength",
+ "Basic data handling: DataListListCreate",
+ "Basic data handling: DataListMax",
+ "Basic data handling: DataListMin",
+ "Basic data handling: DataListPop",
+ "Basic data handling: DataListPopRandom",
+ "Basic data handling: DataListRange",
+ "Basic data handling: DataListRemove",
+ "Basic data handling: DataListReverse",
+ "Basic data handling: DataListSetItem",
+ "Basic data handling: DataListShuffle",
+ "Basic data handling: DataListSlice",
+ "Basic data handling: DataListSort",
+ "Basic data handling: DataListSum",
+ "Basic data handling: DataListToList",
+ "Basic data handling: DataListToSet",
+ "Basic data handling: DataListZip",
+ "Basic data handling: DictCompare",
+ "Basic data handling: DictContainsKey",
+ "Basic data handling: DictCreate",
+ "Basic data handling: DictCreateFromBoolean",
+ "Basic data handling: DictCreateFromFloat",
+ "Basic data handling: DictCreateFromInt",
+ "Basic data handling: DictCreateFromItemsDataList",
+ "Basic data handling: DictCreateFromItemsList",
+ "Basic data handling: DictCreateFromLists",
+ "Basic data handling: DictCreateFromString",
+ "Basic data handling: DictExcludeKeys",
+ "Basic data handling: DictFilterByKeys",
+ "Basic data handling: DictFromKeys",
+ "Basic data handling: DictGet",
+ "Basic data handling: DictGetKeysValues",
+ "Basic data handling: DictGetMultiple",
+ "Basic data handling: DictInvert",
+ "Basic data handling: DictItems",
+ "Basic data handling: DictKeys",
+ "Basic data handling: DictLength",
+ "Basic data handling: DictMerge",
+ "Basic data handling: DictPop",
+ "Basic data handling: DictPopItem",
+ "Basic data handling: DictPopRandom",
+ "Basic data handling: DictRemove",
+ "Basic data handling: DictSet",
+ "Basic data handling: DictSetDefault",
+ "Basic data handling: DictUpdate",
+ "Basic data handling: DictValues",
+ "Basic data handling: Equal",
+ "Basic data handling: ExecutionOrder",
+ "Basic data handling: FloatAdd",
+ "Basic data handling: FloatAsIntegerRatio",
+ "Basic data handling: FloatCreate",
+ "Basic data handling: FloatDivide",
+ "Basic data handling: FloatDivideSafe",
+ "Basic data handling: FloatFromHex",
+ "Basic data handling: FloatHex",
+ "Basic data handling: FloatIsInteger",
+ "Basic data handling: FloatMultiply",
+ "Basic data handling: FloatPower",
+ "Basic data handling: FloatRound",
+ "Basic data handling: FloatSubtract",
+ "Basic data handling: FlowSelect",
+ "Basic data handling: ForceCalculation",
+ "Basic data handling: Generic And",
+ "Basic data handling: Generic Or",
+ "Basic data handling: GreaterThan",
+ "Basic data handling: GreaterThanOrEqual",
+ "Basic data handling: IfElifElse",
+ "Basic data handling: IfElse",
+ "Basic data handling: IntAdd",
+ "Basic data handling: IntBitCount",
+ "Basic data handling: IntBitLength",
+ "Basic data handling: IntCreate",
+ "Basic data handling: IntCreateWithBase",
+ "Basic data handling: IntDivide",
+ "Basic data handling: IntDivideSafe",
+ "Basic data handling: IntFromBytes",
+ "Basic data handling: IntModulus",
+ "Basic data handling: IntMultiply",
+ "Basic data handling: IntPower",
+ "Basic data handling: IntSubtract",
+ "Basic data handling: IntToBytes",
+ "Basic data handling: IsConnected",
+ "Basic data handling: IsNull",
+ "Basic data handling: LessThan",
+ "Basic data handling: LessThanOrEqual",
+ "Basic data handling: ListAll",
+ "Basic data handling: ListAny",
+ "Basic data handling: ListAppend",
+ "Basic data handling: ListContains",
+ "Basic data handling: ListCount",
+ "Basic data handling: ListCreate",
+ "Basic data handling: ListCreateFromBoolean",
+ "Basic data handling: ListCreateFromFloat",
+ "Basic data handling: ListCreateFromInt",
+ "Basic data handling: ListCreateFromString",
+ "Basic data handling: ListEnumerate",
+ "Basic data handling: ListExtend",
+ "Basic data handling: ListFirst",
+ "Basic data handling: ListGetItem",
+ "Basic data handling: ListIndex",
+ "Basic data handling: ListInsert",
+ "Basic data handling: ListLast",
+ "Basic data handling: ListLength",
+ "Basic data handling: ListMax",
+ "Basic data handling: ListMin",
+ "Basic data handling: ListPop",
+ "Basic data handling: ListPopRandom",
+ "Basic data handling: ListRange",
+ "Basic data handling: ListRemove",
+ "Basic data handling: ListReverse",
+ "Basic data handling: ListSetItem",
+ "Basic data handling: ListShuffle",
+ "Basic data handling: ListSlice",
+ "Basic data handling: ListSort",
+ "Basic data handling: ListSum",
+ "Basic data handling: ListToDataList",
+ "Basic data handling: ListToSet",
+ "Basic data handling: MathAbs",
+ "Basic data handling: MathAcos",
+ "Basic data handling: MathAsin",
+ "Basic data handling: MathAtan",
+ "Basic data handling: MathAtan2",
+ "Basic data handling: MathCeil",
+ "Basic data handling: MathCos",
+ "Basic data handling: MathDegrees",
+ "Basic data handling: MathE",
+ "Basic data handling: MathExp",
+ "Basic data handling: MathFloor",
+ "Basic data handling: MathFormula",
+ "Basic data handling: MathLog",
+ "Basic data handling: MathLog10",
+ "Basic data handling: MathMax",
+ "Basic data handling: MathMin",
+ "Basic data handling: MathPi",
+ "Basic data handling: MathRadians",
+ "Basic data handling: MathSin",
+ "Basic data handling: MathSqrt",
+ "Basic data handling: MathTan",
+ "Basic data handling: NotEqual",
+ "Basic data handling: NumberInRange",
+ "Basic data handling: PathAbspath",
+ "Basic data handling: PathBasename",
+ "Basic data handling: PathCommonPrefix",
+ "Basic data handling: PathDirname",
+ "Basic data handling: PathExists",
+ "Basic data handling: PathExpandVars",
+ "Basic data handling: PathGetCwd",
+ "Basic data handling: PathGetExtension",
+ "Basic data handling: PathGetSize",
+ "Basic data handling: PathGlob",
+ "Basic data handling: PathInputDir",
+ "Basic data handling: PathIsAbsolute",
+ "Basic data handling: PathIsDir",
+ "Basic data handling: PathIsFile",
+ "Basic data handling: PathJoin",
+ "Basic data handling: PathListDir",
+ "Basic data handling: PathLoadImageRGB",
+ "Basic data handling: PathLoadImageRGBA",
+ "Basic data handling: PathLoadMaskFromAlpha",
+ "Basic data handling: PathLoadMaskFromGreyscale",
+ "Basic data handling: PathLoadStringFile",
+ "Basic data handling: PathNormalize",
+ "Basic data handling: PathOutputDir",
+ "Basic data handling: PathRelative",
+ "Basic data handling: PathSaveImageRGB",
+ "Basic data handling: PathSaveImageRGBA",
+ "Basic data handling: PathSaveStringFile",
+ "Basic data handling: PathSetExtension",
+ "Basic data handling: PathSplit",
+ "Basic data handling: PathSplitExt",
+ "Basic data handling: RegexFindallDataList",
+ "Basic data handling: RegexFindallList",
+ "Basic data handling: RegexGroupDict",
+ "Basic data handling: RegexSearchGroupsDataList",
+ "Basic data handling: RegexSearchGroupsList",
+ "Basic data handling: RegexSplitDataList",
+ "Basic data handling: RegexSplitList",
+ "Basic data handling: RegexSub",
+ "Basic data handling: RegexTest",
+ "Basic data handling: SetAdd",
+ "Basic data handling: SetAll",
+ "Basic data handling: SetAny",
+ "Basic data handling: SetContains",
+ "Basic data handling: SetCreate",
+ "Basic data handling: SetCreateFromBoolean",
+ "Basic data handling: SetCreateFromFloat",
+ "Basic data handling: SetCreateFromInt",
+ "Basic data handling: SetCreateFromString",
+ "Basic data handling: SetDifference",
+ "Basic data handling: SetDiscard",
+ "Basic data handling: SetEnumerate",
+ "Basic data handling: SetIntersection",
+ "Basic data handling: SetIsDisjoint",
+ "Basic data handling: SetIsSubset",
+ "Basic data handling: SetIsSuperset",
+ "Basic data handling: SetLength",
+ "Basic data handling: SetPop",
+ "Basic data handling: SetPopRandom",
+ "Basic data handling: SetRemove",
+ "Basic data handling: SetSum",
+ "Basic data handling: SetSymmetricDifference",
+ "Basic data handling: SetToDataList",
+ "Basic data handling: SetToList",
+ "Basic data handling: SetUnion",
+ "Basic data handling: StringCapitalize",
+ "Basic data handling: StringCasefold",
+ "Basic data handling: StringCenter",
+ "Basic data handling: StringComparison",
+ "Basic data handling: StringConcat",
+ "Basic data handling: StringCount",
+ "Basic data handling: StringDataListJoin",
+ "Basic data handling: StringDecode",
+ "Basic data handling: StringEncode",
+ "Basic data handling: StringEndswith",
+ "Basic data handling: StringEscape",
+ "Basic data handling: StringExpandtabs",
+ "Basic data handling: StringFind",
+ "Basic data handling: StringFormatMap",
+ "Basic data handling: StringIn",
+ "Basic data handling: StringIsAlnum",
+ "Basic data handling: StringIsAlpha",
+ "Basic data handling: StringIsAscii",
+ "Basic data handling: StringIsDecimal",
+ "Basic data handling: StringIsDigit",
+ "Basic data handling: StringIsIdentifier",
+ "Basic data handling: StringIsLower",
+ "Basic data handling: StringIsNumeric",
+ "Basic data handling: StringIsPrintable",
+ "Basic data handling: StringIsSpace",
+ "Basic data handling: StringIsTitle",
+ "Basic data handling: StringIsUpper",
+ "Basic data handling: StringLength",
+ "Basic data handling: StringListJoin",
+ "Basic data handling: StringLjust",
+ "Basic data handling: StringLower",
+ "Basic data handling: StringLstrip",
+ "Basic data handling: StringRemoveprefix",
+ "Basic data handling: StringRemovesuffix",
+ "Basic data handling: StringReplace",
+ "Basic data handling: StringRfind",
+ "Basic data handling: StringRjust",
+ "Basic data handling: StringRsplitDataList",
+ "Basic data handling: StringRsplitList",
+ "Basic data handling: StringRstrip",
+ "Basic data handling: StringSplitDataList",
+ "Basic data handling: StringSplitList",
+ "Basic data handling: StringSplitlinesDataList",
+ "Basic data handling: StringSplitlinesList",
+ "Basic data handling: StringStartswith",
+ "Basic data handling: StringStrip",
+ "Basic data handling: StringSwapcase",
+ "Basic data handling: StringTitle",
+ "Basic data handling: StringUnescape",
+ "Basic data handling: StringUpper",
+ "Basic data handling: StringZfill",
+ "Basic data handling: SwitchCase",
+ "Basic data handling: TimeAddDelta",
+ "Basic data handling: TimeDelta",
+ "Basic data handling: TimeDifference",
+ "Basic data handling: TimeExtract",
+ "Basic data handling: TimeFormat",
+ "Basic data handling: TimeNow",
+ "Basic data handling: TimeNowUTC",
+ "Basic data handling: TimeParse",
+ "Basic data handling: TimeSubtractDelta",
+ "Basic data handling: TimeToUnix",
+ "Basic data handling: UnixToTime",
+ "TensorBinaryOp",
+ "TensorCreate",
+ "TensorInfo",
+ "TensorJoin",
+ "TensorPermute",
+ "TensorReshape",
+ "TensorSlice",
+ "TensorUnaryOp"
+ ],
+ {
+ "title_aux": "Basic data handling"
+ }
+ ],
+ "https://github.com/StarAsh042/ComfyUI_RollingArtist": [
+ [
+ "RollingArtist"
+ ],
+ {
+ "title_aux": "ComfyUI_RollingArtist"
+ }
+ ],
+ "https://github.com/StarIICraft/ComfyUI-Simple-Selector": [
+ [
+ "SimpleSelectorInt"
+ ],
+ {
+ "title_aux": "ComfyUI-Simple-Selector"
+ }
+ ],
+ "https://github.com/StarMagicAI/comfyui_tagger": [
+ [
+ "DownloadAndLoadFlorence2Lora_jsonL",
+ "DownloadAndLoadFlorence2Model_jsonL",
+ "Florence2ModelLoader_jsonL",
+ "Florence2Run_jsonL",
+ "batch_save_file_jsonL",
+ "batch_text_save_jsonL"
+ ],
+ {
+ "title_aux": "ComfyUI-tagger"
+ }
+ ],
+ "https://github.com/Starnodes2024/ComfyUI_StarNodes": [
+ [
+ "AdaptiveDetailEnhancement",
+ "DetailStarDaemon",
+ "FluxFillSampler",
+ "FluxStartSettings",
+ "Fluxstarsampler",
+ "OllamaModelChooser",
+ "QwenImageStartSettings",
+ "SD35StartSettings",
+ "SDXLStartSettings",
+ "SDstarsampler",
+ "Star Face Loader",
+ "Star3LoRAs",
+ "StarAdvanvesRatioLatent",
+ "StarApplyInfiniteYou",
+ "StarApplyOverlayDepth",
+ "StarBlackWhite",
+ "StarConditioningLoader",
+ "StarConditioningSaver",
+ "StarDeleteSamplerSettings",
+ "StarDenoiseSlider",
+ "StarDistilledOptimizerZIT",
+ "StarDivisibleDimension",
+ "StarDuplicateModelFinder",
+ "StarDynamicLora",
+ "StarDynamicLoraModelOnly",
+ "StarEasyTextStorage",
+ "StarFP8Converter",
+ "StarFP8ModelPatchLoader",
+ "StarFiveWildcards",
+ "StarFlowMatchOption",
+ "StarFlux2Condition",
+ "StarFrameFromVideo",
+ "StarGeminiRefiner",
+ "StarGridCaptionsBatcher",
+ "StarGridComposer",
+ "StarGridImageBatcher",
+ "StarHDREffects",
+ "StarIconExporter",
+ "StarImageEditQwenKontext",
+ "StarImageLoader1by1",
+ "StarImageLoop",
+ "StarImageSwitch",
+ "StarImageSwitch2",
+ "StarInfiniteYouAdvancedPatchMaker",
+ "StarInfiniteYouApply",
+ "StarInfiniteYouFaceCombine",
+ "StarInfiniteYouFaceSwap",
+ "StarInfiniteYouFaceSwapMod",
+ "StarInfiniteYouPatch",
+ "StarInfiniteYouPatchCombine",
+ "StarInfiniteYouSaver",
+ "StarLatentResize",
+ "StarLatentSwitch",
+ "StarLatentSwitch2",
+ "StarLoadImagePlus",
+ "StarLoadSamplerSettings",
+ "StarLoraWeightNormalizer",
+ "StarMetaInjector",
+ "StarModelPacker",
+ "StarNanoBanana",
+ "StarNewsScraper",
+ "StarOllamaSysprompterJC",
+ "StarPSDSaver",
+ "StarPSDSaver2",
+ "StarPSDSaverAdvLayers",
+ "StarPaletteExtractor",
+ "StarPromptPicker",
+ "StarQwenEditEncoder",
+ "StarQwenEditPlusConditioner",
+ "StarQwenImageEditInputs",
+ "StarQwenImageRatio",
+ "StarQwenRebalancePrompter",
+ "StarQwenRegionalPrompter",
+ "StarQwenWanRatio",
+ "StarRadialBlur",
+ "StarRandomImageLoader",
+ "StarSDUpscaleRefiner",
+ "StarSDUpscaleRefinerAdvanced",
+ "StarSampler",
+ "StarSaveFolderString",
+ "StarSavePanoramaJPEG",
+ "StarSaveSamplerSettings",
+ "StarSimpleFilters",
+ "StarSpecialFilters",
+ "StarStopAndGo",
+ "StarTextFilter",
+ "StarTextInput",
+ "StarTextStorage",
+ "StarVideoLoop",
+ "StarWatermark",
+ "StarWildcardsAdvanced",
+ "StarWildsAdv",
+ "Star_Image2Latent",
+ "Star_Show_Last_Frame",
+ "Starnodes_Aspect_Ratio",
+ "Starnodes_Aspect_Ratio_Advanced",
+ "Starnodes_Aspect_Video_Ratio",
+ "Starupscale",
+ "\u2b50 Star Save Image+"
+ ],
+ {
+ "title_aux": "ComfyUI_StarNodes"
+ }
+ ],
+ "https://github.com/Starnodes2024/comfyui_Starnodes_DyPE": [
+ [
+ "StarDyPEModelPatcher"
+ ],
+ {
+ "title_aux": "ComfyUI Star DyPE"
+ }
+ ],
+ "https://github.com/StartHua/ComfyUI_OOTDiffusion_CXH": [
+ [
+ "Ood_CXH"
+ ],
+ {
+ "title_aux": "ComfyUI_OOTDiffusion_CXH"
+ }
+ ],
+ "https://github.com/StartHua/ComfyUI_PCDMs": [
+ [
+ "PCDMS_CXH"
+ ],
+ {
+ "title_aux": "ComfyUI_PCDMs"
+ }
+ ],
+ "https://github.com/StartHua/ComfyUI_Seg_VITON": [
+ [
+ "segformer_agnostic",
+ "segformer_clothes",
+ "segformer_remove_bg",
+ "stabel_vition"
+ ],
+ {
+ "title_aux": "ComfyUI_Seg_VITON"
+ }
+ ],
+ "https://github.com/StartHua/Comfyui_CXH_DeepLX": [
+ [
+ "CXH_DeepLX_Free",
+ "CXH_DeepLX_translate"
+ ],
+ {
+ "title_aux": "Comfyui_CXH_DeepLX"
+ }
+ ],
+ "https://github.com/StartHua/Comfyui_CXH_FluxLoraMerge": [
+ [
+ "CXH_Lora_Merge"
+ ],
+ {
+ "title_aux": "Comfyui_CXH_FluxLoraMerge"
+ }
+ ],
+ "https://github.com/StartHua/Comfyui_CXH_Phi_3.5": [
+ [
+ "CXH_Phi_Run",
+ "CXH_Phi_chat_load",
+ "CXH_Phi_chat_min",
+ "CXH_Phi_load"
+ ],
+ {
+ "title_aux": "Comfyui_CXH_Phi_3.5"
+ }
+ ],
+ "https://github.com/StartHua/Comfyui_Gemini2": [
+ [
+ "CXH_Gemini2_TX",
+ "CXH_Gemini2_Vision",
+ "CXH_Local_Prompt"
+ ],
+ {
+ "title_aux": "Comfyui_Gemini2"
+ }
+ ],
+ "https://github.com/StartHua/Comfyui_joytag": [
+ [
+ "CXH_JoyTag"
+ ],
+ {
+ "title_aux": "Comfyui_joytag"
+ }
+ ],
+ "https://github.com/StartHua/Comfyui_segformer_b2_clothes": [
+ [
+ "segformer_b2_clothes",
+ "segformer_b3_fashion"
+ ],
+ {
+ "title_aux": "comfyui_segformer_b2_clothes"
+ }
+ ],
+ "https://github.com/Steudio/ComfyUI_Steudio": [
+ [
+ "Combine Tiles",
+ "Display UI",
+ "Divide Image and Select Tile",
+ "Divide and Conquer Algorithm",
+ "Load Images into List",
+ "Ratio Calculator",
+ "Ratio to Size",
+ "Seed Shifter",
+ "Sequence Generator",
+ "Simple Config"
+ ],
+ {
+ "title_aux": "ComfyUI Steudio"
+ }
+ ],
+ "https://github.com/Style-Mosaic/dino-x-comfyui-node": [
+ [
+ "DinoxDetector"
+ ],
+ {
+ "title_aux": "ComfyUI DINO-X Detector Node"
+ }
+ ],
+ "https://github.com/SuLU-K/comfyui-easy-sam3-tools": [
+ [
+ "ConvertPoseDataToPosePoint",
+ "PosePointSelector",
+ "Sam3DrawBBox",
+ "Sam3InteractiveBBoxEditor",
+ "Sam3MaskRangeSelector",
+ "SimpleMultiple"
+ ],
+ {
+ "title_aux": "comfyui-easy-sam3-tools"
+ }
+ ],
+ "https://github.com/SuperBeastsAI/ComfyUI-SuperBeasts": [
+ [
+ "Deflicker",
+ "Deflicker - Experimental (SuperBeasts.AI)",
+ "HDR Effects (SuperBeasts.AI)",
+ "HDREffects",
+ "Image Batch Manager (SuperBeasts.AI)",
+ "ImageBatchManagement",
+ "Make Resized Mask Batch (SuperBeasts.AI)",
+ "MakeResizedMaskBatch",
+ "Mask Batch Manager (SuperBeasts.AI)",
+ "MaskBatchManagement",
+ "Pixel Deflicker - Experimental (SuperBeasts.AI)",
+ "PixelDeflicker",
+ "SB Load Model (SuperBeasts.AI)",
+ "SBLoadModel",
+ "String List Manager (SuperBeasts.AI)",
+ "StringListManager",
+ "Super Pop Color Adjustment (SuperBeasts.AI)",
+ "Super Pop Residual Blend (SuperBeasts.AI)",
+ "SuperPopColorAdjustment",
+ "SuperPopResidualBlend"
+ ],
+ {
+ "title_aux": "ComfyUI-SuperBeasts"
+ }
+ ],
+ "https://github.com/SuperMasterBlasterLaser/ComfyUI_YOLO_Classifiers": [
+ [
+ "YOLO Classifier Model Loader",
+ "YOLO Classify"
+ ],
+ {
+ "title_aux": "ComfyUI_YOLO_Classifiers"
+ }
+ ],
+ "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes": [
+ [
+ "CR 8 Channel In",
+ "CR 8 Channel Out",
+ "CR Apply ControlNet",
+ "CR Apply LoRA Stack",
+ "CR Apply Model Merge",
+ "CR Apply Multi Upscale",
+ "CR Apply Multi-ControlNet",
+ "CR Arabic Text RTL",
+ "CR Aspect Ratio",
+ "CR Aspect Ratio Banners",
+ "CR Aspect Ratio SDXL",
+ "CR Aspect Ratio Social Media",
+ "CR Batch Images From List",
+ "CR Batch Process Switch",
+ "CR Binary Pattern",
+ "CR Binary To Bit List",
+ "CR Bit Schedule",
+ "CR Central Schedule",
+ "CR Checker Pattern",
+ "CR Clamp Value",
+ "CR Clip Input Switch",
+ "CR Color Bars",
+ "CR Color Gradient",
+ "CR Color Panel",
+ "CR Color Tint",
+ "CR Combine Prompt",
+ "CR Combine Schedules",
+ "CR Comic Panel Templates",
+ "CR Composite Text",
+ "CR Conditioning Input Switch",
+ "CR Conditioning Mixer",
+ "CR ControlNet Input Switch",
+ "CR Current Frame",
+ "CR Cycle Images",
+ "CR Cycle Images Simple",
+ "CR Cycle LoRAs",
+ "CR Cycle Models",
+ "CR Cycle Text",
+ "CR Cycle Text Simple",
+ "CR Data Bus In",
+ "CR Data Bus Out",
+ "CR Debatch Frames",
+ "CR Diamond Panel",
+ "CR Draw Perspective Text",
+ "CR Draw Pie",
+ "CR Draw Shape",
+ "CR Draw Text",
+ "CR Encode Scheduled Prompts",
+ "CR Feathered Border",
+ "CR Float Range List",
+ "CR Float To Integer",
+ "CR Float To String",
+ "CR Font File List",
+ "CR Get Parameter From Prompt",
+ "CR Gradient Float",
+ "CR Gradient Integer",
+ "CR Half Drop Panel",
+ "CR Halftone Filter",
+ "CR Halftone Grid",
+ "CR Hires Fix Process Switch",
+ "CR Image Border",
+ "CR Image Grid Panel",
+ "CR Image Input Switch",
+ "CR Image Input Switch (4 way)",
+ "CR Image List",
+ "CR Image List Simple",
+ "CR Image Output",
+ "CR Image Panel",
+ "CR Image Pipe Edit",
+ "CR Image Pipe In",
+ "CR Image Pipe Out",
+ "CR Image Size",
+ "CR Img2Img Process Switch",
+ "CR Increment Float",
+ "CR Increment Integer",
+ "CR Index",
+ "CR Index Increment",
+ "CR Index Multiply",
+ "CR Index Reset",
+ "CR Input Text List",
+ "CR Integer Multiple",
+ "CR Integer Range List",
+ "CR Integer To String",
+ "CR Interpolate Latents",
+ "CR Intertwine Lists",
+ "CR Keyframe List",
+ "CR Latent Batch Size",
+ "CR Latent Input Switch",
+ "CR LoRA List",
+ "CR LoRA Stack",
+ "CR Load Animation Frames",
+ "CR Load Flow Frames",
+ "CR Load GIF As List",
+ "CR Load Image List",
+ "CR Load Image List Plus",
+ "CR Load LoRA",
+ "CR Load Prompt Style",
+ "CR Load Schedule From File",
+ "CR Load Scheduled ControlNets",
+ "CR Load Scheduled LoRAs",
+ "CR Load Scheduled Models",
+ "CR Load Text List",
+ "CR Load Value List",
+ "CR Mask Text",
+ "CR Math Operation",
+ "CR Model Input Switch",
+ "CR Model List",
+ "CR Model Merge Stack",
+ "CR Module Input",
+ "CR Module Output",
+ "CR Module Pipe Loader",
+ "CR Multi Upscale Stack",
+ "CR Multi-ControlNet Stack",
+ "CR Multiline Text",
+ "CR Output Flow Frames",
+ "CR Output Schedule To File",
+ "CR Overlay Text",
+ "CR Overlay Transparent Image",
+ "CR Page Layout",
+ "CR Pipe Switch",
+ "CR Polygons",
+ "CR Prompt List",
+ "CR Prompt List Keyframes",
+ "CR Prompt Scheduler",
+ "CR Prompt Text",
+ "CR Radial Gradient",
+ "CR Random Hex Color",
+ "CR Random LoRA Stack",
+ "CR Random Multiline Colors",
+ "CR Random Multiline Values",
+ "CR Random Panel Codes",
+ "CR Random RGB",
+ "CR Random RGB Gradient",
+ "CR Random Shape Pattern",
+ "CR Random Weight LoRA",
+ "CR Repeater",
+ "CR SD1.5 Aspect Ratio",
+ "CR SDXL Aspect Ratio",
+ "CR SDXL Base Prompt Encoder",
+ "CR SDXL Prompt Mix Presets",
+ "CR SDXL Prompt Mixer",
+ "CR SDXL Style Text",
+ "CR Save Text To File",
+ "CR Schedule Input Switch",
+ "CR Schedule To ScheduleList",
+ "CR Seamless Checker",
+ "CR Seed",
+ "CR Seed to Int",
+ "CR Select Font",
+ "CR Select ISO Size",
+ "CR Select Model",
+ "CR Select Resize Method",
+ "CR Set Switch From String",
+ "CR Set Value On Binary",
+ "CR Set Value On Boolean",
+ "CR Set Value on String",
+ "CR Simple Banner",
+ "CR Simple Binary Pattern",
+ "CR Simple Binary Pattern Simple",
+ "CR Simple Image Compare",
+ "CR Simple List",
+ "CR Simple Meme Template",
+ "CR Simple Prompt List",
+ "CR Simple Prompt List Keyframes",
+ "CR Simple Prompt Scheduler",
+ "CR Simple Schedule",
+ "CR Simple Text Panel",
+ "CR Simple Text Scheduler",
+ "CR Simple Text Watermark",
+ "CR Simple Value Scheduler",
+ "CR Split String",
+ "CR Starburst Colors",
+ "CR Starburst Lines",
+ "CR String To Boolean",
+ "CR String To Combo",
+ "CR String To Number",
+ "CR Style Bars",
+ "CR Switch Model and CLIP",
+ "CR Text",
+ "CR Text Blacklist",
+ "CR Text Concatenate",
+ "CR Text Cycler",
+ "CR Text Input Switch",
+ "CR Text Input Switch (4 way)",
+ "CR Text Length",
+ "CR Text List",
+ "CR Text List Simple",
+ "CR Text List To String",
+ "CR Text Operation",
+ "CR Text Replace",
+ "CR Text Scheduler",
+ "CR Thumbnail Preview",
+ "CR Trigger",
+ "CR Upscale Image",
+ "CR VAE Decode",
+ "CR VAE Input Switch",
+ "CR Value",
+ "CR Value Cycler",
+ "CR Value Scheduler",
+ "CR Vignette Filter",
+ "CR XY From Folder",
+ "CR XY Index",
+ "CR XY Interpolate",
+ "CR XY List",
+ "CR XY Product",
+ "CR XY Save Grid Image",
+ "CR_Aspect Ratio For Print"
+ ],
+ {
+ "author": "Suzie1",
+ "description": "175 custom nodes for artists, designers and animators.",
+ "nickname": "Comfyroll Studio",
+ "title": "Comfyroll Studio",
+ "title_aux": "Comfyroll Studio"
+ }
+ ],
+ "https://github.com/Suzu008/ComfyUI-CryptIO": [
+ [
+ "PreviewImageCryptIO",
+ "PreviewVideoCryptIO",
+ "SaveImageCryptIO",
+ "SaveVideoCryptIO",
+ "TextDecrypt",
+ "TextEncrypt",
+ "UploadImageCryptIO",
+ "UploadVideoCryptIO"
+ ],
+ {
+ "title_aux": "ComfyUI-CryptIO"
+ }
+ ],
+ "https://github.com/SuzumiyaAkizuki/ComfyUI-LLM_Prompt_XML_Formatter": [
+ [
+ "LLM_Prompt_Formatter",
+ "LLM_Style_Saver",
+ "LLM_Xml_Style_Injector"
+ ],
+ {
+ "title_aux": "ComfyUI-LLM_Prompt_XML_Formatter"
+ }
+ ],
+ "https://github.com/Sxela/ComfyWarp": [
+ [
+ "ApplyMask",
+ "ApplyMaskConditional",
+ "ApplyMaskLatent",
+ "ApplyMaskLatentConditional",
+ "ExtractFlowAndMixConsistencyMaps",
+ "ExtractOpticalFlow",
+ "FixedQueue",
+ "KeyframedFlowApplication",
+ "LoadFrame",
+ "LoadFrameFromDataset",
+ "LoadFrameFromFolder",
+ "LoadFramePairFromDataset",
+ "LoadFrameSequence",
+ "MakeFrameDataset",
+ "MakePaths",
+ "MixConsistencyMaps",
+ "OffsetNumber",
+ "RenderVideo",
+ "ResizeToFit",
+ "SaveFrame",
+ "SchedulerFloat",
+ "SchedulerInt",
+ "SchedulerString",
+ "WarpFrame"
+ ],
+ {
+ "title_aux": "ComfyWarp"
+ }
+ ],
+ "https://github.com/SykkoAtHome/ComfyUI_FaceProcessor": [
+ [
+ "FaceFitAndRestore",
+ "FaceTracker",
+ "FaceWrapper",
+ "HighPassFilter",
+ "ImageFeeder"
+ ],
+ {
+ "title_aux": "Face Processor for ComfyUI"
+ }
+ ],
+ "https://github.com/T-Ph525/ComfyUI-Underage-Filter": [
+ [
+ "AgeCheckerNode",
+ "MultiTypeGateNode",
+ "UnderageFilterNode"
+ ],
+ {
+ "title_aux": "Underage Filter"
+ }
+ ],
+ "https://github.com/TFL-TFL/ComfyUI_Text_Translation": [
+ [
+ "Text",
+ "Text_Concatenate",
+ "Text_Switch",
+ "Text_Translation",
+ "Text_Translation_V2",
+ "Text_Translation_V2_Full"
+ ],
+ {
+ "title_aux": "ComfyUI_Text_Translation"
+ }
+ ],
+ "https://github.com/THtianhao/ComfyUI-FaceChain": [
+ [
+ "FC CropAndPaste",
+ "FC CropBottom",
+ "FC CropToOrigin",
+ "FC FaceDetectCrop",
+ "FC FaceFusion",
+ "FC FaceSegAndReplace",
+ "FC FaceSegment",
+ "FC MaskOP",
+ "FC RemoveCannyFace",
+ "FC ReplaceByMask",
+ "FC StyleLoraLoad"
+ ],
+ {
+ "title_aux": "ComfyUI-FaceChain"
+ }
+ ],
+ "https://github.com/THtianhao/ComfyUI-Portrait-Maker": [
+ [
+ "PM_BoxCropImage",
+ "PM_ColorTransfer",
+ "PM_ExpandMaskBox",
+ "PM_FaceFusion",
+ "PM_FaceShapMatch",
+ "PM_FaceSkin",
+ "PM_GetImageInfo",
+ "PM_ImageResizeTarget",
+ "PM_ImageScaleShort",
+ "PM_MakeUpTransfer",
+ "PM_MaskDilateErode",
+ "PM_MaskMerge2Image",
+ "PM_PortraitEnhancement",
+ "PM_RatioMerge2Image",
+ "PM_ReplaceBoxImg",
+ "PM_RetinaFace",
+ "PM_Similarity",
+ "PM_SkinRetouching",
+ "PM_SuperColorTransfer",
+ "PM_SuperMakeUpTransfer"
+ ],
+ {
+ "title_aux": "ComfyUI-Portrait-Maker"
+ }
+ ],
+ "https://github.com/TJ16th/ComfyUI-TJ-PolkaDot": [
+ [
+ "PolkaDot_AdvancedShapePlacement",
+ "PolkaDot_ColoredMaskCompositor",
+ "PolkaDot_ShapeMaskGenerator"
+ ],
+ {
+ "title_aux": "TJ_PolkaDot"
+ }
+ ],
+ "https://github.com/TJ16th/TJ_ComfyUI_ColorUtility": [
+ [
+ "ColorPalette",
+ "ImagePaletteExtractor",
+ "RGBColorPicker"
+ ],
+ {
+ "title_aux": "TJ_ComfyUI_ColorUtility"
+ }
+ ],
+ "https://github.com/TJ16th/TJ_ComfyUI_Lineart2Vector": [
+ [
+ "CenterlineToSVG",
+ "LineRegionDetector",
+ "MaskLineCleanup",
+ "SVGAutoReorder",
+ "SVGBatchSaver",
+ "SVGColorPicker",
+ "SVGFileSaver",
+ "SVGGroupLayout",
+ "SVGPathCleanup",
+ "SVGReorder",
+ "SVGStyleEditor",
+ "SVGStyleEditorSimple",
+ "SVGToImage",
+ "SVGVisibility",
+ "VectorPythonInfo"
+ ],
+ {
+ "title_aux": "TJ_ComfyUI_Lineart2Vector"
+ }
+ ],
+ "https://github.com/TJ16th/comfyUI_TJ_NormalLighting": [
+ [
+ "EulerLightingNode"
+ ],
+ {
+ "title_aux": "comfyUI_TJ_NormalLighting"
+ }
+ ],
+ "https://github.com/TKRLAB/ComfyUI_Prompt_List_JSON": [
+ [
+ "ComfyUI_Prompt_JSON"
+ ],
+ {
+ "author": "TKRLAB",
+ "description": "ComfyUI JSON-based prompt management tool.",
+ "title": "ComfyUI_Prompt_List_JSON",
+ "title_aux": "Prompt List JSON"
+ }
+ ],
+ "https://github.com/TMElyralab/Comfyui-MusePose": [
+ [
+ "filenamestring",
+ "musepose",
+ "museposealign"
+ ],
+ {
+ "title_aux": "Comfyui-MusePose"
+ }
+ ],
+ "https://github.com/TRI3D-LC/ComfyUI-MiroBoard": [
+ [
+ "add-image-miro-board"
+ ],
+ {
+ "title_aux": "ComfyUI-MiroBoard"
+ }
+ ],
+ "https://github.com/TRI3D-LC/tri3d-comfyui-nodes": [
+ [
+ "TRI3D_CutByMaskAspectRatio",
+ "get_histogram_limits",
+ "main_light_layer",
+ "main_scaled_paste",
+ "simple_rescale_histogram",
+ "tri3d--image-mask-2-box",
+ "tri3d-HistogramEqualization",
+ "tri3d-LAB_2_RGB",
+ "tri3d-RGB_2_LAB",
+ "tri3d-adjust-neck",
+ "tri3d-atr-parse",
+ "tri3d-atr-parse-batch",
+ "tri3d-bgremove-mega",
+ "tri3d-clean_mask",
+ "tri3d-clear-memory",
+ "tri3d-clear_memory",
+ "tri3d-clipdrop-bgremove-api",
+ "tri3d-clipdrop-bgreplace-api",
+ "tri3d-composite-image-splitter",
+ "tri3d-dwpose",
+ "tri3d-extract-hand",
+ "tri3d-extract-masks-batch",
+ "tri3d-extract-parts-batch",
+ "tri3d-extract-parts-batch2",
+ "tri3d-extract-parts-mask-batch",
+ "tri3d-extract-pascal-parts-batch",
+ "tri3d-extract_pose_part",
+ "tri3d-face-recognise",
+ "tri3d-flexible_color_extract",
+ "tri3d-float-to-image",
+ "tri3d-fuzzification",
+ "tri3d-get_histogram_limits",
+ "tri3d-get_mean_and_standard_deviation",
+ "tri3d-get_threshold_for_bg_swap",
+ "tri3d-image-mask-2-box",
+ "tri3d-image-mask-box-2-image",
+ "tri3d-interaction-canny",
+ "tri3d-levindabhi-cloth-seg",
+ "tri3d-load-pose-json",
+ "tri3d-load_AEMatter_Model",
+ "tri3d-luminosity-match",
+ "tri3d-main_transparent_background",
+ "tri3d-photoroom-bgremove-api",
+ "tri3d-pose-adaption",
+ "tri3d-pose-to-image",
+ "tri3d-position-hands",
+ "tri3d-position-parts-batch",
+ "tri3d-position-pascal-parts-batch",
+ "tri3d-recolor-mask",
+ "tri3d-recolor-mask-LAB_space",
+ "tri3d-recolor-mask-LAB_space_manual",
+ "tri3d-recolor-mask-RGB_space",
+ "tri3d-renormalize_array",
+ "tri3d-run_AEMatter_inference",
+ "tri3d-scaled-paste",
+ "tri3d-scaled-paste_unsafe",
+ "tri3d-simple_bg_swap",
+ "tri3d-simple_rescale_histogram",
+ "tri3d-skin-feathered-padded-mask",
+ "tri3d-swap-pixels",
+ "tri3d_CutByMaskAspectRatio",
+ "tri3d_H_Stack_Images",
+ "tri3d_Image_extend",
+ "tri3d_MaskAreaPercentage",
+ "tri3d_NSFWFilter",
+ "tri3d_NarrowfyImage",
+ "tri3d_Remove_Small_Mask_Islands",
+ "tri3d_SaveFlattenedPoseKpsAsJsonFile",
+ "tri3d_SaveImage_absolute",
+ "tri3d_SaveText_absolute",
+ "tri3d_Skip_HeadMask",
+ "tri3d_Skip_HeadMask_AddNeck",
+ "tri3d_Skip_LipMask",
+ "tri3d_SmartBox",
+ "tri3d_Smart_Depth",
+ "tri3d_StringContains",
+ "tri3d_Wait_And_Read_File",
+ "tri3d_extract_facer_mask",
+ "tri3d_fill_mask",
+ "tri3d_is_only_trouser",
+ "tri3d_position_pose_part"
+ ],
+ {
+ "title_aux": "tri3d-comfyui-nodes"
+ }
+ ],
+ "https://github.com/TTPlanetPig/Comfyui_DreamID-V_wrapper": [
+ [
+ "DreamIDV_ConditioningPrep_TTP",
+ "DreamIDV_ModelLoader_Wrapper_TTP",
+ "DreamIDV_PoseExtractor_TTP",
+ "DreamIDV_Sampler_Wrapper_TTP"
+ ],
+ {
+ "title_aux": "Comfyui_DreamID-V_wrapper"
+ }
+ ],
+ "https://github.com/TTPlanetPig/Comfyui_Hunyuan3D": [
+ [
+ "GifImageViewerNode",
+ "Hunyuan3DNode",
+ "SquareImage"
+ ],
+ {
+ "title_aux": "Comfyui_Hunyuan3D"
+ }
+ ],
+ "https://github.com/TTPlanetPig/Comfyui_JC2": [
+ [
+ "ExtraOptionsNode",
+ "ExtraOptionsNode_Beta",
+ "JoyCaption2",
+ "JoyCaption2_simple",
+ "JoyCaptionBetaOne_Full",
+ "JoyCaptionBetaOne_Simple"
+ ],
+ {
+ "title_aux": "Comfyui_JC2"
+ }
+ ],
+ "https://github.com/TTPlanetPig/Comfyui_Object_Detect_QWen_VL": [
+ [
+ "BBoxesToSAM2",
+ "DownloadAndLoadQwenModel",
+ "QwenVLDetection"
+ ],
+ {
+ "title_aux": "ComfyUI Qwen2.5-VL Object Detection Node"
+ }
+ ],
+ "https://github.com/TTPlanetPig/Comfyui_Object_Migration": [
+ [
+ "TTP_Expand_And_Mask",
+ "TTP_text_mix"
+ ],
+ {
+ "title_aux": "Clothing Migration Kit"
+ }
+ ],
+ "https://github.com/TTPlanetPig/Comfyui_TTP_CN_Preprocessor": [
+ [
+ "TTPlanet_Tile_Preprocessor_GF",
+ "TTPlanet_Tile_Preprocessor_Simple",
+ "TTPlanet_Tile_Preprocessor_cufoff",
+ "TTPlanet_inpainting_Preprecessor"
+ ],
+ {
+ "title_aux": "for comfyui image proprocessor"
+ }
+ ],
+ "https://github.com/TTPlanetPig/Comfyui_TTP_Toolset": [
+ [
+ "LTXVContext_TTP",
+ "LTXVFirstLastFrameControl_TTP",
+ "LTXVMiddleFrame_TTP",
+ "TTP_CoordinateSplitter",
+ "TTP_Expand_And_Mask",
+ "TTP_Image_Assy",
+ "TTP_Image_Tile_Batch",
+ "TTP_Tile_image_size",
+ "TTP_condsetarea_merge",
+ "TTP_condsetarea_merge_test",
+ "TTP_condtobatch",
+ "TTP_text_mix",
+ "TTPlanet_Tile_Preprocessor_Simple",
+ "TeaCacheHunyuanVideoSampler"
+ ],
+ {
+ "title_aux": "Comfyui_TTP_Toolset"
+ }
+ ],
+ "https://github.com/TTPlanetPig/TTP_Comfyui_FramePack_SE": [
+ [
+ "TTPlanet_FramePack"
+ ],
+ {
+ "title_aux": "TTP_Comfyui_FramePack_SE"
+ }
+ ],
+ "https://github.com/TW-CUI/TW-CUI-Util": [
+ [
+ "TWCUI_Util_CommonSDXLResolutions",
+ "TWCUI_Util_FloatLiteral",
+ "TWCUI_Util_GenerationParameters",
+ "TWCUI_Util_GenerationPrompts",
+ "TWCUI_Util_IntLiteral",
+ "TWCUI_Util_ModelVAELORALoader",
+ "TWCUI_Util_ModelVAELoader",
+ "TWCUI_Util_MultilineStringLiteral",
+ "TWCUI_Util_SaveImage",
+ "TWCUI_Util_SaveImageAdvanced",
+ "TWCUI_Util_StringLiteral"
+ ],
+ {
+ "title_aux": "TW-CUI-Util"
+ }
+ ],
+ "https://github.com/TZOOTZ/ComfyUI-TZOOTZ_VHS": [
+ [
+ "TZOOTZ_VHSNode"
+ ],
+ {
+ "title_aux": "TZOOTZ VHS Effect Node"
+ }
+ ],
+ "https://github.com/TaiTair/comfyui-simswap": [
+ [
+ "Simswap",
+ "SimswapBuildFaceModel",
+ "SimswapFaceSwapOpt",
+ "SimswapImageDublicator",
+ "SimswapLoadFaceModel",
+ "SimswapMaskHelper",
+ "SimswapOptions",
+ "SimswapRestoreFace",
+ "SimswapSaveFaceModel"
+ ],
+ {
+ "title_aux": "Simswap Node for ComfyUI"
+ }
+ ],
+ "https://github.com/Taithrah/ComfyUI_Fens_Simple_Nodes": [
+ [
+ "FensTokenCounter",
+ "OptiEmptyLatent",
+ "OptiEmptyLatentAdvanced"
+ ],
+ {
+ "title_aux": "Fens-Simple-Nodes"
+ }
+ ],
+ "https://github.com/Taremin/comfyui-prompt-config": [
+ [
+ "Prompt",
+ "PromptEdit",
+ "PromptGenerationConfig"
+ ],
+ {
+ "title_aux": "comfyui-prompt-config"
+ }
+ ],
+ "https://github.com/Taremin/comfyui-prompt-extranetworks": [
+ [
+ "PromptControlNetApply",
+ "PromptControlNetPrepare",
+ "PromptExtraNetworks"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt ExtraNetworks"
+ }
+ ],
+ "https://github.com/Taremin/comfyui-string-tools": [
+ [
+ "StringToolsBalancedChoice",
+ "StringToolsConcat",
+ "StringToolsRandomChoice",
+ "StringToolsSeed",
+ "StringToolsString",
+ "StringToolsText"
+ ],
+ {
+ "title_aux": "ComfyUI String Tools"
+ }
+ ],
+ "https://github.com/Taremin/webui-monaco-prompt": [
+ [
+ "WebuiMonacoPromptFind",
+ "WebuiMonacoPromptReplace"
+ ],
+ {
+ "title_aux": "WebUI Monaco Prompt"
+ }
+ ],
+ "https://github.com/TdogCreations/ComfyUI-NAID-Grid-Position": [
+ [
+ "NAID Grid Position"
+ ],
+ {
+ "title_aux": "ComfyUI-NAID-Grid-Position"
+ }
+ ],
+ "https://github.com/TeaCrab/ComfyUI-TeaNodes": [
+ [
+ "TC_ColorFill",
+ "TC_CropTo",
+ "TC_EqualizeCLAHE",
+ "TC_ImageResize",
+ "TC_ImageScale",
+ "TC_KorniaGamma",
+ "TC_RandomColorFill",
+ "TC_SizeApproximation"
+ ],
+ {
+ "title_aux": "ComfyUI-TeaNodes"
+ }
+ ],
+ "https://github.com/TechnicalTod/ComfyUI-RotoMask": [
+ [
+ "RotoMaskNode"
+ ],
+ {
+ "title_aux": "ComfyUI-RotoMask"
+ }
+ ],
+ "https://github.com/TemryL/ComfyS3": [
+ [
+ "DownloadFileS3",
+ "LoadImageS3",
+ "SaveImageS3",
+ "SaveVideoFilesS3",
+ "UploadFileS3"
+ ],
+ {
+ "title_aux": "ComfyS3"
+ }
+ ],
+ "https://github.com/TemryL/ComfyUI-IDM-VTON": [
+ [
+ "IDM-VTON",
+ "PipelineLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-IDM-VTON [WIP]"
+ }
+ ],
+ "https://github.com/Temult/TWanSigmaGraph": [
+ [
+ "TWanSigmaGraph"
+ ],
+ {
+ "title_aux": "TWanSigmaGraph"
+ }
+ ],
+ "https://github.com/TencentQQGYLab/ComfyUI-ELLA": [
+ [
+ "CombineClipEllaEmbeds",
+ "ConcatConditionEllaEmbeds",
+ "ConditionToEllaEmbeds",
+ "ELLALoader",
+ "EllaApply",
+ "EllaCombineEmbeds",
+ "EllaEncode",
+ "EllaTextEncode",
+ "SetEllaTimesteps",
+ "T5TextEncode #ELLA",
+ "T5TextEncoderLoader #ELLA"
+ ],
+ {
+ "title_aux": "ComfyUI-ELLA"
+ }
+ ],
+ "https://github.com/Tensor-Art/ComfyUI_TENSOR_ART": [
+ [
+ "TA_AIToolsNode",
+ "TA_ExecuteNode",
+ "TA_UploadImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI_TENSOR_ART"
+ }
+ ],
+ "https://github.com/TensorKaze/ComfyUI-TkNodes": [
+ [
+ "FluxAdvancedSampler",
+ "FluxLatentSampler",
+ "LoadImageAndScaleToTotalPixels",
+ "LoadModelAndUpscaleImage",
+ "MultiLatentSelector",
+ "MultiModelLoader",
+ "RepeatLatentBatchOptional",
+ "VAEEncodeOptional"
+ ],
+ {
+ "title_aux": "ComfyUI-TkNodes"
+ }
+ ],
+ "https://github.com/TheArtOfficial/ComfyUI-MaskMorph": [
+ [
+ "DirectionalMaskExpand",
+ "MaskPinchWiden"
+ ],
+ {
+ "title_aux": "ComfyUI-MaskMorph"
+ }
+ ],
+ "https://github.com/TheBarret/ZSuite": [
+ [
+ "ZSuite: Prompter",
+ "ZSuite: RF Noise",
+ "ZSuite: SeedMod"
+ ],
+ {
+ "title_aux": "ZSuite"
+ }
+ ],
+ "https://github.com/TheLustriVA/ComfyUI-Image-Size-Tools": [
+ [
+ "FluxResolutionNode",
+ "ImageSizeDetectorNode",
+ "SD15ResolutionNode",
+ "SDXLResolutionNode",
+ "WAN21AdvancedResolutionNode",
+ "WAN21ResolutionNode"
+ ],
+ {
+ "title_aux": "ComfyUI Image Size Tool"
+ }
+ ],
+ "https://github.com/TheMadDoctor007/ComfyUI-QwenCameraSelector": [
+ [
+ "QwenCameraSelector"
+ ],
+ {
+ "title_aux": "Qwen Camera Selector"
+ }
+ ],
+ "https://github.com/TheMistoAI/ComfyUI-Anyline": [
+ [
+ "AnyLinePreprocessor"
+ ],
+ {
+ "title_aux": "Anyline"
+ }
+ ],
+ "https://github.com/TheWhykiki/Whykiki-ComfyUIToolset": [
+ [
+ "SequentialImageLoaderV8"
+ ],
+ {
+ "title_aux": "Whykiki ComfyUI Toolset"
+ }
+ ],
+ "https://github.com/ThepExcel/aiangelgallery-comfyui": [
+ [
+ "ThepExcel_AiAngel_MultilineTextChoiceNode"
+ ],
+ {
+ "title_aux": "Multiline Text Choice Node for ComfyUI"
+ }
+ ],
+ "https://github.com/ThereforeGames/ComfyUI-Unprompted": [
+ [
+ "Unprompted",
+ "UnpromptedSetRack"
+ ],
+ {
+ "title_aux": "ComfyUI-Unprompted"
+ }
+ ],
+ "https://github.com/This-is-Uncut/Custom-Node-ComfyUI-NBP-Uncut": [
+ [
+ "NanoBananaProNode"
+ ],
+ {
+ "title_aux": "Custom-Node-ComfyUI-NBP-Uncut"
+ }
+ ],
+ "https://github.com/ThunderBolt4931/comfyui_pixel_forge": [
+ [
+ "ConcatenateBatchHorizontally",
+ "CropDisjointRegions",
+ "DeconcatenateBatchHorizontally",
+ "ImageSimilaritySequentialCLIP",
+ "ImageSimilaritySequentialMatch",
+ "LogoDetectorOWL",
+ "PasteByBoundingBoxBatch",
+ "RepeatConditioning",
+ "SelectImageFromBatch"
+ ],
+ {
+ "title_aux": "ComfyUI-Pixel-Forge"
+ }
+ ],
+ "https://github.com/TiamaTiramisu/risutools": [
+ [
+ "CheckFileNamePrefixExists",
+ "LoadImageFromText",
+ "LoadLastFileNamePrefix",
+ "UUIDGenerator"
+ ],
+ {
+ "title_aux": "RisuTools"
+ }
+ ],
+ "https://github.com/TianDongL/Blind_watermark_Comfyui": [
+ [
+ "WatermarkEmbedImage",
+ "WatermarkEmbedText",
+ "WatermarkExtractImage",
+ "WatermarkExtractText",
+ "WatermarkQRCodeDecoder",
+ "WatermarkQRCodeGenerator"
+ ],
+ {
+ "title_aux": "Blind_watermark_Comfyui"
+ }
+ ],
+ "https://github.com/Tinuva88/Comfy-UmiAI": [
+ [
+ "CameraAngleSelector",
+ "UmiAIWildcardNode",
+ "UmiAIWildcardNodeLite",
+ "UmiCharacterCreator",
+ "UmiDatasetGenerator",
+ "UmiEmotionGenerator",
+ "UmiEmotionStudio",
+ "UmiModelManager",
+ "UmiModelSelector",
+ "UmiPoseGenerator",
+ "UmiPositionControl",
+ "UmiSaveImage",
+ "UmiSpriteGenerator",
+ "UmiTextBypass",
+ "UmiVisualCameraControl"
+ ],
+ {
+ "title_aux": "Comfy-UmiAI"
+ }
+ ],
+ "https://github.com/TinyBeeman/ComfyUI-TinyBee": [
+ [
+ "Combine Lists",
+ "Combine Properties",
+ "Decorate List",
+ "Encode Any Property",
+ "Face Body Aspect Bounds",
+ "Filter Existing Files",
+ "Filter List",
+ "Filter Words",
+ "Force Aspect On Bounds",
+ "Get File List",
+ "Get List From File",
+ "Get Mask Bounding Box",
+ "Incrementer",
+ "Indexed Entry",
+ "Int to Boolean",
+ "Is String Empty",
+ "Json From Properties",
+ "List Count",
+ "Load Image Batch from Zip",
+ "Process Path Name",
+ "Prompt Splitter",
+ "Prop From Properties",
+ "Random Entry",
+ "Random File Entry",
+ "Randomize Image Batch",
+ "Randomize List",
+ "Replace List",
+ "Save Image Batch to Zip",
+ "Search To Boolean",
+ "Search and Replace",
+ "Select Bounding Box",
+ "Sort List",
+ "Split List",
+ "String To List",
+ "String to Int",
+ "Timestamp"
+ ],
+ {
+ "title_aux": "ComfyUI-TinyBee"
+ }
+ ],
+ "https://github.com/TinyTerra/ComfyUI_tinyterraNodes": [
+ [
+ "ttN KSampler_v2",
+ "ttN advPlot combo",
+ "ttN advPlot images",
+ "ttN advPlot merge",
+ "ttN advPlot range",
+ "ttN advPlot string",
+ "ttN advanced xyPlot",
+ "ttN compareInput",
+ "ttN concat",
+ "ttN conditioning",
+ "ttN debugInput",
+ "ttN float",
+ "ttN hiresfixScale",
+ "ttN imageOutput",
+ "ttN imageREMBG",
+ "ttN int",
+ "ttN multiModelMerge",
+ "ttN pipe2BASIC",
+ "ttN pipe2DETAILER",
+ "ttN pipeEDIT",
+ "ttN pipeEncodeConcat",
+ "ttN pipeIN",
+ "ttN pipeKSampler",
+ "ttN pipeKSamplerAdvanced",
+ "ttN pipeKSamplerAdvanced_v2",
+ "ttN pipeKSamplerSDXL",
+ "ttN pipeKSamplerSDXL_v2",
+ "ttN pipeKSampler_v2",
+ "ttN pipeLoader",
+ "ttN pipeLoaderSDXL",
+ "ttN pipeLoaderSDXL_v2",
+ "ttN pipeLoader_v2",
+ "ttN pipeLoraStack",
+ "ttN pipeOUT",
+ "ttN seed",
+ "ttN text",
+ "ttN text3BOX_3WAYconcat",
+ "ttN text7BOX_concat",
+ "ttN textCycleLine",
+ "ttN textDebug",
+ "ttN textOutput",
+ "ttN tinyLoader",
+ "ttN xyPlot"
+ ],
+ {
+ "author": "tinyterra",
+ "description": "This extension offers extensive xyPlot, various pipe nodes, fullscreen image viewer based on node history, dynamic widgets, interface customization, and more.",
+ "nickname": "\ud83c\udf0f",
+ "nodename_pattern": "^ttN ",
+ "title": "tinyterraNodes",
+ "title_aux": "ComfyUI_tinyterraNodes"
+ }
+ ],
+ "https://github.com/Tlant/ComfyUI-OllamaPromptsGeneratorTlant": [
+ [
+ "LoadImageAndExtractMetadataTlant",
+ "LoadRandomTxtFileTlant",
+ "LoadRandomTxtFileTlantV2",
+ "LoadRandomTxtFileTlantV3",
+ "LoadSequencedTxtFileTlant",
+ "LoadSpecificTxtFileTlant",
+ "OllamaPromptsGeneratorTlant",
+ "OllamaSimpleTextGeneratorTlant",
+ "RandomImageLoaderTlant",
+ "ReasoningLLMOutputCleaner",
+ "SaveImagePairForKontext",
+ "StringFormatterTlant"
+ ],
+ {
+ "title_aux": "ComfyUI-OllamaPromptsGeneratorTlant"
+ }
+ ],
+ "https://github.com/ToTheBeginning/ComfyUI-DreamO": [
+ [
+ "ApplyDreamO",
+ "DreamOProcessorLoader",
+ "DreamORefEncode"
+ ],
+ {
+ "title_aux": "DreamO Comfyui"
+ }
+ ],
+ "https://github.com/TobiasGlaubach/ComfyUI-TG_pydocmaker": [
+ [
+ "TG_PydGetMetadata",
+ "TG_PydPreview"
+ ],
+ {
+ "title_aux": "ComfyUI-TG_pydocmaker"
+ }
+ ],
+ "https://github.com/Tr1dae/ComfyUI-Dequality": [
+ [
+ "Dequality"
+ ],
+ {
+ "title_aux": "ComfyUI-Dequality"
+ }
+ ],
+ "https://github.com/Tr1dae/ComfyUI-EasyFilePaths": [
+ [
+ "CharacterLoraSelect",
+ "ChromaActionSelect",
+ "ConvertHEXToRGB",
+ "DepthAnything_V2",
+ "DownloadAndLoadDepthAnythingV2Model",
+ "DynamicBypassController",
+ "DynamicBypassSelector",
+ "EasyArrayFilter",
+ "EasyBasicJsonExtractor",
+ "EasyBboxDetectorCombined",
+ "EasyBooleanConverter",
+ "EasyCLIPLoader",
+ "EasyCheckpointLoader",
+ "EasyCompare",
+ "EasyFileName",
+ "EasyFilmGrain",
+ "EasyFloatToInt",
+ "EasyForceClipDType",
+ "EasyForceModelDType",
+ "EasyGamma",
+ "EasyGetLine",
+ "EasyGrowMaskAndBlur",
+ "EasyImageBloomFilter",
+ "EasyImageCompare",
+ "EasyJSONJobImport",
+ "EasyJSONUpdate",
+ "EasyJsonExtractor",
+ "EasyJsonSaver",
+ "EasyLoraLoader",
+ "EasyMathAdd",
+ "EasyMathMultiply",
+ "EasyMathSubtract",
+ "EasyNull",
+ "EasyResize",
+ "EasySegmDetectorCombined",
+ "EasyTemplateAny",
+ "EasyUNETLoader",
+ "EasyUltralyticsDetectorProvider",
+ "EasyVAELoader",
+ "EasyWardrobeInit",
+ "EasyWardrobeWriter",
+ "EasyYolov8Detection",
+ "EasyYolov8Segmentation",
+ "FreshYoloSegmentationMask",
+ "GeneralSwitch",
+ "HexColorInput",
+ "ImageSaveToPath",
+ "ImageSaveToPathwithCaption",
+ "LatentSwitch",
+ "LineCounter",
+ "LoadImageFromMatch",
+ "LoadImageFromPath",
+ "LoadImagesFromDirectoryPath",
+ "LoadRandomImageFromFolderPath",
+ "QwenActionSelect",
+ "RemoveNoiseMask",
+ "TileAssembly",
+ "TileBreak",
+ "UserSelect",
+ "WanActionSelect",
+ "easy_apply_latent_mask_safe",
+ "easy_base64_loader",
+ "easy_batch_enforcer",
+ "easy_cuda_flush",
+ "easy_image_failsafe_loader",
+ "easy_image_sanitize",
+ "easy_image_stats",
+ "easy_image_url",
+ "easy_latent_NaN_catcher",
+ "easy_latent_clamp",
+ "easy_latent_cpu_hop",
+ "easy_latent_normalize",
+ "easy_latent_sanitize",
+ "easy_mask_sanitize",
+ "easy_smartbypass",
+ "easy_vae_hard_reset",
+ "save_image_with_latent_and_metadata_webp",
+ "webp_latent_loader"
+ ],
+ {
+ "title_aux": "ComfyUI-EasyFilePaths"
+ }
+ ],
+ "https://github.com/Transhumai/ComfyUI-LegionPower": [
+ [
+ "LegionConfig",
+ "LegionExporter",
+ "LegionImporter",
+ "LegionJoin",
+ "LegionJoinAll",
+ "LegionMaster",
+ "LegionMaster3",
+ "LegionMaster6",
+ "LegionWarmup"
+ ],
+ {
+ "title_aux": "ComfyUI-LegionPower"
+ }
+ ],
+ "https://github.com/Trgtuan10/ComfyUI_YoloSegment_Mask": [
+ [
+ "Object Mask"
+ ],
+ {
+ "title_aux": "ComfyUI_YoloSegment_Mask"
+ }
+ ],
+ "https://github.com/TripleHeadedMonkey/ComfyUI_MileHighStyler": [
+ [
+ "PerfectionBetaStyler"
+ ],
+ {
+ "title_aux": "ComfyUI_MileHighStyler"
+ }
+ ],
+ "https://github.com/Tropfchen/ComfyUI-Embedding_Picker": [
+ [
+ "EmbeddingPicker"
+ ],
+ {
+ "title_aux": "Embedding Picker"
+ }
+ ],
+ "https://github.com/Tropfchen/ComfyUI-yaResolutionSelector": [
+ [
+ "YARS",
+ "YARSAdv"
+ ],
+ {
+ "title_aux": "YARS: Yet Another Resolution Selector"
+ }
+ ],
+ "https://github.com/TrophiHunter/ComfyUI_Photography_Nodes": [
+ [
+ "Bloom",
+ "Bloom Lens Flares",
+ "Chromatic Aberration",
+ "Contrast Adaptive Sharpening",
+ "Contrast Brightness",
+ "Depth of Field",
+ "Get Watermark",
+ "Halation",
+ "Lens Dirt",
+ "Lens Distortion",
+ "Levels Adjustment",
+ "Lut",
+ "Manga Toner",
+ "Monitor Filter",
+ "Multi Scale Contrast",
+ "NTSC Filter",
+ "Noise",
+ "Physically Accurate Lens Dirt",
+ "Pixel Art",
+ "Saturation Vibrance",
+ "Sensor Dust",
+ "Sharpen Simple",
+ "Sharpen Unsharp Mask",
+ "Tint",
+ "VHS Chroma Smear",
+ "VHS Degrade",
+ "Vignette Effect",
+ "Watermark"
+ ],
+ {
+ "title_aux": "Photography Nodes"
+ }
+ ],
+ "https://github.com/Trung0246/ComfyUI-0246": [
+ [
+ "0246.Beautify",
+ "0246.BoxRange",
+ "0246.CastReroute",
+ "0246.Cloud",
+ "0246.Count",
+ "0246.Highway",
+ "0246.HighwayBatch",
+ "0246.Hold",
+ "0246.Hub",
+ "0246.Junction",
+ "0246.JunctionBatch",
+ "0246.Loop",
+ "0246.Merge",
+ "0246.Meta",
+ "0246.RandomInt",
+ "0246.Script",
+ "0246.ScriptNode",
+ "0246.ScriptPile",
+ "0246.ScriptRule",
+ "0246.Stringify",
+ "0246.Switch",
+ "0246.Tag"
+ ],
+ {
+ "author": "Trung0246",
+ "description": "Random nodes for ComfyUI I made to solve my struggle with ComfyUI (ex: pipe, process). Have varying quality.",
+ "nickname": "ComfyUI-0246",
+ "title": "ComfyUI-0246",
+ "title_aux": "ComfyUI-0246"
+ }
+ ],
+ "https://github.com/Ttl/ComfyUi_NNLatentUpscale": [
+ [
+ "NNLatentUpscale",
+ "NNlLatentUpscale"
+ ],
+ {
+ "preemptions": [
+ "NNLatentUpscale"
+ ],
+ "title_aux": "ComfyUI Neural Network Latent Upscale"
+ }
+ ],
+ "https://github.com/TuonoMindCode/ComfyUI-MultiClip-Text-Script": [
+ [
+ "MultiClipTextScriptClipSelector",
+ "MultiClipTextScriptMain",
+ "MultiClipTextScriptPositiveOnly"
+ ],
+ {
+ "title_aux": "ComfyUI-MultiClip-Text-Script"
+ }
+ ],
+ "https://github.com/TuonoMindCode/ComfyUI-Resolution-Suggest-Downscale": [
+ [
+ "TuonoResolutionSuggestDownscale"
+ ],
+ {
+ "title_aux": "ComfyUI-Resolution-Suggest-Downscale"
+ }
+ ],
+ "https://github.com/TuriSc/comfyui-text-line-selector": [
+ [
+ "TextLineSelectorNode"
+ ],
+ {
+ "title_aux": "Text Line Selector"
+ }
+ ],
+ "https://github.com/TylerZoro/SD3-Scaling": [
+ [
+ "SD3ImageScaleToTotalPixels"
+ ],
+ {
+ "title_aux": "SD3-Scaling"
+ }
+ ],
+ "https://github.com/Ugleh/ComfyUI-ugleh-OpenAI": [
+ [
+ "Ugleh.OpenAI.ResponsesText"
+ ],
+ {
+ "title_aux": "ComfyUI-ugleh-OpenAI"
+ }
+ ],
+ "https://github.com/UmeAiRT/ComfyUI-UmeAiRT-Sync": [
+ [
+ "UmeAiRT_Sync_Node"
+ ],
+ {
+ "title_aux": "ComfyUI-UmeAiRT-Sync"
+ }
+ ],
+ "https://github.com/Umikaze-job/select_folder_path_easy": [
+ [
+ "SelectFolderPathEasy"
+ ],
+ {
+ "title_aux": "select_folder_path_easy"
+ }
+ ],
+ "https://github.com/UndefinedUo/DuoUmiWildcards": [
+ [
+ "DuoUmiRatioSelector",
+ "DuoUmiWildcard"
+ ],
+ {
+ "title_aux": "DuoUmiWildcards"
+ }
+ ],
+ "https://github.com/Urabewe/ComfyUI-AudioTools": [
+ [
+ "AudioEnhancementNode",
+ "AudioNormalizeLUFS"
+ ],
+ {
+ "title_aux": "ComfyUI-AudioTools"
+ }
+ ],
+ "https://github.com/Urabewe/ComfyUI-CountS2VExtend": [
+ [
+ "CountVideoExtendS2VNode"
+ ],
+ {
+ "title_aux": "ComfyUI Video Extend Counter"
+ }
+ ],
+ "https://github.com/Usonaki/ComfyUI-DyPE-Nunchaku": [
+ [
+ "DyPE_Nunchaku"
+ ],
+ {
+ "title_aux": "ComfyUI-DyPE-Nunchaku"
+ }
+ ],
+ "https://github.com/VAST-AI-Research/ComfyUI-Tripo": [
+ [
+ "TripoAPIDraft",
+ "TripoAnimateRetargetNode",
+ "TripoAnimateRigNode",
+ "TripoConvertNode",
+ "TripoMeshCompletion",
+ "TripoMeshSegmentation",
+ "TripoRefineModel",
+ "TripoSmartLowPoly",
+ "TripoStylizeModel",
+ "TripoTextureModel"
+ ],
+ {
+ "title_aux": "Tripo for ComfyUI"
+ }
+ ],
+ "https://github.com/VK/vk-nodes": [
+ [
+ "PrepareJobs",
+ "SketchyText",
+ "SketchyThumbnail",
+ "TiledConfigNode",
+ "TiledCropNode",
+ "TiledRenderNode",
+ "TiledSetupNode",
+ "VKLoadAudio"
+ ],
+ {
+ "title_aux": "VK Nodes"
+ }
+ ],
+ "https://github.com/Vaibhavs10/ComfyUI-DDUF": [
+ [
+ "DDUFLoader",
+ "DiffusersModelMakeup",
+ "DiffusersPipelineLoader",
+ "DiffusersSchedulerLoader",
+ "DiffusersSimpleSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-DDUF"
+ }
+ ],
+ "https://github.com/VangengLab/ComfyUI-LivePortrait_v2": [
+ [
+ "LivePortraitProcess_animal"
+ ],
+ {
+ "title_aux": "ComfyUI-LivePortrait_v2"
+ }
+ ],
+ "https://github.com/VangengLab/ComfyUI-LivePortrait_v3": [
+ [
+ "LivePortraitp2p"
+ ],
+ {
+ "title_aux": "ComfyUI-LivePortrait_v3"
+ }
+ ],
+ "https://github.com/Vaporbook/ComfyUI-SaveImage-PP": [
+ [
+ "SaveImagePP"
+ ],
+ {
+ "title_aux": "ComfyUI-SaveImage-PP"
+ }
+ ],
+ "https://github.com/Verolelb/ComfyUI-Qwen-Aspect-Ratio": [
+ [
+ "QwenAspectRatioSelectorLatent"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen-Aspect-Ratio"
+ }
+ ],
+ "https://github.com/Verolelb/ComfyUI-Video-Workbench": [
+ [
+ "AutoEditWorkbench"
+ ],
+ {
+ "title_aux": "ComfyUI-Video-Workbench"
+ }
+ ],
+ "https://github.com/Verolelb/ComfyUI-VideoCompressor": [
+ [
+ "VideoCompressor"
+ ],
+ {
+ "title_aux": "Video Compressor (Unified)"
+ }
+ ],
+ "https://github.com/VertexAnomaly/ComfyUI_ImageSentinel": [
+ [
+ "ImageSentinel"
+ ],
+ {
+ "title_aux": "ComfyUI_ImageSentinel"
+ }
+ ],
+ "https://github.com/VertexStudio/roblox-comfyui-nodes": [
+ [
+ "FirstLetterNode",
+ "FlowNodes",
+ "MirrorEffectNode",
+ "SaveImageNode",
+ "ScaleImageNode",
+ "SwitchImageNode",
+ "SwitchTextNode",
+ "TextToImageNode"
+ ],
+ {
+ "title_aux": "roblox-comfyui-nodes"
+ }
+ ],
+ "https://github.com/VikramxD/VEnhancer-ComfyUI-Wrapper": [
+ [
+ "MultiGPUInference",
+ "MultiGPUVEnhancerLoader",
+ "SingleGPUInference",
+ "SingleGPUVEnhancerLoader",
+ "VideoLoader",
+ "VideoSaver"
+ ],
+ {
+ "title_aux": "VEnhancer ComfyUI Extension"
+ }
+ ],
+ "https://github.com/Visionatrix/ComfyUI-Gemini": [
+ [
+ "ConcatText_Zho",
+ "DisplayText_Zho",
+ "Gemini_15P_API_S_Advance_Zho",
+ "Gemini_15P_API_S_Chat_Advance_Zho",
+ "Gemini_API_Chat_Zho",
+ "Gemini_API_S_Chat_Zho",
+ "Gemini_API_S_Vsion_ImgURL_Zho",
+ "Gemini_API_S_Zho",
+ "Gemini_API_Vsion_ImgURL_Zho",
+ "Gemini_API_Zho",
+ "Gemini_FileUpload_API_S_Zho",
+ "Gemini_File_API_S_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemini"
+ }
+ ],
+ "https://github.com/Visionatrix/ComfyUI-RemoteVAE": [
+ [
+ "RemoteVAEDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-RemoteVAE"
+ }
+ ],
+ "https://github.com/Visionatrix/ComfyUI-Visionatrix": [
+ [
+ "StyleAlignedBatchAlign",
+ "VixCheckboxLogic",
+ "VixDictionaryConvert",
+ "VixDictionaryGet",
+ "VixDictionaryNew",
+ "VixDictionaryUpdate",
+ "VixDynamicLoraDefinition",
+ "VixImageFilters",
+ "VixMultilineText",
+ "VixTextConcatenate",
+ "VixTextReplace",
+ "VixUiAspectRatioSelector",
+ "VixUiCheckbox",
+ "VixUiCheckboxLogic",
+ "VixUiList",
+ "VixUiListLogic",
+ "VixUiPrompt",
+ "VixUiRangeFloat",
+ "VixUiRangeInt",
+ "VixUiRangeScaleFloat",
+ "VixUiWorkflowMetadata"
+ ],
+ {
+ "title_aux": "ComfyUI-Visionatrix"
+ }
+ ],
+ "https://github.com/VraethrDalkr/ComfyUI-TripleKSampler": [
+ [
+ "SwitchStrategyAdvanced",
+ "SwitchStrategySimple",
+ "TripleKSamplerWan22Lightning",
+ "TripleKSamplerWan22LightningAdvanced",
+ "TripleKSamplerWan22LightningAdvancedAlt",
+ "TripleWVSampler",
+ "TripleWVSamplerAdvanced",
+ "TripleWVSamplerAdvancedAlt"
+ ],
+ {
+ "title_aux": "ComfyUI-TripleKSampler"
+ }
+ ],
+ "https://github.com/VrchStudio/comfyui-web-viewer": [
+ [
+ "VrchAnyOSCControlNode",
+ "VrchAudioChannelLoaderNode",
+ "VrchAudioConcatNode",
+ "VrchAudioEmotionVisualizerNode",
+ "VrchAudioFrequencyBandAnalyzerNode",
+ "VrchAudioGenresNode",
+ "VrchAudioMusic2EmotionNode",
+ "VrchAudioRecorderNode",
+ "VrchAudioSaverNode",
+ "VrchAudioVisualizerNode",
+ "VrchAudioWebSocketChannelLoaderNode",
+ "VrchAudioWebViewerNode",
+ "VrchBPMDetectorNode",
+ "VrchBooleanKeyControlNode",
+ "VrchChannelOSCControlNode",
+ "VrchChannelX4OSCControlNode",
+ "VrchDelayNode",
+ "VrchDelayOSCControlNode",
+ "VrchFloatKeyControlNode",
+ "VrchFloatOSCControlNode",
+ "VrchFloatRemapNode",
+ "VrchGamepadLoaderNode",
+ "VrchImageChannelLoaderNode",
+ "VrchImageFallbackNode",
+ "VrchImageFlipBookWebViewerNode",
+ "VrchImagePreviewBackgroundNewNode",
+ "VrchImagePreviewBackgroundNode",
+ "VrchImageSaverNode",
+ "VrchImageSwitchOSCControlNode",
+ "VrchImageWebSocketChannelLoaderNode",
+ "VrchImageWebSocketFilterSettingsNode",
+ "VrchImageWebSocketSettingsNode",
+ "VrchImageWebSocketSimpleWebViewerNode",
+ "VrchImageWebSocketWebViewerNode",
+ "VrchImageWebViewerNode",
+ "VrchInstantQueueKeyControlNode",
+ "VrchIntKeyControlNode",
+ "VrchIntOSCControlNode",
+ "VrchIntRemapNode",
+ "VrchJsonUrlLoaderNode",
+ "VrchJsonWebSocketChannelLoaderNode",
+ "VrchJsonWebSocketSenderNode",
+ "VrchLatentWebSocketChannelLoaderNode",
+ "VrchLatentWebSocketSenderNode",
+ "VrchMicLoaderNode",
+ "VrchMidiDeviceLoaderNode",
+ "VrchModelWebViewerNode",
+ "VrchOSCControlSettingsNode",
+ "VrchQRCodeNode",
+ "VrchSwitchOSCControlNode",
+ "VrchTextConcatOSCControlNode",
+ "VrchTextKeyControlNode",
+ "VrchTextSrtPlayerNode",
+ "VrchTextSwitchOSCControlNode",
+ "VrchTriggerToggleNode",
+ "VrchTriggerToggleX4Node",
+ "VrchTriggerToggleX8Node",
+ "VrchVideoWebViewerNode",
+ "VrchWebSocketServerNode",
+ "VrchWebViewerNode",
+ "VrchXYOSCControlNode",
+ "VrchXYZOSCControlNode",
+ "VrchXboxControllerNode"
+ ],
+ {
+ "title_aux": "ComfyUI Web Viewer"
+ }
+ ],
+ "https://github.com/VykosX/ControlFlowUtils": [
+ [
+ "Cycle",
+ "CycleContinue",
+ "CycleEnd",
+ "DataMonitor",
+ "FallbackAnyBatch",
+ "FallbackImagePreviewer",
+ "FolderSearch",
+ "GarbageCollector",
+ "HaltExecution",
+ "IfConditionSelector",
+ "ImageResolutionAdjust",
+ "InvertCondition",
+ "LoopClose",
+ "LoopOpen",
+ "LoraSelector",
+ "MemoryStorage",
+ "ModelSelector",
+ "NullInput",
+ "NullOutput",
+ "ReadTextFile",
+ "SaveTextFile",
+ "SimpleToggle",
+ "StringOperation",
+ "UniversalSwitch",
+ "UnloadModels",
+ "VAESelector",
+ "Wait"
+ ],
+ {
+ "title_aux": "ControlFlowUtils"
+ }
+ ],
+ "https://github.com/WASasquatch/ComfyUI_LMStudio_EasyQuery": [
+ [
+ "WASLMStudioCaption",
+ "WASLMStudioCaptionDataset",
+ "WASLMStudioCaptionDatasetCustom",
+ "WASLMStudioChat",
+ "WASLMStudioModel",
+ "WASLMStudioOptions",
+ "WASLMStudioQuery",
+ "WASLoadImageDirectory"
+ ],
+ {
+ "title_aux": "WAS LMStudio Easy-Query"
+ }
+ ],
+ "https://github.com/WASasquatch/ComfyUI_Preset_Merger": [
+ [
+ "Preset_Model_Merge"
+ ],
+ {
+ "title_aux": "ComfyUI Preset Merger"
+ }
+ ],
+ "https://github.com/WASasquatch/ComfyUI_RetroArch_Player": [
+ [
+ "ComfyRetroArchPlayer"
+ ],
+ {
+ "title_aux": "ComfyUI_RetroArch_Player"
+ }
+ ],
+ "https://github.com/WASasquatch/ComfyUI_Viewer": [
+ [
+ "WASCanvasComposeBatch",
+ "WASComfyViewer"
+ ],
+ {
+ "title_aux": "ComfyUI_Viewer"
+ }
+ ],
+ "https://github.com/WASasquatch/FreeU_Advanced": [
+ [
+ "WAS_FreeU",
+ "WAS_FreeU_V2",
+ "WAS_PostCFGShift"
+ ],
+ {
+ "title_aux": "FreeU_Advanced"
+ }
+ ],
+ "https://github.com/WASasquatch/PPF_Noise_ComfyUI": [
+ [
+ "Blend Latents (PPF Noise)",
+ "Cross-Hatch Power Fractal (PPF Noise)",
+ "Images as Latents (PPF Noise)",
+ "Perlin Power Fractal Latent (PPF Noise)"
+ ],
+ {
+ "title_aux": "PPF_Noise_ComfyUI"
+ }
+ ],
+ "https://github.com/WASasquatch/PowerNoiseSuite": [
+ [
+ "Blend Latents (PPF Noise)",
+ "Cross-Hatch Power Fractal (PPF Noise)",
+ "Cross-Hatch Power Fractal Settings (PPF Noise)",
+ "Images as Latents (PPF Noise)",
+ "Latent Adjustment (PPF Noise)",
+ "Latents to CPU (PPF Noise)",
+ "Linear Cross-Hatch Power Fractal (PPF Noise)",
+ "Perlin Power Fractal Latent (PPF Noise)",
+ "Perlin Power Fractal Settings (PPF Noise)",
+ "Power KSampler Advanced (PPF Noise)",
+ "Power-Law Noise (PPF Noise)"
+ ],
+ {
+ "title_aux": "Power Noise Suite for ComfyUI"
+ }
+ ],
+ "https://github.com/WASasquatch/WAS_Extras": [
+ [
+ "BLVAEEncode",
+ "CLIPTextEncodeList",
+ "CLIPTextEncodeSequence2",
+ "ConditioningBlend",
+ "DebugInput",
+ "KSamplerSeq",
+ "KSamplerSeq2",
+ "VAEEncodeForInpaint (WAS)",
+ "VividSharpen",
+ "VividSharpenV2",
+ "WASApplyLUT",
+ "WASApplyReweightedLoRA",
+ "WASCameraMotionTrajectory",
+ "WASChannelWaveform",
+ "WASCombineLUT",
+ "WASLatentContrastLimitedDetailBoost",
+ "WASLatentUpscaleHybrid",
+ "WASLoadLUT",
+ "WASMoEConditioningListAppend",
+ "WASPowerLoraMerger",
+ "WASPowerLoraMergerOptions",
+ "WASSaveLUT",
+ "WASTiledImageUpscaleWithModel",
+ "WASWan22MoESamplerCtx",
+ "WASWanExposureStabilizer",
+ "WAS_AdaptiveDifferenceLatentUpscale"
+ ],
+ {
+ "title_aux": "WAS_Extras"
+ }
+ ],
+ "https://github.com/WASasquatch/face-upscaling-and-seamless-embedding": [
+ [
+ "FUSEGenericKSampler",
+ "FUSEKSampler",
+ "FUSESamplerMaskOptions",
+ "FUSEVideoKSampler",
+ "FUSEYOLOSettings"
+ ],
+ {
+ "title_aux": "FUSE Face Enhancer"
+ }
+ ],
+ "https://github.com/WASasquatch/was_affine": [
+ [
+ "WASAffineCustomAdvanced",
+ "WASAffineKSampler",
+ "WASAffineKSamplerAdvanced",
+ "WASAffinePatternNoise",
+ "WASAffineScheduleOptions",
+ "WASBayerOptions",
+ "WASBlackNoiseOptions",
+ "WASCheckerOptions",
+ "WASCrossHatchOptions",
+ "WASDetailRegionOptions",
+ "WASDotScreenOptions",
+ "WASGreenNoiseOptions",
+ "WASHighpassWhiteOptions",
+ "WASLatentAffine",
+ "WASLatentAffineCommonOptions",
+ "WASLatentAffineOptions",
+ "WASLatentAffineSimple",
+ "WASLatentUpscale",
+ "WASMultiBandNoiseApply",
+ "WASPerlinOptions",
+ "WASPoissonBlueOptions",
+ "WASRingNoiseOptions",
+ "WASSmoothRegionOptions",
+ "WASTileLinesOptions",
+ "WASUltimateCustomAdvancedAffineNoUpscale",
+ "WASUltimateCustomAdvancedAffineNoUpscaleLatent",
+ "WASVelvetOptions",
+ "WASWANVAEDecode",
+ "WASWANVAEEncode",
+ "WASWorleyEdgesOptions"
+ ],
+ {
+ "title_aux": "WAS Affine"
+ }
+ ],
+ "https://github.com/WUYUDING2583/ComfyUI-Save-Image-Callback": [
+ [
+ "Save Image With Callback"
+ ],
+ {
+ "title_aux": "Save Image With Callback"
+ }
+ ],
+ "https://github.com/WWWEN8/ComfyUI-CCXManager": [
+ [
+ "CCXGroupExecutorSender",
+ "CCXGroupExecutorSingle",
+ "CCXManager",
+ "CCXManagerCopy",
+ "CCXRepoUpdaterNode",
+ "CreateSDPPPInstallationDirectory",
+ "NodeVersionManager"
+ ],
+ {
+ "title_aux": "ComfyUI-CCXManager"
+ }
+ ],
+ "https://github.com/WX-NPS1598/ComfyUI-Auto_Crop_By_NPS": [
+ [
+ "AutoCropByNPS"
+ ],
+ {
+ "title_aux": "Auto Crop By NPS"
+ }
+ ],
+ "https://github.com/WaddingtonHoldings/ComfyUI-InstaSD": [
+ [
+ "GPTImage1Generate",
+ "InstaCBoolean",
+ "InstaCFloat",
+ "InstaCInteger",
+ "InstaCLoadImageFromS3",
+ "InstaCLoraLoader",
+ "InstaCSaveImageToS3",
+ "InstaCSeed",
+ "InstaCText",
+ "InstaCTextML",
+ "InstaFileExist",
+ "InstaLoadImageLocal",
+ "InstaLoadImageWithMask",
+ "InstaPromptMultipleStyleSelector",
+ "InstaPromptStyleSelector",
+ "LoadVideo",
+ "PreViewVideo"
+ ],
+ {
+ "title_aux": "InstaSD nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/WainWong/ComfyUI-Loop-image": [
+ [
+ "CyberEve_BatchImageLoopClose",
+ "CyberEve_BatchImageLoopOpen",
+ "CyberEve_LoopIndexSwitch",
+ "CyberEve_MaskMerge",
+ "CyberEve_MaskSegmentation",
+ "CyberEve_SingleImageLoopClose",
+ "CyberEve_SingleImageLoopOpen"
+ ],
+ {
+ "title_aux": "ComfyUI-Loop-image"
+ }
+ ],
+ "https://github.com/Wakapedia/ComfyUI-WanVideoWakawave": [
+ [
+ "WanVideoWakawaveLoraLoader",
+ "WanVideoWakawavePromptBuilder"
+ ],
+ {
+ "title_aux": "WanVideo Wakawave - Advanced LoRA & Prompt Tools"
+ }
+ ],
+ "https://github.com/Wakfull33/ComfyUI-SaveImageCivitAI": [
+ [
+ "SaveCivitai"
+ ],
+ {
+ "title_aux": "ComfyUI-SaveImageCivitAI"
+ }
+ ],
+ "https://github.com/WangDianhui/ComfyUI-SA-ODE_Sampler": [
+ [
+ "LowStepSigmaScheduler",
+ "SAODELowStepSampler",
+ "SAODEStableSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-SA-ODE_Sampler"
+ }
+ ],
+ "https://github.com/WangPengxing/ComfyUI_WPX_Node": [
+ [
+ "AnimalContour",
+ "AnimalContourSilhouette",
+ "CircleContour",
+ "DetermineRowsAndCols",
+ "PenetrateStyle",
+ "RectangleContour",
+ "SplitMaskElements",
+ "SplitStickers"
+ ],
+ {
+ "title_aux": "ComfyUI WPX Nodes"
+ }
+ ],
+ "https://github.com/WarpedAnimation/ComfyUI-WarpedToolset": [
+ [
+ "ClipLoaderGGUF",
+ "DualClipLoaderGGUF",
+ "GGUFRun",
+ "GGUFSave",
+ "GGUFUndo",
+ "LoaderGGUF",
+ "LoaderGGUFAdvanced",
+ "QuadrupleClipLoaderGGUF",
+ "TENSORBoost",
+ "TENSORCut",
+ "TripleClipLoaderGGUF",
+ "VaeGGUF",
+ "WarpedAddToCaption",
+ "WarpedBasicGuider",
+ "WarpedBundleAllVideoImages",
+ "WarpedBundleVideoImages",
+ "WarpedCLIPLoader",
+ "WarpedCLIPVisionLoader",
+ "WarpedCheckpointLoader",
+ "WarpedClipLoaderGGUF",
+ "WarpedContinueWorkflowAuto",
+ "WarpedContinueWorkflowManual",
+ "WarpedCreateEmptyImageBatch",
+ "WarpedCreateEmptyLatentBatch",
+ "WarpedCreateSpecialImageBatch",
+ "WarpedDualCLIPLoader",
+ "WarpedDualClipLoaderGGUF",
+ "WarpedDualEncoder",
+ "WarpedDualGuider",
+ "WarpedFramepackLoraSelectBatch",
+ "WarpedFramepackMultiLoraSelect",
+ "WarpedFramepackMultiLoraSelectExt",
+ "WarpedFramepackSampler",
+ "WarpedGetImageFromVideo",
+ "WarpedGetTwoImagesFromVideo",
+ "WarpedHunyuanImageToVideo",
+ "WarpedHunyuanLoraAvgMerge",
+ "WarpedHunyuanLoraBatchMerge",
+ "WarpedHunyuanLoraConvert",
+ "WarpedHunyuanLoraConvertKeys",
+ "WarpedHunyuanLoraConvertToMusubi",
+ "WarpedHunyuanLoraDoubleBlocksLayersBlend",
+ "WarpedHunyuanLoraDoubleBlocksModifyMultipleSegments",
+ "WarpedHunyuanLoraDoubleBlocksModifySegment",
+ "WarpedHunyuanLoraDoubleBlocksRemoveLinear",
+ "WarpedHunyuanLoraDoubleBlocksSwap",
+ "WarpedHunyuanLoraMerge",
+ "WarpedHunyuanMultiLoraAvgMerge",
+ "WarpedHunyuanMultiLoraLoader",
+ "WarpedHunyuanMultiLoraMerge",
+ "WarpedHunyuanMultiLoraMixer",
+ "WarpedHunyuanVideoLoraLoader",
+ "WarpedHunyuanVideoToVideo",
+ "WarpedImageLossCalc",
+ "WarpedImageNoiseAugmentation",
+ "WarpedImageScaleToSide",
+ "WarpedLeapfusionHunyuanI2V",
+ "WarpedLoadFramePackModel",
+ "WarpedLoadHunyuanLoraWeightsByPrefix",
+ "WarpedLoadImages",
+ "WarpedLoadLorasBatchByPrefix",
+ "WarpedLoadVideosBatch",
+ "WarpedLoaderGGUF",
+ "WarpedLoraKeysAndMetadataReader",
+ "WarpedLoraReSave",
+ "WarpedModifyCaptionFile",
+ "WarpedMultiLoraLoader",
+ "WarpedNumericalConversion",
+ "WarpedPromptConcat",
+ "WarpedPromptConcatExt",
+ "WarpedReverseImageBatch",
+ "WarpedSamplerCustomAdv",
+ "WarpedSamplerCustomAdvLatent",
+ "WarpedSamplerCustomScripted",
+ "WarpedSamplerScripts12",
+ "WarpedSamplerScripts16",
+ "WarpedSamplerScripts20",
+ "WarpedSamplerScripts30",
+ "WarpedSamplerScripts40",
+ "WarpedSamplerScripts5",
+ "WarpedSamplerScripts8",
+ "WarpedSaveAnimatedPng",
+ "WarpedSaveImageCaption",
+ "WarpedSingleEncoder",
+ "WarpedUNETConverter",
+ "WarpedUNETLoader",
+ "WarpedUpscaleWithModel",
+ "WarpedVAELoader",
+ "WarpedWan22MergeLoaderGGUF",
+ "WarpedWanImageToVideo",
+ "WarpedWanLoadAndEditLoraBlocks",
+ "WarpedWanLoraMerge"
+ ],
+ {
+ "title_aux": "ComfyUI-WarpedToolset"
+ }
+ ],
+ "https://github.com/WaveSpeedAI/wavespeed-comfyui": [
+ [
+ "WaveSpeedAI Preview",
+ "WaveSpeedAIPredictor"
+ ],
+ {
+ "title_aux": "wavespeed-comfyui"
+ }
+ ],
+ "https://github.com/WeChatCV/Stand-In_Preprocessor_ComfyUI": [
+ [
+ "ApplyFaceProcessor",
+ "FaceOnlyModeSwitch",
+ "FaceProcessorLoader",
+ "VideoBackgroundRestorer",
+ "VideoFramePreprocessor",
+ "VideoInputPreprocessor"
+ ],
+ {
+ "title_aux": "Stand-In Official Preprocessor ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/WebDev9000/WebDev9000-Nodes": [
+ [
+ "IgnoreBraces",
+ "SettingsSwitch"
+ ],
+ {
+ "title_aux": "WebDev9000-Nodes"
+ }
+ ],
+ "https://github.com/Wenaka2004/ComfyUI-TagClassifier": [
+ [
+ "LLMProcessingNode"
+ ],
+ {
+ "title_aux": "ComfyUI-TagClassifier"
+ }
+ ],
+ "https://github.com/What-a-stupid-username/comfyui-InversedSampler": [
+ [
+ "SamplerInversedEulerNode"
+ ],
+ {
+ "title_aux": "comfyui_InversedSampler"
+ }
+ ],
+ "https://github.com/Wicloz/ComfyUI-Simply-Nodes": [
+ [
+ "WF_ConditionalLoraLoader",
+ "WF_FixupPixelArt",
+ "WF_MultilineText",
+ "WF_RandomStyle",
+ "WF_RefineToggle",
+ "WF_ResolutionSDXL",
+ "WF_TextFlow"
+ ],
+ {
+ "title_aux": "ComfyUI Simply Nodes"
+ }
+ ],
+ "https://github.com/Windecay/ComfyUI-ReservedVRAM": [
+ [
+ "ReservedVRAMSetter"
+ ],
+ {
+ "title_aux": "ComfyUI-ReservedVRAM"
+ }
+ ],
+ "https://github.com/Windecay/ComfyUI-SDupcaleTiledSize": [
+ [
+ "SDupscaleTiledSize"
+ ],
+ {
+ "title_aux": "ComfyUI-SDupcaleTiledSize"
+ }
+ ],
+ "https://github.com/Windecay/ComfyUI_CheckVprediction": [
+ [
+ "CheckVpredictionNode"
+ ],
+ {
+ "title_aux": "ComfyUI_CheckVprediction"
+ }
+ ],
+ "https://github.com/Windecay/ComfyUI_Dynamic-RAMCache": [
+ [
+ "DynamicRAMCacheControl",
+ "RAMCacheExtremeCleanup"
+ ],
+ {
+ "title_aux": "ComfyUI_Dynamic-RAMCache"
+ }
+ ],
+ "https://github.com/WingeD123/ComfyUI_QwenVL_PromptCaption": [
+ [
+ "Ovis25Run",
+ "Qwen25Caption",
+ "Qwen25CaptionBatch",
+ "Qwen3Caption",
+ "Qwen3CaptionBatch",
+ "StringToBbox",
+ "StringToSam3Box"
+ ],
+ {
+ "title_aux": "ComfyUI_QwenVL_PromptCaption"
+ }
+ ],
+ "https://github.com/X-School-Academy/X-FluxAgent": [
+ [
+ "X-FluxAgent.AICodeGenNode",
+ "X-FluxAgent.OpenAIChatnNode",
+ "X-FluxAgent.RichTextNode",
+ "X-FluxAgent.SaveTextNode"
+ ],
+ {
+ "title_aux": "X-FluxAgent"
+ }
+ ],
+ "https://github.com/X-T-E-R/ComfyUI-EasyCivitai-XTNodes": [
+ [
+ "CheckpointLoaderSimpleWithPreviews",
+ "CivitaiCheckpointLoaderSimple",
+ "CivitaiLoraLoader",
+ "CivitaiLoraLoaderStacked",
+ "CivitaiLoraLoaderStackedAdvanced",
+ "LoraLoaderStackedAdvancedWithPreviews",
+ "LoraLoaderStackedWithPreviews",
+ "LoraLoaderWithPreviews",
+ "XTNodesCleanPrompt",
+ "XTNodesPromptConcatenate"
+ ],
+ {
+ "title_aux": "ComfyUI Easy Civitai (XTNodes)"
+ }
+ ],
+ "https://github.com/XLabs-AI/x-flux-comfyui": [
+ [
+ "ApplyAdvancedFluxControlNet",
+ "ApplyAdvancedFluxIPAdapter",
+ "ApplyFluxControlNet",
+ "ApplyFluxIPAdapter",
+ "FluxLoraLoader",
+ "LoadFluxControlNet",
+ "LoadFluxIPAdapter",
+ "XlabsSampler"
+ ],
+ {
+ "title_aux": "x-flux-comfyui"
+ }
+ ],
+ "https://github.com/XWAVEart/comfyui-xwave-xlitch-nodes": [
+ [
+ "XWAVECellularNoiseNode",
+ "XWAVEPixelate",
+ "XWaveChromaticAberration",
+ "XWaveColorChannelManipulation",
+ "XWaveColorFilter",
+ "XWaveColorShiftExpansion",
+ "XWaveCurvedHueShift",
+ "XWaveGaussianBlur",
+ "XWaveHistogramGlitch",
+ "XWaveJPEGArtifacts",
+ "XWaveNoiseEffect",
+ "XWavePosterize",
+ "XWaveRGBChannelShift",
+ "XWaveSharpen"
+ ],
+ {
+ "title_aux": "ComfyUI XWAVE Nodes"
+ }
+ ],
+ "https://github.com/XYMikky12138/ComfyUI-MIKKY-Mask-Editor": [
+ [
+ "MIKKYMaskEditorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-MIKKY-Mask-Editor"
+ }
+ ],
+ "https://github.com/XchanBik/ComfyUI_SimpleBridgeNode": [
+ [
+ "LoraTextLoader",
+ "SimpleBridgeLoadNode",
+ "SimpleBridgeStoreNode"
+ ],
+ {
+ "description": "A custom node for ComfyUI to store and retrieve data dynamically.",
+ "nickname": "SimpleBridgeNode",
+ "title": "SimpleBridgeNode",
+ "title_aux": "ComfyUI_SimpleBridgeNode"
+ }
+ ],
+ "https://github.com/Xclbr7/ComfyUI-Merlin": [
+ [
+ "GeminiPromptExpander",
+ "Magic Photo Prompter \ud83e\ude84"
+ ],
+ {
+ "title_aux": "ComfyUI-Merlin: Magic Photo Prompter"
+ }
+ ],
+ "https://github.com/Xiangyu-CAS/HandFixer": [
+ [
+ "MediapipeHandNode"
+ ],
+ {
+ "title_aux": "HandFixer"
+ }
+ ],
+ "https://github.com/XieJunchen/comfyUI_LLM": [
+ [
+ "AppendImagesToBatch",
+ "CloudImageUploadNode",
+ "CloudImagesToVideoAndUpload",
+ "CloudVideoUploadNode",
+ "ComfyUI_LLM_Ollama",
+ "CreateEmptyImageBatch",
+ "DeepSeek_Online",
+ "GetFirstImageFromBatch",
+ "GetVideoClipByIndex",
+ "LoadGifFromLocal",
+ "LoadImgFromUrl",
+ "RemoveFirstOrLastImageFromBatch",
+ "SplitVideoByFrames",
+ "StringArrayFormatter",
+ "StringArrayIndexer"
+ ],
+ {
+ "title_aux": "comfyUI_LLM"
+ }
+ ],
+ "https://github.com/Xkipper/ComfyUI_SkipperNodes": [
+ [
+ "Embedding Stack",
+ "Simple Box"
+ ],
+ {
+ "title_aux": "ComfyUI_SkipperNodes"
+ }
+ ],
+ "https://github.com/XmYx/ComfyUI-SmolLM3": [
+ [
+ "SmolLM3ModelLoader",
+ "SmolLM3Sampler",
+ "SmolLM3SimpleGenerate"
+ ],
+ {
+ "title_aux": "ComfyUI-SmolLM3"
+ }
+ ],
+ "https://github.com/XmYx/deforum-comfy-nodes": [
+ [
+ "DeforumAddNoiseNode",
+ "DeforumAnimParamsNode",
+ "DeforumAreaPromptNode",
+ "DeforumBaseParamsNode",
+ "DeforumCacheLatentNode",
+ "DeforumCadenceNode",
+ "DeforumCadenceParamsNode",
+ "DeforumColorMatchNode",
+ "DeforumColorParamsNode",
+ "DeforumConditioningBlendNode",
+ "DeforumDepthParamsNode",
+ "DeforumDiffusionParamsNode",
+ "DeforumFILMInterpolationNode",
+ "DeforumFrameWarpNode",
+ "DeforumGetCachedLatentNode",
+ "DeforumHybridMotionNode",
+ "DeforumHybridParamsNode",
+ "DeforumHybridScheduleNode",
+ "DeforumIteratorNode",
+ "DeforumKSampler",
+ "DeforumLoadVideo",
+ "DeforumNoiseParamsNode",
+ "DeforumPromptNode",
+ "DeforumSeedNode",
+ "DeforumSetVAEDownscaleRatioNode",
+ "DeforumSimpleInterpolationNode",
+ "DeforumSingleSampleNode",
+ "DeforumTranslationParamsNode",
+ "DeforumVideoSaveNode"
+ ],
+ {
+ "title_aux": "Deforum Nodes"
+ }
+ ],
+ "https://github.com/XuanYu-github/comfyui-PlyPreview": [
+ [
+ "PlyPreviewLoadGaussianPLYEnhance",
+ "PlyPreviewLoadGaussianPLYPathEnhance",
+ "PlyPreviewPreviewGaussianEnhance",
+ "PlyPreviewProcessGaussianPLYEnhance"
+ ],
+ {
+ "title_aux": "ComfyUI PlyPreview"
+ }
+ ],
+ "https://github.com/Xyc2016/Comfyui_Fd_Nodes": [
+ [
+ "FD_Flux2KleinGenImage",
+ "FD_GeminiImage",
+ "FD_RemoveWatermark",
+ "FD_Upload",
+ "FD_imgToText_Doubao"
+ ],
+ {
+ "title_aux": "Comfyui_Fd_Nodes"
+ }
+ ],
+ "https://github.com/Xyem/Xycuno-Oobabooga": [
+ [
+ "Oobabooga",
+ "Xycuno Oobabooga"
+ ],
+ {
+ "title_aux": "Xycuno Oobabooga"
+ }
+ ],
+ "https://github.com/Xz3r0-M/ComfyUI-Xz3r0-Nodes": [
+ [
+ "XAudioSave",
+ "XImageSave",
+ "XLatentLoad",
+ "XLatentSave",
+ "XMath",
+ "XResolution",
+ "XStringGroup",
+ "XVideoSave"
+ ],
+ {
+ "title_aux": "ComfyUI-Xz3r0-Nodes"
+ }
+ ],
+ "https://github.com/YOUR-WORST-TACO/ComfyUI-TacoNodes": [
+ [
+ "Example",
+ "TacoAnimatedLoader",
+ "TacoGifMaker",
+ "TacoImg2ImgAnimatedLoader",
+ "TacoImg2ImgAnimatedProcessor",
+ "TacoLatent"
+ ],
+ {
+ "title_aux": "ComfyUI-TacoNodes"
+ }
+ ],
+ "https://github.com/YRIKKA/ComfyUI-InferenceTimeScaling": [
+ [
+ "InferenceTimeScaler",
+ "LoadCLIPScoreVerifier",
+ "LoadImageRewardVerifier",
+ "LoadQwenVLMVerifier"
+ ],
+ {
+ "title_aux": "ComfyUI-InferenceTimeScaling"
+ }
+ ],
+ "https://github.com/Yahweasel/ComfyUI-HF-Diffusers": [
+ [
+ "HFDAutoencoderKL",
+ "HFDEncodePrompt",
+ "HFDLoadLora",
+ "HFDLoadPipeline",
+ "HFDRunPipeline",
+ "HFDVAEDecode",
+ "HFDVAEEncode",
+ "HFTAutoModel",
+ "HFTCreateConversation",
+ "HFTLoadPipeline",
+ "HFTRunPipeline",
+ "HFTUnpackConversation"
+ ],
+ {
+ "title_aux": "ComfyUI-HF-Diffusers"
+ }
+ ],
+ "https://github.com/Yahweasel/ComfyUI-MinDalle": [
+ [
+ "MinDalleNode"
+ ],
+ {
+ "title_aux": "ComfyUI-MinDalle"
+ }
+ ],
+ "https://github.com/Yanick112/ComfyUI-ToSVG": [
+ [
+ "TS_ImageQuantize",
+ "TS_ImageToSVGStringBW_Potracer",
+ "TS_ImageToSVGStringBW_Vtracer",
+ "TS_ImageToSVGStringColor_Vtracer",
+ "TS_SVGBytesIOToString",
+ "TS_SVGPathSimplify",
+ "TS_SVGStringPreview",
+ "TS_SVGStringToImage",
+ "TS_SVGStringToSVGBytesIO",
+ "TS_SaveSVGString"
+ ],
+ {
+ "title_aux": "ComfyUI-ToSVG"
+ }
+ ],
+ "https://github.com/YaroslavIv/comfyui_swd": [
+ [
+ "SwDSelector"
+ ],
+ {
+ "title_aux": "SwD Preset Selector for ComfyUI"
+ }
+ ],
+ "https://github.com/YarvixPA/ComfyUI-YarvixPA": [
+ [
+ "ApplyStyleModelEnhanced",
+ "ApplyStyleModelSimple",
+ "BatchImagesNode",
+ "FrameCalculatorAudio",
+ "FrameCalculatorVideo",
+ "GetResolutionImage",
+ "InpaintConditioningNode",
+ "InpaintFluxKontextConditioning",
+ "Prepimg2Vid",
+ "RemoveBackgroundNode",
+ "ShowAnyDataType",
+ "StitchImages",
+ "StitchImagesAndMask",
+ "TextFieldNode",
+ "UnstitchImages",
+ "UnstitchImagesAndMask",
+ "UpscaleImageWithModel"
+ ],
+ {
+ "title_aux": "ComfyUI-YarvixPA"
+ }
+ ],
+ "https://github.com/YaserJaradeh/comfyui-yaser-nodes": [
+ [
+ "Float",
+ "GeneralSwitch",
+ "ImageColorMatch",
+ "ImageSizeBySide",
+ "IterativeUpscaleWithModelsNode",
+ "LoraLoaderStack",
+ "SpotDiffusionParams",
+ "TiledDiffusion",
+ "TiledVAEDecode",
+ "TiledVAEEncode",
+ "UtilRepeatImages",
+ "WanVideoControlnet",
+ "WanVideoControlnetLoader",
+ "WanVideoNAG"
+ ],
+ {
+ "title_aux": "Yaser-nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/Yeq6X/ComfyUI-image-to-video-inserter": [
+ [
+ "Base64ListToImages",
+ "Base64VideoToImages",
+ "CreateBlankFrames",
+ "ImageBatchAssembler",
+ "ImageFrameSelector",
+ "ImagesToBase64List",
+ "ImagesToBase64Video",
+ "MultiImageInserter",
+ "WanVideoLatentInsertFrames",
+ "WanVideoLatentZeroFrames"
+ ],
+ {
+ "title_aux": "ComfyUI Image to Video Inserter"
+ }
+ ],
+ "https://github.com/Yo1up/Diffusion-Model-Detailer": [
+ [
+ "Detailer"
+ ],
+ {
+ "title_aux": "Diffusion-Model-Detailer"
+ }
+ ],
+ "https://github.com/Ysthara/ComfyUI-Resolution-AR-Node": [
+ [
+ "ResolutionNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Resolution-AR-Node"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-AniSora": [
+ [
+ "AniSora",
+ "AniSoraPrompt",
+ "LoadAniSoraModel",
+ "SaveAniSora"
+ ],
+ {
+ "title_aux": "ComfyUI-AniSora"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-AudioX": [
+ [
+ "AudioXPrompt",
+ "Condition",
+ "Generate",
+ "LoadAudioXAudio",
+ "LoadAudioXModel",
+ "LoadAudioXVideo",
+ "SaveAudioXAudio"
+ ],
+ {
+ "title_aux": "Yuan-ManX/ComfyUI-AudioX"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Bagel": [
+ [
+ "BagelPrompt",
+ "ImageEditing",
+ "ImageGeneration",
+ "ImageThinkEditing",
+ "ImageThinkGeneration",
+ "ImageUnderstanding",
+ "LoadBAGELModel",
+ "LoadEditImage"
+ ],
+ {
+ "title_aux": "ComfyUI-Bagel"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-ChatterboxTTS": [
+ [
+ "ChatterboxAudioPrompt",
+ "ChatterboxPrompt",
+ "ChatterboxTTS",
+ "ChatterboxVC",
+ "LoadChatterboxAudio",
+ "LoadChatterboxTTSModel",
+ "LoadChatterboxTargetAudio",
+ "LoadChatterboxVCModel",
+ "SaveChatterboxAudio"
+ ],
+ {
+ "title_aux": "ComfyUI-ChatterboxTTS"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Cobra": [
+ [
+ "ColorizeImage",
+ "DrawColorHint",
+ "ExtractLineArt",
+ "GetColorValue",
+ "LoadCobraModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Cobra"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Dia": [
+ [
+ "DiaTTS",
+ "InputDiaText",
+ "LoadDiaAudio",
+ "LoadDiaModel",
+ "SaveDiaAudio"
+ ],
+ {
+ "title_aux": "ComfyUI-Dia"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Direct3D-S2": [
+ [
+ "Direct3DS2",
+ "LoadDirect3DS2Image",
+ "LoadDirect3DS2Model",
+ "SaveDirect3DS2Mesh"
+ ],
+ {
+ "title_aux": "ComfyUI-Direct3D-S2"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-HiDream-I1": [
+ [
+ "GenerateHiDreamImage",
+ "LoadHiDreamModel",
+ "SaveHiDreamImage"
+ ],
+ {
+ "title_aux": "ComfyUI-HiDream-I1"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-HiggsAudio": [
+ [
+ "HiggsAudio",
+ "LoadHiggsAudioModel",
+ "LoadHiggsAudioPrompt",
+ "LoadHiggsAudioSystemPrompt",
+ "LoadHiggsAudioTokenizer",
+ "SaveHiggsAudio"
+ ],
+ {
+ "title_aux": "ComfyUI-HiggsAudio"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Hunyuan3D-2.1": [
+ [
+ "Hunyuan3DShapeGeneration",
+ "Hunyuan3DTexureSynthsis",
+ "LoadHunyuan3DImage",
+ "LoadHunyuan3DModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Hunyuan3D-2.1"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-HunyuanPortrait": [
+ [
+ "HunyuanPortrait",
+ "LoadHunyuanPortraitConfig",
+ "LoadHunyuanPortraitImage",
+ "LoadHunyuanPortraitVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-HunyuanPortrait"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Kimi-VL": [
+ [
+ "KimiVL",
+ "LoadKimiVLImage",
+ "LoadKimiVLModel",
+ "SaveKimiVLText"
+ ],
+ {
+ "title_aux": "ComfyUI-Kimi-VL"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-LLaMA-Mesh": [
+ [
+ "Apply Gradient Color",
+ "ApplyGradientColor",
+ "Chat LLaMa Mesh",
+ "ChatLLaMaMesh",
+ "Visualize Mesh",
+ "VisualizeMesh"
+ ],
+ {
+ "title_aux": "ComfyUI-LLaMA-Mesh"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-LayerAnimate": [
+ [
+ "LayerAnimateNode",
+ "LoadImages",
+ "LoadPretrainedModel"
+ ],
+ {
+ "title_aux": "ComfyUI-LayerAnimate"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-LiveCC": [
+ [
+ "LiveCC",
+ "LiveCCPrompt",
+ "LoadLiveCCModel",
+ "LoadLiveCCVideo",
+ "SaveLiveCCText"
+ ],
+ {
+ "title_aux": "ComfyUI-LiveCC"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Matrix-Game": [
+ [
+ "GameVideoGenerator",
+ "LoadDiTModel",
+ "LoadGameImage",
+ "LoadMouseIcon",
+ "LoadTextEncoderModel",
+ "LoadVAEModel",
+ "MatrixGameOutput"
+ ],
+ {
+ "title_aux": "ComfyUI-Matrix-Game"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-MoviiGen": [
+ [
+ "LoadMoviiGenModel",
+ "MoviiGen",
+ "MoviiGenPrompt",
+ "SaveMoviiGen"
+ ],
+ {
+ "title_aux": "ComfyUI-MoviiGen"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Multiverse": [
+ [
+ "PlayGame"
+ ],
+ {
+ "title_aux": "ComfyUI-Multiverse"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Muyan-TTS": [
+ [
+ "Generate",
+ "InputText",
+ "LoadMuyanTTSModel",
+ "LoadRefAudio",
+ "PromptText",
+ "SaveMuyanTTSAudio"
+ ],
+ {
+ "title_aux": "ComfyUI-Muyan-TTS"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-OmniGen2": [
+ [
+ "LoadOmniGen2Image",
+ "LoadOmniGen2Model",
+ "OmniGen2"
+ ],
+ {
+ "title_aux": "ComfyUI-OmniGen2"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-OrpheusTTS": [
+ [
+ "Long Text Generation",
+ "LongTextGeneration",
+ "Single Text Generation",
+ "SingleTextGeneration"
+ ],
+ {
+ "title_aux": "ComfyUI-OrpheusTTS"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-PhotoDoodle": [
+ [
+ "PhotoDoodle",
+ "PhotoDoodle Gen"
+ ],
+ {
+ "title_aux": "ComfyUI-PhotoDoodle"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-PosterCraft": [
+ [
+ "LoadCustomTransformer",
+ "LoadPipeline",
+ "LoadPosterCraftPrompt",
+ "LoadQwenModel",
+ "PosterCraft",
+ "SavePosterCraft"
+ ],
+ {
+ "title_aux": "ComfyUI-PosterCraft"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-SkyReels-A2": [
+ [
+ "A2Prompt",
+ "A2VideoGenerator",
+ "CombineImages",
+ "LoadA2Model",
+ "NegativePrompt",
+ "ReferenceImages",
+ "SaveVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-SkyReels-A2"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-SkyworkUniPic": [
+ [
+ "Image2Text",
+ "ImageEditing",
+ "LoadSkyworkUniPicCheckpoint",
+ "LoadSkyworkUniPicConfig",
+ "LoadSkyworkUniPicImage",
+ "LoadSkyworkUniPicPrompt",
+ "SaveSkyworkUniPicEditImage",
+ "SaveSkyworkUniPicImage",
+ "Text2Image"
+ ],
+ {
+ "title_aux": "ComfyUI-SkyworkUniPic"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-SoundHub": [
+ [
+ "Load Audio",
+ "LoadAudio",
+ "Preview Audio",
+ "PreviewAudio",
+ "Save Audio",
+ "SaveAudio"
+ ],
+ {
+ "title_aux": "ComfyUI-SoundHub"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Step1X-3D": [
+ [
+ "GeometryGeneration",
+ "GeometryLabelGeneration",
+ "LoadInputImage",
+ "LoadStep1X3DGeometryLabelModel",
+ "LoadStep1X3DGeometryModel",
+ "LoadStep1X3DTextureModel",
+ "LoadUntexturedMesh",
+ "SaveTexturedMesh",
+ "SaveUntexturedMesh",
+ "TexureSynthsis"
+ ],
+ {
+ "title_aux": "ComfyUI-Step1X-3D"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-StyleStudio": [
+ [
+ "StyleStudio",
+ "StyleStudio Image Stylization"
+ ],
+ {
+ "title_aux": "ComfyUI-StyleStudio"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-ThinkSound": [
+ [
+ "LoadCaption",
+ "LoadCoTDescription",
+ "LoadOThinkSoundVideo",
+ "ThinkSound"
+ ],
+ {
+ "title_aux": "ComfyUI-ThinkSound"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-UNO": [
+ [
+ "ConfigSave",
+ "ImageConcat",
+ "ImagePathLoader",
+ "ImageSave",
+ "UNOGenerator",
+ "UNOParams"
+ ],
+ {
+ "title_aux": "ComfyUI-UNO"
+ }
+ ],
+ "https://github.com/Yuan-ManX/ComfyUI-Vui": [
+ [
+ "LoadVuiModel",
+ "LoadVuiPrompt",
+ "SaveVui",
+ "Vui"
+ ],
+ {
+ "title_aux": "ComfyUI-Vui"
+ }
+ ],
+ "https://github.com/Yukinoshita-Yukinoe/ComfyUI-Qwen-Node": [
+ [
+ "QwenAPILLMNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen-Node"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-APISR": [
+ [
+ "APISR_Lterative_Zho",
+ "APISR_ModelLoader_Zho",
+ "APISR_Zho"
+ ],
+ {
+ "title_aux": "APISR IN COMFYUI"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Animated-optical-illusions": [
+ [
+ "AOI_Processing_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-Animated-optical-illusions"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-ArtGallery": [
+ [
+ "ArtGallery_Zho",
+ "ArtistsImage_Zho",
+ "CamerasImage_Zho",
+ "FilmsImage_Zho",
+ "MovementsImage_Zho",
+ "StylesImage_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-ArtGallery"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG": [
+ [
+ "BRIA_RMBG_ModelLoader_Zho",
+ "BRIA_RMBG_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-BRIA_AI-RMBG"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-DeepSeek-JanusPro": [
+ [
+ "Janus_ImageGeneration",
+ "Janus_ModelLoader",
+ "Janus_MultimodalUnderstanding"
+ ],
+ {
+ "title_aux": "ComfyUI-DeepSeek-JanusPro"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-DepthFM": [
+ [
+ "DepthFM_Literative_Zho",
+ "DepthFM_ModelLoader_Zho",
+ "DepthFM_Zho"
+ ],
+ {
+ "title_aux": "DepthFM IN COMFYUI"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID": [
+ [
+ "IDBaseModelLoader_fromhub",
+ "IDBaseModelLoader_local",
+ "IDControlNetLoader",
+ "IDGenerationNode",
+ "ID_Prompt_Styler",
+ "InsightFaceLoader_Zho",
+ "Ipadapter_instantidLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-InstantID"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Phi-3-mini": [
+ [
+ "Phi3mini_4k_Chat_Zho",
+ "Phi3mini_4k_ModelLoader_Zho",
+ "Phi3mini_4k_Zho"
+ ],
+ {
+ "title_aux": "Phi-3-mini in ComfyUI"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO": [
+ [
+ "BaseModel_Loader_fromhub",
+ "BaseModel_Loader_local",
+ "LoRALoader",
+ "NEW_PhotoMaker_Generation",
+ "PhotoMakerAdapter_Loader_fromhub",
+ "PhotoMakerAdapter_Loader_local",
+ "Prompt_Styler",
+ "Ref_Image_Preprocessing"
+ ],
+ {
+ "title_aux": "ComfyUI PhotoMaker (ZHO)"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PixArt-alpha-Diffusers": [
+ [
+ "PA_BaseModelLoader_fromhub_Zho",
+ "PA_Generation_Zho",
+ "PA_Styler_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-PixArt-alpha-Diffusers"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Q-Align": [
+ [
+ "QAlign_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-Q-Align"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API": [
+ [
+ "QWenVL_API_S_Multi_Zho",
+ "QWenVL_API_S_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen-VL-API"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO": [
+ [
+ "SVD_Aspect_Ratio_Zho",
+ "SVD_Steps_MotionStrength_Seed_Zho",
+ "SVD_Styler_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-SVD-ZHO (WIP)"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE": [
+ [
+ "SMoE_Generation_Zho",
+ "SMoE_ModelLoader_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI SegMoE"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Text_Image-Composite": [
+ [
+ "AlphaChanelAddByMask",
+ "ImageCompositeBy_BG_Zho",
+ "ImageCompositeBy_Zho",
+ "ImageComposite_BG_Zho",
+ "ImageComposite_Zho",
+ "RGB_Image_Zho",
+ "Text_Image_Frame_Zho",
+ "Text_Image_Multiline_Zho",
+ "Text_Image_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-Text_Image-Composite [WIP]"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-UltraEdit-ZHO": [
+ [
+ "UltraEdit_Generation_Zho",
+ "UltraEdit_ModelLoader_Zho",
+ "UltraEdit_ModelLoader_local_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI-UltraEdit-ZHO"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM": [
+ [
+ "ESAM_ModelLoader_Zho",
+ "Yoloworld_ESAM_DetectorProvider_Zho",
+ "Yoloworld_ESAM_Zho",
+ "Yoloworld_ModelLoader_Zho"
+ ],
+ {
+ "title_aux": "ComfyUI YoloWorld-EfficientSAM"
+ }
+ ],
+ "https://github.com/ZHO-ZHO-ZHO/comfyui-portrait-master-zh-cn": [
+ [
+ "PortraitMaster_\u4e2d\u6587\u7248"
+ ],
+ {
+ "title_aux": "comfyui-portrait-master-zh-cn"
+ }
+ ],
+ "https://github.com/ZUENS2020/ComfyUI-Gemini-LiteLLM": [
+ [
+ "ChatParams",
+ "GeminiImageParams",
+ "LLMBaseConfig",
+ "LLMChatGenerate",
+ "LLMImageGenerate",
+ "ORBaseConfig",
+ "ORChatGenerate",
+ "ORChatParams",
+ "ORImageGenerate",
+ "ORImageParams"
+ ],
+ {
+ "title_aux": "ComfyUI Gemini LiteLLM Nodes"
+ }
+ ],
+ "https://github.com/ZXL-Xinram/ComfyUI-AutoFlow": [
+ [
+ "AutoFlowAddAlphaChannel",
+ "AutoFlowCombineVideoAndMask",
+ "AutoFlowConditionAssignment",
+ "AutoFlowConditionChecker",
+ "AutoFlowExportTexturedMesh",
+ "AutoFlowImageResizeCalculator",
+ "AutoFlowIntToListConverter",
+ "AutoFlowListLength",
+ "AutoFlowListToIntExtractor",
+ "AutoFlowLoadImageWithBackground",
+ "AutoFlowLoadImagesForLoopWithBackground",
+ "AutoFlowPathJoiner",
+ "AutoFlowPathParser",
+ "AutoFlowPathValidator",
+ "AutoFlowSaveImagesWithAlpha",
+ "AutoFlowStringCase",
+ "AutoFlowStringConcat",
+ "AutoFlowStringFormat",
+ "AutoFlowStringMultiConcat",
+ "AutoFlowStringReplace",
+ "AutoFlowStringSplit",
+ "AutoFlowTimestampFormatter",
+ "AutoFlowTimestampGenerator",
+ "AutoFlowVideoToImages"
+ ],
+ {
+ "title_aux": "ComfyUI-AutoFlow"
+ }
+ ],
+ "https://github.com/ZZXYWQ/ComfyUI-ZZXYWQ": [
+ [
+ "StreamRecorder",
+ "VideoFormatConverter",
+ "ZZX_PaintsUndo"
+ ],
+ {
+ "title_aux": "ZZX Nodes"
+ }
+ ],
+ "https://github.com/Zachary116699/ComfyUI-LoadImageWithMetaDataEx": [
+ [
+ "ZLoadImageWithMetaDataFP"
+ ],
+ {
+ "title_aux": "ComfyUI_LoadImageWithMetaDataEx"
+ }
+ ],
+ "https://github.com/ZaneA/ComfyUI-ImageReward": [
+ [
+ "ImageRewardLoader",
+ "ImageRewardScore"
+ ],
+ {
+ "title_aux": "ImageReward"
+ }
+ ],
+ "https://github.com/Zar4X/ComfyUI-Batch-Process": [
+ [
+ "ImageBatchLoader",
+ "ImageBatchSaver",
+ "LoraBatchLoader",
+ "TXTBatchLoader",
+ "TextModifyTool",
+ "VideoBatchSaver"
+ ],
+ {
+ "title_aux": "ComfyUI-Batch-Process"
+ }
+ ],
+ "https://github.com/Zar4X/ComfyUI-Image-Resizing": [
+ [
+ "ExtendCanvasByPercentage",
+ "ExtendCanvasByPercentage (ZX)",
+ "ImageAspectRatioExtractor",
+ "ImageCropByPercentage",
+ "ImageResolutionExtractor",
+ "MaskCropByPercentage",
+ "ResizeToMultiple",
+ "SmartImageResize"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Resizing"
+ }
+ ],
+ "https://github.com/Zch6111/AI_Text_Comfyui": [
+ [
+ "AutoPromptGeneratorNode",
+ "GeminiImageToPrompt",
+ "SmartAutoPromptNode"
+ ],
+ {
+ "title_aux": "AI_Text_Comfyui"
+ }
+ ],
+ "https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools": [
+ [
+ "EmbeddingsNameLoader",
+ "EmbendingList"
+ ],
+ {
+ "title_aux": "ComfyUI-Embeddings-Tools"
+ }
+ ],
+ "https://github.com/Zehong-Ma/ComfyUI-MagCache": [
+ [
+ "CompileModel",
+ "MagCache",
+ "MagCacheCalibration"
+ ],
+ {
+ "title_aux": "ComfyUI-MagCache"
+ }
+ ],
+ "https://github.com/Zeknes/Comfyui-LLM-Chat": [
+ [
+ "LLMChat"
+ ],
+ {
+ "title_aux": "Comfyui-LLM-Chat"
+ }
+ ],
+ "https://github.com/Zeknes/Comfyui-Nanobanana-API": [
+ [
+ "NanobananaImageGenerator"
+ ],
+ {
+ "title_aux": "Comfyui-Nanobanana-API"
+ }
+ ],
+ "https://github.com/Zeks/comfyui-rapidfire": [
+ [
+ "BracketEscaper",
+ "CachedCheckpoint",
+ "CsvWriterNode",
+ "HyperTile //Inspire",
+ "ImmatureImageCounter",
+ "ImmatureImageDataLoader",
+ "KSampler //Inspire",
+ "KSamplerAdvanced //Inspire",
+ "KSamplerAdvancedPipe //Inspire",
+ "KSamplerAdvancedProgress //Inspire",
+ "KSamplerPipe //Inspire",
+ "KSamplerProgress //Inspire",
+ "MultiModelAdvancedKsampler",
+ "MultiModelCheckpointIterator",
+ "MultiModelCheckpointIteratorFirst",
+ "MultiModelPromptSaver",
+ "Ranbooru",
+ "RandomCharacterSelector",
+ "RandomNoise //Inspire",
+ "RapidSchedulerCombo",
+ "RapidSchedulerSelector",
+ "RapidStringIterator",
+ "ScheduledCFGGuider //Inspire",
+ "ScheduledPerpNegCFGGuider //Inspire",
+ "StringHasher"
+ ],
+ {
+ "title_aux": "comfyui-rapidfire"
+ }
+ ],
+ "https://github.com/ZeroSpaceStudios/ComfyUI-ZSNodes": [
+ [
+ "ZS_BoundingBoxCrop",
+ "ZS_SaveImage"
+ ],
+ {
+ "title_aux": "ComfyUI-ZSNodes"
+ }
+ ],
+ "https://github.com/ZhiHui6/zhihui_nodes_comfyui": [
+ [
+ "AudioDuration",
+ "BatchLoadingOfImages",
+ "ColorMatchToReference",
+ "ColorRemoval",
+ "ExtraOptions",
+ "FilmGrain",
+ "Florence2Plus",
+ "GetImageSizes",
+ "ImageAspectRatio",
+ "ImageFormatConverter",
+ "ImageLoader",
+ "ImageRotateTool",
+ "ImageScaler",
+ "ImageSwitchDualMode",
+ "KontextPresetsPlus",
+ "LaplacianSharpen",
+ "LatentSwitchDualMode",
+ "LoadKontextPresetsBasic",
+ "MultiLineTextNode",
+ "MultiPlatformTranslate",
+ "MultiplePathsInput",
+ "PathSwitch",
+ "PauseWorkflow",
+ "PhotographPromptGenerator",
+ "PreviewOrCompareImages",
+ "PriorityImageSwitch",
+ "PriorityTextSwitch",
+ "PromptCardSelector",
+ "PromptDelete",
+ "PromptGallery",
+ "PromptPresetMultipleChoice",
+ "PromptPresetOneChoice",
+ "PromptReplace",
+ "Qwen3VLAPI",
+ "Qwen3VLAdvanced",
+ "Qwen3VLBasic",
+ "Qwen3VLExtraOptions",
+ "ReservedVRAMSetter",
+ "ResourceCleaner",
+ "Sa2VAAdvanced",
+ "Sa2VASegmentationPreset",
+ "ShowText",
+ "SobelSharpen",
+ "SunoLyricsGenerator",
+ "SunoSongStylePromptGenerator",
+ "SystemPromptLoader",
+ "TagSelector",
+ "TextCombinerNode",
+ "TextEditorWithContinue",
+ "TextExpander",
+ "TextExtractor",
+ "TextMergerNode",
+ "TextModifier",
+ "TextSwitchDualMode",
+ "TriggerWordMerger",
+ "TypeDesigner",
+ "USMSharpen",
+ "VideoLoader",
+ "WanPromptGenerator"
+ ],
+ {
+ "title_aux": "zhihui_nodes_comfyui"
+ }
+ ],
+ "https://github.com/Zone-Roam/ComfyUI-Live-Search": [
+ [
+ "LiveSearch_API_Loader",
+ "LiveSearch_Agent",
+ "LiveSearch_Settings"
+ ],
+ {
+ "title_aux": "ComfyUI-Live-Search"
+ }
+ ],
+ "https://github.com/a-l-e-x-d-s-9/ComfyUI-SaveCheckpointWithMetadata": [
+ [
+ "Save Checkpoint with Metadata",
+ "SaveCheckpointWithMetadata"
+ ],
+ {
+ "title_aux": "Save Checkpoint with Metadata"
+ }
+ ],
+ "https://github.com/a-ru2016/ComfyUI-Universal-ABM-LoRA": [
+ [
+ "NullUniversalLoRALoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Universal-ABM-LoRA"
+ }
+ ],
+ "https://github.com/a-ru2016/ComfyUI_UniversalSubspace": [
+ [
+ "ApplyNullLaLoRA",
+ "ApplyUniversalLoRA",
+ "ApplyUniversalWeights",
+ "LoadUniversalWeights",
+ "UniversalLoRALoader"
+ ],
+ {
+ "title_aux": "ComfyUI_UniversalSubspace"
+ }
+ ],
+ "https://github.com/a-und-b/ComfyUI_AB_Wildcard": [
+ [
+ "ABWildcardNode"
+ ],
+ {
+ "title_aux": "ComfyUI_AB_Wildcard"
+ }
+ ],
+ "https://github.com/a-und-b/ComfyUI_Delay": [
+ [
+ "Add Delay"
+ ],
+ {
+ "title_aux": "ComfyUI_Delay"
+ }
+ ],
+ "https://github.com/a-und-b/ComfyUI_IC-Light-v2_fal": [
+ [
+ "ICLightV2"
+ ],
+ {
+ "title_aux": "IC-Light V2 (fal.ai)"
+ }
+ ],
+ "https://github.com/a-und-b/ComfyUI_JSON_Helper": [
+ [
+ "JSONStringToObjectNode"
+ ],
+ {
+ "title_aux": "ComfyUI_JSON_Helper"
+ }
+ ],
+ "https://github.com/a-und-b/ComfyUI_LoRA_from_URL": [
+ [
+ "Load LoRA From URL"
+ ],
+ {
+ "title_aux": "ComfyUI_LoRA_from_URL"
+ }
+ ],
+ "https://github.com/a-und-b/ComfyUI_MaskAreaCondition": [
+ [
+ "MaskAreaCondition",
+ "SelectData"
+ ],
+ {
+ "title_aux": "ComfyUI Mask Area Condition"
+ }
+ ],
+ "https://github.com/a1lazydog/ComfyUI-AudioScheduler": [
+ [
+ "AmplitudeToGraph",
+ "AmplitudeToNumber",
+ "AudioToAmplitudeGraph",
+ "AudioToAudioData",
+ "AudioToFFTs",
+ "BatchAmplitudeSchedule",
+ "ClipAmplitude",
+ "FloatArrayToGraph",
+ "GateNormalizedAmplitude",
+ "NormalizeAmplitude",
+ "NormalizedAmplitudeDrivenString",
+ "NormalizedAmplitudeToGraph",
+ "NormalizedAmplitudeToNumber",
+ "TransientAmplitudeBasic"
+ ],
+ {
+ "title_aux": "ComfyUI-AudioScheduler"
+ }
+ ],
+ "https://github.com/aTanguay/ComfyUI_Detonate": [
+ [
+ "DetonateBlur",
+ "DetonateChannelCopy",
+ "DetonateChromaKeyer",
+ "DetonateClamp",
+ "DetonateColorCorrect",
+ "DetonateColorCurves",
+ "DetonateConstant",
+ "DetonateCornerPin",
+ "DetonateCrop",
+ "DetonateCryptomatteExtract",
+ "DetonateDefocus",
+ "DetonateDenoise",
+ "DetonateDilate",
+ "DetonateDisplacementMap",
+ "DetonateEdgeDefringe",
+ "DetonateEdgeDetect",
+ "DetonateErode",
+ "DetonateExposure",
+ "DetonateGlow",
+ "DetonateGrade",
+ "DetonateGrain",
+ "DetonateGridWarp",
+ "DetonateHueSatVal",
+ "DetonateInvert",
+ "DetonateLUT",
+ "DetonateLoadEXR",
+ "DetonateLumaKeyer",
+ "DetonateLumaKeyerSimple",
+ "DetonateMaskFromColor",
+ "DetonateMaskSmoother",
+ "DetonateMatteControl",
+ "DetonateMerge",
+ "DetonateNoise",
+ "DetonatePremultiply",
+ "DetonateRamp",
+ "DetonateRotoBezier",
+ "DetonateRotoBezierFromImage",
+ "DetonateSaturation",
+ "DetonateSeamBlender",
+ "DetonateSharpen",
+ "DetonateShuffle",
+ "DetonateTransform",
+ "DetonateTriMapGenerator",
+ "DetonateUnpremultiply",
+ "DetonateVignette",
+ "DetonateZDefocus",
+ "DetonateZMerge"
+ ],
+ {
+ "title_aux": "ComfyUI_Detonate"
+ }
+ ],
+ "https://github.com/aadityamundhalia/ComfyUI-ollama-aditya": [
+ [
+ "OllamaPromptGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI Ollama by Aditya"
+ }
+ ],
+ "https://github.com/abdozmantar/ComfyUI-DeepExtract": [
+ [
+ "VocalAndSoundRemoverNode"
+ ],
+ {
+ "title_aux": "DeepExtract"
+ }
+ ],
+ "https://github.com/abdozmantar/ComfyUI-DeepExtractV2": [
+ [
+ "DeepExtractV2Node"
+ ],
+ {
+ "title_aux": "DeepExtract2"
+ }
+ ],
+ "https://github.com/abdullahceylan/ac-comfyui-image-optimizer": [
+ [
+ "ACImageBatchResizer",
+ "ACImageInfo",
+ "ACImageOptimizer",
+ "ACImageOptimizerAdvanced",
+ "ACImageOptimizerMultiInput",
+ "ACImageOptimizerPreview",
+ "ACImageOptimizerSave",
+ "ACImageOptimizerSaveMultiInput",
+ "ACImageSmartResizer"
+ ],
+ {
+ "author": "Abdullah Ceylan",
+ "title_aux": "AC Image Optimizer"
+ }
+ ],
+ "https://github.com/abdullahceylan/ac-comfyui-queue-manager": [
+ [
+ "QueueManagerNode"
+ ],
+ {
+ "title_aux": "AC ComfyUI Queue Manager"
+ }
+ ],
+ "https://github.com/aburahamu/ComfyUI-IsNiceParts": [
+ [
+ "NiceHand"
+ ],
+ {
+ "title_aux": "ComfyUI-IsNiceParts"
+ }
+ ],
+ "https://github.com/aburahamu/ComfyUI-RequestsPoster": [
+ [
+ "GetImageFromSD3byI2I",
+ "GetImageFromSD3byT2I",
+ "PostImage2Discord",
+ "PostImage2X",
+ "PostText"
+ ],
+ {
+ "title_aux": "ComfyUI-RequestPoster"
+ }
+ ],
+ "https://github.com/abyz22/image_control": [
+ [
+ "abyz22_AddPrompt",
+ "abyz22_Convertpipe",
+ "abyz22_Editpipe",
+ "abyz22_FirstNonNull",
+ "abyz22_Frompipe",
+ "abyz22_ImpactWildcardEncode",
+ "abyz22_ImpactWildcardEncode_GetPrompt",
+ "abyz22_Padding Image",
+ "abyz22_RandomMask",
+ "abyz22_RemoveControlnet",
+ "abyz22_ResizeOpenpose",
+ "abyz22_SaveImage",
+ "abyz22_SetQueue",
+ "abyz22_Topipe",
+ "abyz22_blend_onecolor",
+ "abyz22_blendimages",
+ "abyz22_bypass",
+ "abyz22_censoring",
+ "abyz22_drawmask",
+ "abyz22_lamaInpaint",
+ "abyz22_lamaPreprocessor",
+ "abyz22_makecircles",
+ "abyz22_path_generator",
+ "abyz22_setimageinfo",
+ "abyz22_smallhead"
+ ],
+ {
+ "title_aux": "image_control"
+ }
+ ],
+ "https://github.com/acorderob/sd-webui-prompt-postprocessor": [
+ [
+ "ACBPPPSelectVariable",
+ "ACBPromptPostProcessor"
+ ],
+ {
+ "author": "ACB",
+ "description": "Node for processing prompts. Includes the following options: send to negative prompt, set variables, if/elif/else command for conditional content, wildcards and choices.",
+ "nickname": "ACB PPP",
+ "title": "Prompt Post Processor",
+ "title_aux": "Prompt PostProcessor"
+ }
+ ],
+ "https://github.com/adambarbato/ComfyUI-Sa2VA": [
+ [
+ "Sa2VANodeTpl"
+ ],
+ {
+ "title_aux": "Sa2VA Segmentation"
+ }
+ ],
+ "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface": [
+ [
+ "DownloadLinkChecker",
+ "ShowFileNames"
+ ],
+ {
+ "title_aux": "ComfyUI-TrashNodes-DownloadHuggingface"
+ }
+ ],
+ "https://github.com/adieyal/comfyui-dynamicprompts": [
+ [
+ "DPCombinatorialGenerator",
+ "DPFeelingLucky",
+ "DPJinja",
+ "DPMagicPrompt",
+ "DPOutput",
+ "DPRandomGenerator"
+ ],
+ {
+ "title_aux": "DynamicPrompts Custom Nodes"
+ }
+ ],
+ "https://github.com/adigayung/ComfyUI-Translator": [
+ [
+ "AT_CLIPTextAutoTranslate",
+ "AT_PromptText",
+ "CLIP Text Encode (Auto Translate)",
+ "Prompt Text (Auto Translate)"
+ ],
+ {
+ "title_aux": "ComfyUI-Translator"
+ }
+ ],
+ "https://github.com/adrianschubek/comfyui-zeug": [
+ [
+ "ZeugBool",
+ "ZeugCleanGpuPass",
+ "ZeugFloat",
+ "ZeugFloatToStr",
+ "ZeugInt",
+ "ZeugIntToStr",
+ "ZeugIntToWxH",
+ "ZeugJoinStr",
+ "ZeugJoinStrList",
+ "ZeugPrintPass",
+ "ZeugSplitStrList",
+ "ZeugStr",
+ "ZeugStrToFloat",
+ "ZeugStrToInt",
+ "ZeugWxHToInt"
+ ],
+ {
+ "title_aux": "comfyui-zeug"
+ }
+ ],
+ "https://github.com/adriflex/ComfyUI_Blender_Texdiff": [
+ [
+ "ViewportColor",
+ "ViewportDepth"
+ ],
+ {
+ "title_aux": "ComfyUI_Blender_Texdiff"
+ }
+ ],
+ "https://github.com/advancedtech-sk/ComfyUI-GROUT": [
+ [
+ "GROUTHeatmapColorize",
+ "GROUTSegmentation",
+ "GROUTThreshold"
+ ],
+ {
+ "title_aux": "ComfyUI-GROUT"
+ }
+ ],
+ "https://github.com/aegis72/aegisflow_utility_nodes": [
+ [
+ "Add Text To Image",
+ "Aegisflow CLIP Pass",
+ "Aegisflow Conditioning Pass",
+ "Aegisflow Image Pass",
+ "Aegisflow Latent Pass",
+ "Aegisflow Mask Pass",
+ "Aegisflow Model Pass",
+ "Aegisflow Pos/Neg Pass",
+ "Aegisflow SDXL Tuple Pass",
+ "Aegisflow VAE Pass",
+ "Aegisflow controlnet preprocessor bus",
+ "Apply Instagram Filter",
+ "Binary INT Switch",
+ "Brightness_Contrast_Ally",
+ "Flatten Colors",
+ "Gaussian Blur_Ally",
+ "GlitchThis Effect",
+ "Hue Rotation",
+ "Image Flip_ally",
+ "Placeholder Tuple",
+ "Swap Color Mode",
+ "aegisflow Multi_Pass",
+ "aegisflow Multi_Pass XL",
+ "af_pipe_in_15",
+ "af_pipe_in_xl",
+ "af_pipe_out_15",
+ "af_pipe_out_xl"
+ ],
+ {
+ "title_aux": "AegisFlow Utility Nodes"
+ }
+ ],
+ "https://github.com/aegis72/comfyui-styles-all": [
+ [
+ "menus"
+ ],
+ {
+ "title_aux": "ComfyUI-styles-all"
+ }
+ ],
+ "https://github.com/aesethtics/ComfyUI-Utilitools": [
+ [
+ "UtilAdd",
+ "UtilAspectRatio",
+ "UtilBatchController",
+ "UtilBooleanAND",
+ "UtilBooleanNOT",
+ "UtilBooleanOR",
+ "UtilCalculator",
+ "UtilConstantFloat",
+ "UtilConstantInt",
+ "UtilConstantString",
+ "UtilCounter",
+ "UtilDateTimestamp",
+ "UtilDivide",
+ "UtilFloatToInt",
+ "UtilIfThenElse",
+ "UtilImageDimensions",
+ "UtilIntToFloat",
+ "UtilListCreate",
+ "UtilListIndex",
+ "UtilMultiply",
+ "UtilPassthrough",
+ "UtilStringReplace",
+ "UtilSubtract",
+ "UtilSwitch",
+ "UtilTextConcat",
+ "UtilWhateverToString"
+ ],
+ {
+ "title_aux": "ComfyUI Utilitools Nodes"
+ }
+ ],
+ "https://github.com/aesethtics/comfyui-3d-model-viewer": [
+ [
+ "ThreeDModelViewer"
+ ],
+ {
+ "title_aux": "ComfyUI 3D Model Viewer"
+ }
+ ],
+ "https://github.com/agavesunset/AgaveLogicCounter": [
+ [
+ "CyclicIntController"
+ ],
+ {
+ "title_aux": "AgaveLogicCounter"
+ }
+ ],
+ "https://github.com/agilly1989/ComfyUI_agilly1989_motorway": [
+ [
+ "MotorwayFloat",
+ "MotorwayInt",
+ "MotorwaySeed",
+ "MotorwayStart",
+ "MotorwayStr",
+ "MotorwayStrMulti"
+ ],
+ {
+ "title_aux": "ComfyUI_agilly1989_motorway"
+ }
+ ],
+ "https://github.com/ah-kun/ComfyUI-FailSafe-Translate-Node": [
+ [
+ "FailSafeTranslateAdvanced",
+ "FailSafeTranslateSimple"
+ ],
+ {
+ "title_aux": "ComfyUI-FailSafe-Translate-Node"
+ }
+ ],
+ "https://github.com/ahernandezmiro/ComfyUI-GCP_Storage_tools": [
+ [
+ "GCPReadImageNode",
+ "GCPWriteImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI-GCP_Storage_tools"
+ }
+ ],
+ "https://github.com/ahkimkoo/ComfyUI-GetKeyFrames": [
+ [
+ "BreakGrid",
+ "GetKeyFrames",
+ "MakeGrid"
+ ],
+ {
+ "title_aux": "ComfyUI-GetKeyFrames"
+ }
+ ],
+ "https://github.com/ahkimkoo/Comfyui-AudioSegment": [
+ [
+ "AudioListToBatch",
+ "AudioSegmentByParagraph",
+ "AudioSegmenter",
+ "SelectAudioClipFromList",
+ "SelectAudioFromList"
+ ],
+ {
+ "title_aux": "ComfyUI Audio Segment Plugin"
+ }
+ ],
+ "https://github.com/ai-joe-git/ComfyUI-Metadata-Extractor": [
+ [
+ "MetadataExtractorImproved"
+ ],
+ {
+ "title_aux": "ComfyUI-Metadata-Extractor"
+ }
+ ],
+ "https://github.com/ai-joe-git/ComfyUI-Simple-Prompt-Batcher": [
+ [
+ "SimplePromptBatcher"
+ ],
+ {
+ "title_aux": "ComfyUI-Simple-Prompt-Batcher"
+ }
+ ],
+ "https://github.com/ai-liam/comfyui-liam": [
+ [
+ "AiStoreAzureGPTLiam",
+ "GetBetterDepthImage",
+ "LiamLibDisplayText",
+ "LiamLibFillImage",
+ "LiamLibImageToGray",
+ "LiamLibLoadImage",
+ "LiamLibMergeText",
+ "LiamLibSaveImg",
+ "LiamLibSaveText",
+ "OllamaApiTNodeLiam",
+ "PreviewReliefImage",
+ "SpeechRecognitionLiam",
+ "SpeechSynthesisLiam"
+ ],
+ {
+ "title_aux": "LiamUtil"
+ }
+ ],
+ "https://github.com/ai-liam/comfyui_liam_util": [
+ [
+ "LiamLoadImage"
+ ],
+ {
+ "title_aux": "LiamUtil (single node)"
+ }
+ ],
+ "https://github.com/ai-shizuka/ComfyUI-tbox": [
+ [
+ "AnimalPosePreprocessor",
+ "BatchManager",
+ "CannyPreprocessor",
+ "ConstrainImageNode",
+ "DWPosePreprocessor",
+ "DWPreprocessor",
+ "DensePosePreprocessor",
+ "GFPGANNode",
+ "ImageLoader",
+ "ImageResize",
+ "ImageSaver",
+ "ImageSize",
+ "ImagesSaver",
+ "LineArtPreprocessor",
+ "LineartStandardPreprocessor",
+ "MaskAddNode",
+ "MiDaSDepthPreprocessor",
+ "PurgeVRAMNode",
+ "VideoInfo",
+ "VideoLoader",
+ "VideoSaver",
+ "WatermarkNode"
+ ],
+ {
+ "author": "tstandley",
+ "title_aux": "ComfyUI-tbox"
+ }
+ ],
+ "https://github.com/aiaiaikkk/ComfyUI-Curve": [
+ [
+ "CameraRawEnhanceNode",
+ "CameraRawToneCurveNode",
+ "ColorGradingNode",
+ "CurvePresetNode",
+ "GaussianBlurNode",
+ "HistogramAnalysisNode",
+ "PhotoshopCurveNode",
+ "PhotoshopHSLNode",
+ "PhotoshopLevelsNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Curve"
+ }
+ ],
+ "https://github.com/aiaiaikkk/comfyui-api-image-edit": [
+ [
+ "APIImageEditNode"
+ ],
+ {
+ "title_aux": "ComfyUI API Image Edit"
+ }
+ ],
+ "https://github.com/aiaiaikkk/super-prompt-canvas": [
+ [
+ "AdvancedBackgroundRemoval",
+ "BackgroundRemovalSettings",
+ "CustomModelPromptGenerator",
+ "KontextSuperPrompt",
+ "LRPGCanvas",
+ "OllamaKontextPromptGenerator",
+ "OllamaServiceManager",
+ "TextGenWebUIFluxKontextEnhancer"
+ ],
+ {
+ "title_aux": "super-prompt-canvas"
+ }
+ ],
+ "https://github.com/aianimation55/ComfyUI-FatLabels": [
+ [
+ "FatLabels"
+ ],
+ {
+ "title_aux": "Comfy UI FatLabels"
+ }
+ ],
+ "https://github.com/aiartvn/A2V_Multi_Image_Composite": [
+ [
+ "A2V_Multi_Image_Composite"
+ ],
+ {
+ "title_aux": "A2V Multi Image Composite"
+ }
+ ],
+ "https://github.com/aicuai/aicu-comfyui-stability-ai-api": [
+ [
+ "StabilityControlSketch",
+ "StabilityControlStructure",
+ "StabilityControlStyle",
+ "StabilityEdit",
+ "StabilityImageCore",
+ "StabilityImageSD3",
+ "StabilityImageToVideo",
+ "StabilityImageUltra",
+ "StabilityUpscaleConservative",
+ "StabilityUpscaleCreative",
+ "StabilityUpscaleFast"
+ ],
+ {
+ "title_aux": "aicu-comfyui-stability-ai-api"
+ }
+ ],
+ "https://github.com/aicuai/comfyui-save-image-watermark": [
+ [
+ "ExtractInvisibleWatermark",
+ "Local Save",
+ "LocalSaveImageWithWatermark"
+ ],
+ {
+ "title_aux": "comfyui-save-image-watermark"
+ }
+ ],
+ "https://github.com/aidec/Comfyui_TextBatch_aidec": [
+ [
+ "DataTempManager",
+ "DataTmpGet",
+ "DataTmpSet",
+ "GroupController",
+ "IFMatchCond",
+ "ImageFilenameProcessor",
+ "ImageInfoExtractor",
+ "ImageQueueProcessor",
+ "ImageQueueProcessorPlus",
+ "ImageQueueProcessorPro",
+ "JsonQuery",
+ "LoadImageByIndex",
+ "LoadImagesFromDirBatch",
+ "LoadImagesFromDirLazy",
+ "LoopResultExtractor",
+ "PathParser",
+ "TextArrayIndex",
+ "TextBatch",
+ "TextQueueProcessor",
+ "TextSplitCounter",
+ "TextSplitGet",
+ "UniversalLoopController"
+ ],
+ {
+ "title_aux": "Comfyui_TextBatch_aidec"
+ }
+ ],
+ "https://github.com/aidenli/ComfyUI_NYJY": [
+ [
+ "BailianChat",
+ "BailianChatOption",
+ "BailianVL",
+ "BailianVLOption",
+ "CivitaiPrompt",
+ "CommonLLMChat",
+ "ConvertAnyToString",
+ "ConvertDenoseToStep",
+ "ConvertStringToNumber",
+ "CreateSeedanceVideo",
+ "CustomLatentImage-NYJY",
+ "FloatSlider-NYJY",
+ "FluxProOnline",
+ "GetItemFromList",
+ "JoyCaption",
+ "JoyCaptionAlpha1Online",
+ "JoyCaptionAlpha2Online",
+ "JoyTag",
+ "JsonDumps",
+ "JsonGetKeys",
+ "JsonGetValueByKeys",
+ "JsonLoads",
+ "LengthOfArray",
+ "QwenLatentImage",
+ "ReadFileToString",
+ "Seededit3",
+ "Seedream3Txt2Img",
+ "Seedream4Img2Img",
+ "Seedream4Txt2Img",
+ "SplitString",
+ "Translate",
+ "VolcengineChat",
+ "VolcengineChatOption",
+ "VolcengineImageOption",
+ "VolcengineImg2Img",
+ "VolcengineTxt2Img"
+ ],
+ {
+ "title_aux": "ComfyUI_NYJY"
+ }
+ ],
+ "https://github.com/aigc-apps/EasyAnimate": [
+ [
+ "CameraBasicFromChaoJie",
+ "CameraCombineFromChaoJie",
+ "CameraJoinFromChaoJie",
+ "CameraTrajectoryFromChaoJie",
+ "CreateTrajectoryBasedOnKJNodes",
+ "EasyAnimateI2VSampler",
+ "EasyAnimateT2VSampler",
+ "EasyAnimateV2VSampler",
+ "EasyAnimateV5_I2VSampler",
+ "EasyAnimateV5_T2VSampler",
+ "EasyAnimateV5_V2VSampler",
+ "EasyAnimate_TextBox",
+ "ImageMaximumNode",
+ "LoadEasyAnimateLora",
+ "LoadEasyAnimateModel",
+ "TextBox"
+ ],
+ {
+ "title_aux": "Video Generation Nodes for EasyAnimate"
+ }
+ ],
+ "https://github.com/aigc-apps/VideoX-Fun": [
+ [
+ "CameraBasicFromChaoJie",
+ "CameraCombineFromChaoJie",
+ "CameraJoinFromChaoJie",
+ "CameraTrajectoryFromChaoJie",
+ "CogVideoXFunInpaintSampler",
+ "CogVideoXFunT2VSampler",
+ "CogVideoXFunV2VSampler",
+ "CombineFlux2Pipeline",
+ "CombineQwenImagePipeline",
+ "CombineWan2_2Pipeline",
+ "CombineWan2_2VaceFunPipeline",
+ "CombineWanPipeline",
+ "CombineZImagePipeline",
+ "CreateTrajectoryBasedOnKJNodes",
+ "Flux2ControlSampler",
+ "Flux2T2ISampler",
+ "FunAttention",
+ "FunCompile",
+ "FunRiflex",
+ "FunTextBox",
+ "ImageCollectNode",
+ "ImageMaximumNode",
+ "ImageToCanny",
+ "ImageToDepth",
+ "ImageToPose",
+ "LoadCogVideoXFunLora",
+ "LoadCogVideoXFunModel",
+ "LoadFlux2ControlNetInModel",
+ "LoadFlux2ControlNetInPipeline",
+ "LoadFlux2Lora",
+ "LoadFlux2Model",
+ "LoadFlux2TextEncoderModel",
+ "LoadFlux2TransformerModel",
+ "LoadFlux2VAEModel",
+ "LoadQwenImageControlNetInModel",
+ "LoadQwenImageControlNetInPipeline",
+ "LoadQwenImageLora",
+ "LoadQwenImageModel",
+ "LoadQwenImageProcessor",
+ "LoadQwenImageTextEncoderModel",
+ "LoadQwenImageTransformerModel",
+ "LoadQwenImageVAEModel",
+ "LoadVaceWanTransformer3DModel",
+ "LoadWan2_2FunLora",
+ "LoadWan2_2FunModel",
+ "LoadWan2_2Lora",
+ "LoadWan2_2Model",
+ "LoadWan2_2TransformerModel",
+ "LoadWan2_2VaceFunModel",
+ "LoadWanClipEncoderModel",
+ "LoadWanFunLora",
+ "LoadWanFunModel",
+ "LoadWanLora",
+ "LoadWanModel",
+ "LoadWanTextEncoderModel",
+ "LoadWanTransformerModel",
+ "LoadWanVAEModel",
+ "LoadZImageControlNetInModel",
+ "LoadZImageControlNetInPipeline",
+ "LoadZImageLora",
+ "LoadZImageModel",
+ "LoadZImageTextEncoderModel",
+ "LoadZImageTransformerModel",
+ "LoadZImageVAEModel",
+ "QwenImageControlSampler",
+ "QwenImageEditPlusSampler",
+ "QwenImageEditSampler",
+ "QwenImageT2VSampler",
+ "VideoToCanny",
+ "VideoToDepth",
+ "VideoToOpenpose",
+ "Wan2_2FunInpaintSampler",
+ "Wan2_2FunT2VSampler",
+ "Wan2_2FunV2VSampler",
+ "Wan2_2I2VSampler",
+ "Wan2_2T2VSampler",
+ "Wan2_2VaceFunSampler",
+ "WanFunInpaintSampler",
+ "WanFunT2VSampler",
+ "WanFunV2VSampler",
+ "WanI2VSampler",
+ "WanT2VSampler",
+ "ZImageControlSampler",
+ "ZImageT2ISampler"
+ ],
+ {
+ "title_aux": "VideoX-Fun"
+ }
+ ],
+ "https://github.com/aimerib/ComfyUI_HigherBitDepthSaveImage": [
+ [
+ "SaveImageHigherBitDepth"
+ ],
+ {
+ "title_aux": "ComfyUI-HigherBitDepthSaveImage"
+ }
+ ],
+ "https://github.com/aimoviestudio/comfyui-promptbuilder": [
+ [
+ "DynamicJsonPromptBuilder",
+ "DynamicTextPromptBuilder",
+ "JsonPromptBuilder",
+ "TextPromptBuilder",
+ "TextPromptNode"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Builder"
+ }
+ ],
+ "https://github.com/ainewsto/Comfyui-chatgpt-api": [
+ [
+ "ComfyuiChatGPTApi",
+ "Comfyui_gpt_image_1",
+ "Comfyui_gpt_image_1_edit"
+ ],
+ {
+ "title_aux": "Comfyui-chatgpt-api"
+ }
+ ],
+ "https://github.com/ainewsto/Comfyui-google-veo2-api": [
+ [
+ "ComfyuiGoogleVeo2"
+ ],
+ {
+ "title_aux": "Comfyui-google-veo2-api"
+ }
+ ],
+ "https://github.com/ainewsto/comfyui-labs-google": [
+ [
+ "ComfyUI-ImageFx",
+ "ComfyUI-Whisk",
+ "ComfyUI-Whisk-Prompts"
+ ],
+ {
+ "title_aux": "comfyui-labs-google"
+ }
+ ],
+ "https://github.com/aining2022/ComfyUI_Swwan": [
+ [
+ "AddLabel",
+ "AnyBooleanSwitch (Swwan)",
+ "AnySwitch (Swwan)",
+ "BatchSlice",
+ "ColorMatch",
+ "CrossFadeImages",
+ "CrossFadeImagesMulti",
+ "DrawMaskOnImage",
+ "FastPreview",
+ "GetImageRangeFromBatch",
+ "GetImageSizeAndCount",
+ "GetImagesFromBatchIndexed",
+ "GetLatentRangeFromBatch",
+ "GetLatentSizeAndCount",
+ "IO_save_image",
+ "ImageAddMulti",
+ "ImageAndMaskPreview",
+ "ImageBatchExtendWithOverlap",
+ "ImageBatchFilter",
+ "ImageBatchJoinWithTransition",
+ "ImageBatchMulti",
+ "ImageBatchRepeatInterleaving",
+ "ImageBatchTestPattern",
+ "ImageConcanate",
+ "ImageConcatFromBatch",
+ "ImageConcatMulti",
+ "ImageCropByMask",
+ "ImageCropByMaskAndResize",
+ "ImageCropByMaskBatch",
+ "ImageGrabPIL",
+ "ImageGridComposite2x2",
+ "ImageGridComposite3x3",
+ "ImageGridtoBatch",
+ "ImageNormalize_Neg1_To_1",
+ "ImagePadForOutpaintMasked",
+ "ImagePadForOutpaintTargetSize",
+ "ImagePadKJ",
+ "ImagePass",
+ "ImagePrepForICLora",
+ "ImageResizeByMegapixels",
+ "ImageResizeKJ",
+ "ImageResizeKJv2",
+ "ImageTensorList",
+ "ImageUncropByMask",
+ "ImageUpscaleWithModelBatched",
+ "Image_Resize_sum",
+ "Image_Resize_sum_data",
+ "Image_Resize_sum_restore",
+ "InsertImagesToBatchIndexed",
+ "InsertLatentToIndex",
+ "LayerUtility: CropByMask V2",
+ "LayerUtility: CropByMask V3",
+ "LayerUtility: CropByMask V4",
+ "LayerUtility: ImageScaleByAspectRatio V2",
+ "LayerUtility: RestoreCropBox",
+ "LayerUtility: RestoreCropBox V2",
+ "LoadAndResizeImage",
+ "LoadImagesFromFolderKJ",
+ "LoadVideosFromFolder",
+ "Mask_transform_sum",
+ "MathExpression_UTK",
+ "MergeBatch",
+ "MergeImageChannels",
+ "PadImageBatchInterleaved",
+ "PreviewAnimation",
+ "RemapImageRange",
+ "ReplaceImagesInBatch",
+ "ReverseImageBatch",
+ "SaveImageKJ",
+ "SaveImageWithAlpha",
+ "SaveStringKJ",
+ "Seed (rgthree)",
+ "ShuffleImageBatch",
+ "SplitImageChannels",
+ "SwwanCropByMaskV5",
+ "SwwanImageBatchToImageList",
+ "SwwanImageListToImageBatch",
+ "SwwanRestoreCropBoxV3",
+ "SwwanRestoreCropBoxV4",
+ "TransitionImagesInBatch",
+ "TransitionImagesMulti",
+ "WebcamCaptureCV2",
+ "list_Merge",
+ "list_Slice",
+ "list_Value",
+ "list_num_range",
+ "math_Remap_data",
+ "math_calculate",
+ "nsfwDetector",
+ "nsfwDetectorV2",
+ "raiseExceptionOnTrue",
+ "sch_Prompt",
+ "sch_Value",
+ "sch_image",
+ "sch_mask",
+ "sch_split_text",
+ "sch_text",
+ "type_AnyIndex"
+ ],
+ {
+ "title_aux": "ComfyUI_Swwan"
+ }
+ ],
+ "https://github.com/aisabervisionlab/ComfyUI_merge_ASVL": [
+ [
+ "ASVL"
+ ],
+ {
+ "title_aux": "ComfyUI_merge_ASVL"
+ }
+ ],
+ "https://github.com/aistudynow/Comfyui-HunyuanFoley": [
+ [
+ "HunyuanDependenciesLoader",
+ "HunyuanFoleySampler",
+ "HunyuanFoleyTorchCompile",
+ "HunyuanModelLoader",
+ "SelectAudioFromBatch"
+ ],
+ {
+ "title_aux": "Comfyui-HunyuanFoley"
+ }
+ ],
+ "https://github.com/ajbergh/comfyui-ethnicity_hairstyle_clip_encoder": [
+ [
+ "CLIPTextEncodeWithExtras"
+ ],
+ {
+ "title_aux": "comfyui-ethnicity_hairstyle_clip_encoder"
+ }
+ ],
+ "https://github.com/akatz-ai/ComfyUI-AKatz-Nodes": [
+ [
+ "AK_AdjustDepthmapBrightness",
+ "AK_AdjustListSize",
+ "AK_AnimatedDilationMaskLinear",
+ "AK_AudioFramesyncSchedule",
+ "AK_AudioreactiveDilateMaskInfinite",
+ "AK_AudioreactiveDilationMask",
+ "AK_AudioreactiveDynamicDilationMask",
+ "AK_BinaryAmplitudeGate",
+ "AK_BlobTrack",
+ "AK_BrightnessToFloatList",
+ "AK_ConvertListToFloatList",
+ "AK_DilateMaskLinearInfinite",
+ "AK_FadeBetweenBatches",
+ "AK_FlexFeatureToFloatList",
+ "AK_FloatListToDilateMaskSchedule",
+ "AK_FloatListToFlexFeature",
+ "AK_IPAdapterCustomWeights",
+ "AK_KeyframeScheduler",
+ "AK_LagChop",
+ "AK_ListToNumpyFloatArray",
+ "AK_MakeDepthmapSeamless",
+ "AK_NormalizeMaskImage",
+ "AK_RescaleFloatList",
+ "AK_ScaleMask",
+ "AK_ScheduledBinaryComparison",
+ "AK_ShrinkNumSequence",
+ "AK_SplitImageBatch",
+ "AK_VideoSpeedAdjust",
+ "Scale Mask Node"
+ ],
+ {
+ "author": "akatz",
+ "description": "Custom node pack for nodes I use in my workflows.",
+ "nickname": "Akatz Custom Nodes",
+ "title": "Akatz Custom Nodes",
+ "title_aux": "Akatz Custom Nodes"
+ }
+ ],
+ "https://github.com/akatz-ai/ComfyUI-Basic-Math": [
+ [
+ "BasicMath",
+ "BooleanInput",
+ "BooleanLogic",
+ "BooleanUnary",
+ "FloatComparison",
+ "FloatInput",
+ "IntMath",
+ "IntegerComparison",
+ "IntegerInput",
+ "MathConstants",
+ "NumberClamp",
+ "NumberComparison",
+ "NumberInRange",
+ "NumberLerp",
+ "NumberRound",
+ "PreciseFloatInput",
+ "StringComparison",
+ "StringInput",
+ "ToBool",
+ "ToFloat",
+ "ToInt",
+ "ToString",
+ "UnaryMath"
+ ],
+ {
+ "title_aux": "ComfyUI-Basic-Math"
+ }
+ ],
+ "https://github.com/akatz-ai/ComfyUI-DepthCrafter-Nodes": [
+ [
+ "DepthCrafter",
+ "DownloadAndLoadDepthCrafterModel"
+ ],
+ {
+ "author": "akatz",
+ "description": "Custom nodes for use with DepthCrafter. Create consistent depth maps for your videos.",
+ "nickname": "DepthCrafter Nodes",
+ "title": "DepthCrafter Nodes",
+ "title_aux": "DepthCrafter Nodes"
+ }
+ ],
+ "https://github.com/akatz-ai/ComfyUI-Depthflow-Nodes": [
+ [
+ "Depthflow",
+ "DepthflowEffectColor",
+ "DepthflowEffectDOF",
+ "DepthflowEffectInpaint",
+ "DepthflowEffectVignette",
+ "DepthflowMotionArc",
+ "DepthflowMotionCosine",
+ "DepthflowMotionLinear",
+ "DepthflowMotionPresetCircle",
+ "DepthflowMotionPresetDolly",
+ "DepthflowMotionPresetHorizontal",
+ "DepthflowMotionPresetOrbital",
+ "DepthflowMotionPresetVertical",
+ "DepthflowMotionPresetZoom",
+ "DepthflowMotionSetTarget",
+ "DepthflowMotionSine",
+ "DepthflowMotionTriangle"
+ ],
+ {
+ "author": "akatz",
+ "description": "Custom nodes for use with Tremeschin's Depthflow library.",
+ "nickname": "Depthflow Nodes",
+ "title": "Depthflow Nodes",
+ "title_aux": "\ud83c\udf0a Depthflow Nodes"
+ }
+ ],
+ "https://github.com/akatz-ai/ComfyUI-X-Portrait-Nodes": [
+ [
+ "DownloadXPortraitModel",
+ "XPortrait"
+ ],
+ {
+ "author": "akatz",
+ "description": "Custom nodes for use with X-Portrait. Animate portraits with an input video and a reference image.",
+ "nickname": "X-Portrait Nodes",
+ "title": "X-Portrait Nodes",
+ "title_aux": "ComfyUI-X-Portrait-Nodes"
+ }
+ ],
+ "https://github.com/akaugun/comfyui-lora-hook-trigger": [
+ [
+ "LoraTriggerWithExample"
+ ],
+ {
+ "title_aux": "comfyui-lora-hook-trigger"
+ }
+ ],
+ "https://github.com/akawana/ComfyUI-AK-Pack": [
+ [
+ "AK Base",
+ "AK Control Multiple KSamplers",
+ "AK Pipe",
+ "AK Pipe Loop",
+ "AK Replace Alpha with Color",
+ "AK Replace Color with Alpha",
+ "AKCLIPEncodeMultiple",
+ "AKContrastAndSaturateImage",
+ "AKIndexMultiple",
+ "AKKSamplerSettings",
+ "AKKSamplerSettingsOut",
+ "AKProjectSettingsOut",
+ "AKResizeOnBoolean",
+ "CLIPTextEncodeAndCombineCached",
+ "CLIPTextEncodeCached",
+ "Getter",
+ "IsMaskEmpty",
+ "IsOneOfGroupsActive",
+ "PreviewRawText",
+ "RepeatGroupState",
+ "Setter"
+ ],
+ {
+ "title_aux": "AK Pack"
+ }
+ ],
+ "https://github.com/akawana/ComfyUI-AK-XZ-Axis": [
+ [
+ "AK XZ Axis Plot",
+ "AK XZ Batch Lora",
+ "AK XZ Batch Prompts",
+ "AK XZ Range Float",
+ "AK XZ Range Int",
+ "AKXZPreviewPlot"
+ ],
+ {
+ "title_aux": "AK XZ Axis (XY for any KSampler)"
+ }
+ ],
+ "https://github.com/akawana/ComfyUI-Folded-Prompts": [
+ [
+ "FPFoldedPrompts",
+ "FPTextAreaPlus",
+ "FPTextCleanAndSplitt"
+ ],
+ {
+ "title_aux": "Folded prompts"
+ }
+ ],
+ "https://github.com/akawana/ComfyUI-RGBYP-Mask-Editor": [
+ [
+ "MaskGrowBlur",
+ "RGBYPLoadImage",
+ "RGBYPMaskBridge",
+ "RGBYPMaskCompositeWithStrength",
+ "RGBYPMaskStrength",
+ "RGBYPMaskStrengthOut",
+ "RGBYPMaskToList",
+ "RGBYPMaskToRegularMasks",
+ "RGBYPSaveMask"
+ ],
+ {
+ "title_aux": "RGBYP Mask Editor (RGB + YP)"
+ }
+ ],
+ "https://github.com/akierson/ComfyUI-textnodes": [
+ [
+ "Prompt Truncate",
+ "Tidy Tags"
+ ],
+ {
+ "title_aux": "ComfyUI-textnodes"
+ }
+ ],
+ "https://github.com/akierson/comfyui-colornodes": [
+ [
+ "Color Picker",
+ "Color to Hex",
+ "Color to RGB",
+ "Image Replace Color",
+ "Invert Color"
+ ],
+ {
+ "title_aux": "comfyui-colornodes"
+ }
+ ],
+ "https://github.com/al-swaiti/All-IN-ONE-style": [
+ [
+ "ComfyUIStyler",
+ "menus"
+ ],
+ {
+ "title_aux": "All-IN-ONE-style"
+ }
+ ],
+ "https://github.com/al-swaiti/ComfyUI-CascadeResolutions": [
+ [
+ "CascadeResolutions"
+ ],
+ {
+ "title_aux": "ComfyUI-CascadeResolutions"
+ }
+ ],
+ "https://github.com/al-swaiti/ComfyUI-OllamaGemini": [
+ [
+ "ClaudeAPI",
+ "FLUXResolutions",
+ "GeminiAPI",
+ "GeminiBBoxJoin",
+ "GeminiBEN2_RMBG",
+ "GeminiBRIA_RMBG",
+ "GeminiBRIA_RMBG_Safe",
+ "GeminiCLIPSeg",
+ "GeminiCombineSegMasks",
+ "GeminiComfyUIStyler",
+ "GeminiConvertRasterToVector",
+ "GeminiDrawBBoxMask",
+ "GeminiFLUXResolutions",
+ "GeminiImageGenerator",
+ "GeminiLoadImagePath",
+ "GeminiLoadImagesFromDir",
+ "GeminiMathExpression",
+ "GeminiSVGPreview",
+ "GeminiSaveSVG",
+ "GeminiSaveText",
+ "GeminiSmartPromptGenerator",
+ "GeminiTextSplitter",
+ "GeminiUltraDetect",
+ "ListAvailableModels",
+ "OllamaAPI",
+ "QwenAPI",
+ "VeoLoadVideo",
+ "VeoVideoExtend",
+ "VeoVideoGenerator",
+ "VeoVideoGeneratorAdvanced",
+ "style_menus"
+ ],
+ {
+ "title_aux": "ComfyUI-OllamaGemini"
+ }
+ ],
+ "https://github.com/alFrame/ComfyUI-AF-Enhanced-HTML-Note": [
+ [
+ "AF_Enhanced_HTML_Note"
+ ],
+ {
+ "author": "Alex Furer",
+ "description": "A ComfyUI custom node that allows you to create a note node with HTML support.",
+ "nickname": "AF - Enhanced HTML Note",
+ "title": "AF - Enhanced HTML Note",
+ "title_aux": "ComfyUI AF - Enhanced-HTML-Note"
+ }
+ ],
+ "https://github.com/alFrame/ComfyUI-AF-Pack-Prompt-Nodes": [
+ [
+ "AF_Edit_Generated_Prompt",
+ "AF_Load_Prompt_History",
+ "AF_Model_Switch",
+ "AF_Save_Prompt_History",
+ "AF_Show_Text"
+ ],
+ {
+ "author": "Alex Furer",
+ "description": "A collection of prompt management nodes for ComfyUI including prompt editing, history saving, and loading functionality.",
+ "nickname": "AF Prompt Nodes Pack",
+ "title": "AF Prompt Nodes Pack",
+ "title_aux": "ComfyUI AF - Pack-Prompt-Nodes"
+ }
+ ],
+ "https://github.com/alanhuang67/ComfyUI-FAI-Node": [
+ [
+ "FAIDynamicMask",
+ "FAIScaleScheduler",
+ "FAI_Voronoi_Generator"
+ ],
+ {
+ "title_aux": "FAI-Node"
+ }
+ ],
+ "https://github.com/alankent/ComfyUI-OA-360-Clip": [
+ [
+ "OA360Clip"
+ ],
+ {
+ "title_aux": "OA 360 Clip"
+ }
+ ],
+ "https://github.com/alastor-666-1933/caching_to_not_waste": [
+ [
+ "caching_condition",
+ "caching_controlnet",
+ "caching_from_combined_images",
+ "caching_image",
+ "caching_mask",
+ "caching_text",
+ "caching_wildcard_list"
+ ],
+ {
+ "title_aux": "Caching to not Waste"
+ }
+ ],
+ "https://github.com/alchemine/comfyui-alchemine-pack": [
+ [
+ "AsyncSaveImage",
+ "AutoBreak",
+ "DanbooruPopularPostsTagsRetriever",
+ "DanbooruPostTagsRetriever",
+ "DanbooruPostsDownloader",
+ "DanbooruRelatedTagsRetriever",
+ "DownloadImage",
+ "FilterSubtags",
+ "FilterTags",
+ "FixBreakAfterTIPO",
+ "GeminiInference",
+ "OllamaInference",
+ "PreviewLatestImage",
+ "ProcessTags",
+ "RemoveWeights",
+ "ReplaceUnderscores",
+ "SaveImageWithText",
+ "SignalSwitch",
+ "SubstituteTags",
+ "TextEditingInference",
+ "TokenAnalyzer",
+ "WidthHeight"
+ ],
+ {
+ "title_aux": "ComfyUI-Alchemine-Pack"
+ }
+ ],
+ "https://github.com/aledelpho/Arthemy_Live-Tuner-SDXL-ComfyUI": [
+ [
+ "ArthemyClipLiveTunerSDXL",
+ "ArthemyLiveModelTunerSDXL"
+ ],
+ {
+ "title_aux": "Arthemy Live Tuner - SDXL"
+ }
+ ],
+ "https://github.com/aledelpho/Arthemy_Live-Tuner-ZIT-ComfyUI": [
+ [
+ "ArthemyQwenSaver",
+ "ArthemyQwenTunerLab",
+ "ArthemyQwenTunerSimple",
+ "ArthemyTunerLoader",
+ "ArthemyZImage_Saver",
+ "ArthemyZImage_Tuner_Lab",
+ "ArthemyZImage_Tuner_Simple"
+ ],
+ {
+ "title_aux": "Arthemy Live Tuner - Z-image"
+ }
+ ],
+ "https://github.com/aleolidev/comfy_kaizen_package": [
+ [
+ "KaizenImageComposite"
+ ],
+ {
+ "title_aux": "Kaizen Package"
+ }
+ ],
+ "https://github.com/alessandroperilli/OCS_Nodes": [
+ [
+ "OCS_CloudImageSize",
+ "OCS_FirstNotEmpty",
+ "OCS_ImageGrid4x4",
+ "OCS_ImageListFilter",
+ "OCS_ImageSaver",
+ "OCS_LocalImageSize",
+ "OCS_LocalVideoSize",
+ "OCS_ModelDownloader",
+ "OCS_Watermarker"
+ ],
+ {
+ "title_aux": "Open Creative Studio Nodes"
+ }
+ ],
+ "https://github.com/alessandrozonta/ComfyUI-CenterNode": [
+ [
+ "BBoxCrop"
+ ],
+ {
+ "title_aux": "ComfyUI-CenterNode"
+ }
+ ],
+ "https://github.com/alessandrozonta/ComfyUI-Layers": [
+ [
+ "LayerDividerDivideLayer",
+ "LayersSaver - Save Layer",
+ "LayersSaver - Save Layer From Images",
+ "PSDLayerCreatorFromImagesOnly"
+ ],
+ {
+ "title_aux": "Save Layers Node for ComfyUI"
+ }
+ ],
+ "https://github.com/alessandrozonta/ComfyUI-OpenPose": [
+ [
+ "OpenPose - Get poses",
+ "OpenPoseNode"
+ ],
+ {
+ "author": "joe",
+ "title_aux": "OpenPose Node"
+ }
+ ],
+ "https://github.com/alessandrozonta/ComfyUI-PoseDirection": [
+ [
+ "DirectionNode",
+ "OpenPose - Get direction"
+ ],
+ {
+ "title_aux": "ComfyUI-PoseDirection"
+ }
+ ],
+ "https://github.com/alessandrozonta/Comfyui-LoopLoader": [
+ [
+ "LoadLoopImagesFromDir"
+ ],
+ {
+ "title_aux": "Comfyui-LoopLoader"
+ }
+ ],
+ "https://github.com/alexcong/ComfyUI-SwinIR": [
+ [
+ "SwinIRLoader",
+ "SwinIRRun"
+ ],
+ {
+ "title_aux": "ComfyUI-SwinIR"
+ }
+ ],
+ "https://github.com/alexcong/ComfyUI_QwenVL": [
+ [
+ "Qwen",
+ "Qwen2.5",
+ "Qwen2.5VL",
+ "QwenVL"
+ ],
+ {
+ "title_aux": "Qwen2-VL wrapper for ComfyUI"
+ }
+ ],
+ "https://github.com/alexgenovese/ComfyUI-UNO-Flux": [
+ [
+ "UNOGenerate",
+ "UNOModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI UNO Nodes"
+ }
+ ],
+ "https://github.com/alexgenovese/ComfyUI_HF_Servelress_Inference": [
+ [
+ "HF_QuestionAnswer",
+ "Job_Caption",
+ "Joy_caption",
+ "Joy_caption_load"
+ ],
+ {
+ "author": "Alex Genovese",
+ "description": "Huggingface Api Serverless request",
+ "nickname": "alexgenovese",
+ "title": "Huggingface Api Serverless",
+ "title_aux": "Huggingface Api Serverless"
+ }
+ ],
+ "https://github.com/alexisrolland/ComfyUI-Blender": [
+ [
+ "BlenderInputBoolean",
+ "BlenderInputCombo",
+ "BlenderInputFloat",
+ "BlenderInputGroup",
+ "BlenderInputInt",
+ "BlenderInputLoad3D",
+ "BlenderInputLoadCheckpoint",
+ "BlenderInputLoadDiffusionModel",
+ "BlenderInputLoadImage",
+ "BlenderInputLoadLora",
+ "BlenderInputLoadMask",
+ "BlenderInputSampler",
+ "BlenderInputSeed",
+ "BlenderInputString",
+ "BlenderInputStringMultiline",
+ "BlenderOutputDownload3D",
+ "BlenderOutputSaveGlb",
+ "BlenderOutputSaveImage",
+ "BlenderOutputString"
+ ],
+ {
+ "title_aux": "ComfyUI-Blender"
+ }
+ ],
+ "https://github.com/alexisrolland/ComfyUI-Phi": [
+ [
+ "LoadPhi",
+ "LoadPhiMultimodal",
+ "LoadPhiVision",
+ "RunPhi",
+ "RunPhiMultimodal",
+ "RunPhiVision"
+ ],
+ {
+ "title_aux": "ComfyUI-Phi"
+ }
+ ],
+ "https://github.com/alexjx/ComfyUI-Sa2VA-XJ": [
+ [
+ "XJSa2VAImageSegmentation",
+ "XJSa2VAImageSegmentationV2",
+ "XJSa2VAVideoSegmentation"
+ ],
+ {
+ "title_aux": "ComfyUI-Sa2VA-XJ"
+ }
+ ],
+ "https://github.com/alexjx/ComfyUI-XJNodes": [
+ [
+ "XJAppendImageList",
+ "XJConditionalLoraLoader",
+ "XJContextEnter",
+ "XJContextExit",
+ "XJEmptyImageList",
+ "XJFloatRangeList",
+ "XJGetImageFromList",
+ "XJImageGrid",
+ "XJImageListFilter",
+ "XJImageListLength",
+ "XJImageListSlice",
+ "XJImagePairCompare",
+ "XJImagePreviewBridge",
+ "XJImageRandomTransform",
+ "XJImageScaleCalc",
+ "XJImageScaleMegapixel",
+ "XJImageTransform",
+ "XJIntOffset",
+ "XJIntegerDecrement",
+ "XJIntegerIncrement",
+ "XJJSONExtractor",
+ "XJLoadImageByPath",
+ "XJLoadImageWithMetadata",
+ "XJLoadImagesFromDirBatch",
+ "XJLoadImagesFromDirList",
+ "XJLoopEnd",
+ "XJLoopStart",
+ "XJOneImageFromBatch",
+ "XJRandomImagesFromBatch",
+ "XJRandomText",
+ "XJRandomTextFromFile",
+ "XJRandomTextFromList",
+ "XJSamplerAdapter",
+ "XJSaveImageWithMetadata",
+ "XJSchedulerAdapter",
+ "XJSegsAutoAdjustHookProvider",
+ "XJSegsColorCorrectHSVHookProvider",
+ "XJSegsColorCorrectRGBHookProvider",
+ "XJSegsColorMatchHookProvider",
+ "XJSegsCount",
+ "XJSegsExtractor",
+ "XJSegsFilter",
+ "XJSegsFilterByLabel",
+ "XJSegsMerge",
+ "XJSegsPick",
+ "XJSegsStitcher",
+ "XJSegsWildcardPrompt",
+ "XJStringPass",
+ "XJSupirParameters",
+ "XJTextFileInfo",
+ "XJTextListFromFile",
+ "XJUnwrapFromList",
+ "XJWrapAsList"
+ ],
+ {
+ "title_aux": "ComfyUI-XJNodes"
+ }
+ ],
+ "https://github.com/alexopus/ComfyUI-Image-Saver": [
+ [
+ "Any to String (Image Saver)",
+ "Cfg Literal (Image Saver)",
+ "Checkpoint Loader with Name (Image Saver)",
+ "Civitai Hash Fetcher (Image Saver)",
+ "Conditioning Concat Optional (Image Saver)",
+ "Float Literal (Image Saver)",
+ "Image Saver",
+ "Image Saver Metadata",
+ "Image Saver Simple",
+ "Input Parameters (Image Saver)",
+ "Int Literal (Image Saver)",
+ "RandomShapeGenerator",
+ "Sampler Selector (Image Saver)",
+ "Scheduler Selector (Eff.) (Image Saver)",
+ "Scheduler Selector (Image Saver)",
+ "Scheduler Selector (inspire) (Image Saver)",
+ "Seed Generator (Image Saver)",
+ "String Literal (Image Saver)",
+ "UNet loader with Name (Image Saver)",
+ "Width/Height Literal (Image Saver)",
+ "Workflow Input Value (Image Saver)"
+ ],
+ {
+ "title_aux": "ComfyUI Image Saver"
+ }
+ ],
+ "https://github.com/aliabougazia/comfyui_pt_security_scanner": [
+ [
+ "PTSecurityScanner"
+ ],
+ {
+ "title_aux": "comfyui_pt_security_scanner"
+ }
+ ],
+ "https://github.com/alibof96/ComfyUI-DownscaleIRN": [
+ [
+ "IRNDownscale"
+ ],
+ {
+ "title_aux": "ComfyUI-DownscaleIRN"
+ }
+ ],
+ "https://github.com/aligjahed/comfy-flow": [
+ [
+ "FlowManager",
+ "FlowStepPointer"
+ ],
+ {
+ "title_aux": "comfy-flow"
+ }
+ ],
+ "https://github.com/alisson-anjos/ComfyUI-Ollama-Describer": [
+ [
+ "InputText",
+ "JsonPropertyExtractorNode",
+ "OllamaCaptionerExtraOptions",
+ "OllamaImageCaptioner",
+ "OllamaImageDescriber",
+ "OllamaTextDescriber",
+ "TextTransformer"
+ ],
+ {
+ "title_aux": "ComfyUI-Ollama-Describer"
+ }
+ ],
+ "https://github.com/alludus/ComfyUI-multiGPU-upscaler": [
+ [
+ "multiGPU_ImageUpscaleWithModel",
+ "multiGPU_ImageUpscaleWithModelMultiGPU",
+ "multiGPU_UpscaleModelLoader"
+ ],
+ {
+ "title_aux": "multiGPU Upscaler"
+ }
+ ],
+ "https://github.com/alpertunga-bile/image-caption-comfyui": [
+ [
+ "Image Caption Node",
+ "Insert Prompt Node"
+ ],
+ {
+ "title_aux": "image-caption-comfyui"
+ }
+ ],
+ "https://github.com/alpertunga-bile/prompt-generator-comfyui": [
+ [
+ "Prompt Generator"
+ ],
+ {
+ "title_aux": "prompt-generator"
+ }
+ ],
+ "https://github.com/alsritter/asymmetric-tiling-comfyui": [
+ [
+ "Asymmetric_Tiling_KSampler"
+ ],
+ {
+ "title_aux": "asymmetric-tiling-comfyui"
+ }
+ ],
+ "https://github.com/alt-key-project/comfyui-dream-project": [
+ [
+ "Analyze Palette [Dream]",
+ "Beat Curve [Dream]",
+ "Big Float Switch [Dream]",
+ "Big Image Switch [Dream]",
+ "Big Int Switch [Dream]",
+ "Big Latent Switch [Dream]",
+ "Big Palette Switch [Dream]",
+ "Big Text Switch [Dream]",
+ "Boolean To Float [Dream]",
+ "Boolean To Int [Dream]",
+ "Build Prompt [Dream]",
+ "CSV Curve [Dream]",
+ "CSV Generator [Dream]",
+ "Calculation [Dream]",
+ "Common Frame Dimensions [Dream]",
+ "Compare Palettes [Dream]",
+ "FFMPEG Video Encoder [Dream]",
+ "File Count [Dream]",
+ "Finalize Prompt [Dream]",
+ "Float Input [Dream]",
+ "Float to Log Entry [Dream]",
+ "Frame Count Calculator [Dream]",
+ "Frame Counter (Directory) [Dream]",
+ "Frame Counter (Simple) [Dream]",
+ "Frame Counter Info [Dream]",
+ "Frame Counter Offset [Dream]",
+ "Frame Counter Time Offset [Dream]",
+ "Image Brightness Adjustment [Dream]",
+ "Image Color Shift [Dream]",
+ "Image Contrast Adjustment [Dream]",
+ "Image Motion [Dream]",
+ "Image Sequence Blend [Dream]",
+ "Image Sequence Loader [Dream]",
+ "Image Sequence Saver [Dream]",
+ "Image Sequence Tweening [Dream]",
+ "Int Input [Dream]",
+ "Int to Log Entry [Dream]",
+ "Laboratory [Dream]",
+ "Linear Curve [Dream]",
+ "Log Entry Joiner [Dream]",
+ "Log File [Dream]",
+ "Noise from Area Palettes [Dream]",
+ "Noise from Palette [Dream]",
+ "Palette Color Align [Dream]",
+ "Palette Color Shift [Dream]",
+ "Random Prompt Words [Dream]",
+ "Sample Image Area as Palette [Dream]",
+ "Sample Image as Palette [Dream]",
+ "Saw Curve [Dream]",
+ "Sine Curve [Dream]",
+ "Smooth Event Curve [Dream]",
+ "String Input [Dream]",
+ "String Tokenizer [Dream]",
+ "String to Log Entry [Dream]",
+ "Text Input [Dream]",
+ "Triangle Curve [Dream]",
+ "Triangle Event Curve [Dream]",
+ "WAV Curve [Dream]"
+ ],
+ {
+ "title_aux": "Dream Project Animation Nodes"
+ }
+ ],
+ "https://github.com/alt-key-project/comfyui-dream-video-batches": [
+ [
+ "Blended Transition [DVB]",
+ "Calculation [DVB]",
+ "Create Frame Set [DVB]",
+ "Divide [DVB]",
+ "Fade From Black [DVB]",
+ "Fade To Black [DVB]",
+ "Float Input [DVB]",
+ "For Each Done [DVB]",
+ "For Each Filename [DVB]",
+ "Frame Set Append [DVB]",
+ "Frame Set Frame Dimensions Scaled [DVB]",
+ "Frame Set Index Offset [DVB]",
+ "Frame Set Merger [DVB]",
+ "Frame Set Reindex [DVB]",
+ "Frame Set Repeat [DVB]",
+ "Frame Set Reverse [DVB]",
+ "Frame Set Split Beginning [DVB]",
+ "Frame Set Split End [DVB]",
+ "Frame Set Splitter [DVB]",
+ "Generate Inbetween Frames [DVB]",
+ "Int Input [DVB]",
+ "Linear Camera Pan [DVB]",
+ "Linear Camera Roll [DVB]",
+ "Linear Camera Zoom [DVB]",
+ "Load Image From Path [DVB]",
+ "Multiply [DVB]",
+ "Sine Camera Pan [DVB]",
+ "Sine Camera Roll [DVB]",
+ "Sine Camera Zoom [DVB]",
+ "String Input [DVB]",
+ "Text Input [DVB]",
+ "Trace Memory Allocation [DVB]",
+ "Unwrap Frame Set [DVB]"
+ ],
+ {
+ "title_aux": "Dream Video Batches"
+ }
+ ],
+ "https://github.com/ameyukisora/ComfyUI-Empty-Latent-Advanced": [
+ [
+ "EmptyLatentAdvancedSelector"
+ ],
+ {
+ "title_aux": "ComfyUI Empty Latent Advanced"
+ }
+ ],
+ "https://github.com/amir84ferdos/ComfyUI-ArchAi3d-Qwen": [
+ [
+ "ArchAi3D_Any_Index_Switch",
+ "ArchAi3D_Average_Color",
+ "ArchAi3D_Batch_Text_Encode",
+ "ArchAi3D_Batch_Text_Encode_SDXL",
+ "ArchAi3D_Boolean_Input",
+ "ArchAi3D_Cinematography_Prompt_Builder",
+ "ArchAi3D_CivitAI_Download",
+ "ArchAi3D_Clean_Room_Prompt",
+ "ArchAi3D_Color_Correction_Advanced",
+ "ArchAi3D_Color_Correction_BT709",
+ "ArchAi3D_Conditioning_Balance",
+ "ArchAi3D_Dependency_Installer",
+ "ArchAi3D_DiffSynth_ControlNet",
+ "ArchAi3D_Empty_Latent_Batch",
+ "ArchAi3D_Float_Input",
+ "ArchAi3D_GDrive_Download",
+ "ArchAi3D_Gemini",
+ "ArchAi3D_Gemini_Model",
+ "ArchAi3D_HF_Download",
+ "ArchAi3D_HighPass_Blend",
+ "ArchAi3D_Info",
+ "ArchAi3D_Int_Input",
+ "ArchAi3D_LlamaCpp_Installer",
+ "ArchAi3D_Load_CLIP",
+ "ArchAi3D_Load_Diffusion_Model",
+ "ArchAi3D_Load_Dual_CLIP",
+ "ArchAi3D_Load_Image_URL",
+ "ArchAi3D_Mask_Crop_Rotate",
+ "ArchAi3D_Mask_To_Position_Guide",
+ "ArchAi3D_Metric3D_Depth",
+ "ArchAi3D_Metric3D_Normal",
+ "ArchAi3D_Nunchaku_Installer",
+ "ArchAi3D_Object_Focus_Camera",
+ "ArchAi3D_Object_Focus_Camera_V2",
+ "ArchAi3D_Object_Focus_Camera_V3",
+ "ArchAi3D_Object_Focus_Camera_V4",
+ "ArchAi3D_Object_Focus_Camera_V5",
+ "ArchAi3D_Object_Focus_Camera_V6",
+ "ArchAi3D_Object_Focus_Camera_V7",
+ "ArchAi3D_Panorama_Offset",
+ "ArchAi3D_Position_Guide_Prompt_Builder",
+ "ArchAi3D_QwenVL_GGUF",
+ "ArchAi3D_QwenVL_Server_Control",
+ "ArchAi3D_Qwen_Camera_View_Selector",
+ "ArchAi3D_Qwen_Colorization",
+ "ArchAi3D_Qwen_DX8152_Camera_LoRA",
+ "ArchAi3D_Qwen_Encoder",
+ "ArchAi3D_Qwen_Encoder_Simple",
+ "ArchAi3D_Qwen_Encoder_V2",
+ "ArchAi3D_Qwen_Encoder_V3",
+ "ArchAi3D_Qwen_Environment_Navigator",
+ "ArchAi3D_Qwen_Exterior_Focus",
+ "ArchAi3D_Qwen_Exterior_Navigation",
+ "ArchAi3D_Qwen_Exterior_View_Control",
+ "ArchAi3D_Qwen_Image_Scale",
+ "ArchAi3D_Qwen_Image_Scale_V2",
+ "ArchAi3D_Qwen_Image_Stitch",
+ "ArchAi3D_Qwen_Interior_Focus",
+ "ArchAi3D_Qwen_Interior_Navigation",
+ "ArchAi3D_Qwen_Interior_View_Control",
+ "ArchAi3D_Qwen_Material_Changer",
+ "ArchAi3D_Qwen_Object_Position_Control",
+ "ArchAi3D_Qwen_Object_Rotation_Control",
+ "ArchAi3D_Qwen_Object_Rotation_V2",
+ "ArchAi3D_Qwen_Object_View_Control",
+ "ArchAi3D_Qwen_Person_Cinematographer",
+ "ArchAi3D_Qwen_Person_Perspective",
+ "ArchAi3D_Qwen_Person_Perspective_Control",
+ "ArchAi3D_Qwen_Person_Position_Control",
+ "ArchAi3D_Qwen_Person_Rotation_Control",
+ "ArchAi3D_Qwen_Person_View_Control",
+ "ArchAi3D_Qwen_Scene_Photographer",
+ "ArchAi3D_Qwen_Simple_Camera_Control",
+ "ArchAi3D_Qwen_Style_Transfer",
+ "ArchAi3D_Qwen_System_Prompt",
+ "ArchAi3D_Qwen_Watermark_Removal",
+ "ArchAi3D_SAM3_Segment",
+ "ArchAi3D_SEGS_Mask_Blur",
+ "ArchAi3D_SEGS_Mask_Irregularity",
+ "ArchAi3D_SEGS_To_Bundle",
+ "ArchAi3D_SaveSplatScene",
+ "ArchAi3D_Save_Image",
+ "ArchAi3D_Simple_Blend_Mask",
+ "ArchAi3D_Simple_Blend_Mask_Batch",
+ "ArchAi3D_Simple_Edge_Mask",
+ "ArchAi3D_Simple_Position_Prompt",
+ "ArchAi3D_Simple_Tile_Compositor",
+ "ArchAi3D_Simple_Tile_Compositor_Single",
+ "ArchAi3D_Simple_Tile_Cropper",
+ "ArchAi3D_Simple_Tile_Cropper_Batch",
+ "ArchAi3D_Simple_Tile_Sampler",
+ "ArchAi3D_Smart_Tile_Calculator",
+ "ArchAi3D_Smart_Tile_Calculator_V3",
+ "ArchAi3D_Smart_Tile_Calculator_V4",
+ "ArchAi3D_Smart_Tile_Calculator_V5",
+ "ArchAi3D_Smart_Tile_Conditioning",
+ "ArchAi3D_Smart_Tile_Detailer",
+ "ArchAi3D_Smart_Tile_Merger",
+ "ArchAi3D_Smart_Tile_Prompter",
+ "ArchAi3D_Smart_Tile_Prompter_Turbo",
+ "ArchAi3D_Smart_Tile_SEGS",
+ "ArchAi3D_Smart_Tile_SEGS_Blur",
+ "ArchAi3D_Smart_Tile_Sampler",
+ "ArchAi3D_Smart_Tile_Solver_V6",
+ "ArchAi3D_Smart_Tile_Solver_V6_2",
+ "ArchAi3D_Smart_USDU_DiffDiff_ControlNet",
+ "ArchAi3D_Smart_USDU_DiffDiff_ControlNet_CustomSample",
+ "ArchAi3D_Smart_USDU_DiffDiff_ControlNet_NoUpscale",
+ "ArchAi3D_Smart_USDU_DiffDiffusion",
+ "ArchAi3D_Smart_USDU_DiffDiffusion_CustomSample",
+ "ArchAi3D_Smart_USDU_DiffDiffusion_NoUpscale",
+ "ArchAi3D_Smart_USDU_Mask_Denoise",
+ "ArchAi3D_Smart_USDU_Split_Latent",
+ "ArchAi3D_Smart_USDU_Universal",
+ "ArchAi3D_Smart_USDU_Universal_CustomSample",
+ "ArchAi3D_Smart_USDU_Universal_NoUpscale",
+ "ArchAi3D_Smart_USDU_Universal_NoUpscale_V2",
+ "ArchAi3D_Smart_USDU_Universal_NoUpscale_V3",
+ "ArchAi3D_Smart_USDU_Universal_NoUpscale_V3_Standalone",
+ "ArchAi3D_Smart_USDU_V3_Standalone",
+ "ArchAi3D_Smart_Ultimate_SD_Upscale",
+ "ArchAi3D_Smart_Ultimate_SD_Upscale_CustomSample",
+ "ArchAi3D_Smart_Ultimate_SD_Upscale_NoUpscale",
+ "ArchAi3D_Solid_Color_Image",
+ "ArchAi3D_String_Input",
+ "ArchAi3D_USDU_EdgeRepair",
+ "ArchAi3dQwenEncoderSimpleV2"
+ ],
+ {
+ "nodename_pattern": "ArchAi3D",
+ "title_aux": "ComfyUI-ArchAi3d-Qwen"
+ }
+ ],
+ "https://github.com/amir84ferdos/ComfyUI-GRAG-ArchAi3D": [
+ [
+ "GRAG_Advanced_Sampler",
+ "GRAG_Preset_Manager",
+ "GRAG_Simple_Controller",
+ "GRAG_Unified_Controller"
+ ],
+ {
+ "title_aux": "ComfyUI-GRAG-ArchAi3D"
+ }
+ ],
+ "https://github.com/amtarr/ComfyUI-TextureAlchemy": [
+ [
+ "AOApproximator",
+ "AnisotropyMapGenerator",
+ "AppearanceExtractor",
+ "AutoContrastLevels",
+ "BBoxEditor",
+ "BBoxReposition",
+ "BasicLightingBuilder",
+ "BlendModeUtility",
+ "ChannelPacker",
+ "ChannelPackerORMA",
+ "ChannelPackerRMA",
+ "ChannelPackerRMAA",
+ "ChannelUnpacker",
+ "ChannelUnpackerRMA",
+ "ClarityEnhancer",
+ "ColorCode",
+ "ColorImage",
+ "ColorMatchTransfer",
+ "ColorRamp",
+ "ColorSelectionMask",
+ "ColorToGrayscale",
+ "CompositeMaskAdjuster",
+ "CompositeMaskExtractor",
+ "CropToMaskWithPadding",
+ "CurvatureGenerator",
+ "DenoiseFilter",
+ "DetailMapBlender",
+ "DirtGrimeMaskGenerator",
+ "DisplacementToVector",
+ "EdgeDetection",
+ "EdgeWearMaskGenerator",
+ "EmbedAlpha",
+ "EmissionMaskGenerator",
+ "EnvironmentMapToIrradiance",
+ "FrankenMapExtractor",
+ "FrequencyRecombine",
+ "FrequencySeparation",
+ "GammaAdjust",
+ "GetAverageColor",
+ "GradientMap",
+ "GradientMaskGenerator",
+ "GrayscaleToColor",
+ "HDRIToIrradianceFast",
+ "HSVAdjuster",
+ "HeightAmplifier",
+ "HeightCombiner",
+ "HeightToNormal",
+ "ImageBitDepthChecker",
+ "ImageEnhancement",
+ "ImageMaskCombiner",
+ "InpaintCropExtractor",
+ "InpaintStitcher",
+ "LevelsAdjustment",
+ "LightingExtractor",
+ "LightingPassMaskApplicator",
+ "LotusHeightProcessor",
+ "LotusNormalProcessor",
+ "Marigold_AOV_Extractor",
+ "MaskCompositor",
+ "MicroDetailOverlay",
+ "MultiTextureBlender",
+ "MultimattePassApplicator",
+ "NormalConverter",
+ "NormalFormatAuto",
+ "NormalFormatBruteForce",
+ "NormalFormatValidator",
+ "NormalIntensity",
+ "NormalMapCombiner",
+ "NormalMapRelighter",
+ "NormalMapRelighterAdvanced",
+ "NormalMapRelighterIBL",
+ "NormalMapRelighterIBL_PBR",
+ "NormalToDepth",
+ "PBRAdjuster",
+ "PBRBatchToPipe",
+ "PBRCombiner",
+ "PBRExtractor",
+ "PBRHeightProcessor",
+ "PBRMaterialMixer",
+ "PBRMaterialProcessor",
+ "PBRNormalProcessor",
+ "PBRPipePreview",
+ "PBRPipeToBatch",
+ "PBRPipelineAdjuster",
+ "PBRSaver",
+ "PBRSaverWithMetadata",
+ "PBRSplitter",
+ "PBR_AOV_Generator",
+ "PaddingCalculator",
+ "PassMaskApplicator",
+ "PatchFit",
+ "PatchUpscale",
+ "PatternGenerator",
+ "ProceduralNoiseGenerator",
+ "QwenImagePrep",
+ "SSSMapGenerator",
+ "ScratchesGenerator",
+ "SeamlessTiling",
+ "SharpenDepth",
+ "SharpenNormal",
+ "SimpleCropToMaskWithPadding",
+ "SimpleGammaAdjust",
+ "SimpleInpaintCrop",
+ "SimpleInpaintStitch",
+ "SimpleRecolor",
+ "SingleMultimattePassApplicator",
+ "SinglePassMaskApplicator",
+ "SmartBlur",
+ "SmartTextureResizer",
+ "SquareMaker",
+ "TemperatureTint",
+ "TextureAnalyzer",
+ "TextureAtlasBuilder",
+ "TextureEqualizer",
+ "TextureOffset",
+ "TextureScaler",
+ "TextureTiler",
+ "TranslucencyMapGenerator",
+ "TriplanarProjection",
+ "UVCheckerGenerator",
+ "UpscaleCalculator",
+ "UpscaleToResolution",
+ "WearGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-TextureAlchemy"
+ }
+ ],
+ "https://github.com/an90ray/ComfyUI_RErouter_CustomNodes": [
+ [
+ "CLIPTextEncode (RE)",
+ "CLIPTextEncodeSDXL (RE)",
+ "CLIPTextEncodeSDXLRefiner (RE)",
+ "Int (RE)",
+ "RErouter <=",
+ "RErouter =>",
+ "String (RE)"
+ ],
+ {
+ "title_aux": "ComfyUI_RErouter_CustomNodes"
+ }
+ ],
+ "https://github.com/andersxa/comfyui-PromptAttention": [
+ [
+ "CLIPAttentionMaskEncode"
+ ],
+ {
+ "title_aux": "CLIP Directional Prompt Attention"
+ }
+ ],
+ "https://github.com/andygill/comfyui-sunflower-nodes": [
+ [
+ "DepthViewToIsometric",
+ "DisparityToDepthView",
+ "EquirectangularToRectilinear",
+ "ImageChannelSelect",
+ "MaskChannelSelect",
+ "ResizeDown"
+ ],
+ {
+ "title_aux": "comfyui-sunflower-nodes"
+ }
+ ],
+ "https://github.com/angeloshredder/StableCascadeResizer": [
+ [
+ "CascadeResize",
+ "Cascade_Resizer"
+ ],
+ {
+ "title_aux": "StableCascadeResizer"
+ }
+ ],
+ "https://github.com/angree/ComfyUI-Q_GLB_Material_Modifier": [
+ [
+ "QManualGLBMaterialModifier",
+ "QPresetGLBMaterialModifier"
+ ],
+ {
+ "title_aux": "Q GLB Material Modifier"
+ }
+ ],
+ "https://github.com/angree/ComfyUI-Q_find-mask-size": [
+ [
+ "QImageCropCalculator"
+ ],
+ {
+ "title_aux": "Q Find Mask Size"
+ }
+ ],
+ "https://github.com/anhkhoatranle30/Handy-Nodes-ComfyUI": [
+ [
+ "Custom Save Image //Handy"
+ ],
+ {
+ "author": "Khoa Tran",
+ "description": "This extension offers various handy nodes.",
+ "nickname": "Handy-Nodes-ComfyUI",
+ "title": "Handy-Nodes-ComfyUI",
+ "title_aux": "Handy Node ComfyUI"
+ }
+ ],
+ "https://github.com/anhrefnyoiyoi/Placeholder-Replacer-By-ID": [
+ [
+ "Placeholder Replacer By ID"
+ ],
+ {
+ "title_aux": "Placeholder-Replacer-By-ID"
+ }
+ ],
+ "https://github.com/anilstream/ComfyUI-Ideogram-Character": [
+ [
+ "SD_IdeogramCharacter"
+ ],
+ {
+ "title_aux": "ComfyUI-Ideogram-Character"
+ }
+ ],
+ "https://github.com/annewj023/Comfyui_google_nano": [
+ [
+ "GoogleNanoNode"
+ ],
+ {
+ "title_aux": "Google Nano"
+ }
+ ],
+ "https://github.com/antrobot1234/antrobots-comfyUI-nodepack": [
+ [
+ "MergeDicts"
+ ],
+ {
+ "title_aux": "antrobots ComfyUI Nodepack"
+ }
+ ],
+ "https://github.com/anveshane/Comfyui_StoryMem": [
+ [
+ "StoryMemContinuationShot",
+ "StoryMemFirstShot",
+ "StoryMemGetMotionFrames",
+ "StoryMemInfo",
+ "StoryMemMemoryBuffer",
+ "StoryMemMemoryVisualizer",
+ "StoryMemModelLoader",
+ "StoryMemUpdateMemory",
+ "StoryMemVideoCombine"
+ ],
+ {
+ "title_aux": "Comfyui_StoryMem"
+ }
+ ],
+ "https://github.com/apeirography/DaimalyadNodes": [
+ [
+ "DaimalyadModelDownloader",
+ "DaimalyadWildcardProcessor"
+ ],
+ {
+ "title_aux": "DaimalyadNodes"
+ }
+ ],
+ "https://github.com/apenguin24/ComfyUI-WanKeyframing": [
+ [
+ "LoadImagesFromDirectory",
+ "WanKeyframeToVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-WanKeyframing"
+ }
+ ],
+ "https://github.com/arcum42/ComfyUI_SageUtils": [
+ [
+ "SageSetWildcardText",
+ "Sage_AdvSamplerInfo",
+ "Sage_CLIPLoaderFromInfo",
+ "Sage_CLIPSelector",
+ "Sage_CheckLorasForUpdates",
+ "Sage_CheckpointSelector",
+ "Sage_ChromaCLIPLoaderFromInfo",
+ "Sage_CleanText",
+ "Sage_CollectKeywordsFromLoraStack",
+ "Sage_ConstructLLMPrompt",
+ "Sage_ConstructLLMPromptExtra",
+ "Sage_ConstructMetadataFlexible",
+ "Sage_CropImage",
+ "Sage_CubiqImageResize",
+ "Sage_DualCLIPSelector",
+ "Sage_DualCLIPTextEncode",
+ "Sage_DualCLIPTextEncodeLumina2",
+ "Sage_DualCLIPTextEncodeQwen",
+ "Sage_DynamicComboTest",
+ "Sage_EmptyLatentImagePassthrough",
+ "Sage_FlexibleCLIPSelector",
+ "Sage_FloatToStr",
+ "Sage_FreeMemory",
+ "Sage_FreeU2",
+ "Sage_GuessResolutionByRatio",
+ "Sage_Halt",
+ "Sage_HiDreamE1_Instruction",
+ "Sage_IntToStr",
+ "Sage_JoinText",
+ "Sage_KSampler",
+ "Sage_KSamplerAudioDecoder",
+ "Sage_KSamplerTiledDecoder",
+ "Sage_LMStudioLLMPromptText",
+ "Sage_LMStudioLLMPromptVision",
+ "Sage_LMStudioLLMPromptVisionRefine",
+ "Sage_LoadImage",
+ "Sage_LoadModelFromInfo",
+ "Sage_Load_Dataset_From_Folder",
+ "Sage_LogicalSwitch",
+ "Sage_LoraStack",
+ "Sage_LoraStackInfoDisplay",
+ "Sage_LoraStackLoader",
+ "Sage_ModelInfo",
+ "Sage_ModelInfoDisplay",
+ "Sage_ModelLoraStackLoader",
+ "Sage_ModelShiftOnly",
+ "Sage_ModelShifts",
+ "Sage_MultiModelPicker",
+ "Sage_MultiSelectorDoubleClip",
+ "Sage_MultiSelectorQuadClip",
+ "Sage_MultiSelectorSingleClip",
+ "Sage_MultiSelectorTripleClip",
+ "Sage_OllamaAdvancedOptions",
+ "Sage_OllamaLLMPromptText",
+ "Sage_OllamaLLMPromptVision",
+ "Sage_OllamaLLMPromptVisionRefine",
+ "Sage_PonyPrefix",
+ "Sage_PonyRatingv6",
+ "Sage_PonyRatingv7",
+ "Sage_PonyScore",
+ "Sage_PonySource",
+ "Sage_PonyStyle",
+ "Sage_PonyStyleCluster",
+ "Sage_PromptText",
+ "Sage_QuadCLIPSelector",
+ "Sage_QuickLoraStack",
+ "Sage_QuickResPicker",
+ "Sage_ReferenceImage",
+ "Sage_SamplerInfo",
+ "Sage_SamplerSelector",
+ "Sage_SaveImageWithMetadata",
+ "Sage_SaveText",
+ "Sage_SchedulerSelector",
+ "Sage_SetText",
+ "Sage_SetTextWithInt",
+ "Sage_SetTextWithoutComments",
+ "Sage_SingleCLIPTextEncode",
+ "Sage_SystemPrompt",
+ "Sage_TextRandomLine",
+ "Sage_TextSelectLine",
+ "Sage_TextSubstitution",
+ "Sage_TextSwitch",
+ "Sage_TextWeight",
+ "Sage_TilingInfo",
+ "Sage_TrainingCaptionsToConditioning",
+ "Sage_TripleCLIPSelector",
+ "Sage_TripleJoinText",
+ "Sage_TripleLoraStack",
+ "Sage_TripleQuickLoraStack",
+ "Sage_UNETLoRALoader",
+ "Sage_UNETLoaderFromInfo",
+ "Sage_UNETSelector",
+ "Sage_UnetClipVaeToModelInfo",
+ "Sage_VAELoaderFromInfo",
+ "Sage_VAESelector",
+ "Sage_ViewAnything",
+ "Sage_ViewNotes",
+ "Sage_ZeroConditioning"
+ ],
+ {
+ "title_aux": "Sage Utils"
+ }
+ ],
+ "https://github.com/ardadmrknn/comfyui-history-clip-text-encode-node": [
+ [
+ "PromptHistoryClipTextEncode"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt History Node"
+ }
+ ],
+ "https://github.com/aria1th/ComfyUI-Wildcards-rework": [
+ [
+ "TextWildcards"
+ ],
+ {
+ "title_aux": "ComfyUI-Wildcards-rework"
+ }
+ ],
+ "https://github.com/arthurtravers/ComfyUI-VideoOutputBridge": [
+ [
+ "VideoOutputBridge"
+ ],
+ {
+ "title_aux": "Video Output Bridge"
+ }
+ ],
+ "https://github.com/asaddi/ComfyUI-YALLM-node": [
+ [
+ "LLMChat",
+ "LLMMinP",
+ "LLMModel",
+ "LLMPrependAppend",
+ "LLMProvider",
+ "LLMTemperature",
+ "LLMTextLatch",
+ "LLMTopK",
+ "LLMTopP"
+ ],
+ {
+ "title_aux": "ComfyUI-YALLM-node"
+ }
+ ],
+ "https://github.com/asaddi/YALLM-LlamaVision": [
+ [
+ "LLMSamplerSettings",
+ "LlamaVisionChat",
+ "LlamaVisionModel"
+ ],
+ {
+ "title_aux": "YALLM-LlamaVision"
+ }
+ ],
+ "https://github.com/asagi4/ComfyUI-Adaptive-Guidance": [
+ [
+ "AdaptiveGuidance",
+ "AdaptiveProjectedGuidance",
+ "PerpNegAdaptiveGuidanceGuider"
+ ],
+ {
+ "title_aux": "Adaptive Guidance for ComfyUI"
+ }
+ ],
+ "https://github.com/asagi4/ComfyUI-CADS": [
+ [
+ "CADS"
+ ],
+ {
+ "title_aux": "ComfyUI-CADS"
+ }
+ ],
+ "https://github.com/asagi4/ComfyUI-NPNet": [
+ [
+ "NPNetGoldenNoise"
+ ],
+ {
+ "title_aux": "ComfyUI NPNet (Golden Noise)"
+ }
+ ],
+ "https://github.com/asagi4/comfyui-dynamic-anynode": [
+ [
+ "AnyNode"
+ ],
+ {
+ "title_aux": "comfyui-dynamic-anynode"
+ }
+ ],
+ "https://github.com/asagi4/comfyui-prompt-control": [
+ [
+ "PCAddMaskToCLIP",
+ "PCAddMaskToCLIPMany",
+ "PCAttentionCoupleBatchNegative",
+ "PCExtractScheduledPrompt",
+ "PCLazyLoraLoader",
+ "PCLazyLoraLoaderAdvanced",
+ "PCLazyTextEncode",
+ "PCLazyTextEncodeAdvanced",
+ "PCLoraHooksFromText",
+ "PCMacroExpand",
+ "PCSaveExpandedWorkflow",
+ "PCSetLogLevel",
+ "PCSetPCTextEncodeSettings",
+ "PCTextEncode",
+ "PCTextEncodeWithRange"
+ ],
+ {
+ "author": "asagi4",
+ "description": "Control LoRA and prompt scheduling, advanced text encoding, regional prompting, and much more, through your text prompt. Generates dynamic graphs that are literally identical to handcrafted noodle soup.",
+ "nickname": "ComfyUI Prompt Control",
+ "title": "ComfyUI Prompt Control",
+ "title_aux": "ComfyUI Prompt Control"
+ }
+ ],
+ "https://github.com/asagi4/comfyui-utility-nodes": [
+ [
+ "MUConditioningCutoff",
+ "MUForceCacheClear",
+ "MUJinjaRender",
+ "MURemoveControlNet",
+ "MUReplaceModelWeights",
+ "MUSimpleWildcard"
+ ],
+ {
+ "title_aux": "asagi4/comfyui-utility-nodes"
+ }
+ ],
+ "https://github.com/asdrabael/Hunyuan-Multi-Lora-Loader": [
+ [
+ "HunyuanMultiLoraLoader",
+ "HunyuanMultiLoraLoaderWrapper"
+ ],
+ {
+ "title_aux": "Hunyuan-Multi-Lora-Loader"
+ }
+ ],
+ "https://github.com/ashtar1984/ComfyUI-SwitchPathLazy": [
+ [
+ "SwitchPathLazy",
+ "SwitchPathRev"
+ ],
+ {
+ "title_aux": "ComfyUI-SwitchPathLazy"
+ }
+ ],
+ "https://github.com/ashtar1984/comfyui-find-perfect-resolution": [
+ [
+ "FindPerfectResolution"
+ ],
+ {
+ "title_aux": "comfyui-find-perfect-resolution"
+ }
+ ],
+ "https://github.com/asirihewage/remove_metadata_comfyui": [
+ [
+ "RemoveMetadataStealth",
+ "VideoSanitizerStealth"
+ ],
+ {
+ "title_aux": "remove_metadata_comfyui"
+ }
+ ],
+ "https://github.com/aslanxie/comfyui_qwen_image_edit": [
+ [
+ "QWen Image Edit"
+ ],
+ {
+ "title_aux": "comfyui_qwen_image_edit"
+ }
+ ],
+ "https://github.com/asutermo/ComfyUI-Flux-TryOff": [
+ [
+ "TryOffFluxFillModelNode",
+ "TryOffFluxFillPipelineNode",
+ "TryOffModelNode",
+ "TryOffQuantizerNode",
+ "TryOffRunNode",
+ "TryOnOffModelNode",
+ "TryOnOffRunNode",
+ "TryOnRunNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Flux-TryOff"
+ }
+ ],
+ "https://github.com/aszc-dev/ComfyUI-CoreMLSuite": [
+ [
+ "Core ML Converter",
+ "Core ML LCM Converter",
+ "Core ML LoRA Loader",
+ "CoreMLModelAdapter",
+ "CoreMLSampler",
+ "CoreMLSamplerAdvanced",
+ "CoreMLUNetLoader"
+ ],
+ {
+ "title_aux": "Core ML Suite for ComfyUI"
+ }
+ ],
+ "https://github.com/atluslin/comfyui_arcane_style_trans": [
+ [
+ "Arcane_style_trans"
+ ],
+ {
+ "title_aux": "comfyui_arcane_style_trans"
+ }
+ ],
+ "https://github.com/ato-zen/ComfyUI-VIBE": [
+ [
+ "VIBE_Editor"
+ ],
+ {
+ "title_aux": "ComfyUI-VIBE"
+ }
+ ],
+ "https://github.com/ato321/ComfyUI-LTXVGuideRebase": [
+ [
+ "LTXVRebaseGuides"
+ ],
+ {
+ "title_aux": "ComfyUI-LTXVGuideRebase"
+ }
+ ],
+ "https://github.com/attashe/ComfyUI-FluxRegionAttention": [
+ [
+ "CLIPDebug",
+ "FluxRegionBBOX",
+ "FluxRegionMask",
+ "RegionAttention"
+ ],
+ {
+ "title_aux": "ComfyUI-FluxRegionAttention"
+ }
+ ],
+ "https://github.com/attome-ai/Comfyui_Attome_S3": [
+ [
+ "AttomeS3Config",
+ "AttomeS3LoadAudio",
+ "AttomeS3LoadImage",
+ "AttomeS3LoadText",
+ "AttomeS3LoadVideo",
+ "AttomeS3SaveAudio",
+ "AttomeS3SaveImage",
+ "AttomeS3SaveText",
+ "AttomeS3SaveVideo"
+ ],
+ {
+ "title_aux": "Comfyui_Attome_S3"
+ }
+ ],
+ "https://github.com/audioscavenger/ComfyUI-Thumbnails": [
+ [
+ "LoadImage"
+ ],
+ {
+ "author": "AudioscavengeR",
+ "description": "Load Image thumbnails and show input subfolders.",
+ "nickname": "LoadImageThumbnails",
+ "title": "LoadImageThumbnails",
+ "title_aux": "ComfyUI-Thumbnails"
+ }
+ ],
+ "https://github.com/audioscavenger/save-image-extended-comfyui": [
+ [
+ "SaveImageExtended"
+ ],
+ {
+ "author": "AudioscavengeR",
+ "description": "1 custom node to save your pictures in various folders and formats.",
+ "nickname": "Save Image Extended",
+ "title": "Save Image Extended",
+ "title_aux": "Save Image Extended for ComfyUI"
+ }
+ ],
+ "https://github.com/austinbrown34/ComfyUI-IO-Helpers": [
+ [
+ "EncodedPromptFromFile",
+ "EncodedPromptToFile",
+ "IO_LoadImage",
+ "SampledLatentsFromFile",
+ "SampledLatentsToFile"
+ ],
+ {
+ "title_aux": "ComfyUI-IO-Helpers"
+ }
+ ],
+ "https://github.com/avatechai/avatar-graph-comfyui": [
+ [
+ "ApplyMeshTransformAsShapeKey",
+ "B_ENUM",
+ "B_VECTOR3",
+ "B_VECTOR4",
+ "Combine Points",
+ "CreateShapeFlow",
+ "ExportBlendshapes",
+ "ExportGLTF",
+ "Extract Boundary Points",
+ "Image Alpha Mask Merge",
+ "ImageBridge",
+ "LoadImageFromRequest",
+ "LoadImageWithAlpha",
+ "LoadValueFromRequest",
+ "SAM MultiLayer",
+ "Save Image With Workflow"
+ ],
+ {
+ "author": "Avatech Limited",
+ "description": "Include nodes for sam + bpy operation, that allows workflow creations for generative 2d character rig.",
+ "nickname": "Avatar Graph",
+ "title": "Avatar Graph",
+ "title_aux": "Avatar Graph"
+ }
+ ],
+ "https://github.com/avenstack/ComfyUI-AV-FunASR": [
+ [
+ "AVASRTimestamp",
+ "AVFormat2Subtitle",
+ "AVSaveSubtitles",
+ "AVSpeechTimestamp"
+ ],
+ {
+ "title_aux": "ComfyUI-AV-FunASR"
+ }
+ ],
+ "https://github.com/avenstack/ComfyUI-AV-LatentSync": [
+ [
+ "AVLatentSync",
+ "AVVideoLengthAdjuster"
+ ],
+ {
+ "title_aux": "ComfyUI-AV-LatentSync"
+ }
+ ],
+ "https://github.com/avenstack/ComfyUI-AV-MegaTTS3": [
+ [
+ "AVMegaTTS3",
+ "AVPromptInit"
+ ],
+ {
+ "title_aux": "ComfyUI-AV-MegaTTS3"
+ }
+ ],
+ "https://github.com/avocadori/ComfyUI-load-image-prompt-lora": [
+ [
+ "YAMLImageCycler",
+ "YAMLImageCyclerSimple",
+ "YAMLLoRAExtractor",
+ "YAMLLoRALoader",
+ "YAMLLoRASelector"
+ ],
+ {
+ "title_aux": "ComfyUI-load-image-prompt-lora"
+ }
+ ],
+ "https://github.com/aws-samples/comfyui-llm-node-for-amazon-bedrock": [
+ [
+ "Amazon Bedrock - Luma AI Ray Video",
+ "Amazon Bedrock - Nova Canvas Background Prompt Replace",
+ "Amazon Bedrock - Nova Canvas Generate Image",
+ "Amazon Bedrock - Nova Canvas Generate Variations",
+ "Amazon Bedrock - Nova Reel Video",
+ "Amazon Bedrock - SD3 & SD3.5 Large | Image to Image",
+ "Amazon Bedrock - Stability AI Models | Text to Image",
+ "Bedrock - Claude",
+ "Bedrock - Claude Multimodal",
+ "Bedrock - Nova",
+ "Bedrock - SDXL",
+ "Bedrock - Titan Inpainting",
+ "Bedrock - Titan Outpainting",
+ "Bedrock - Titan Text to Image",
+ "Bedrock - Titan Variation",
+ "Image From S3",
+ "Image From URL",
+ "Image OCR By Textract",
+ "Image OCR By Textract V2",
+ "Image OCR By Textract V3",
+ "Image OCR by PaddleOCR",
+ "Image To S3",
+ "JSON Text Extraction",
+ "Prompt Regex Remove",
+ "Prompt Template",
+ "Prompt Template with Two Inputs"
+ ],
+ {
+ "title_aux": "Amazon Bedrock nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/azazeal04/comfyui-switch-samplers": [
+ [
+ "CrossMultiStepKSampler",
+ "CrossStepSwitchKSampler",
+ "MultiStepKSampler",
+ "StepSwitchKSampler"
+ ],
+ {
+ "title_aux": "comfy-switch-samplers"
+ }
+ ],
+ "https://github.com/azure-dragon-ai/ComfyUI-ClipScore-Nodes": [
+ [
+ "HaojihuiClipScoreFakeImageProcessor",
+ "HaojihuiClipScoreImageProcessor",
+ "HaojihuiClipScoreImageScore",
+ "HaojihuiClipScoreLoader",
+ "HaojihuiClipScoreRealImageProcessor",
+ "HaojihuiClipScoreTextProcessor"
+ ],
+ {
+ "title_aux": "ComfyUI-ClipScore-Nodes"
+ }
+ ],
+ "https://github.com/azure-dragon-ai/ComfyUI-HPSv2-Nodes": [
+ [
+ "GetImageSize",
+ "HaojihuiHPSv2ImageProcessor",
+ "HaojihuiHPSv2ImageScore",
+ "HaojihuiHPSv2ImageScores",
+ "HaojihuiHPSv2Loader",
+ "HaojihuiHPSv2SaveAnimatedWEBP",
+ "HaojihuiHPSv2SaveImage",
+ "HaojihuiHPSv2SaveWEBP",
+ "HaojihuiHPSv2SaveWebpImage",
+ "HaojihuiHPSv2TextProcessor",
+ "SaveImageWebp",
+ "ScaleShort"
+ ],
+ {
+ "title_aux": "ComfyUI-HPSv2-Nodes"
+ }
+ ],
+ "https://github.com/babe-and-spencer-enterprises/base-comfyui-node": [
+ [
+ "UploadToBaseNode"
+ ],
+ {
+ "title_aux": "ComfyUI Upload to BASE Node"
+ }
+ ],
+ "https://github.com/bablueza/ComfyUI-Vaja-Ai4thai": [
+ [
+ "ShowText",
+ "Vaja Synthesis Api"
+ ],
+ {
+ "title_aux": "Vaja TextToSpeech Node for ComfyUI"
+ }
+ ],
+ "https://github.com/babydjac/comfyui-grok-prompts": [
+ [
+ "Flux",
+ "PonyXL"
+ ],
+ {
+ "title_aux": "ComfyUI Grok Prompts"
+ }
+ ],
+ "https://github.com/babydjac/comfyui-smart-scaler": [
+ [
+ "AspectRatioAdjuster",
+ "BatchFrameProcessor",
+ "DynamicResolutionSelector",
+ "ImageMetadataExtractor",
+ "SizeParser",
+ "SmartAspectScaler",
+ "WanVideoFrameScaler"
+ ],
+ {
+ "title_aux": "ComfyUI Smart Scaler"
+ }
+ ],
+ "https://github.com/badayvedat/ComfyUI-fal-Connector": [
+ [
+ "BooleanInput_fal",
+ "FloatInput_fal",
+ "IntegerInput_fal",
+ "LoadImageFromURL_fal",
+ "RemoteCheckpointLoader_fal",
+ "RemoteLoraLoader_fal",
+ "SaveImage_fal",
+ "StringInput_fal"
+ ],
+ {
+ "title_aux": "ComfyUI-fal-Connector"
+ }
+ ],
+ "https://github.com/badjeff/comfyui_lora_tag_loader": [
+ [
+ "LoraTagLoader"
+ ],
+ {
+ "title_aux": "badjeff/LoRA Tag Loader for ComfyUI"
+ }
+ ],
+ "https://github.com/badxprogramm/ComfyUI-GradientBlur": [
+ [
+ "GradientBlur"
+ ],
+ {
+ "title_aux": "GradientBlurNode for ComfyUI"
+ }
+ ],
+ "https://github.com/baicai99/ComfyUI-FrameSkipping": [
+ [
+ "FrameSelector",
+ "FrameSkipping",
+ "FrameTruncating",
+ "IntOperationsNode",
+ "MaskFrameSkipping",
+ "MaskGenerator",
+ "MaskSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-FrameSkipping"
+ }
+ ],
+ "https://github.com/baijunty/comfyui_image_embeddings": [
+ [
+ "Base64ImageLoader",
+ "CustomImageLoader",
+ "Image2Base64",
+ "ImageHash",
+ "OutputEmbedding",
+ "Resize2DivisibleImage"
+ ],
+ {
+ "title_aux": "comfyui_image_embeddings"
+ }
+ ],
+ "https://github.com/bananasss00/ComfyUI-SP-Nodes": [
+ [
+ "BoolSwitchOutStr",
+ "CivitaiPrompts",
+ "ComfyuiRuntimeArgs",
+ "FaceScatter",
+ "FaceScatter2",
+ "FluxInspireLbw_Batch",
+ "FluxInspireLbw_BlockVectorPreset",
+ "GodnessMerger_Apply",
+ "GodnessMerger_InputBlocks",
+ "GodnessMerger_InputBlocksExperimental",
+ "GodnessMerger_LabelEmb",
+ "GodnessMerger_MiddleBlock",
+ "GodnessMerger_MiddleBlockExperimental",
+ "GodnessMerger_NoiseInjection",
+ "GodnessMerger_Out",
+ "GodnessMerger_OutputBlocks",
+ "GodnessMerger_OutputBlocksExperimental",
+ "GodnessMerger_RAW_Apply",
+ "GodnessMerger_TimeEmbed",
+ "ImageMonitor",
+ "ImgMetaValueExtractor",
+ "LoraLoaderByPath",
+ "LoraLoaderFromFolder",
+ "LoraLoaderOnlyModelByPath",
+ "NoiseInjectionEssentialsHookProvider",
+ "PreviewImageWEBP",
+ "PromptChecker",
+ "RandomPromptFromBook",
+ "Random_Model_Merge",
+ "SD3BlocksMultiply",
+ "SD3Multiply",
+ "SP-CheckpointSave",
+ "SP-UnetSave",
+ "SP_AnyPipe10",
+ "SP_AnyPipe15",
+ "SP_AnyPipe20",
+ "SP_AnyPipe30",
+ "SP_AnyPipe40",
+ "SP_AnyPipe5",
+ "SP_AnyPipe50",
+ "SP_CacheAutoLoader",
+ "SP_CacheCheck",
+ "SP_CacheGet",
+ "SP_CacheManager",
+ "SP_CachePersistence",
+ "SP_CacheStore",
+ "SP_CacheValue",
+ "SP_CompositeCacheKey",
+ "SP_DDInpaint_Pipe",
+ "SP_DebugLogger",
+ "SP_DictValue",
+ "SP_DynamicCombo",
+ "SP_FlorenceCaption",
+ "SP_FluxFastMergePatchFP8 [Experimental]",
+ "SP_FluxLoader",
+ "SP_FluxUnsampler",
+ "SP_FluxUnsampler_ForwardODESampler",
+ "SP_FluxUnsampler_InverseSampler",
+ "SP_HiresGen",
+ "SP_HiresGen_Dynamic",
+ "SP_HiresGen_HiresCfg",
+ "SP_HiresGen_Sharpen",
+ "SP_HunyuanLoader",
+ "SP_ImpactSwitchCombo",
+ "SP_KSampler",
+ "SP_KSamplerSelect",
+ "SP_KoboldCpp",
+ "SP_KoboldCppWithContext",
+ "SP_KoboldCpp_BannedTokens",
+ "SP_KoboldCpp_OverrideCfg",
+ "SP_ListAny",
+ "SP_LoadLatent",
+ "SP_ModelLoader",
+ "SP_Name_Checkpoint",
+ "SP_Name_Clip",
+ "SP_Name_ClipVision",
+ "SP_Name_ControlNet",
+ "SP_Name_StyleModel",
+ "SP_Name_Unet",
+ "SP_Name_UpscaleModel",
+ "SP_Name_Vae",
+ "SP_Pass",
+ "SP_Pipe",
+ "SP_Pipe_ToBasicPipe",
+ "SP_SD3Loader",
+ "SP_SDLoader",
+ "SP_SaveLatent",
+ "SP_SelectItemFromAnyList",
+ "SP_SendStringWebsocket",
+ "SP_SetPipeModelType",
+ "SP_Supir",
+ "SP_SupirSampler",
+ "SP_SupirSampler_DPMPP2M",
+ "SP_SupirSampler_EDM",
+ "SP_SwitchBooleanAny",
+ "SP_UnlistValues",
+ "SP_WebsocketSendImage",
+ "SP_XYGrid",
+ "SP_XYValues",
+ "ScatterParams",
+ "ScatterParamsBatch",
+ "SendTelegramChatBot",
+ "StrToCombo",
+ "TextSplitJoinByDelimiter"
+ ],
+ {
+ "author": "SeniorPioner",
+ "description": "Node Pack: PromptChecker for token toggling, KoboldCPP API, ModelMerging, Telegram-Bot-API, and more",
+ "nickname": "SP-Nodes",
+ "title": "SP-Nodes",
+ "title_aux": "SP-Nodes"
+ }
+ ],
+ "https://github.com/bananasss00/ComfyUI-flux_fill_patcher": [
+ [
+ "ApplyFluxFillPatch"
+ ],
+ {
+ "title_aux": "ComfyUI-flux_fill_patcher"
+ }
+ ],
+ "https://github.com/banodoco/steerable-motion": [
+ [
+ "BatchCreativeInterpolation",
+ "IpaConfiguration",
+ "RemoveAndInterpolateFrames",
+ "VideoContinuationGenerator",
+ "VideoFrameExtractorAndMaskGenerator",
+ "WanInputFrameNumber",
+ "WanVideoBlender"
+ ],
+ {
+ "title_aux": "Steerable Motion"
+ }
+ ],
+ "https://github.com/banqingyuan/ComfyUI-text-replace": [
+ [
+ "ChatOverlayNode",
+ "ExtractJsonNode",
+ "ImageEraseNode",
+ "OCRLocNode"
+ ],
+ {
+ "title_aux": "ComfyUI-text-replace"
+ }
+ ],
+ "https://github.com/bartly/Comfyui_babel_removebg_api": [
+ [
+ "BabelRemovebg"
+ ],
+ {
+ "title_aux": "Babel Removebg Api Node for ComfyUI"
+ }
+ ],
+ "https://github.com/bash-j/mikey_nodes": [
+ [
+ "AddMetaData",
+ "Batch Crop Image",
+ "Batch Crop Resize Inplace",
+ "Batch Load Images",
+ "Batch Resize Image for SDXL",
+ "Checkpoint Loader Simple Mikey",
+ "CheckpointHash",
+ "CheckpointSaveModelOnly",
+ "CinematicLook",
+ "Empty Latent Ratio Custom SDXL",
+ "Empty Latent Ratio Select SDXL",
+ "EvalFloats",
+ "FaceFixerOpenCV",
+ "FileNamePrefix",
+ "FileNamePrefixDateDirFirst",
+ "Float to String",
+ "GetSubdirectories",
+ "HaldCLUT",
+ "Image Caption",
+ "ImageBorder",
+ "ImageOverlay",
+ "ImagePaste",
+ "Int to String",
+ "LMStudioPrompt",
+ "Load Image Based on Number",
+ "LoraSyntaxProcessor",
+ "Mikey Sampler",
+ "Mikey Sampler Base Only",
+ "Mikey Sampler Base Only Advanced",
+ "Mikey Sampler Tiled",
+ "Mikey Sampler Tiled Base Only",
+ "MikeyLatentTileSampler",
+ "MikeyLatentTileSamplerCustom",
+ "MikeySamplerTiledAdvanced",
+ "MikeySamplerTiledAdvancedBaseOnly",
+ "ModelMergePixArtSigmaXL2_1024MS",
+ "ModelMergeTrainDiff",
+ "ModelMergeTrainDiffPixartSigmaXL2_1024MS",
+ "MosaicExpandImage",
+ "OobaPrompt",
+ "PresetRatioSelector",
+ "Prompt With SDXL",
+ "Prompt With Style",
+ "Prompt With Style V2",
+ "Prompt With Style V3",
+ "Range Float",
+ "Range Integer",
+ "Ratio Advanced",
+ "RemoveTextBetween",
+ "Resize Image for SDXL",
+ "SD3TextConditioningWithOptionsOnePrompt",
+ "SRFloatPromptInput",
+ "SRIntPromptInput",
+ "SRStringPromptInput",
+ "Save Image If True",
+ "Save Image With Prompt Data",
+ "Save Images Mikey",
+ "Save Images No Display",
+ "Save Images With Prompt Data",
+ "SaveMetaData",
+ "SearchAndReplace",
+ "Seed String",
+ "Style Conditioner",
+ "Style Conditioner Base Only",
+ "Text2InputOr3rdOption",
+ "TextCombinations",
+ "TextCombinations3",
+ "TextConcat",
+ "TextPadderMikey",
+ "TextPreserve",
+ "Upscale Tile Calculator",
+ "Wildcard Processor",
+ "WildcardAndLoraSyntaxProcessor",
+ "WildcardOobaPrompt"
+ ],
+ {
+ "title_aux": "Mikey Nodes"
+ }
+ ],
+ "https://github.com/bbaudio-2025/ComfyUI-SuperUltimateVaceTools": [
+ [
+ "CustomCropArea",
+ "CustomRefineOption",
+ "NAGParamtersSetting",
+ "RefineTest",
+ "RegionalBatchPrompt",
+ "SuperUltimateVACEUpscale",
+ "VACEControlImageCombine",
+ "VACEPromptCheckTotalFrame",
+ "VACEPromptCombine",
+ "VaceFunLongVideo",
+ "VaceLongVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-SuperUltimateVaceTools"
+ }
+ ],
+ "https://github.com/bbtaivi/ComfyUI-Aiv-Param": [
+ [
+ "AivParam"
+ ],
+ {
+ "title_aux": "AIV ComfyUI Node"
+ }
+ ],
+ "https://github.com/bcasadei/ComfyUI-Prompt-Camera-Assistant": [
+ [
+ "PromptCameraAssistant"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Camera-Assistant"
+ }
+ ],
+ "https://github.com/bear2b/comfyui-argo-nodes": [
+ [
+ "ColorMatrixGPU",
+ "LoadGridFromURL",
+ "SaveGridToS3"
+ ],
+ {
+ "title_aux": "ColorMatrixGPU Node for ComfyUI"
+ }
+ ],
+ "https://github.com/bedovyy/ComfyUI-LLM-Helper": [
+ [
+ "LLMHelper_GetModels",
+ "LLMHelper_PostModelsUnload"
+ ],
+ {
+ "title_aux": "ComfyUI-LLM-Helper"
+ }
+ ],
+ "https://github.com/bedovyy/ComfyUI_NAIDGenerator": [
+ [
+ "AnlasTrackerNAID",
+ "CharacterReferenceOptionNAID",
+ "ColorizeNAID",
+ "DeclutterNAID",
+ "EmotionNAID",
+ "GenerateNAID",
+ "Img2ImgOptionNAID",
+ "InpaintingOptionNAID",
+ "LineArtNAID",
+ "MaskImageToNAID",
+ "ModelOptionNAID",
+ "NetworkOptionNAID",
+ "PromptToNAID",
+ "RemoveBGNAID",
+ "SketchNAID",
+ "V4BasePrompt",
+ "V4NegativePrompt",
+ "VibeTransferOptionNAID"
+ ],
+ {
+ "title_aux": "ComfyUI_NAIDGenerator"
+ }
+ ],
+ "https://github.com/bemoregt/ComfyUI_CustomNode_Image2Spectrum": [
+ [
+ "Image_Spectrum"
+ ],
+ {
+ "title_aux": "ComfyUI_CustomNode_Image2Spectrum"
+ }
+ ],
+ "https://github.com/benda1989/CosyVoice2_ComfyUI": [
+ [
+ "CosyVoice3s",
+ "CosyVoiceCrossLingual",
+ "CosyVoiceLoader",
+ "CosyVoiceNLControl",
+ "CosyVoiceSonic",
+ "Text2"
+ ],
+ {
+ "title_aux": "GKK\u00b7CosyVoice"
+ }
+ ],
+ "https://github.com/benda1989/Sonic_ComfyUI": [
+ [
+ "SonicLoader",
+ "SonicSimper",
+ "SonicSpeechs"
+ ],
+ {
+ "title_aux": "GKK\u00b7Sonic"
+ }
+ ],
+ "https://github.com/benjamin-bertram/Comfyui_OIDN_Denoiser": [
+ [
+ "OIDNDenoiser"
+ ],
+ {
+ "title_aux": "ComfyUI OIDN Denoiser"
+ }
+ ],
+ "https://github.com/benjiyaya/ComfyUI-HunyuanVideoImagesGuider": [
+ [
+ "Hunyuan Video Image To Guider"
+ ],
+ {
+ "title_aux": "ComfyUI-HunyuanVideoImagesGuider"
+ }
+ ],
+ "https://github.com/benjiyaya/ComfyUI-KokoroTTS": [
+ [
+ "Kokoro TextToSpeech"
+ ],
+ {
+ "title_aux": "ComfyUI-KokoroTTS"
+ }
+ ],
+ "https://github.com/benjiyaya/ComfyUI-QwenImageLayeredToLength": [
+ [
+ "QwenImageLayered - Layer to Length Mapper",
+ "QwenImageLayered_LengthMapper"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenImageLayeredToLength"
+ }
+ ],
+ "https://github.com/benstaniford/comfy-contact-sheet-image-loader": [
+ [
+ "ContactSheetImageLoader"
+ ],
+ {
+ "title_aux": "Comfy Contact Sheet Image Loader"
+ }
+ ],
+ "https://github.com/benstaniford/comfy-image-switch": [
+ [
+ "ImageSwitchNode",
+ "SwitchAnyValid"
+ ],
+ {
+ "title_aux": "ComfyUI Image Switch Node"
+ }
+ ],
+ "https://github.com/benstaniford/comfy-load-last-image": [
+ [
+ "LoadMostRecentImage"
+ ],
+ {
+ "title_aux": "ComfyUI Load Most Recent Image Node"
+ }
+ ],
+ "https://github.com/benstaniford/comfy-lora-loader-with-triggerdb": [
+ [
+ "LoRaLoaderWithTriggerDB"
+ ],
+ {
+ "title_aux": "LoRa Loader with Trigger Database"
+ }
+ ],
+ "https://github.com/benstaniford/comfy-prompt-db": [
+ [
+ "PromptDB",
+ "PromptStack"
+ ],
+ {
+ "title_aux": "Prompt Database for ComfyUI"
+ }
+ ],
+ "https://github.com/bentoml/comfy-pack": [
+ [
+ "CPackInputAny",
+ "CPackInputFile",
+ "CPackInputImage",
+ "CPackInputInt",
+ "CPackInputString",
+ "CPackOutputAudio",
+ "CPackOutputFile",
+ "CPackOutputImage",
+ "CPackOutputTextFile",
+ "CPackOutputVideo",
+ "CPackOutputZip",
+ "CPackOutputZipSwitch"
+ ],
+ {
+ "title_aux": "Comfy-Pack"
+ }
+ ],
+ "https://github.com/beyondprompting/ComfyUI-Beyond_nodes": [
+ [
+ "Beyond_Public_LoRA_URL",
+ "Bool-beyond_nodes",
+ "BooleanControlOutput-beyond_nodes",
+ "BooleanSwitch-beyond_nodes",
+ "Compare-beyond_nodes",
+ "Compositor3-beyond_nodes",
+ "Compositor4-beyond_nodes",
+ "Compositor4MasksOutput-beyond_nodes",
+ "Compositor4TransformsOut-beyond_nodes",
+ "CompositorConfig4-beyond_nodes",
+ "DebugPrint-beyond_nodes",
+ "EditMask-beyond_nodes",
+ "Float-beyond_nodes",
+ "If ANY return A else B-beyond_nodes",
+ "ImageMaskScaleAs-beyond_nodes",
+ "ImageMaskSwitch-beyond_nodes",
+ "ImageScaleDownBy-beyond_nodes",
+ "Int-beyond_nodes",
+ "MaskBoundingBox",
+ "MaskBoundingBox-beyond_nodes",
+ "MaskRectArea-beyond_nodes",
+ "MaskToImage-beyond_nodes",
+ "Prompt-beyond_nodes",
+ "RoundMask-beyond_nodes",
+ "String-beyond_nodes",
+ "TwoWaySwitch-beyond_nodes",
+ "UUID",
+ "UUIDFilename"
+ ],
+ {
+ "author": "Beyond Prompting",
+ "description": "Beyond Node Packages",
+ "nickname": "Beyond Nodes",
+ "title": "Beyond Nodes",
+ "title_aux": "ComfyUI-Beyond_nodes"
+ }
+ ],
+ "https://github.com/bgreene2/ComfyUI-Hunyuan-Image-3": [
+ [
+ "HunyuanImage3"
+ ],
+ {
+ "title_aux": "ComfyUI-Hunyuan-Image-3"
+ }
+ ],
+ "https://github.com/bhhtr12/ComfyUI-ollama-stop": [
+ [
+ "OllamaStopNode"
+ ],
+ {
+ "title_aux": "ComfyUI-ollama-stop"
+ }
+ ],
+ "https://github.com/bhvbhushan/ComfyUI-LoRABlockWeight": [
+ [
+ "HierarchicalLoRAWeightEditor",
+ "NunchakuHierarchicalLoRALoader"
+ ],
+ {
+ "title_aux": "ComfyUI LoRA Block Weight Loader"
+ }
+ ],
+ "https://github.com/big-mon/ComfyUI-ResolutionPresets": [
+ [
+ "ResolutionPresetsSDXL"
+ ],
+ {
+ "title_aux": "ComfyUI-ResolutionPresets"
+ }
+ ],
+ "https://github.com/bikiam/ComfyUI_WhisperSRT": [
+ [
+ "WhisperAudioToSRTText"
+ ],
+ {
+ "title_aux": "ComfyUI_WhisperSRT"
+ }
+ ],
+ "https://github.com/bilal-arikan/ComfyUI_TextAssets": [
+ [
+ "LoadTextAsset"
+ ],
+ {
+ "title_aux": "ComfyUI_TextAssets"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_ACE-Step": [
+ [
+ "ACELoRALoader",
+ "ACEModelLoader",
+ "ACEStepEdit",
+ "ACEStepExtend",
+ "ACEStepGen",
+ "ACEStepRepainting",
+ "GenerationParameters",
+ "LyricsLangSwitch",
+ "MultiLineLyrics",
+ "MultiLinePromptACES"
+ ],
+ {
+ "title_aux": "ComfyUI_ACE-Step"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_AudioTools": [
+ [
+ "AddSubtitlesToVideo",
+ "AdjustAudio",
+ "AudioAddWatermark",
+ "AudioConcatenate",
+ "AudioRecorderAT",
+ "ClearVoiceRun",
+ "LoadAudioMW",
+ "MergeAudioMW",
+ "MinimalPauseNode",
+ "MultiLinePromptAT",
+ "MusicSeparation",
+ "RemoveSilence",
+ "SpeechSeparation",
+ "StringEditNode",
+ "TrimAudio"
+ ],
+ {
+ "title_aux": "ComfyUI_AudioTools"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_CSM": [
+ [
+ "CSMDialogRun",
+ "CSMSpeakersPreview",
+ "MultiLineText"
+ ],
+ {
+ "title_aux": "ComfyUI_CSM"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_DiffRhythm": [
+ [
+ "DiffRhythmRun",
+ "MultiLineLyricsDR"
+ ],
+ {
+ "title_aux": "ComfyUI_DiffRhythm_MW"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_EraX-WoW-Turbo": [
+ [
+ "EraXWoWRUN",
+ "WhisperTurboRun"
+ ],
+ {
+ "title_aux": "MW-ComfyUI_EraX-WoW-Turbo"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_IndexTTS": [
+ [
+ "IndexSpeakersPreview",
+ "IndexTTS2Run",
+ "IndexTTSRun",
+ "MultiLinePromptIndex"
+ ],
+ {
+ "title_aux": "ComfyUI_IndexTTS"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_KokoroTTS_MW": [
+ [
+ "KokoroRun",
+ "KokoroZHRun",
+ "MultiLinePromptKK"
+ ],
+ {
+ "title_aux": "ComfyUI_KokoroTTS_MW"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_MegaTTS3": [
+ [
+ "MegaTTS3Run",
+ "MegaTTS3SpeakersPreview",
+ "MultiLinePromptMG"
+ ],
+ {
+ "title_aux": "MW-ComfyUI_MegaTTS3"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_NotaGen": [
+ [
+ "NotaGenRun"
+ ],
+ {
+ "title_aux": "ComfyUI_NotaGen"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_OneButtonPrompt": [
+ [
+ "LoadImageAndPromptFromURL",
+ "LoadImageFromURL",
+ "LoadPrompt",
+ "StringEditNodeOBP"
+ ],
+ {
+ "title_aux": "MW-ComfyUI_OneButtonPrompt"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_OuteTTS": [
+ [
+ "OuteTTSRun"
+ ],
+ {
+ "title_aux": "MW-ComfyUI_OuteTTS"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_PortraitTools": [
+ [
+ "AlignFace",
+ "BeautifyPhoto",
+ "DetectCropFace",
+ "DetectCropFaces",
+ "IDPhotos",
+ "ImageWatermark",
+ "LoadImageMW"
+ ],
+ {
+ "title_aux": "MW-ComfyUI_PortraitTools"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_SOME": [
+ [
+ "SomeSing2Midi"
+ ],
+ {
+ "title_aux": "ComfyUI_SOME"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_SparkTTS": [
+ [
+ "AudioRecorderSpark",
+ "SparkTTSClone",
+ "SparkTTSRun"
+ ],
+ {
+ "title_aux": "ComfyUI_SparkTTS"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_StepAudioTTS": [
+ [
+ "AudioRecorder",
+ "StepAudioClone",
+ "StepAudioRun"
+ ],
+ {
+ "title_aux": "ComfyUI_StepAudioTTS"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_gemmax": [
+ [
+ "GemmaxRun",
+ "QuickMTRun"
+ ],
+ {
+ "title_aux": "MW-ComfyUI_gemmax"
+ }
+ ],
+ "https://github.com/billwuhao/ComfyUI_parakeet-tdt": [
+ [
+ "ParakeetASRRun"
+ ],
+ {
+ "title_aux": "ComfyUI_parakeet-tdt"
+ }
+ ],
+ "https://github.com/billwuhao/Comfyui_HeyGem": [
+ [
+ "HeyGemRun"
+ ],
+ {
+ "title_aux": "Comfyui_HeyGem"
+ }
+ ],
+ "https://github.com/birdneststream/ComfyUI-Mircify": [
+ [
+ "IRC Art Converter",
+ "IRC PNG Exporter",
+ "IRC Text Saver"
+ ],
+ {
+ "title_aux": "ComfyUI-Mircify"
+ }
+ ],
+ "https://github.com/bitaffinity/ComfyUI_HF_Inference": [
+ [
+ "Classification",
+ "FeatureExtraction",
+ "Generation",
+ "ObjectDetection",
+ "QuestionAnswering",
+ "Segmentation",
+ "TextToImage",
+ "Translation"
+ ],
+ {
+ "title_aux": "ComfyUI_HF_Inference"
+ }
+ ],
+ "https://github.com/bkpaine1/Halo-Lipsy": [
+ [
+ "HaloLipsy"
+ ],
+ {
+ "title_aux": "Halo-Lipsy"
+ }
+ ],
+ "https://github.com/bkpaine1/Halo-TeaCache": [
+ [
+ "HaloTeaCache"
+ ],
+ {
+ "title_aux": "Halo-TeaCache"
+ }
+ ],
+ "https://github.com/bkpaine1/halo_pack": [
+ [
+ "HALOConditioningDebug",
+ "HALOLatentDebug",
+ "HALOModelDebug",
+ "HALOVAEDecode",
+ "HALOVAEEncode"
+ ],
+ {
+ "title_aux": "HALO Debug Pack"
+ }
+ ],
+ "https://github.com/black-forest-labs/bfl-comfy-nodes": [
+ [
+ "FLUX 1.0 [canny]",
+ "FLUX 1.0 [canny] Finetuned",
+ "FLUX 1.0 [depth]",
+ "FLUX 1.0 [depth] Finetuned",
+ "FLUX 1.0 [dev]",
+ "FLUX 1.0 [fill]",
+ "FLUX 1.0 [fill] Finetuned",
+ "FLUX 1.0 [pro]",
+ "FLUX 1.0 [pro] Finetuned",
+ "FLUX 1.1 [pro]",
+ "FLUX 1.1 [ultra]",
+ "FLUX 1.1 [ultra] Finetuned"
+ ],
+ {
+ "title_aux": "Black Forest Labs API Nodes"
+ }
+ ],
+ "https://github.com/blackcodetavern/ComfyUI-Benripack": [
+ [
+ "AnimationExtractor",
+ "CharacterPipe",
+ "Load3DModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Benripack"
+ }
+ ],
+ "https://github.com/blepping/ComfyUI-ApplyResAdapterUnet": [
+ [
+ "ApplyResAdapterUnet"
+ ],
+ {
+ "title_aux": "ComfyUI-ApplyResAdapterUnet"
+ }
+ ],
+ "https://github.com/blepping/ComfyUI-bleh": [
+ [
+ "BlehBlockCFG",
+ "BlehBlockOps",
+ "BlehCFGInitSampler",
+ "BlehCast",
+ "BlehDeepShrink",
+ "BlehDisableNoise",
+ "BlehDiscardPenultimateSigma",
+ "BlehEnsurePreviewer",
+ "BlehForceSeedSampler",
+ "BlehGlobalSageAttention",
+ "BlehHyperTile",
+ "BlehImageAsLatent",
+ "BlehInsaneChainSampler",
+ "BlehLatentAsImage",
+ "BlehLatentBlend",
+ "BlehLatentOps",
+ "BlehLatentScaleBy",
+ "BlehModelPatchConditional",
+ "BlehModelPatchFastTerminate",
+ "BlehPlug",
+ "BlehRefinerAfter",
+ "BlehSageAttentionSampler",
+ "BlehSetSamplerPreset",
+ "BlehSetSigmas",
+ "BlehTAEVideoDecode",
+ "BlehTAEVideoEncode"
+ ],
+ {
+ "title_aux": "ComfyUI-bleh"
+ }
+ ],
+ "https://github.com/blepping/ComfyUI-sonar": [
+ [
+ "FreeUExtreme",
+ "FreeUExtremeConfig",
+ "NoisyLatentLike",
+ "SONAR_CUSTOM_NOISE to NOISE",
+ "SamplerConfigOverride",
+ "SamplerSonarDPMPPSDE",
+ "SamplerSonarEuler",
+ "SamplerSonarEulerA",
+ "SonarAdvanced1fNoise",
+ "SonarAdvancedCollatzNoise",
+ "SonarAdvancedDistroNoise",
+ "SonarAdvancedPowerLawNoise",
+ "SonarAdvancedPyramidNoise",
+ "SonarAdvancedVoronoiNoise",
+ "SonarApplyLatentOperationCFG",
+ "SonarBlendedNoise",
+ "SonarChannelNoise",
+ "SonarCompositeNoise",
+ "SonarCustomNoise",
+ "SonarCustomNoiseAdv",
+ "SonarCustomNoiseParameters",
+ "SonarGuidanceConfig",
+ "SonarGuidedNoise",
+ "SonarLatentOperationAdvanced",
+ "SonarLatentOperationFilteredNoise",
+ "SonarLatentOperationNoise",
+ "SonarLatentOperationQuantileFilter",
+ "SonarLatentOperationSetSeed",
+ "SonarModulatedNoise",
+ "SonarNoiseImage",
+ "SonarNormalizeNoiseToScale",
+ "SonarPatternBreakNoise",
+ "SonarPerDimNoise",
+ "SonarPowerFilter",
+ "SonarPowerFilterNoise",
+ "SonarPowerNoise",
+ "SonarPreviewFilter",
+ "SonarQuantileFilteredNoise",
+ "SonarRandomNoise",
+ "SonarRepeatedNoise",
+ "SonarResizedNoise",
+ "SonarResizedNoiseAdv",
+ "SonarRippleFilteredNoise",
+ "SonarScatternetFilteredNoise",
+ "SonarScheduledNoise",
+ "SonarShuffledNoise",
+ "SonarSplitNoiseChain",
+ "SonarWaveletCFG",
+ "SonarWaveletFilteredNoise",
+ "SonarWaveletNoise"
+ ],
+ {
+ "title_aux": "ComfyUI-sonar"
+ }
+ ],
+ "https://github.com/blepping/comfyui_jankdiffusehigh": [
+ [
+ "DiffuseHighParam",
+ "DiffuseHighSampler"
+ ],
+ {
+ "title_aux": "comfyui_jankdiffusehigh"
+ }
+ ],
+ "https://github.com/blepping/comfyui_jankhidiffusion": [
+ [
+ "ApplyMSWMSAAttention",
+ "ApplyMSWMSAAttentionSimple",
+ "ApplyRAUNet",
+ "ApplyRAUNetSimple"
+ ],
+ {
+ "title_aux": "comfyui_jankhidiffusion"
+ }
+ ],
+ "https://github.com/blepping/comfyui_overly_complicated_sampling": [
+ [
+ "OCS ApplyFilterImage",
+ "OCS ApplyFilterLatent",
+ "OCS Group",
+ "OCS ModelSetMaxSigma",
+ "OCS MultiParam",
+ "OCS Param",
+ "OCS Sampler",
+ "OCS SimpleRestartSchedule",
+ "OCS Substeps",
+ "OCSNoise Conditioning",
+ "OCSNoise ExpressionFilteredNoise",
+ "OCSNoise ImmiscibleReference",
+ "OCSNoise OverrideSamplerNoise",
+ "OCSNoise PerlinAdvanced",
+ "OCSNoise PerlinSimple",
+ "OCSNoise to SONAR_CUSTOM_NOISE"
+ ],
+ {
+ "title_aux": "comfyui_overly_complicated_sampling"
+ }
+ ],
+ "https://github.com/blird/ComfyUI-Wanify": [
+ [
+ "AdaptiveImageResize"
+ ],
+ {
+ "title_aux": "ComfyUI-Wanify: Adaptive Image Resize Node"
+ }
+ ],
+ "https://github.com/blob8/ComfyUI_sloppy-comic": [
+ [
+ "Generate Comic",
+ "LLM API Request"
+ ],
+ {
+ "title_aux": "ComfyUI_sloppy-comic"
+ }
+ ],
+ "https://github.com/blob8/ComfyUI_video-image-motion-transfer": [
+ [
+ "VideoImageWarp"
+ ],
+ {
+ "title_aux": "ComfyUI_video-image-motion-transfer"
+ }
+ ],
+ "https://github.com/blovett80/ComfyUI-PixelDojo": [
+ [
+ "PixelDojoAPI"
+ ],
+ {
+ "title_aux": "ComfyUI-PixelDojo"
+ }
+ ],
+ "https://github.com/blueraincoatli/comfyUI_SillyNodes": [
+ [
+ "BooleanJumper|SillyNode",
+ "CloseErrorWindowNode|SillyNode",
+ "QueueSequence|SillyNode",
+ "Screenshots|SillyNode",
+ "dummyInput|SillyNode",
+ "dummyInput|blueraincoat"
+ ],
+ {
+ "title_aux": "comfyUI_SillyNodes"
+ }
+ ],
+ "https://github.com/bluevisor/ComfyUI_PS_Blend_Node": [
+ [
+ "PSBlendNode"
+ ],
+ {
+ "title_aux": "ComfyUI_PS_Blend_Node"
+ }
+ ],
+ "https://github.com/blurgyy/CoMPaSS-FLUX.1-dev-ComfyUI": [
+ [
+ "CoMPaSS for FLUX.1-dev",
+ "Example"
+ ],
+ {
+ "title_aux": "CoMPaSS-ComfyUI"
+ }
+ ],
+ "https://github.com/bmad4ever/comfyui_ab_samplercustom": [
+ [
+ "AB SamplerCustom (experimental)"
+ ],
+ {
+ "title_aux": "comfyui_ab_sampler"
+ }
+ ],
+ "https://github.com/bmad4ever/comfyui_lists_cartesian_product": [
+ [
+ "AnyListCartesianProduct"
+ ],
+ {
+ "title_aux": "Lists Cartesian Product"
+ }
+ ],
+ "https://github.com/bmad4ever/comfyui_panels": [
+ [
+ "bmad_BBoxFromInts",
+ "bmad_BBoxSnap",
+ "bmad_BevelPolygon",
+ "bmad_BuildLayoutPanels",
+ "bmad_CanvasPanel",
+ "bmad_ComplementaryCardinals",
+ "bmad_CropImageByBBox",
+ "bmad_CropMaskByBBox",
+ "bmad_CropMaskHolesQuantizedPadded",
+ "bmad_DetectPanelsInImage",
+ "bmad_DrawPanelsEdges",
+ "bmad_DrawPanelsEdgesDashed",
+ "bmad_DrawPanelsEdgesDotted",
+ "bmad_GridPanelLayoutGenerator",
+ "bmad_GrowPanel",
+ "bmad_InvertCardinals",
+ "bmad_ListAppendPanel",
+ "bmad_ListTransferPanel",
+ "bmad_LoadPanelLayout",
+ "bmad_MutatePanelLayout",
+ "bmad_OffsetPolygonBounds",
+ "bmad_Panel2Mask",
+ "bmad_PasteCrops",
+ "bmad_PolygonBounds",
+ "bmad_PolygonOriginCenter",
+ "bmad_PolygonOriginCentroid",
+ "bmad_PolygonOriginVector",
+ "bmad_PolygonOriginVertex",
+ "bmad_PolygonToMask",
+ "bmad_PolygonToResizedMask",
+ "bmad_PolygonUnwrappedBounds",
+ "bmad_PreviewPanelLayout",
+ "bmad_PreviewPanels",
+ "bmad_RandomPanelLayoutGenerator",
+ "bmad_RelativeCropImage",
+ "bmad_RotatePolygon",
+ "bmad_SavePanelLayout",
+ "bmad_ScalePolygon",
+ "bmad_SkewPolygon",
+ "bmad_SliceList_Panels",
+ "bmad_SortPanels",
+ "bmad_StringDecodePanelLayout",
+ "bmad_StringEncodePanelLayout",
+ "bmad_TranslatePolygon",
+ "bmad_UnpackBBox"
+ ],
+ {
+ "title_aux": "comfyui-panels"
+ }
+ ],
+ "https://github.com/bmad4ever/comfyui_quilting": [
+ [
+ "GuessQuiltingBlockSize_Bmad",
+ "ImageQuiltingSeamlessMB_Bmad",
+ "ImageQuiltingSeamlessSB_Bmad",
+ "ImageQuilting_Bmad",
+ "LatentQuiltingSeamlessMB_Bmad",
+ "LatentQuiltingSeamlessSB_Bmad",
+ "LatentQuilting_Bmad"
+ ],
+ {
+ "title_aux": "comfyui_quilting"
+ }
+ ],
+ "https://github.com/bmad4ever/comfyui_wfc_like": [
+ [
+ "WFC_CustomTemperature_Bmad",
+ "WFC_CustomValueWeights_Bmad",
+ "WFC_Decode_BMad",
+ "WFC_EmptyState_Bmad",
+ "WFC_Encode_BMad",
+ "WFC_Filter_Bmad",
+ "WFC_GenParallel_Bmad",
+ "WFC_Generate_BMad",
+ "WFC_SampleNode_BMad"
+ ],
+ {
+ "title_aux": "comfyui_wfc_like"
+ }
+ ],
+ "https://github.com/bobmagicii/comfykit-custom-nodes": [
+ [
+ "LoraStackFiveSimple",
+ "LoraThree",
+ "LoraWithMeta",
+ "TypecasterClip",
+ "TypecasterCond",
+ "TypecasterImage",
+ "TypecasterLatent",
+ "TypecasterModel",
+ "TypecasterVae"
+ ],
+ {
+ "title_aux": "ComfyKit Custom Nodes"
+ }
+ ],
+ "https://github.com/bobosola/ComfyUI-reboot": [
+ [
+ "reboot"
+ ],
+ {
+ "title_aux": "ComfyUI-reboot"
+ }
+ ],
+ "https://github.com/bollerdominik/ComfyUI-load-lora-from-url": [
+ [
+ "AssertNotBlack",
+ "CutImageByMask",
+ "GeminiImage2GenAI",
+ "ImageResize+",
+ "LoadLoraFromUrlOrPath",
+ "LoadNunchakuLoraFromUrlOrPath",
+ "LoadUpscaleModelFromUrlOrPath",
+ "LoadVideoFromUrlOrPath",
+ "LoadVideoLoraFromUrlOrPath",
+ "LoadVideoLoraFromUrlOrPathSelect",
+ "OpenRouterGeminiImage",
+ "PasteImageByMask",
+ "SimpleMath+"
+ ],
+ {
+ "title_aux": "ComfyUI-load-lora-from-url"
+ }
+ ],
+ "https://github.com/bombax-xiaoice/ComfyUI-Allegro": [
+ [
+ "AllegroDecoder",
+ "AllegroEncoder",
+ "AllegroSampler",
+ "AllegroTI2VEncoder",
+ "AllegroTI2VSampler",
+ "AllegroTextEncoder",
+ "LoadAllegroModel",
+ "LoadAllegroTI2VModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Allegro"
+ }
+ ],
+ "https://github.com/bombax-xiaoice/ComfyUI-DisPose": [
+ [
+ "DisPoseDecoder",
+ "DisPoseLoader",
+ "DisPoseSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-DisPose"
+ }
+ ],
+ "https://github.com/bombax-xiaoice/ComfyUI-MagicDance": [
+ [
+ "LoadMagicDanceModel",
+ "MagicDanceDecoder",
+ "MagicDanceEncoder",
+ "MagicDanceSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-MagicDance"
+ }
+ ],
+ "https://github.com/bombax-xiaoice/ComfyUI-Open-Sora-I2V": [
+ [
+ "OpenSoraDecoder",
+ "OpenSoraEncoder",
+ "OpenSoraLoader",
+ "OpenSoraSampler",
+ "OpenSoraTextEncoder"
+ ],
+ {
+ "title_aux": "ComfyUI-Open-Sora-I2V"
+ }
+ ],
+ "https://github.com/bombax-xiaoice/ComfyUI-OpenSoraPlan": [
+ [
+ "OpenSoraPlan0LoaderT2V",
+ "OpenSoraPlan1LoaderT2V",
+ "OpenSoraPlan2LoaderI2V",
+ "OpenSoraPlan2LoaderT2V",
+ "OpenSoraPlan2SamplerI2V",
+ "OpenSoraPlan3LoaderI2V",
+ "OpenSoraPlan3LoaderT2V",
+ "OpenSoraPlan3SamplerI2V",
+ "OpenSoraPlanDecoder",
+ "OpenSoraPlanPromptRefiner",
+ "OpenSoraPlanSamplerT2V"
+ ],
+ {
+ "title_aux": "ComfyUI-OpenSoraPlan"
+ }
+ ],
+ "https://github.com/bombdefuser-124/Newbie-Teacache-ComfyUI": [
+ [
+ "TeaCacheCoefficientCalculator",
+ "TeaCache_Lumina2"
+ ],
+ {
+ "title_aux": "Newbie-Teacache-ComfyUI"
+ }
+ ],
+ "https://github.com/bombless/comfyUI-RememberingUtils": [
+ [
+ "RememberLastSeed",
+ "ShowLastSeed",
+ "ShowLastText"
+ ],
+ {
+ "title_aux": "Remembering utils"
+ }
+ ],
+ "https://github.com/bomborant/ComfyUI-ShakaNodes": [
+ [
+ "ShakaTensorDebug",
+ "ShakaWanKeyframes"
+ ],
+ {
+ "title_aux": "ShakaNodes"
+ }
+ ],
+ "https://github.com/bongsang/ComfyUI-Bongsang": [
+ [
+ "AnyInfo",
+ "RgbChannel"
+ ],
+ {
+ "title_aux": "ComfyUI-Bongsang"
+ }
+ ],
+ "https://github.com/boredcoderyt/ComfyUI-Fibo-Edit": [
+ [
+ "FiboEdit",
+ "FiboEdit_VLM"
+ ],
+ {
+ "title_aux": "Fibo Edit Node for ComfyUI"
+ }
+ ],
+ "https://github.com/boredofnames/ComfyUI-ntfy": [
+ [
+ "Ntfy",
+ "SaveImageAndNtfy"
+ ],
+ {
+ "title_aux": "ComfyUI-ntfy"
+ }
+ ],
+ "https://github.com/boricuapab/ComfyUI-Bori-JsonSetGetConverter": [
+ [
+ "Bori Json Get Set Convert"
+ ],
+ {
+ "title_aux": "ComfyUI-Bori-JsonSetGetConverter"
+ }
+ ],
+ "https://github.com/boricuapab/ComfyUI-Bori-QwenImageResolutions": [
+ [
+ "Bori Qwen Image Resolution",
+ "Bori Qwen Img Res"
+ ],
+ {
+ "title_aux": "ComfyUI-Bori-QwenImageResolutions"
+ }
+ ],
+ "https://github.com/bowtiedbluefin/ComfyUI-AI-CustomURL": [
+ [
+ "ImageAdvancedParams_AICustomURL",
+ "ImageGeneration_AICustomURL",
+ "ImageLoader_AICustomURL",
+ "SaveVideo_AICustomURL",
+ "SpeechAdvancedParams_AICustomURL",
+ "SpeechGeneration_AICustomURL",
+ "TextAdvancedParams_AICustomURL",
+ "TextGeneration_AICustomURL",
+ "VideoAdvancedParams_AICustomURL",
+ "VideoGeneration_AICustomURL",
+ "VideoLoader_AICustomURL",
+ "VideoPreview_AICustomURL",
+ "VideoRetrieve_AICustomURL"
+ ],
+ {
+ "title_aux": "ComfyUI-AI-CustomURL"
+ }
+ ],
+ "https://github.com/bpmpnaito/comfyui-imageviewer": [
+ [
+ "ImageViewer"
+ ],
+ {
+ "title_aux": "comfyui-imageviewer"
+ }
+ ],
+ "https://github.com/bradsec/ComfyUI_ResolutionSelectorPlus": [
+ [
+ "ResolutionSelector"
+ ],
+ {
+ "title_aux": "ResolutionSelector for ComfyUI"
+ }
+ ],
+ "https://github.com/bradsec/ComfyUI_StringEssentials": [
+ [
+ "StringConditionalAppend",
+ "StringContainsAny",
+ "StringMultiReplace",
+ "StringPreview",
+ "StringStrip",
+ "StringTextbox"
+ ],
+ {
+ "title_aux": "ComfyUI_StringEssentials"
+ }
+ ],
+ "https://github.com/brahianrosswill/ComfyUi-RandomNoiseCustom": [
+ [
+ "RandomNoiseCustom"
+ ],
+ {
+ "title_aux": "ComfyUi-RandomNoiseCustom"
+ }
+ ],
+ "https://github.com/braintacles/braintacles-comfyui-nodes": [
+ [
+ "CLIPTextEncodeSDXL-Multi-IO",
+ "CLIPTextEncodeSDXL-Pipe",
+ "Empty Latent Image from Aspect-Ratio",
+ "Interval Sampler",
+ "Random Find and Replace"
+ ],
+ {
+ "title_aux": "braintacles-nodes"
+ }
+ ],
+ "https://github.com/brantje/ComfyUI-api-tools": [
+ [
+ "SimpleGenImageInterface"
+ ],
+ {
+ "title_aux": "ComfyUI-api-tools"
+ }
+ ],
+ "https://github.com/brantje/ComfyUI_MagicQuill": [
+ [
+ "MagicQuill"
+ ],
+ {
+ "author": "Zichen LIU (https://zliucz.github.io/) and Yue YU (https://bruceyyu.github.io/)",
+ "description": "Official ComfyUI Implementations for Paper - MagicQuill: An Intelligent Interactive Image Editing System",
+ "nickname": "MagicQuill nodes",
+ "title": "MagicQuill",
+ "title_aux": "ComfyUI-MagicQuill"
+ }
+ ],
+ "https://github.com/brayevalerien/ComfyUI-GroqNodes": [
+ [
+ "GroqAudio",
+ "GroqBatch",
+ "GroqChat",
+ "GroqToolUse",
+ "GroqVision"
+ ],
+ {
+ "title_aux": "Groq Nodes"
+ }
+ ],
+ "https://github.com/brayevalerien/ComfyUI-SplitString": [
+ [
+ "Split String"
+ ],
+ {
+ "title_aux": "ComfyUI-splitstring"
+ }
+ ],
+ "https://github.com/brayevalerien/ComfyUI-resynthesizer": [
+ [
+ "Resynthesize"
+ ],
+ {
+ "title_aux": "ComfyUI Resynthesizer"
+ }
+ ],
+ "https://github.com/brenzel/comfyui-prompt-beautify": [
+ [
+ "PromptBeautify",
+ "PromptBeautifyAdvanced"
+ ],
+ {
+ "title_aux": "comfyui-prompt-beautify"
+ }
+ ],
+ "https://github.com/brianfitzgerald/style_aligned_comfy": [
+ [
+ "StyleAlignedBatchAlign",
+ "StyleAlignedReferenceSampler",
+ "StyleAlignedSampleReferenceLatents"
+ ],
+ {
+ "title_aux": "StyleAligned for ComfyUI"
+ }
+ ],
+ "https://github.com/bronkula/comfyui-fitsize": [
+ [
+ "FS: Crop Image Into Even Pieces",
+ "FS: Fit Image And Resize",
+ "FS: Fit Size From Image",
+ "FS: Fit Size From Int",
+ "FS: Image Region To Mask",
+ "FS: Load Image And Resize To Fit",
+ "FS: Pick Image From Batch",
+ "FS: Pick Image From Batches",
+ "FS: Pick Image From List"
+ ],
+ {
+ "title_aux": "comfyui-fitsize"
+ }
+ ],
+ "https://github.com/brucew4yn3rp/ComfyUI_SelectiveMetadata": [
+ [
+ "Multiline String",
+ "Save Image (Selective Metadata)",
+ "SaveImage"
+ ],
+ {
+ "title_aux": "Save Image with Selective Metadata"
+ }
+ ],
+ "https://github.com/brucew4yn3rp/ComfyUI_VintageEffect": [
+ [
+ "Vintage Effect"
+ ],
+ {
+ "title_aux": "Vintage Effect"
+ }
+ ],
+ "https://github.com/bruefire/ComfyUI-SeqImageLoader": [
+ [
+ "VFrame Loader With Mask Editor",
+ "Video Loader With Mask Editor"
+ ],
+ {
+ "title_aux": "ComfyUI Sequential Image Loader"
+ }
+ ],
+ "https://github.com/bryanmcguire/comfyui-flux2fun-controlnet": [
+ [
+ "Flux2FunControlNetApply",
+ "Flux2FunControlNetLoader"
+ ],
+ {
+ "title_aux": "comfyui-flux2fun-controlnet"
+ }
+ ],
+ "https://github.com/btitkin/ComfyUI-RandomPromptBuilder": [
+ [
+ "PromptDisplayNode",
+ "RandomPromptBuilder"
+ ],
+ {
+ "title_aux": "Random Prompt Builder"
+ }
+ ],
+ "https://github.com/buddy-bytes/ComfyUI-SmartResolutionToolkit": [
+ [
+ "SmartLatentGenerator",
+ "SmartResolutionPicker"
+ ],
+ {
+ "title_aux": "Smart Resolution Toolkit"
+ }
+ ],
+ "https://github.com/budihartono/comfyui-aspect-ratio-presets": [
+ [
+ "CAS Empty Latent Aspect Ratio Axis",
+ "CAS Empty Latent Aspect Ratio Preset"
+ ],
+ {
+ "title_aux": "CAS Aspect Ratio Presets Node for ComfyUI"
+ }
+ ],
+ "https://github.com/budihartono/comfyui_otonx_nodes": [
+ [
+ "OTX Integer Multiple Inputs 4",
+ "OTX Integer Multiple Inputs 5",
+ "OTX Integer Multiple Inputs 6",
+ "OTX KSampler Feeder",
+ "OTX Versatile Multiple Inputs 4",
+ "OTX Versatile Multiple Inputs 5",
+ "OTX Versatile Multiple Inputs 6"
+ ],
+ {
+ "title_aux": "Otonx's Custom Nodes"
+ }
+ ],
+ "https://github.com/bugltd/ComfyLab-Pack": [
+ [
+ "Convert to Any (lab)",
+ "File Queue (lab)",
+ "Format: Multiline (lab)",
+ "Format: String (lab)",
+ "Generic Queue (lab)",
+ "Image Queue (lab)",
+ "Image: Downscale to Total Pixels (lab)",
+ "Input: Boolean (lab)",
+ "Input: Float (lab)",
+ "Input: Folder (lab)",
+ "Input: Integer (lab)",
+ "Input: Multiline (lab)",
+ "Input: String (lab)",
+ "List: Checkpoints (lab)",
+ "List: Limit (lab)",
+ "List: LoRAs (lab)",
+ "List: Merge (lab)",
+ "List: Random Seeds (lab)",
+ "List: Samplers (lab)",
+ "List: Schedulers (lab)",
+ "List: from Elements (lab)",
+ "List: from File (backend) (lab)",
+ "List: from Multiline (lab)",
+ "List: from String (lab)",
+ "Load Image (RGBA) (lab)",
+ "Output Config: Load (lab)",
+ "Output Config: Retrieve (backend) (lab)",
+ "Plot Config: Grid (lab)",
+ "Plot Config: Header/Footer (lab)",
+ "Resolution to Dimensions (lab)",
+ "Save Text File (lab)",
+ "Sleep (lab)",
+ "XY Plot: Queue (lab)",
+ "XY Plot: Render (lab)",
+ "XY Plot: Split Data (lab)"
+ ],
+ {
+ "nodename_pattern": " \\(lab\\)$",
+ "title_aux": "ComfyLab Pack"
+ }
+ ],
+ "https://github.com/bulldog68/ComfyUI_FMJ_LLM": [
+ [
+ "FMJLlmConfigNode",
+ "FMJLlmOllamaVision",
+ "FMJOllamaPromptGenerator",
+ "FMJUnloadAllLLM"
+ ],
+ {
+ "title_aux": "FMJ-LLM"
+ }
+ ],
+ "https://github.com/bulldog68/ComfyUI_FMJ_SP": [
+ [
+ "FMJSpeedPrompt"
+ ],
+ {
+ "title_aux": "FMJ-speed-Prompt"
+ }
+ ],
+ "https://github.com/bulldog68/ComfyUI_FMJ_SaveImageVersions": [
+ [
+ "FMJ_LoadImageWithSnapshot",
+ "FMJ_SaveImageWithSnapshot"
+ ],
+ {
+ "title_aux": "ComfyUI_FMJ_SaveImageVersions"
+ }
+ ],
+ "https://github.com/burnsbert/ComfyUI-EBU-LMStudio": [
+ [
+ "EbuLMStudioBrainstormer",
+ "EbuLMStudioLoadModel",
+ "EbuLMStudioMakeRequest",
+ "EbuLMStudioUnload",
+ "EbuLMStudioUnloadGuider"
+ ],
+ {
+ "title_aux": "EBU LMStudio LLM Integration"
+ }
+ ],
+ "https://github.com/burnsbert/ComfyUI-EBU-PromptHelper": [
+ [
+ "EbuPromptHelperCharacterDescriberFemale",
+ "EbuPromptHelperCharacterDescriberMale",
+ "EbuPromptHelperCombineTwoStrings",
+ "EbuPromptHelperConsumeListItem",
+ "EbuPromptHelperCurrentDateTime",
+ "EbuPromptHelperListSampler",
+ "EbuPromptHelperLoadFileAsString",
+ "EbuPromptHelperRandomColorPalette",
+ "EbuPromptHelperRandomize",
+ "EbuPromptHelperReplace",
+ "EbuPromptHelperSeasonWeatherTimeOfDay",
+ "EbuPromptHelperTruncate"
+ ],
+ {
+ "title_aux": "EBU PromptHelper"
+ }
+ ],
+ "https://github.com/burnsbert/ComfyUI-EBU-Workflow": [
+ [
+ "EbuAppendToFile",
+ "EbuComputeImageUpscale",
+ "EbuDecodeNewLines",
+ "EbuEncodeNewLines",
+ "EbuFileListCache",
+ "EbuGetImageAspectRatio",
+ "EbuGetImageAspectRatioFromImage",
+ "EbuImageWaitForImage",
+ "EbuModelWaitForImage",
+ "EbuReadFromFile",
+ "EbuScalingResolution",
+ "EbuScalingTile",
+ "EbuStringWaitForImage",
+ "EbuUniqueFileName"
+ ],
+ {
+ "title_aux": "EBU Workflow"
+ }
+ ],
+ "https://github.com/bvhari/ComfyUI_CFGStar": [
+ [
+ "CFGStar"
+ ],
+ {
+ "title_aux": "ComfyUI_CFGStar"
+ }
+ ],
+ "https://github.com/bvhari/ComfyUI_ImageProcessing": [
+ [
+ "BilateralFilter",
+ "Brightness",
+ "Gamma",
+ "Hue",
+ "Saturation",
+ "SigmoidCorrection",
+ "UnsharpMask"
+ ],
+ {
+ "title_aux": "ImageProcessing"
+ }
+ ],
+ "https://github.com/bvhari/ComfyUI_PerpCFG": [
+ [
+ "PerpCFG"
+ ],
+ {
+ "title_aux": "ComfyUI_PerpCFG"
+ }
+ ],
+ "https://github.com/bvhari/ComfyUI_PerpWeight": [
+ [
+ "CLIPTextEncodePerpWeight"
+ ],
+ {
+ "title_aux": "ComfyUI_PerpWeight"
+ }
+ ],
+ "https://github.com/bvhari/ComfyUI_SUNoise": [
+ [
+ "SUNoiseLatent",
+ "SamplersSUNoise",
+ "SamplersSUNoiseAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI_SUNoise"
+ }
+ ],
+ "https://github.com/by-ae/ae-in-workflow": [
+ [
+ "CropImageBatchToMaskBoundsAE",
+ "ImageSelectorAE",
+ "InterpolateFloatListAE",
+ "PoseEditorAE",
+ "ZImageImagesToLoRAAE"
+ ],
+ {
+ "title_aux": "ae-in-workflow"
+ }
+ ],
+ "https://github.com/bytedance/ComfyUI-HyperLoRA": [
+ [
+ "HyperLoRAApplyLoRA",
+ "HyperLoRABaseCond",
+ "HyperLoRAConfig",
+ "HyperLoRAFaceAttr",
+ "HyperLoRAGenerateBaseLoRA",
+ "HyperLoRAGenerateIDLoRA",
+ "HyperLoRAIDCond",
+ "HyperLoRALoader",
+ "HyperLoRASaveLoRA",
+ "HyperLoRAUniGenerateIDLoRA",
+ "HyperLoRAUniLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-HyperLoRA"
+ }
+ ],
+ "https://github.com/bytedance/ComfyUI_InfiniteYou": [
+ [
+ "FaceCombine",
+ "FaceSwap_InfiniteYou",
+ "InfiniteYouApply"
+ ],
+ {
+ "title_aux": "ComfyUI_InfiniteYou"
+ }
+ ],
+ "https://github.com/c0dezer019/FreezeFrame": [
+ [
+ "PSampler",
+ "PSamplerAdvanced",
+ "PSamplerCustom",
+ "PSamplerCustomAdvanced"
+ ],
+ {
+ "title_aux": "FreezeFrame"
+ }
+ ],
+ "https://github.com/c0ffymachyne/ComfyUI_BeatByte": [
+ [
+ "BytebeatSynth"
+ ],
+ {
+ "title_aux": "Bytebeat Synthesizer: Composing with Operators"
+ }
+ ],
+ "https://github.com/c0ffymachyne/ComfyUI_SignalProcessing": [
+ [
+ "SignalProcessingBaxandall3BandEQ",
+ "SignalProcessingBaxandallEQ",
+ "SignalProcessingConvolutionReverb",
+ "SignalProcessingFilter",
+ "SignalProcessingHarmonicsEnhancer",
+ "SignalProcessingLimiter",
+ "SignalProcessingLoadAudio",
+ "SignalProcessingLoudness",
+ "SignalProcessingMixdown",
+ "SignalProcessingNormalizer",
+ "SignalProcessingPadSynth",
+ "SignalProcessingPadSynthChoir",
+ "SignalProcessingPaulStretch",
+ "SignalProcessingPitchShifter",
+ "SignalProcessingSaturation",
+ "SignalProcessingSpectrogram",
+ "SignalProcessingStereoWidening",
+ "SignalProcessingWaveform"
+ ],
+ {
+ "title_aux": "ComfyUI Signal Processing"
+ }
+ ],
+ "https://github.com/cake-ml/tiny-sana-preview": [
+ [
+ "TinySanaPreview"
+ ],
+ {
+ "title_aux": "TinySanaPreview"
+ }
+ ],
+ "https://github.com/calcuis/gguf": [
+ [
+ "AudioEncoderLoaderGGUF",
+ "ClipLoaderGGUF",
+ "DualClipLoaderGGUF",
+ "GGUFRun",
+ "GGUFSave",
+ "GGUFUndo",
+ "LoaderGGUF",
+ "LoaderGGUFAdvanced",
+ "QuadrupleClipLoaderGGUF",
+ "TENSORBoost",
+ "TENSORCut",
+ "TripleClipLoaderGGUF",
+ "VaeGGUF"
+ ],
+ {
+ "preemptions": [
+ "LoaderGGUF",
+ "ClipLoaderGGUF",
+ "DualClipLoaderGGUF",
+ "TripleClipLoaderGGUF",
+ "LoaderGGUFAdvanced",
+ "GGUFSave"
+ ],
+ "title_aux": "gguf"
+ }
+ ],
+ "https://github.com/caleboleary/ComfyUI-Arc2Face": [
+ [
+ "Arc2FaceEncoderLoader",
+ "Arc2FaceFaceExtractor",
+ "Arc2FaceGenerator",
+ "Arc2FaceImageGridGenerator",
+ "Arc2FaceImg2ImgGenerator",
+ "Arc2FaceUNetLoader"
+ ],
+ {
+ "title_aux": "Arc2Face ComfyUI Node Library"
+ }
+ ],
+ "https://github.com/calibancode/ComfyUI-bevvy": [
+ [
+ "SaveImageWebP"
+ ],
+ {
+ "title_aux": "ComfyUI-bevvy"
+ }
+ ],
+ "https://github.com/camenduru/ComfyUI-TostAI": [
+ [
+ "SendToTostAI"
+ ],
+ {
+ "title_aux": "ComfyUI-TostAI"
+ }
+ ],
+ "https://github.com/capitan01R/Capitan-ConditioningEnhancer": [
+ [
+ "CapitanAdvancedEnhancer",
+ "ConditioningEnhancer"
+ ],
+ {
+ "title_aux": "Capitan-ConditioningEnhancer"
+ }
+ ],
+ "https://github.com/capitan01R/ComfyUI-CapitanFlowMatch": [
+ [
+ "CapitanLinear",
+ "CapitanShift",
+ "CapitanShiftPresets"
+ ],
+ {
+ "title_aux": "ComfyUI-CapitanFlowMatch"
+ }
+ ],
+ "https://github.com/capitan01R/ComfyUI-CapitanZiT-Scheduler": [
+ [
+ "CapitanZiTLinearSigma",
+ "FlowMatchSchedulerSmoothCosine",
+ "SamplerMinimalChangeFlow"
+ ],
+ {
+ "title_aux": "ComfyUI-CapitanZiT-Scheduler"
+ }
+ ],
+ "https://github.com/capitan01R/ComfyUI-Flux2Klein-Enhancer": [
+ [
+ "Flux2KleinDetailController",
+ "Flux2KleinEnhancer",
+ "Flux2KleinRefLatentController",
+ "Flux2KleinSectionedEncoder",
+ "Flux2KleinTextEnhancer",
+ "Flux2KleinTextRefBalance"
+ ],
+ {
+ "title_aux": "ComfyUI-Flux2Klein-Enhancer"
+ }
+ ],
+ "https://github.com/capitan01R/ComfyUI-ZImageTurbo-FlowSampler": [
+ [
+ "FlowMatchScheduler",
+ "FlowMatchSchedulerDynamic",
+ "SigmaViewer",
+ "ZImagePresets",
+ "ZImageSampler",
+ "ZImageTurboScheduler",
+ "ZImageTurboSchedulerAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-ZImageTurbo-FlowSampler"
+ }
+ ],
+ "https://github.com/cardenluo/ComfyUI-Apt_Preset": [
+ [
+ "AD_DrawSchedule",
+ "AD_FILM_VFI",
+ "AD_ImageExpandBatch",
+ "AD_MaskExpandBatch",
+ "AD_frame_replace",
+ "AD_pingpong_vedio",
+ "AD_sch_IPA",
+ "AD_sch_adv_CN",
+ "AD_sch_image_merge",
+ "AD_sch_latent",
+ "AD_sch_mask_weigh",
+ "AD_sch_prompt_adv",
+ "AD_sch_prompt_basic",
+ "AD_sch_prompt_stack",
+ "AD_sch_value",
+ "AD_slice_Condi",
+ "AI_GLM4",
+ "AI_GLM_image",
+ "AI_GLM_text",
+ "AI_Ollama_image",
+ "AI_Ollama_text",
+ "AI_PresetSave",
+ "AI_Qwen",
+ "AI_Qwen_text",
+ "Ai_Ollama_RunModel",
+ "Ai_doubao_seedream",
+ "Amp_audio_Normalized",
+ "Amp_drive_String",
+ "Amp_drive_mask",
+ "Amp_drive_value",
+ "Apt_clear_cache",
+ "CN_preset1_Unpack",
+ "CN_preset1_pack",
+ "Coordinate_Generator",
+ "Coordinate_Index2Text",
+ "Coordinate_MarkRender",
+ "Coordinate_SplitIndex",
+ "Coordinate_fromImage",
+ "Coordinate_fromMask",
+ "Coordinate_loadImage",
+ "Coordinate_pointCombine",
+ "Data_Highway",
+ "Data_basic",
+ "Data_bus_chx",
+ "Data_chx_Merge",
+ "Data_presetData",
+ "Data_preset_save",
+ "Data_sampleData",
+ "Data_select",
+ "Easy_QwenEdit2509",
+ "IO_EasyMark",
+ "IO_LoadImgList",
+ "IO_PathProcessor",
+ "IO_RegexPreset",
+ "IO_image_select",
+ "IO_input_any",
+ "IO_loadFilePath",
+ "IO_load_anyimage",
+ "IO_node_Script",
+ "IO_save_image",
+ "IO_store_image",
+ "IO_video_encode",
+ "IPA_XL_PromptInjection",
+ "IPA_clip_vision",
+ "Image_Channel_Apply",
+ "Image_CnMapMix",
+ "Image_CnMap_Resize",
+ "Image_Detail_HL_frequencye",
+ "Image_Pair_Merge",
+ "Image_Pair_crop",
+ "Image_Resize2",
+ "Image_Resize_longsize",
+ "Image_Resize_sum",
+ "Image_Resize_sum_data",
+ "Image_Resize_sum_restore",
+ "Image_Solo_data",
+ "Image_UpscaleModel",
+ "Image_batch_composite",
+ "Image_batch_select",
+ "Image_effect_Load",
+ "Image_merge2image",
+ "Image_pad_adjust",
+ "Image_pad_adjust_restore",
+ "Image_pad_keep",
+ "Image_precision_Converter",
+ "Image_safe_size",
+ "Image_smooth_blur",
+ "Image_solo_crop",
+ "Image_solo_crop2",
+ "Image_solo_stitch",
+ "Image_target_adjust",
+ "Image_transform_layer",
+ "Image_transform_layer_adv",
+ "Mask_BodySegment",
+ "Mask_ClothesSegment",
+ "Mask_Detect_label",
+ "Mask_FaceSegment",
+ "Mask_Remove_bg",
+ "Mask_Remove_bg2",
+ "Mask_image2mask",
+ "Mask_math",
+ "Mask_simple_adjust",
+ "Mask_splitMask",
+ "Mask_splitMask_by_color",
+ "Mask_split_mulMask",
+ "Mask_transform_sum",
+ "Model_Preset_Unpack",
+ "Model_Preset_pack",
+ "Scheduler_CondNoise",
+ "Scheduler_MixScheduler",
+ "Stack_CN_union",
+ "Stack_CN_union3",
+ "Stack_ControlNet",
+ "Stack_EmbossAndFill",
+ "Stack_GradientAndStroke",
+ "Stack_IPA",
+ "Stack_Kontext_MulCondi",
+ "Stack_Kontext_MulImg",
+ "Stack_Ksampler_adv",
+ "Stack_Ksampler_basic",
+ "Stack_Ksampler_custom",
+ "Stack_Ksampler_dual_paint",
+ "Stack_Ksampler_highAndLow",
+ "Stack_Ksampler_refine",
+ "Stack_LoRA",
+ "Stack_Redux",
+ "Stack_ShadowAndGlow",
+ "Stack_VAEDecodeTiled",
+ "Stack_Wan22FunControlToVideo",
+ "Stack_WanAnimateToVideo",
+ "Stack_WanCameraImageToVideo",
+ "Stack_WanFirstLastFrameToVideo",
+ "Stack_WanFunControlToVideo",
+ "Stack_WanFunInpaintToVideo",
+ "Stack_WanHuMoImageToVideo",
+ "Stack_WanImageToVideo",
+ "Stack_WanPhantomSubjectToVideo",
+ "Stack_WanSoundImageToVideo",
+ "Stack_WanSoundImageToVideoExtend",
+ "Stack_WanTrackToVideo",
+ "Stack_WanVaceToVideo",
+ "Stack_adv_CN",
+ "Stack_condi",
+ "Stack_inpaint",
+ "Stack_ksampler_tile",
+ "Stack_latent",
+ "Stack_pre_Mark2",
+ "Stack_sample_data",
+ "Stack_text",
+ "basicIn_Boolean",
+ "basicIn_Remap_slide",
+ "basicIn_Sampler",
+ "basicIn_Scheduler",
+ "basicIn_Seed",
+ "basicIn_float",
+ "basicIn_input",
+ "basicIn_int",
+ "basicIn_string",
+ "basic_Ksampler_adv",
+ "basic_Ksampler_custom",
+ "basic_Ksampler_full",
+ "basic_Ksampler_low_gpu",
+ "basic_Ksampler_mid",
+ "basic_Ksampler_simple",
+ "batch_BatchSlice",
+ "batch_MergeBatch",
+ "chx_IPA_XL",
+ "chx_IPA_adv",
+ "chx_IPA_apply_combine",
+ "chx_IPA_basic",
+ "chx_IPA_faceID",
+ "chx_IPA_faceID_adv",
+ "chx_IPA_region_combine",
+ "chx_Ksampler_Kontext",
+ "chx_Ksampler_Kontext_adv",
+ "chx_Ksampler_Kontext_inpaint",
+ "chx_Ksampler_VisualStyle",
+ "chx_Ksampler_dual_area",
+ "chx_Ksampler_dual_paint",
+ "chx_Ksampler_highAndLow",
+ "chx_Ksampler_inpaint",
+ "chx_Ksampler_mix",
+ "chx_Ksampler_refine",
+ "chx_YC_LG_Redux",
+ "chx_input_data",
+ "chx_ksampler_Deforum_sch",
+ "chx_ksampler_tile",
+ "chx_latent_adjust",
+ "color_Fragment",
+ "color_OneColor_keep",
+ "color_OneColor_replace",
+ "color_RadiaBrightGradient",
+ "color_TransforTool",
+ "color_adjust_HDR",
+ "color_adjust_HSL",
+ "color_balance_adv",
+ "color_brightGradient",
+ "color_match_adv",
+ "color_select",
+ "create_AD_mask",
+ "create_Mask_match_shape",
+ "create_Mask_match_shape2",
+ "create_Mask_visual_tag",
+ "create_RadialGradient",
+ "create_any_List",
+ "create_any_batch",
+ "create_image_batch",
+ "create_lineGradient",
+ "create_mask_array",
+ "create_mask_batch",
+ "create_mask_solo",
+ "create_mulcolor_img",
+ "excel_Prompter",
+ "excel_Qwen_camera",
+ "excel_VedioPrompt",
+ "excel_column_diff",
+ "excel_insert_image",
+ "excel_insert_image_easy",
+ "excel_qwen_artistic",
+ "excel_qwen_font",
+ "excel_read",
+ "excel_read_easy",
+ "excel_roles",
+ "excel_row_diff",
+ "excel_search_data",
+ "excel_write_data",
+ "excel_write_data_easy",
+ "flow_BooleanSwitch",
+ "flow_QueueTrigger",
+ "flow_auto_pixel",
+ "flow_bridge_image",
+ "flow_case_tentor",
+ "flow_createbatch",
+ "flow_forEnd",
+ "flow_forStart",
+ "flow_judge_input",
+ "flow_judge_output",
+ "flow_low_gpu",
+ "flow_sch_control",
+ "flow_switch_input",
+ "flow_switch_output",
+ "flow_tensor_Unify",
+ "flow_whileEnd",
+ "flow_whileStart",
+ "img_effect_CircleWarp",
+ "img_effect_Liquify",
+ "img_effect_Stretch",
+ "img_effect_WaveWarp",
+ "latent_Image2Noise",
+ "latent_chx_noise",
+ "lay_ImageGrid",
+ "lay_MaskGrid",
+ "lay_edge_cut",
+ "lay_image_grid_note",
+ "lay_images_free_layout",
+ "lay_mul_image",
+ "lay_text_sum",
+ "lay_text_sum_mul",
+ "list_ListSlice",
+ "list_MergeList",
+ "list_Value",
+ "list_num_range",
+ "load_GGUF",
+ "load_Nanchaku",
+ "math_Remap_data",
+ "math_calculate",
+ "model_Style_Align",
+ "model_tool_assy",
+ "pack_Pack",
+ "pack_Unpack",
+ "param_preset_Unpack",
+ "param_preset_pack",
+ "photoshop_preset_Unpack",
+ "photoshop_preset_pack",
+ "pre_Kontext",
+ "pre_Kontext_mul_Image",
+ "pre_Kontext_mul_mask",
+ "pre_QwenEdit",
+ "pre_USO",
+ "pre_Unit_PromptWeight",
+ "pre_ZImageInpaint_patch",
+ "pre_advanced_condi_merge",
+ "pre_controlnet",
+ "pre_controlnet_union",
+ "pre_guide",
+ "pre_ic_light_sd15",
+ "pre_inpaint_sum",
+ "pre_latent_light",
+ "pre_mul_Mulcondi",
+ "pre_mul_ref_latent",
+ "pre_qwen_controlnet",
+ "pre_sample_data",
+ "sampler_DynamicTileMerge",
+ "sampler_DynamicTileSplit",
+ "sampler_enhance",
+ "sch_Prompt",
+ "sch_Value",
+ "sch_image",
+ "sch_mask",
+ "sch_split_text",
+ "sch_text",
+ "scheduler_ModelAligned",
+ "scheduler_interactive_sigmas",
+ "scheduler_manual_sigmas",
+ "scheduler_sigmas2Graph",
+ "stack_Mask2color",
+ "sum_Ksampler",
+ "sum_TextEncode",
+ "sum_create_chx",
+ "sum_editor",
+ "sum_latent",
+ "sum_load_adv",
+ "sum_load_simple",
+ "sum_lora",
+ "sum_stack_AD",
+ "sum_stack_Kontext",
+ "sum_stack_QwenEditPlus",
+ "sum_stack_Wan",
+ "sum_stack_flux2_Klein",
+ "sum_stack_image",
+ "text_Splitter",
+ "text_StrMatrix",
+ "text_converter",
+ "text_filter",
+ "text_list_combine",
+ "text_loadText",
+ "text_modifier",
+ "text_mul_Join",
+ "text_mul_Split",
+ "text_saveText",
+ "text_sum",
+ "text_wildcards",
+ "texture_Ksampler",
+ "texture_Offset",
+ "texture_apply",
+ "texture_create",
+ "texture_render",
+ "type_AnyCast",
+ "type_AnyIndex",
+ "type_BasiPIPE",
+ "type_BatchToList",
+ "type_ImageAlphaSplit",
+ "type_Image_Batch2List",
+ "type_Image_List2Batch",
+ "type_Image_List2Batch_adv",
+ "type_ListToBatch",
+ "type_Mask_Batch2List",
+ "type_Mask_List2Batch",
+ "unpack_box2",
+ "view_Data",
+ "view_GetLength",
+ "view_GetShape",
+ "view_GetWidgetsValues",
+ "view_Mask_And_Img",
+ "view_Primitive",
+ "view_bridge_Text",
+ "view_bridge_image",
+ "view_combo",
+ "view_mask",
+ "view_mulView"
+ ],
+ {
+ "title_aux": "ComfyUI-Apt_Preset"
+ }
+ ],
+ "https://github.com/casc1701/ComfyUI_OverlayFrameNumber": [
+ [
+ "OverlayFrameNumber"
+ ],
+ {
+ "title_aux": "ComfyUI_OverlayFrameNumber"
+ }
+ ],
+ "https://github.com/casterpollux/MiniMax-bmo": [
+ [
+ "MinimaxRemoverBMO"
+ ],
+ {
+ "nodename_pattern": "MiniMax.*BMO|BMO.*MiniMax",
+ "title_aux": "MiniMax Video Object Remover Suite"
+ }
+ ],
+ "https://github.com/catboxanon/comfyui_stealth_pnginfo": [
+ [
+ "CatboxAnonSaveImageStealth"
+ ],
+ {
+ "title_aux": "comfyui_stealth_pnginfo"
+ }
+ ],
+ "https://github.com/cathodeDreams/comfyui-azul-scripts": [
+ [
+ "SaveImageAsJPG",
+ "WeightedConditioningAverage"
+ ],
+ {
+ "title_aux": "comfyui-azul-scripts"
+ }
+ ],
+ "https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life": [
+ [
+ "BOPBTL_BlendFaces",
+ "BOPBTL_DetectEnhanceBlendFaces",
+ "BOPBTL_DetectFaces",
+ "BOPBTL_EnhanceFaces",
+ "BOPBTL_EnhanceFacesAdvanced",
+ "BOPBTL_LoadFaceDetectorModel",
+ "BOPBTL_LoadFaceEnhancerModel",
+ "BOPBTL_LoadRestoreOldPhotosModel",
+ "BOPBTL_LoadScratchMaskModel",
+ "BOPBTL_RestoreOldPhotos",
+ "BOPBTL_ScratchMask"
+ ],
+ {
+ "title_aux": "ComfyUI Bringing Old Photos Back to Life"
+ }
+ ],
+ "https://github.com/cdb-boop/comfyui-image-round": [
+ [
+ "ComfyUI_Image_Round__CircularCrop",
+ "ComfyUI_Image_Round__ImageCropAdvanced",
+ "ComfyUI_Image_Round__ImageRound",
+ "ComfyUI_Image_Round__ImageRoundAdvanced"
+ ],
+ {
+ "title_aux": "comfyui-image-round"
+ }
+ ],
+ "https://github.com/cdxOo/comfyui-text-node-with-comments": [
+ [
+ "text-node-with-comments"
+ ],
+ {
+ "title_aux": "Text Node With Comments (@cdxoo)"
+ }
+ ],
+ "https://github.com/cedarconnor/ComfyUI-DreamCube": [
+ [
+ "ApplyDepthToCubemapFace",
+ "BatchCubemapDepth",
+ "CreateEmptyCubemap",
+ "CubemapInfo",
+ "CubemapPreview",
+ "CubemapSeamValidator",
+ "CubemapToEquirect",
+ "EnforceDepthConsistency",
+ "EquirectToCubemap",
+ "ExtractCubemapFace",
+ "ExtractDepthChannel",
+ "InsertCubemapFace",
+ "MergeCubemapDepth",
+ "NormalizeCubemapDepth",
+ "SmoothCubemapDepth"
+ ],
+ {
+ "title_aux": "ComfyUI-DreamCube"
+ }
+ ],
+ "https://github.com/cedarconnor/ComfyUI-Skeletonretarget": [
+ [
+ "ApplyRetargetTransform",
+ "ComputeRetargetTransform",
+ "ExtractSkeletonFromPose",
+ "SkeletonToOpenPoseImage"
+ ],
+ {
+ "title_aux": "ComfyUI-Skeletonretarget"
+ }
+ ],
+ "https://github.com/cedarconnor/comfyui-BatchNameLoop": [
+ [
+ "Batch Image Iterator",
+ "Batch Image Loader",
+ "Batch Image Saver",
+ "Batch Image Single Saver"
+ ],
+ {
+ "title_aux": "ComfyUI Batch Name Loop"
+ }
+ ],
+ "https://github.com/cedarconnor/comfyui-LatLong": [
+ [
+ "Cubemap Faces Extract",
+ "Cubemap To Equirectangular",
+ "Cubemap To Equirectangular (Flexible)",
+ "Equirectangular Crop 180",
+ "Equirectangular Crop Square",
+ "Equirectangular Edge Blender",
+ "Equirectangular Mirror Flip",
+ "Equirectangular Perspective Extract",
+ "Equirectangular Processor",
+ "Equirectangular Resize",
+ "Equirectangular Rotate",
+ "Equirectangular Rotate Preset",
+ "Equirectangular To Cubemap",
+ "Equirectangular To Cubemap (Flexible)",
+ "LatLong Apply Circular Padding Model",
+ "LatLong Apply Circular Padding VAE",
+ "LatLong Create Pole Mask",
+ "LatLong Create Seam Mask",
+ "LatLong Outpaint Setup",
+ "LatLong Outpaint Stitch",
+ "LatLong Roll Image",
+ "LatLong Roll Mask",
+ "LatLong Split Cubemap Faces",
+ "LatLong Stack Cubemap Faces",
+ "PanoramaVideoViewerNode",
+ "PanoramaViewerNode"
+ ],
+ {
+ "title_aux": "ComfyUI LatLong - Equirectangular Image Processing Nodes"
+ }
+ ],
+ "https://github.com/cedarconnor/upsampler": [
+ [
+ "Upsampler Dynamic Upscale",
+ "Upsampler Precise Upscale",
+ "Upsampler Smart Upscale"
+ ],
+ {
+ "title_aux": "ComfyUI Upsampler Nodes"
+ }
+ ],
+ "https://github.com/celoron/ComfyUI-VisualQueryTemplate": [
+ [
+ "VisualQueryTemplateNode"
+ ],
+ {
+ "title_aux": "ComfyUI-VisualQueryTemplate"
+ }
+ ],
+ "https://github.com/celsojr2013/comfyui_jamworks_client": [
+ [
+ "Jamworks Download",
+ "Jamworks Login",
+ "Jamworks_Download",
+ "Jamworks_Login",
+ "Shell Command",
+ "Shell_Command"
+ ],
+ {
+ "title_aux": "comfyui_jamworks_client"
+ }
+ ],
+ "https://github.com/celsojr2013/comfyui_simpletools": [
+ [
+ "GoogleTranslator",
+ "Parameters",
+ "ResolutionSolver"
+ ],
+ {
+ "title_aux": "ComfyUI SimpleTools Suit"
+ }
+ ],
+ "https://github.com/cenzijing/ComfyUI-Markmap": [
+ [
+ "MarkmapNode",
+ "ReadHtmlNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Markmap"
+ }
+ ],
+ "https://github.com/cerspense/ComfyUI_cspnodes": [
+ [
+ "CountTextLines",
+ "DepthToNormalMap",
+ "GetLastFrameFromBatch",
+ "GetMP4Prompt",
+ "ImageDirIterator",
+ "IncrementEveryN",
+ "Modelscopet2v",
+ "Modelscopev2v",
+ "RemapRange",
+ "RemoveBlankLines",
+ "ResizeByImage",
+ "SplitImageChannels",
+ "VidDirIterator"
+ ],
+ {
+ "title_aux": "cspnodes"
+ }
+ ],
+ "https://github.com/ceruleandeep/ComfyUI-LLaVA-Captioner": [
+ [
+ "LlavaCaptioner"
+ ],
+ {
+ "title_aux": "ComfyUI LLaVA Captioner"
+ }
+ ],
+ "https://github.com/cganimitta/ComfyUI_CGAnimittaTools": [
+ [
+ "CGA_BlackBorderCrop",
+ "CGA_BlenderBridge",
+ "CGA_ColorToGrayscale",
+ "CGA_ExtractFromList",
+ "CGA_FrameExtraction\ud83c\udf9e\ufe0f",
+ "CGA_ListSubfolders",
+ "CGA_NegativeSelector",
+ "CGA_TxtReaderNode"
+ ],
+ {
+ "title_aux": "ComfyUI_CGAnimittaTools"
+ }
+ ],
+ "https://github.com/chakib-belgaid/ComfyUI-autosize": [
+ [
+ "CustomAutoSize",
+ "SDXLAutoSize"
+ ],
+ {
+ "title_aux": "ComfyUI-autosize"
+ }
+ ],
+ "https://github.com/chakib-belgaid/Comfyui_Prompt_styler": [
+ [
+ "Prompt_Styler"
+ ],
+ {
+ "title_aux": "ComfyUI Style Plugin"
+ }
+ ],
+ "https://github.com/chameleon-ai/comfyui_momo": [
+ [
+ "MoMo"
+ ],
+ {
+ "title_aux": "comfyui_momo"
+ }
+ ],
+ "https://github.com/chandlergis/ComfyUI-IMG_Query": [
+ [
+ "ImageRequestNode"
+ ],
+ {
+ "title_aux": "ComfyUI-IMG_Query"
+ }
+ ],
+ "https://github.com/chandlergis/ComfyUI_EmojiOverlay": [
+ [
+ "Image Emoji Overlay"
+ ],
+ {
+ "title_aux": "ComfyUI_EmojiOverlay"
+ }
+ ],
+ "https://github.com/changwook987/ComfyUI-Small-Utility": [
+ [
+ "Eval",
+ "RandomEmptyLatent"
+ ],
+ {
+ "title_aux": "ComfyUI-Small-Utility"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-AniPortrait": [
+ [
+ "AniPortraitLoader",
+ "AniPortraitRun",
+ "Box2Video",
+ "CoverVideo",
+ "MaskList2Video"
+ ],
+ {
+ "title_aux": "ComfyUI-AniPortrait"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-CameraCtrl-Wrapper": [
+ [
+ "CameraBasic",
+ "CameraCombine",
+ "CameraCtrlLoader",
+ "CameraCtrlRun",
+ "CameraJoin",
+ "CameraTrajectory"
+ ],
+ {
+ "title_aux": "ComfyUI-CameraCtrl-Wrapper"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-Champ": [
+ [
+ "ChampLoader",
+ "ChampRun",
+ "ImageCombineOneColumn",
+ "ImageCombineOneRow"
+ ],
+ {
+ "title_aux": "ComfyUI-Champ"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-DragAnything": [
+ [
+ "DragAnythingLoader",
+ "DragAnythingPipelineRun",
+ "DragAnythingPipelineRunRandom",
+ "DragAnythingRun",
+ "DragAnythingRunRandom",
+ "LoadText",
+ "SaveText",
+ "VHS_FILENAMES_STRING"
+ ],
+ {
+ "title_aux": "ComfyUI-DragAnything"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-DragNUWA": [
+ [
+ "BrushMotion",
+ "CompositeMotionBrush",
+ "CompositeMotionBrushWithoutModel",
+ "DragNUWA Run",
+ "DragNUWA Run MotionBrush",
+ "Get First Image",
+ "Get Last Image",
+ "InstantCameraMotionBrush",
+ "InstantObjectMotionBrush",
+ "Load CheckPoint DragNUWA",
+ "Load MotionBrush From Optical Flow",
+ "Load MotionBrush From Optical Flow Directory",
+ "Load MotionBrush From Optical Flow Without Model",
+ "Load MotionBrush From Tracking Points",
+ "Load MotionBrush From Tracking Points Without Model",
+ "Load Pose KeyPoints",
+ "Loop",
+ "LoopEnd_IMAGE",
+ "LoopStart_IMAGE",
+ "Split Tracking Points"
+ ],
+ {
+ "title_aux": "ComfyUI-DragNUWA"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-DynamiCrafter": [
+ [
+ "DynamiCrafter Simple",
+ "DynamiCrafterInterp Simple",
+ "DynamiCrafterInterpLoader",
+ "DynamiCrafterLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-DynamiCrafter"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-EasyAnimate": [
+ [
+ "EasyAnimateLoader",
+ "EasyAnimateRun"
+ ],
+ {
+ "title_aux": "ComfyUI-EasyAnimate"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-Gemma": [
+ [
+ "GemmaLoader",
+ "GemmaRun"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemma"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-I2VGEN-XL": [
+ [
+ "I2VGEN-XL Simple",
+ "Modelscope Pipeline Loader"
+ ],
+ {
+ "title_aux": "ComfyUI-I2VGEN-XL"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-Img2Img-Turbo": [
+ [
+ "Img2ImgTurboEdgeLoader",
+ "Img2ImgTurboEdgeRun",
+ "Img2ImgTurboSketchLoader",
+ "Img2ImgTurboSketchRun"
+ ],
+ {
+ "title_aux": "ComfyUI-Img2Img-Turbo"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-LaVIT": [
+ [
+ "VHS_FILENAMES_STRING_LaVIT",
+ "VideoLaVITI2I",
+ "VideoLaVITI2V",
+ "VideoLaVITI2VLong",
+ "VideoLaVITLoader",
+ "VideoLaVITT2V",
+ "VideoLaVITT2VLong",
+ "VideoLaVITUnderstandingImage",
+ "VideoLaVITUnderstandingLoader",
+ "VideoLaVITUnderstandingVideo",
+ "VideoLaVITVideoDetokenizerLoader",
+ "VideoLaVITVideoReconstruction"
+ ],
+ {
+ "title_aux": "ComfyUI-LaVIT"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-LightGlue": [
+ [
+ "LightGlue Loader",
+ "LightGlue Simple",
+ "LightGlue Simple Multi"
+ ],
+ {
+ "title_aux": "ComfyUI-LightGlue"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": [
+ [
+ "Moore-AnimateAnyone Denoising Unet",
+ "Moore-AnimateAnyone Image Encoder",
+ "Moore-AnimateAnyone Pipeline Loader",
+ "Moore-AnimateAnyone Pose Guider",
+ "Moore-AnimateAnyone Reference Unet",
+ "Moore-AnimateAnyone Simple",
+ "Moore-AnimateAnyone VAE"
+ ],
+ {
+ "title_aux": "ComfyUI-Moore-AnimateAnyone"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor": [
+ [
+ "Motion Vector Extractor",
+ "VideoCombineThenPath"
+ ],
+ {
+ "title_aux": "ComfyUI-Motion-Vector-Extractor"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-MotionCtrl": [
+ [
+ "Load Motion Camera Preset",
+ "Load Motion Traj Preset",
+ "Load Motionctrl Checkpoint",
+ "Motionctrl Cond",
+ "Motionctrl Sample",
+ "Motionctrl Sample Simple",
+ "Select Image Indices"
+ ],
+ {
+ "title_aux": "ComfyUI-MotionCtrl"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD": [
+ [
+ "Load Motionctrl-SVD Camera Preset",
+ "Load Motionctrl-SVD Checkpoint",
+ "Motionctrl-SVD Sample Simple"
+ ],
+ {
+ "title_aux": "ComfyUI-MotionCtrl-SVD"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-MuseTalk": [
+ [
+ "MuseTalkCupAudio",
+ "MuseTalkRun",
+ "VHS_FILENAMES_STRING_MuseTalk"
+ ],
+ {
+ "title_aux": "ComfyUI-MuseTalk"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-MuseV": [
+ [
+ "MuseVRun",
+ "MuseVRunVid2Vid",
+ "VHS_FILENAMES_STRING_MuseV"
+ ],
+ {
+ "author": "infguo",
+ "title_aux": "ComfyUI-MuseV"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-Open-Sora": [
+ [
+ "OpenSoraLoader",
+ "OpenSoraRun",
+ "OpenSoraSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-Open-Sora"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-Open-Sora-Plan": [
+ [
+ "OpenSoraPlanDecode",
+ "OpenSoraPlanLoader",
+ "OpenSoraPlanRun",
+ "OpenSoraPlanSample"
+ ],
+ {
+ "title_aux": "ComfyUI-Open-Sora-Plan"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-Panda3d": [
+ [
+ "Panda3dAmbientLight",
+ "Panda3dAttachNewNode",
+ "Panda3dBase",
+ "Panda3dDirectionalLight",
+ "Panda3dLoadDepthModel",
+ "Panda3dLoadModel",
+ "Panda3dLoadTexture",
+ "Panda3dModelMerge",
+ "Panda3dTest",
+ "Panda3dTextureMerge"
+ ],
+ {
+ "title_aux": "ComfyUI-Panda3d"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-Pymunk": [
+ [
+ "PygameRun",
+ "PygameSurface",
+ "PymunkDynamicBox",
+ "PymunkDynamicCircle",
+ "PymunkRun",
+ "PymunkShapeMerge",
+ "PymunkSpace",
+ "PymunkStaticLine"
+ ],
+ {
+ "title_aux": "ComfyUI-Pymunk"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-RAFT": [
+ [
+ "Load MotionBrush",
+ "RAFT Run",
+ "Save MotionBrush",
+ "VizMotionBrush"
+ ],
+ {
+ "title_aux": "ComfyUI-RAFT"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-SimDA": [
+ [
+ "SimDALoader",
+ "SimDARun",
+ "SimDATrain",
+ "VHS_FILENAMES_STRING_SimDA"
+ ],
+ {
+ "title_aux": "ComfyUI-SimDA"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-Trajectory": [
+ [
+ "Trajectory_Canvas_Tab"
+ ],
+ {
+ "author": "Lerc",
+ "description": "This extension provides a full page image editor with mask support. There are two nodes, one to receive images from the editor and one to send images to the editor.",
+ "nickname": "Canvas Tab",
+ "title": "Canvas Tab",
+ "title_aux": "ComfyUI-Trajectory"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-Video-Editing-X-Attention": [
+ [
+ "StringList",
+ "VEXAGuidance",
+ "VEXALoader",
+ "VEXARun"
+ ],
+ {
+ "title_aux": "ComfyUI-Video-Editing-X-Attention"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI-dust3r": [
+ [
+ "CameraPoseVideo",
+ "Dust3rLoader",
+ "Dust3rRun"
+ ],
+ {
+ "title_aux": "ComfyUI-dust3r"
+ }
+ ],
+ "https://github.com/chaojie/ComfyUI_StreamingT2V": [
+ [
+ "LoadText_StreamingT2V",
+ "PromptTravelIndex",
+ "SaveText_StreamingT2V",
+ "StreamingT2VLoaderAnimateDiff",
+ "StreamingT2VLoaderAnimateDiffModel",
+ "StreamingT2VLoaderEnhanceModel",
+ "StreamingT2VLoaderModelscopeModel",
+ "StreamingT2VLoaderModelscopeT2V",
+ "StreamingT2VLoaderSVD",
+ "StreamingT2VLoaderSVDModel",
+ "StreamingT2VLoaderStreamModel",
+ "StreamingT2VLoaderVidXTendModel",
+ "StreamingT2VRunEnhanceStep",
+ "StreamingT2VRunI2V",
+ "StreamingT2VRunLongStep",
+ "StreamingT2VRunLongStepVidXTendPipeline",
+ "StreamingT2VRunLongStepVidXTendPipelineCustomRef",
+ "StreamingT2VRunLongStepVidXTendPipelineCustomRefOutExtendOnly",
+ "StreamingT2VRunLongStepVidXTendPipelinePromptTravel",
+ "StreamingT2VRunShortStepAnimateDiff",
+ "StreamingT2VRunShortStepModelscopeT2V",
+ "StreamingT2VRunShortStepSVD",
+ "StreamingT2VRunT2V",
+ "VHS_FILENAMES_STRING_StreamingT2V"
+ ],
+ {
+ "title_aux": "ComfyUI_StreamingT2V"
+ }
+ ],
+ "https://github.com/chaosaiart/Chaosaiart-Nodes": [
+ [
+ "chaosaiart_Any_Switch",
+ "chaosaiart_Any_Switch_Big_Number",
+ "chaosaiart_Any_Switch_small",
+ "chaosaiart_AutoNone_Switch_small",
+ "chaosaiart_CheckpointLoader",
+ "chaosaiart_CheckpointPrompt",
+ "chaosaiart_CheckpointPrompt2",
+ "chaosaiart_CheckpointPrompt_Frame",
+ "chaosaiart_CheckpointPrompt_FrameMixer",
+ "chaosaiart_ControlNetApply",
+ "chaosaiart_ControlNetApply2",
+ "chaosaiart_ControlNetApply3",
+ "chaosaiart_Denoising_Switch",
+ "chaosaiart_EmptyLatentImage",
+ "chaosaiart_FramePromptCLIPEncode",
+ "chaosaiart_Frame_Switch",
+ "chaosaiart_KSampler1",
+ "chaosaiart_KSampler2",
+ "chaosaiart_KSampler3",
+ "chaosaiart_KSampler_a1",
+ "chaosaiart_KSampler_a1a",
+ "chaosaiart_KSampler_a2",
+ "chaosaiart_KSampler_expert_1",
+ "chaosaiart_Ksampler_attribut",
+ "chaosaiart_Load_Image_Batch",
+ "chaosaiart_Load_Image_Batch_2img",
+ "chaosaiart_MainPromptCLIPEncode",
+ "chaosaiart_Number",
+ "chaosaiart_Number2",
+ "chaosaiart_Number_Counter",
+ "chaosaiart_Number_Switch",
+ "chaosaiart_Prompt",
+ "chaosaiart_Prompt_Frame",
+ "chaosaiart_Prompt_mixer_byFrame",
+ "chaosaiart_SaveImage",
+ "chaosaiart_Show_Info",
+ "chaosaiart_Simple_Prompt",
+ "chaosaiart_TextCLIPEncode",
+ "chaosaiart_TextCLIPEncode_lora",
+ "chaosaiart_adjust_color",
+ "chaosaiart_any_array2input_1Input",
+ "chaosaiart_any_array2input_all_big",
+ "chaosaiart_any_array2input_all_small",
+ "chaosaiart_any_input2array_big",
+ "chaosaiart_any_input2array_small",
+ "chaosaiart_controlnet_weidgth",
+ "chaosaiart_convert",
+ "chaosaiart_convert_Prompt",
+ "chaosaiart_deepseek_fix",
+ "chaosaiart_forPreview",
+ "chaosaiart_img2gif",
+ "chaosaiart_img2video",
+ "chaosaiart_lora",
+ "chaosaiart_lora_advanced",
+ "chaosaiart_merge_Folders",
+ "chaosaiart_oneNode",
+ "chaosaiart_reloadAny_Load",
+ "chaosaiart_reloadAny_Save",
+ "chaosaiart_reloadIMG_Load",
+ "chaosaiart_reloadIMG_Save",
+ "chaosaiart_reloadLatent_Load",
+ "chaosaiart_reloadLatent_Save",
+ "chaosaiart_restarter",
+ "chaosaiart_restarter_advanced",
+ "chaosaiart_video2img1",
+ "chaosaiart_zoom_frame"
+ ],
+ {
+ "title_aux": "Chaosaiart-Nodes"
+ }
+ ],
+ "https://github.com/charlyad142/ComfyUI_Charly_FitToAspectNode": [
+ [
+ "Charly FitToAspectNode"
+ ],
+ {
+ "title_aux": "ComfyUI Charly FitToAspectNode"
+ }
+ ],
+ "https://github.com/charlyad142/ComfyUI_bfl_api_pro_nodes": [
+ [
+ "BFL Flux 2 Flex",
+ "BFL Flux 2 Pro",
+ "BFL Flux Kontext",
+ "BFL Flux Ultra",
+ "BFL Image Expander",
+ "BFL Image Generator",
+ "BFL Inpainting"
+ ],
+ {
+ "title_aux": "ComfyUI BFL API Pro Nodes"
+ }
+ ],
+ "https://github.com/charlyad142/comfyUI_charly_replicate_api": [
+ [
+ "Replicate Qwen Image Edit",
+ "Replicate Qwen Image Edit Plus",
+ "Replicate SeedEdit",
+ "Replicate Seedream4"
+ ],
+ {
+ "title_aux": "ComfyUI Replicate Image Generation & Edit"
+ }
+ ],
+ "https://github.com/chaserhkj/ComfyUI-Chaser-nodes": [
+ [
+ "EvalFloatExpr",
+ "EvalIntExpr",
+ "LoadImageFromWebDAV",
+ "MergeData",
+ "PromptFormatter",
+ "PromptTemplate",
+ "RegisterTemplate",
+ "SetData",
+ "TemplateFileLoader",
+ "UploadImagesToWebDAV",
+ "UploadMP4ToWebDAV",
+ "UploadWebMToWebDAV",
+ "YAMLData",
+ "YAMLFileLoader"
+ ],
+ {
+ "title_aux": "Chaser's Custom Nodes"
+ }
+ ],
+ "https://github.com/chchchadzilla/ComfyUI-ChomfyNodes": [
+ [
+ "ChomfyDetailedLogger",
+ "ChomfyMegaPrompt",
+ "ChomfyUniversalCounter",
+ "ChomfyUniversalNoise"
+ ],
+ {
+ "title_aux": "ComfyUI-ChomfyNodes"
+ }
+ ],
+ "https://github.com/checkbins/checkbin-comfy": [
+ [
+ "Checkbin Get Image Bin",
+ "Checkbin Get String Bin",
+ "Checkbin Save Image Bin",
+ "Checkbin Save String Bin",
+ "Checkbin Start Run",
+ "Checkbin Submit Bin"
+ ],
+ {
+ "title_aux": "checkbin-comfy"
+ }
+ ],
+ "https://github.com/chenbaiyujason/ComfyUI_StepFun": [
+ [
+ "CombineStrings",
+ "JSONParser",
+ "StepFunClient",
+ "TextImageChat",
+ "VideoChat",
+ "VideoFileUploader"
+ ],
+ {
+ "title_aux": "ComfyUI-SCStepFun"
+ }
+ ],
+ "https://github.com/chenlongming/ComfyUI_Spectral": [
+ [
+ "Calculate",
+ "KMeans",
+ "LoadEnvi",
+ "LoadSpectral",
+ "Plot"
+ ],
+ {
+ "title_aux": "ComfyUI_Spectral"
+ }
+ ],
+ "https://github.com/chenpipi0807/ComfyUI-Index-TTS": [
+ [
+ "AudioCleanupNode",
+ "IndexTTS2BaseNode",
+ "IndexTTS2CacheControlNode",
+ "IndexTTS2EmotionAudioNode",
+ "IndexTTS2EmotionTextNode",
+ "IndexTTS2EmotionVectorNode",
+ "IndexTTS2ProNode",
+ "IndexTTSNode",
+ "IndexTTSProNode",
+ "NovelTextStructureNode",
+ "TimbreAudioLoader"
+ ],
+ {
+ "author": "ComfyUI-Index-TTS",
+ "description": "ComfyUI\u63a5\u53e3\u7684\u5de5\u4e1a\u7ea7\u96f6\u6837\u672c\u6587\u672c\u5230\u8bed\u97f3\u5408\u6210\u7cfb\u7edf",
+ "title": "IndexTTS for ComfyUI",
+ "title_aux": "ComfyUI-Index-TTS"
+ }
+ ],
+ "https://github.com/chenpipi0807/ComfyUI_NSFW_Godie": [
+ [
+ "NSFWFilterNode"
+ ],
+ {
+ "title_aux": "ComfyUI NSFW Filter"
+ }
+ ],
+ "https://github.com/chenpipi0807/Comfyui-CustomizeTextEncoder-Qwen-image": [
+ [
+ "TextEncodeQwenImageEditEnhanced",
+ "TextEncodeQwenImageT2ICustom"
+ ],
+ {
+ "title_aux": "Comfyui-CustomizeTextEncoder-Qwen-image"
+ }
+ ],
+ "https://github.com/chenpipi0807/PIP_ArtisticWords": [
+ [
+ "PIP Artistic Text Generator",
+ "PIP ArtisticWords Fusion",
+ "PIP ColorPicker",
+ "PIP SVG Recorder",
+ "PIP Text Preview",
+ "PIPAdvancedColorAnalyzer",
+ "PIPColorPicker",
+ "PIPColorWheel"
+ ],
+ {
+ "title_aux": "PIP Artistic Words for ComfyUI"
+ }
+ ],
+ "https://github.com/cherninlab/logo-generator-comfyui": [
+ [
+ "GoogleFontsLogo"
+ ],
+ {
+ "title_aux": "Logo Generator Node for ComfyUI"
+ }
+ ],
+ "https://github.com/chesnokovivan/ComfyUI-Novakid": [
+ [
+ "Novakid Styler"
+ ],
+ {
+ "title_aux": "ComfyUI-Novakid"
+ }
+ ],
+ "https://github.com/chflame163/ComfyUI_CatVTON_Wrapper": [
+ [
+ "CatVTONWrapper"
+ ],
+ {
+ "author": "chflame",
+ "description": "CatVTON warpper for ComfyUI",
+ "nickname": "CatVTON_Wrapper",
+ "title": "CatVTON_Wrapper",
+ "title_aux": "ComfyUI_CatVTON_Wrapper"
+ }
+ ],
+ "https://github.com/chflame163/ComfyUI_CogView4_Wrapper": [
+ [
+ "CogView4"
+ ],
+ {
+ "title_aux": "ComfyUI_CogView4_Wrapper"
+ }
+ ],
+ "https://github.com/chflame163/ComfyUI_FaceSimilarity": [
+ [
+ "Face Similarity"
+ ],
+ {
+ "title_aux": "ComfyUI Face Similarity"
+ }
+ ],
+ "https://github.com/chflame163/ComfyUI_Janus_Wrapper": [
+ [
+ "JanusImage2Text",
+ "JanusTextToImage",
+ "LoadJanusModel"
+ ],
+ {
+ "title_aux": "ComfyUI_Janus_Wrapper"
+ }
+ ],
+ "https://github.com/chflame163/ComfyUI_LayerStyle": [
+ [
+ "LayerColor: AutoAdjust",
+ "LayerColor: AutoAdjustV2",
+ "LayerColor: AutoBrightness",
+ "LayerColor: Brightness & Contrast",
+ "LayerColor: BrightnessContrastV2",
+ "LayerColor: Color of Shadow & Highlight",
+ "LayerColor: ColorAdapter",
+ "LayerColor: ColorBalance",
+ "LayerColor: ColorTemperature",
+ "LayerColor: ColorofShadowHighlightV2",
+ "LayerColor: Exposure",
+ "LayerColor: Gamma",
+ "LayerColor: HSV",
+ "LayerColor: LAB",
+ "LayerColor: LUT Apply",
+ "LayerColor: Levels",
+ "LayerColor: Negative",
+ "LayerColor: RGB",
+ "LayerColor: YUV",
+ "LayerFilter: AddGrain",
+ "LayerFilter: ChannelShake",
+ "LayerFilter: ColorMap",
+ "LayerFilter: DistortDisplace",
+ "LayerFilter: Film",
+ "LayerFilter: FilmV2",
+ "LayerFilter: GaussianBlur",
+ "LayerFilter: GaussianBlurV2",
+ "LayerFilter: HDREffects",
+ "LayerFilter: HalfTone",
+ "LayerFilter: LightLeak",
+ "LayerFilter: MotionBlur",
+ "LayerFilter: Sharp & Soft",
+ "LayerFilter: SkinBeauty",
+ "LayerFilter: SoftLight",
+ "LayerFilter: WaterColor",
+ "LayerMask: BlendIf Mask",
+ "LayerMask: CreateGradientMask",
+ "LayerMask: DrawRoundedRectangle",
+ "LayerMask: ImageToMask",
+ "LayerMask: LoadSegformerModel",
+ "LayerMask: MaskBoxDetect",
+ "LayerMask: MaskBoxExtend",
+ "LayerMask: MaskByColor",
+ "LayerMask: MaskEdgeShrink",
+ "LayerMask: MaskEdgeUltraDetail",
+ "LayerMask: MaskEdgeUltraDetail V2",
+ "LayerMask: MaskEdgeUltraDetail V3",
+ "LayerMask: MaskGradient",
+ "LayerMask: MaskGrain",
+ "LayerMask: MaskGrow",
+ "LayerMask: MaskInvert",
+ "LayerMask: MaskMotionBlur",
+ "LayerMask: MaskPreview",
+ "LayerMask: MaskStroke",
+ "LayerMask: PixelSpread",
+ "LayerMask: RemBgUltra",
+ "LayerMask: RmBgUltra V2",
+ "LayerMask: SegformerB2ClothesUltra",
+ "LayerMask: SegformerClothesPipelineLoader",
+ "LayerMask: SegformerClothesSetting",
+ "LayerMask: SegformerFashionPipelineLoader",
+ "LayerMask: SegformerFashionSetting",
+ "LayerMask: SegformerUltraV2",
+ "LayerMask: SegformerUltraV3",
+ "LayerMask: Shadow & Highlight Mask",
+ "LayerMask: ShadowHighlightMaskV2",
+ "LayerStyle: ColorOverlay",
+ "LayerStyle: ColorOverlay V2",
+ "LayerStyle: DropShadow",
+ "LayerStyle: DropShadow V2",
+ "LayerStyle: DropShadow V3",
+ "LayerStyle: Gradient Map",
+ "LayerStyle: GradientOverlay",
+ "LayerStyle: GradientOverlay V2",
+ "LayerStyle: InnerGlow",
+ "LayerStyle: InnerGlow V2",
+ "LayerStyle: InnerShadow",
+ "LayerStyle: InnerShadow V2",
+ "LayerStyle: OuterGlow",
+ "LayerStyle: OuterGlow V2",
+ "LayerStyle: Stroke",
+ "LayerStyle: Stroke V2",
+ "LayerUtility: AnyRerouter",
+ "LayerUtility: BatchSelector",
+ "LayerUtility: Boolean",
+ "LayerUtility: BooleanOperator",
+ "LayerUtility: BooleanOperatorV2",
+ "LayerUtility: CheckMask",
+ "LayerUtility: CheckMaskV2",
+ "LayerUtility: ChoiceTextPreset",
+ "LayerUtility: ColorImage",
+ "LayerUtility: ColorImage V2",
+ "LayerUtility: ColorName",
+ "LayerUtility: ColorPicker",
+ "LayerUtility: CropBoxResolve",
+ "LayerUtility: CropByMask",
+ "LayerUtility: CropByMask V2",
+ "LayerUtility: CropByMask V3",
+ "LayerUtility: ExtendCanvas",
+ "LayerUtility: ExtendCanvasV2",
+ "LayerUtility: Float",
+ "LayerUtility: FluxKontextImageScale",
+ "LayerUtility: GetImageSize",
+ "LayerUtility: GetMainColors",
+ "LayerUtility: GetMainColorsV2",
+ "LayerUtility: GradientImage",
+ "LayerUtility: GradientImage V2",
+ "LayerUtility: GrayValue",
+ "LayerUtility: HLFrequencyDetailRestore",
+ "LayerUtility: HSV Value",
+ "LayerUtility: ICMask",
+ "LayerUtility: ICMaskCropBack",
+ "LayerUtility: If",
+ "LayerUtility: ImageBatchToList",
+ "LayerUtility: ImageBlend",
+ "LayerUtility: ImageBlend V2",
+ "LayerUtility: ImageBlendAdvance",
+ "LayerUtility: ImageBlendAdvance V2",
+ "LayerUtility: ImageBlendAdvance V3",
+ "LayerUtility: ImageChannelMerge",
+ "LayerUtility: ImageChannelSplit",
+ "LayerUtility: ImageCombineAlpha",
+ "LayerUtility: ImageCompositeHandleMask",
+ "LayerUtility: ImageHub",
+ "LayerUtility: ImageListToBatch",
+ "LayerUtility: ImageMaskScaleAs",
+ "LayerUtility: ImageMaskScaleAsV2",
+ "LayerUtility: ImageOpacity",
+ "LayerUtility: ImageReel",
+ "LayerUtility: ImageReelComposit",
+ "LayerUtility: ImageRemoveAlpha",
+ "LayerUtility: ImageScaleByAspectRatio",
+ "LayerUtility: ImageScaleByAspectRatio V2",
+ "LayerUtility: ImageScaleRestore",
+ "LayerUtility: ImageScaleRestore V2",
+ "LayerUtility: ImageShift",
+ "LayerUtility: ImageTaggerSave",
+ "LayerUtility: ImageTaggerSaveV2",
+ "LayerUtility: Integer",
+ "LayerUtility: LayerImageTransform",
+ "LayerUtility: LayerMaskTransform",
+ "LayerUtility: LoadImagesFromPath",
+ "LayerUtility: LoadVQAModel",
+ "LayerUtility: NameToColor",
+ "LayerUtility: NanoBananaImageScale",
+ "LayerUtility: NumberCalculator",
+ "LayerUtility: NumberCalculatorV2",
+ "LayerUtility: PrintInfo",
+ "LayerUtility: PurgeVRAM",
+ "LayerUtility: PurgeVRAM V2",
+ "LayerUtility: QueueStop",
+ "LayerUtility: RGB Value",
+ "LayerUtility: RandomGenerator",
+ "LayerUtility: RandomGeneratorV2",
+ "LayerUtility: RestoreCropBox",
+ "LayerUtility: RoundedRectangle",
+ "LayerUtility: Seed",
+ "LayerUtility: SimpleTextImage",
+ "LayerUtility: String",
+ "LayerUtility: StringCondition",
+ "LayerUtility: SwitchCase",
+ "LayerUtility: TextBox",
+ "LayerUtility: TextImage",
+ "LayerUtility: TextImage V2",
+ "LayerUtility: TextJoin",
+ "LayerUtility: TextJoinV2",
+ "LayerUtility: TextPreseter",
+ "LayerUtility: VQAPrompt",
+ "LayerUtility: XY to Percent"
+ ],
+ {
+ "author": "chflame",
+ "description": "A set of nodes for ComfyUI that can composite layer and mask to achieve Photoshop like functionality.",
+ "nickname": "LayerStyle",
+ "title": "LayerStyle",
+ "title_aux": "ComfyUI Layer Style"
+ }
+ ],
+ "https://github.com/chflame163/ComfyUI_LayerStyle_Advance": [
+ [
+ "LayerMask: BBoxJoin",
+ "LayerMask: BenUltra",
+ "LayerMask: BiRefNetUltra",
+ "LayerMask: BiRefNetUltraV2",
+ "LayerMask: DrawBBoxMask",
+ "LayerMask: DrawBBoxMaskV2",
+ "LayerMask: EVFSAMUltra",
+ "LayerMask: Florence2Ultra",
+ "LayerMask: HumanPartsUltra",
+ "LayerMask: LoadBenModel",
+ "LayerMask: LoadBiRefNetModel",
+ "LayerMask: LoadBiRefNetModelV2",
+ "LayerMask: LoadFlorence2Model",
+ "LayerMask: LoadSAM2Model",
+ "LayerMask: LoadSegmentAnythingModels",
+ "LayerMask: MaskByDifferent",
+ "LayerMask: MediapipeFacialSegment",
+ "LayerMask: ObjectDetectorFL2",
+ "LayerMask: ObjectDetectorGemini",
+ "LayerMask: ObjectDetectorGeminiV2",
+ "LayerMask: ObjectDetectorMask",
+ "LayerMask: ObjectDetectorYOLO8",
+ "LayerMask: ObjectDetectorYOLOWorld",
+ "LayerMask: PersonMaskUltra",
+ "LayerMask: PersonMaskUltra V2",
+ "LayerMask: SAM2Ultra",
+ "LayerMask: SAM2UltraV2",
+ "LayerMask: SAM2VideoUltra",
+ "LayerMask: SegmentAnythingUltra",
+ "LayerMask: SegmentAnythingUltra V2",
+ "LayerMask: SegmentAnythingUltra V3",
+ "LayerMask: TransparentBackgroundUltra",
+ "LayerMask: YoloV8Detect",
+ "LayerUtility: AddBlindWaterMark",
+ "LayerUtility: Collage",
+ "LayerUtility: CreateQRCode",
+ "LayerUtility: DecodeQRCode",
+ "LayerUtility: DeepSeekAPI",
+ "LayerUtility: DeepSeekAPIV2",
+ "LayerUtility: Florence2Image2Prompt",
+ "LayerUtility: Gemini",
+ "LayerUtility: GeminiImageEdit",
+ "LayerUtility: GeminiV2",
+ "LayerUtility: GetColorTone",
+ "LayerUtility: GetColorToneV2",
+ "LayerUtility: ImageAutoCrop",
+ "LayerUtility: ImageAutoCrop V2",
+ "LayerUtility: ImageAutoCrop V3",
+ "LayerUtility: ImageRewardFilter",
+ "LayerUtility: JimengI2IAPI",
+ "LayerUtility: JoyCaption2",
+ "LayerUtility: JoyCaption2ExtraOptions",
+ "LayerUtility: JoyCaption2Split",
+ "LayerUtility: JoyCaptionBeta1",
+ "LayerUtility: JoyCaptionBeta1ExtraOptions",
+ "LayerUtility: LaMa",
+ "LayerUtility: LlamaVision",
+ "LayerUtility: LoadJoyCaption2Model",
+ "LayerUtility: LoadJoyCaptionBeta1Model",
+ "LayerUtility: LoadPSD",
+ "LayerUtility: LoadSmolLM2Model",
+ "LayerUtility: LoadSmolVLMModel",
+ "LayerUtility: PhiPrompt",
+ "LayerUtility: PromptEmbellish",
+ "LayerUtility: PromptTagger",
+ "LayerUtility: QWenImage2Prompt",
+ "LayerUtility: SD3NegativeConditioning",
+ "LayerUtility: SaveImagePlus",
+ "LayerUtility: SaveImagePlusV2",
+ "LayerUtility: ShowBlindWaterMark",
+ "LayerUtility: SmolLM2",
+ "LayerUtility: SmolVLM",
+ "LayerUtility: UserPromptGeneratorReplaceWord",
+ "LayerUtility: UserPromptGeneratorTxt2ImgPrompt",
+ "LayerUtility: UserPromptGeneratorTxt2ImgPromptWithReference",
+ "LayerUtility: ZhipuGLM4",
+ "LayerUtility: ZhipuGLM4V"
+ ],
+ {
+ "author": "chflame",
+ "description": "A set of nodes for ComfyUI that can composite layer and mask to achieve Photoshop like functionality.",
+ "nickname": "LayerStyle",
+ "title": "LayerStyle",
+ "title_aux": "ComfyUI_LayerStyle_Advance"
+ }
+ ],
+ "https://github.com/chflame163/ComfyUI_MSSpeech_TTS": [
+ [
+ "Input Trigger",
+ "MicrosoftSpeech_TTS",
+ "Play Sound",
+ "Play Sound (loop)"
+ ],
+ {
+ "title_aux": "ComfyUI_MSSpeech_TTS"
+ }
+ ],
+ "https://github.com/chflame163/ComfyUI_OmniGen_Wrapper": [
+ [
+ "dzOmniGenWrapper"
+ ],
+ {
+ "title_aux": "ComfyUI_OmniGen_Wrapper"
+ }
+ ],
+ "https://github.com/chflame163/ComfyUI_WordCloud": [
+ [
+ "ComfyWordCloud",
+ "LoadTextFile",
+ "RGB_Picker"
+ ],
+ {
+ "title_aux": "ComfyUI_WordCloud"
+ }
+ ],
+ "https://github.com/chibiace/ComfyUI-Chibi-Nodes": [
+ [
+ "ConditionText",
+ "ConditionTextMulti",
+ "ConditionTextPrompts",
+ "ImageAddText",
+ "ImageSimpleResize",
+ "ImageSizeInfo",
+ "ImageTool",
+ "Int2String",
+ "LoadEmbedding",
+ "LoadImageExtended",
+ "Loader",
+ "Prompts",
+ "RandomResolutionLatent",
+ "SaveImages",
+ "SeedGenerator",
+ "SimpleSampler",
+ "TextSplit",
+ "Textbox",
+ "Wildcards"
+ ],
+ {
+ "title_aux": "ComfyUI-Chibi-Nodes"
+ }
+ ],
+ "https://github.com/choey/Comfy-Topaz": [
+ [
+ "TopazPhotoAI",
+ "TopazSharpenSettings",
+ "TopazUpscaleSettings"
+ ],
+ {
+ "title_aux": "Comfy-Topaz"
+ }
+ ],
+ "https://github.com/chou18194766xx/comfyui-EncryptSave": [
+ [
+ "EncryptSaveAES"
+ ],
+ {
+ "title_aux": "comfyui-EncryptSave"
+ }
+ ],
+ "https://github.com/chou18194766xx/comfyui_EncryptPreview": [
+ [
+ "EncryptPreviewImage"
+ ],
+ {
+ "title_aux": "comfyui_EncryptPreview"
+ }
+ ],
+ "https://github.com/chri002/ComfyUI_depthMapOperation": [
+ [
+ "CleanPoints (KDTree)",
+ "CloudPointsInfo",
+ "CubeLimit",
+ "Export to PLY",
+ "ImageToPoints (Torch)",
+ "Import PLY",
+ "InterpolatePoints (KDTree)",
+ "PointsToImage (Orthographic)",
+ "PointsToImage (Projection)",
+ "PointsToImage advance (DEBUG)",
+ "PointsToImage advance (Orthographic)",
+ "PointsToImage advance (Projection)",
+ "TransformPoints"
+ ],
+ {
+ "title_aux": "ComfyUI_depthMapOperation"
+ }
+ ],
+ "https://github.com/chris-arsenault/ComfyUI-AharaNodes": [
+ [
+ "FrameSegmenter",
+ "FrameSegmenterIndexer",
+ "RepeatSampler",
+ "RepeatSamplerConfigNode",
+ "RepeatSamplerConfigPatchLatent",
+ "RepeatSamplerConfigPatchModel"
+ ],
+ {
+ "title_aux": "ComfyUI-AharaNodes"
+ }
+ ],
+ "https://github.com/chris-the-wiz/EmbeddingsCurveEditor_ComfyUI": [
+ [
+ "Embeddings Curve Editor"
+ ],
+ {
+ "title_aux": "EmbeddingsCurveEditor_ComfyUI"
+ }
+ ],
+ "https://github.com/chrisfreilich/virtuoso-nodes": [
+ [
+ "BlackAndWhite",
+ "BlendIf",
+ "BlendModes",
+ "ColorBalance",
+ "ColorBalanceAdvanced",
+ "GaussianBlur",
+ "GaussianBlurDepth",
+ "HueSat",
+ "HueSatAdvanced",
+ "LensBlur",
+ "LensBlurDepth",
+ "Levels",
+ "MergeRGB",
+ "MotionBlur",
+ "MotionBlurDepth",
+ "SelectiveColor",
+ "SolidColor",
+ "SolidColorHSV",
+ "SolidColorRGB",
+ "SplitRGB"
+ ],
+ {
+ "author": "Chris Freilich",
+ "description": "This extension provides a \"Levels\" node.",
+ "nickname": "Virtuoso Pack - Contrast",
+ "title": "Virtuoso Pack - Contrast",
+ "title_aux": "Virtuoso Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/chrisgoringe/cg-image-filter": [
+ [
+ "Any List to String",
+ "Batch from Image List",
+ "Image Filter",
+ "Image List From Batch",
+ "Mask Image Filter",
+ "Masked Section",
+ "Pick from List",
+ "Split String by Commas",
+ "String List from Strings",
+ "String to Float",
+ "String to Int",
+ "Text Image Filter",
+ "Text Image Filter with Extras"
+ ],
+ {
+ "author": "chrisgoringe",
+ "description": "A custom node that pauses the flow while you choose which image or images to pass on to the rest of the workflow. Simplified and improved version of cg-image-picker.",
+ "nickname": "Image Filter",
+ "title": "Image Filter",
+ "title_aux": "Image Filter"
+ }
+ ],
+ "https://github.com/chrisgoringe/cg-noisetools": [
+ [
+ "Batch Noise Simulate",
+ "Mix Noise",
+ "Seperable Batch Noise",
+ "Shape Noise",
+ "Split Sigmas with Rewind"
+ ],
+ {
+ "title_aux": "Noise variation and batch noise tools"
+ }
+ ],
+ "https://github.com/chrisgoringe/cg-use-everywhere": [
+ [
+ "Anything Everywhere",
+ "Anything Everywhere3",
+ "Anything Everywhere?",
+ "Combo Clone",
+ "Prompts Everywhere",
+ "Seed Everywhere",
+ "Simple String"
+ ],
+ {
+ "nodename_pattern": "(^(Prompts|Anything) Everywhere|Simple String)",
+ "title_aux": "Use Everywhere (UE Nodes)"
+ }
+ ],
+ "https://github.com/chrish-slingshot/CrasHUtils": [
+ [
+ "CheckPointNames",
+ "CheckpointNames",
+ "ColorStylizer",
+ "DinoGame",
+ "DoomGame",
+ "ExtractCharacterInfo",
+ "ImageGlitcher",
+ "QueryLocalLLM",
+ "SdxlResolution",
+ "SdxlResolutionToDimensions",
+ "SnakeGame",
+ "SpaceInvadersGame",
+ "TetrisGame"
+ ],
+ {
+ "title_aux": "CrasH Utils"
+ }
+ ],
+ "https://github.com/chrishill197724-gif/ComfyUI-Wan22-GGUF-Storyboard": [
+ [
+ "Wan22StoryboardGGUF"
+ ],
+ {
+ "title_aux": "ComfyUI-Wan22-GGUF-Storyboard"
+ }
+ ],
+ "https://github.com/chrissy0/chris-comfyui-nodes": [
+ [
+ "PadImageSquare"
+ ],
+ {
+ "title_aux": "chris-comfyui-nodes"
+ }
+ ],
+ "https://github.com/christian-byrne/audio-separation-nodes-comfyui": [
+ [
+ "AudioCombine",
+ "AudioCrop",
+ "AudioGetTempo",
+ "AudioSeparation",
+ "AudioSpeedShift",
+ "AudioTempoMatch",
+ "AudioVideoCombine"
+ ],
+ {
+ "title_aux": "audio-separation-nodes-comfyui"
+ }
+ ],
+ "https://github.com/christian-byrne/claude-code-comfyui-nodes": [
+ [
+ "ClaudeCodeArguments",
+ "ClaudeCodeContext",
+ "ClaudeCodeExecute",
+ "ClaudeCodeMCP",
+ "ClaudeCodeMemory",
+ "ClaudeCodeReader",
+ "ClaudeCodeTools",
+ "ClaudeRedditScraper"
+ ],
+ {
+ "title_aux": "Claude Code ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/christian-byrne/img2colors-comfyui-node": [
+ [
+ "bmy_Img2ColorNode"
+ ],
+ {
+ "author": "christian-byrne",
+ "description": "",
+ "nickname": "img2color",
+ "title": "Img2Color Node - Detect and describe color palettes in images",
+ "title_aux": "Img2color - Extract Colors from Image"
+ }
+ ],
+ "https://github.com/christian-byrne/img2txt-comfyui-nodes": [
+ [
+ "img2txt BLIP/Llava Multimodel Tagger"
+ ],
+ {
+ "author": "christian-byrne",
+ "title": "Img2Txt auto captioning",
+ "title_aux": "img2txt-comfyui-nodes"
+ }
+ ],
+ "https://github.com/christian-byrne/size-match-compositing-nodes": [
+ [
+ "Composite Alpha Layer",
+ "Size Match Images/Masks"
+ ],
+ {
+ "title_aux": "Node - Size Matcher"
+ }
+ ],
+ "https://github.com/christian-byrne/youtube-dl-comfyui": [
+ [
+ "YoutubeDL"
+ ],
+ {
+ "title_aux": "youtube-dl-comfyui"
+ }
+ ],
+ "https://github.com/chyer/Chye-ComfyUI-Toolset": [
+ [
+ "CYHARRHalationNode",
+ "CYHChromaticAberrationNode",
+ "CYHFilmGrainNode",
+ "CYHFolderFilenameBuilderNode",
+ "CYHGlobalColorGradingNode",
+ "CYHLatentFluxAspectRatio",
+ "CYHLatentPhoneAspectRatio",
+ "CYHLatentQwenAspectRatio",
+ "CYHLatentSDXLAspectRatio",
+ "CYHLatentSocialAspectRatio",
+ "CYHLatentVideoAspectRatio",
+ "CYHPreviewVideo",
+ "CYHResolutionMultiplierNode",
+ "CYHTextFileEditorNode",
+ "CYHTextFileLoaderNode",
+ "PromptEnhancer",
+ "PromptEnhancerEditable",
+ "PromptToolsSetup",
+ "PromptWildcardGenerator"
+ ],
+ {
+ "title_aux": "Chye ComfyUI Toolset"
+ }
+ ],
+ "https://github.com/ciga2011/ComfyUI-MarkItDown": [
+ [
+ "WIZ_AUDIO2MARKDOWN",
+ "WIZ_EXCEL2MARKDOWN",
+ "WIZ_HTML2MARKDOWN",
+ "WIZ_IMAGE2MARKDOWN",
+ "WIZ_IPYNB2MARKDOWN",
+ "WIZ_LLM_CLIENT",
+ "WIZ_MARKITDOWN",
+ "WIZ_PDF2MARKDOWN",
+ "WIZ_POWERPOINT2MARKDOWN",
+ "WIZ_WORD2MARKDOWN"
+ ],
+ {
+ "title_aux": "ComfyUI MarkItDown"
+ }
+ ],
+ "https://github.com/ciga2011/ComfyUI-Pollinations": [
+ [
+ "PollinationsNode"
+ ],
+ {
+ "title_aux": "ComfyUI Pollinations"
+ }
+ ],
+ "https://github.com/ciga2011/ComfyUI-PromptOptimizer": [
+ [
+ "PromptOptimizer"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Optimizer"
+ }
+ ],
+ "https://github.com/ciri/comfyui-model-downloader": [
+ [
+ "Auto Model Downloader",
+ "CivitAI Downloader",
+ "HF Downloader"
+ ],
+ {
+ "title_aux": "ComfyUI Model Downloader"
+ }
+ ],
+ "https://github.com/citronlegacy/ComfyUI-CitronNodes": [
+ [
+ "GetDateTime",
+ "get_first_and_final_frames",
+ "get_gif_first_and_final_frames",
+ "nodes",
+ "project"
+ ],
+ {
+ "title_aux": "ComfyUI-CitronNodes"
+ }
+ ],
+ "https://github.com/city96/ComfyUI-GGUF": [
+ [
+ "CLIPLoaderGGUF",
+ "DualCLIPLoaderGGUF",
+ "QuadrupleCLIPLoaderGGUF",
+ "TripleCLIPLoaderGGUF",
+ "UnetLoaderGGUF",
+ "UnetLoaderGGUFAdvanced"
+ ],
+ {
+ "preemptions": [
+ "CLIPLoaderGGUF",
+ "DualCLIPLoaderGGUF",
+ "TripleCLIPLoaderGGUF",
+ "UnetLoaderGGUF",
+ "UnetLoaderGGUFAdvanced"
+ ],
+ "title_aux": "ComfyUI-GGUF"
+ }
+ ],
+ "https://github.com/city96/ComfyUI_ColorMod": [
+ [
+ "CV2Tonemap",
+ "CV2TonemapDrago",
+ "CV2TonemapDurand",
+ "CV2TonemapMantiuk",
+ "CV2TonemapReinhard",
+ "ColorModCompress",
+ "ColorModEdges",
+ "ColorModMove",
+ "ColorModPivot",
+ "ColorspaceConvert",
+ "HDRCreate",
+ "HDRExposureFusion",
+ "LoadImageHDR",
+ "LoadImageHighPrec",
+ "PreviewImageHighPrec",
+ "SaveImageHDR",
+ "SaveImageHighPrec"
+ ],
+ {
+ "title_aux": "ComfyUI_ColorMod"
+ }
+ ],
+ "https://github.com/city96/ComfyUI_DiT": [
+ [
+ "DiTCheckpointLoader",
+ "DiTCheckpointLoaderSimple",
+ "DiTLabelCombine",
+ "DiTLabelSelect",
+ "DiTSampler"
+ ],
+ {
+ "title_aux": "ComfyUI_DiT [WIP]"
+ }
+ ],
+ "https://github.com/city96/ComfyUI_ExtraModels": [
+ [
+ "DiTCondLabelEmpty",
+ "DiTCondLabelSelect",
+ "DitCheckpointLoader",
+ "EmptyDCAELatentImage",
+ "EmptySanaLatentImage",
+ "ExtraVAELoader",
+ "GemmaLoader",
+ "GemmaTextEncode",
+ "HYDiTCheckpointLoader",
+ "HYDiTSrcSizeCond",
+ "HYDiTTextEncode",
+ "HYDiTTextEncodeSimple",
+ "HYDiTTextEncoderLoader",
+ "MiaoBiCLIPLoader",
+ "MiaoBiDiffusersLoader",
+ "OverrideCLIPDevice",
+ "OverrideVAEDevice",
+ "PixArtCheckpointLoader",
+ "PixArtCheckpointLoaderSimple",
+ "PixArtControlNetCond",
+ "PixArtLoraLoader",
+ "PixArtResolutionCond",
+ "PixArtResolutionSelect",
+ "PixArtT5FromSD3CLIP",
+ "PixArtT5TextEncode",
+ "SanaCheckpointLoader",
+ "SanaResolutionCond",
+ "SanaResolutionSelect",
+ "SanaTextEncode",
+ "T5TextEncode",
+ "T5v11Loader"
+ ],
+ {
+ "title_aux": "Extra Models for ComfyUI"
+ }
+ ],
+ "https://github.com/city96/ComfyUI_NetDist": [
+ [
+ "CombineImageBatch",
+ "FetchRemote",
+ "LoadCurrentWorkflowJSON",
+ "LoadDiskWorkflowJSON",
+ "LoadImageUrl",
+ "LoadLatentNumpy",
+ "LoadLatentUrl",
+ "RemoteChainEnd",
+ "RemoteChainStart",
+ "RemoteQueueSimple",
+ "RemoteQueueWorker",
+ "SaveDiskWorkflowJSON",
+ "SaveImageUrl",
+ "SaveLatentNumpy"
+ ],
+ {
+ "title_aux": "ComfyUI_NetDist"
+ }
+ ],
+ "https://github.com/city96/SD-Latent-Interposer": [
+ [
+ "LatentInterposer"
+ ],
+ {
+ "title_aux": "Latent-Interposer"
+ }
+ ],
+ "https://github.com/city96/SD-Latent-Upscaler": [
+ [
+ "LatentUpscaler"
+ ],
+ {
+ "title_aux": "SD-Latent-Upscaler"
+ }
+ ],
+ "https://github.com/civen-cn/ComfyUI-PaddleOcr": [
+ [
+ "OcrBlur",
+ "OcrBoxMask",
+ "OcrImageText"
+ ],
+ {
+ "title_aux": "ComfyUI-PaddleOcr"
+ }
+ ],
+ "https://github.com/civen-cn/ComfyUI-Whisper-Translator": [
+ [
+ "Add Subtitles To FramesX",
+ "Apply WhisperX"
+ ],
+ {
+ "title_aux": "ComfyUI Whisper Translator"
+ }
+ ],
+ "https://github.com/civitai/civitai_comfy_nodes": [
+ [
+ "CivitAI_Checkpoint_Loader",
+ "CivitAI_Lora_Loader"
+ ],
+ {
+ "title_aux": "Civitai Comfy Nodes"
+ }
+ ],
+ "https://github.com/cjj198909/comfy_openai_image_api_azure": [
+ [
+ "OpenAI Image API"
+ ],
+ {
+ "title_aux": "OpenAI/Azure OpenAI Image API"
+ }
+ ],
+ "https://github.com/ckinpdx/ComfyUI-LoadAudioandSplit": [
+ [
+ "LoadAudioandSplit"
+ ],
+ {
+ "title_aux": "ComfyUI-LoadAudioandSplit"
+ }
+ ],
+ "https://github.com/ckinpdx/ComfyUI-SCAIL-AudioReactive": [
+ [
+ "SCAILAISTBeatDance",
+ "SCAILAISTChunkPreview",
+ "SCAILAISTFullLoader",
+ "SCAILAISTFullSequence",
+ "SCAILAISTLibraryLoader",
+ "SCAILAlignPoseToReference",
+ "SCAILAudioFeatureExtractor",
+ "SCAILBasePoseGenerator",
+ "SCAILBeatDetector",
+ "SCAILBeatDrivenPose",
+ "SCAILCMULibraryLoader",
+ "SCAILCMUMotion",
+ "SCAILCMUSequenceToSCAILPose",
+ "SCAILMixamoFBX",
+ "SCAILPoseFromDWPose",
+ "SCAILPoseRenderer"
+ ],
+ {
+ "title_aux": "ComfyUI-SCAIL-AudioReactive"
+ }
+ ],
+ "https://github.com/ckinpdx/ComfyUI-WanKeyframeBuilder": [
+ [
+ "WanKeyframeBuilder",
+ "WanKeyframeBuilderContinuation"
+ ],
+ {
+ "title_aux": "ComfyUI-WanKeyframeBuilder"
+ }
+ ],
+ "https://github.com/ckinpdx/comfyui-humo-audio-motion": [
+ [
+ "HuMoAudioAttentionControlV4",
+ "HuMoLipsyncSuppressAttn"
+ ],
+ {
+ "title_aux": "comfyui-humo-audio-motion"
+ }
+ ],
+ "https://github.com/claptrap0/ComfyUI_LLM_Hub": [
+ [
+ "Generated_Output",
+ "LLM_Hub",
+ "LLM_Settings"
+ ],
+ {
+ "title_aux": "ComfyUI_LLM_Hub"
+ }
+ ],
+ "https://github.com/claussteinmassl/ComfyUI-CS-CustomNodes": [
+ [
+ "CS Transform",
+ "CSTransform"
+ ],
+ {
+ "title_aux": "CS Transform Node for ComfyUI"
+ }
+ ],
+ "https://github.com/clayton-grey/ComfyUI-EditRouter": [
+ [
+ "CG_EditRouter"
+ ],
+ {
+ "title_aux": "ComfyUI-EditRouter"
+ }
+ ],
+ "https://github.com/cleanlii/comfyui-dalle-integration": [
+ [
+ "DalleImageEdit",
+ "DalleImageGeneration",
+ "DalleImageVariation"
+ ],
+ {
+ "title_aux": "DalleImageNodes - OpenAI DALL\u00b7E Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/clhui/ComfyUi-clh-Tool": [
+ [
+ "EchartGraph_clh",
+ "EchartOptionByPath_clh",
+ "EchartOption_clh",
+ "INTConstant_clh",
+ "JavaScript_clh",
+ "JoinStringMulti_clh",
+ "MathExpression_clh",
+ "SetRedis|clh",
+ "ShowText_clh",
+ "SomethingToString_clh",
+ "String2FatLabels_clh",
+ "String2Image_clh",
+ "StringConstant_clh",
+ "duplicate_checker_clh"
+ ],
+ {
+ "author": "Dr.Lt.Data",
+ "description": "This extension offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler.",
+ "nickname": "CLH Simple Tool",
+ "title": "CLH simple Tool",
+ "title_aux": "Clh Tool for ComfyUI"
+ }
+ ],
+ "https://github.com/clouddreamfly/ComfyUI-PromptWrapper": [
+ [
+ "CombinePrompt",
+ "CustomPrompt",
+ "DrawArtistPrompt",
+ "DrawStylePrompt",
+ "GeneratePrompt",
+ "InputPrompt",
+ "LightPrompt",
+ "MultiCombinePrompt",
+ "MultiReplacePrompt",
+ "NegativePrompt",
+ "PortraitCosmeticPrompt",
+ "PortraitFashionPrompt",
+ "PortraitPosePrompt",
+ "PortraitPrompt",
+ "PortraitSkinPrompt",
+ "PreviewPrompt",
+ "PromptTranslation",
+ "PromptTranslationHY",
+ "RandomLinePrompt",
+ "RandomsPrompt",
+ "RandomsWeightPrompt",
+ "ReplacePrompt",
+ "SavePrompt",
+ "SceneryPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptWrapper"
+ }
+ ],
+ "https://github.com/cloudkoala/comfyui-koala": [
+ [
+ "AspectRatioLatentNode",
+ "SaveImageAnywhere",
+ "SaveMeshAnywhere"
+ ],
+ {
+ "title_aux": "comfyui-koala"
+ }
+ ],
+ "https://github.com/cluny85/ComfyUI-Scripting-Tools": [
+ [
+ "EnhancedUUIDGeneratorNode",
+ "UUIDGeneratorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Scripting-Tools"
+ }
+ ],
+ "https://github.com/cmdicely/simple_image_to_palette": [
+ [
+ "Example"
+ ],
+ {
+ "title_aux": "Simple Image To Palette"
+ }
+ ],
+ "https://github.com/cmeka/ComfyUI-WanMoEScheduler": [
+ [
+ "WanMoEScheduler"
+ ],
+ {
+ "title_aux": "ComfyUI-WanMoEScheduler"
+ }
+ ],
+ "https://github.com/cnbjjj/ComfyUI-Jtils": [
+ [
+ "Jtils"
+ ],
+ {
+ "title_aux": "ComfyUI-Jtils"
+ }
+ ],
+ "https://github.com/cnnmmd/comfyui_xoxxox_cnnmmd": [
+ [
+ "Xoxxox_CnvDat",
+ "Xoxxox_CnvSen",
+ "Xoxxox_CnvTxt",
+ "Xoxxox_CnvVce",
+ "Xoxxox_DlyGet",
+ "Xoxxox_DlySet",
+ "Xoxxox_GenImg",
+ "Xoxxox_GenTxt",
+ "Xoxxox_GetAud",
+ "Xoxxox_GetDir",
+ "Xoxxox_GetDis",
+ "Xoxxox_GetImg",
+ "Xoxxox_GetMem",
+ "Xoxxox_GetTxt",
+ "Xoxxox_IniFlw",
+ "Xoxxox_LogNum",
+ "Xoxxox_LogTxt",
+ "Xoxxox_PutTxt",
+ "Xoxxox_RcvVce",
+ "Xoxxox_RepTxt",
+ "Xoxxox_RunFlw",
+ "Xoxxox_SenSlc",
+ "Xoxxox_SenTxt",
+ "Xoxxox_SetAud",
+ "Xoxxox_SetDir",
+ "Xoxxox_SetDis",
+ "Xoxxox_SetImg",
+ "Xoxxox_SetMem",
+ "Xoxxox_SetNil",
+ "Xoxxox_SetTxt",
+ "Xoxxox_SndVce",
+ "Xoxxox_SwtImg",
+ "Xoxxox_TrnBak"
+ ],
+ {
+ "title_aux": "cnnmmd: comfyui_xoxxox_cnnmmd"
+ }
+ ],
+ "https://github.com/codeprimate/ComfyUI-MaskContourProcessor": [
+ [
+ "MaskContourProcessor"
+ ],
+ {
+ "title_aux": "ComfyUI Mask Contour Processor"
+ }
+ ],
+ "https://github.com/colorAi/comfyui-ImageSelectorbyPrompt": [
+ [
+ "AdvancedImageSelectorByPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-Image Selector by Prompt"
+ }
+ ],
+ "https://github.com/comfy-deploy/comfyui-llm-toolkit": [
+ [
+ "APIKeyInput",
+ "APIProviderSelectorNode",
+ "AudioDurationFrames",
+ "BananaTaskGenerator",
+ "BlankImage",
+ "CheckImageEmpty",
+ "ConfigGenerateImage",
+ "ConfigGenerateImageBFL",
+ "ConfigGenerateImageFluxDev",
+ "ConfigGenerateImageGemini",
+ "ConfigGenerateImageOpenAI",
+ "ConfigGenerateImageOpenRouter",
+ "ConfigGenerateImagePortrait",
+ "ConfigGenerateImageSeedream",
+ "ConfigGenerateImageUnified",
+ "ConfigGenerateMusic",
+ "ConfigGenerateSpeech",
+ "ConfigGenerateVideo",
+ "ConfigGenerateVideoHailuoI2VPro",
+ "ConfigGenerateVideoHailuoI2VStandard",
+ "ConfigGenerateVideoHailuoT2VPro",
+ "ConfigGenerateVideoHailuoT2VStandard",
+ "ConfigGenerateVideoKlingI2VMaster",
+ "ConfigGenerateVideoKlingI2VPro",
+ "ConfigGenerateVideoKlingI2VStandard",
+ "ConfigGenerateVideoSeedanceProI2V",
+ "ConfigGenerateVideoSeedanceProT2V",
+ "ConfigGenerateVideoVeo2I2V",
+ "ConfigGenerateVideoVeo2T2V",
+ "ConfigGenerateVideoVeo3",
+ "ConfigGenerateVideoVeo3Fast",
+ "Display_Text",
+ "FramesToSeconds",
+ "GenerateImage",
+ "GenerateLyrics",
+ "GenerateMusic",
+ "GenerateSpeech",
+ "GenerateVideo",
+ "HighLowSNR",
+ "ImageComparer",
+ "JoinStringsMulti",
+ "LLMPromptManager",
+ "LLMToolkitProviderSelector",
+ "LLMToolkitTextGenerator",
+ "LLMToolkitTextGeneratorStream",
+ "LoadAudioFromPath",
+ "LoadVideoFromPath",
+ "LocalTransformersProviderNode",
+ "ModelListFetcherNode",
+ "PlayRandomSound",
+ "PreviewImageLogic",
+ "PreviewOutputs",
+ "PreviewVideo",
+ "ResolutionSelector",
+ "StylePromptGenerator",
+ "SwitchAny",
+ "SwitchAnyRoute",
+ "SwitchAnyRoute_wANY",
+ "SwitchAny_wANY",
+ "SystemPromptTaskGenerator",
+ "TestAPIKeyContext",
+ "UpscaleVideo"
+ ],
+ {
+ "author": "ComfyDeploy",
+ "description": "llm toolkit",
+ "nickname": "llm_toolkit",
+ "title": "llm toolkit",
+ "title_aux": "ComfyUI LLM Toolkit"
+ }
+ ],
+ "https://github.com/comfyanonymous/ComfyUI": [
+ [
+ "APG",
+ "AddNoise",
+ "AlignYourStepsScheduler",
+ "AudioAdjustVolume",
+ "AudioConcat",
+ "AudioEncoderEncode",
+ "AudioEncoderLoader",
+ "AudioMerge",
+ "AutogrowNamesTestNode",
+ "AutogrowPrefixTestNode",
+ "BasicGuider",
+ "BasicScheduler",
+ "BatchImagesMasksLatentsNode",
+ "BatchImagesNode",
+ "BatchLatentsNode",
+ "BatchMasksNode",
+ "BetaSamplingScheduler",
+ "BriaImageEditNode",
+ "ByteDanceFirstLastFrameNode",
+ "ByteDanceImageNode",
+ "ByteDanceImageReferenceNode",
+ "ByteDanceImageToVideoNode",
+ "ByteDanceSeedreamNode",
+ "ByteDanceTextToVideoNode",
+ "CFGGuider",
+ "CFGNorm",
+ "CFGZeroStar",
+ "CLIPAttentionMultiply",
+ "CLIPLoader",
+ "CLIPMergeAdd",
+ "CLIPMergeSimple",
+ "CLIPMergeSubtract",
+ "CLIPSave",
+ "CLIPSetLastLayer",
+ "CLIPTextEncode",
+ "CLIPTextEncodeControlnet",
+ "CLIPTextEncodeFlux",
+ "CLIPTextEncodeHiDream",
+ "CLIPTextEncodeHunyuanDiT",
+ "CLIPTextEncodeKandinsky5",
+ "CLIPTextEncodeLumina2",
+ "CLIPTextEncodePixArtAlpha",
+ "CLIPTextEncodeSD3",
+ "CLIPTextEncodeSDXL",
+ "CLIPTextEncodeSDXLRefiner",
+ "CLIPVisionEncode",
+ "CLIPVisionLoader",
+ "Canny",
+ "CaseConverter",
+ "CheckpointLoader",
+ "CheckpointLoaderSimple",
+ "CheckpointSave",
+ "ChromaRadianceOptions",
+ "ColorToRGBInt",
+ "ComboOptionTestNode",
+ "ComfySoftSwitchNode",
+ "ComfySwitchNode",
+ "ConditioningAverage",
+ "ConditioningCombine",
+ "ConditioningConcat",
+ "ConditioningSetArea",
+ "ConditioningSetAreaPercentage",
+ "ConditioningSetAreaPercentageVideo",
+ "ConditioningSetAreaStrength",
+ "ConditioningSetMask",
+ "ConditioningSetTimestepRange",
+ "ConditioningStableAudio",
+ "ConditioningZeroOut",
+ "ContextWindowsManual",
+ "ControlNetApply",
+ "ControlNetApplyAdvanced",
+ "ControlNetApplySD3",
+ "ControlNetInpaintingAliMamaApply",
+ "ControlNetLoader",
+ "ConvertStringToComboNode",
+ "CosmosImageToVideoLatent",
+ "CosmosPredict2ImageToVideoLatent",
+ "CreateList",
+ "CreateVideo",
+ "CropMask",
+ "CustomCombo",
+ "DCTestNode",
+ "DiffControlNetLoader",
+ "DifferentialDiffusion",
+ "DiffusersLoader",
+ "DisableNoise",
+ "DualCFGGuider",
+ "DualCLIPLoader",
+ "EasyCache",
+ "EmptyAceStep1.5LatentAudio",
+ "EmptyAceStepLatentAudio",
+ "EmptyAudio",
+ "EmptyChromaRadianceLatentImage",
+ "EmptyCosmosLatentVideo",
+ "EmptyFlux2LatentImage",
+ "EmptyHunyuanImageLatent",
+ "EmptyHunyuanLatentVideo",
+ "EmptyImage",
+ "EmptyLTXVLatentVideo",
+ "EmptyLatentAudio",
+ "EmptyLatentHunyuan3Dv2",
+ "EmptyLatentImage",
+ "EmptyMochiLatentVideo",
+ "EmptyQwenImageLayeredLatentImage",
+ "EmptySD3LatentImage",
+ "Epsilon Scaling",
+ "ExponentialScheduler",
+ "ExtendIntermediateSigmas",
+ "FeatherMask",
+ "FlipSigmas",
+ "Flux2ProImageNode",
+ "Flux2Scheduler",
+ "FluxDisableGuidance",
+ "FluxGuidance",
+ "FluxKontextImageScale",
+ "FluxKontextMultiReferenceLatentMethod",
+ "FluxKontextProImageNode",
+ "FluxProExpandNode",
+ "FluxProFillNode",
+ "FluxProUltraImageNode",
+ "FreSca",
+ "FreeU",
+ "FreeU_V2",
+ "GITSScheduler",
+ "GLIGENLoader",
+ "GLIGENTextBoxApply",
+ "GeminiImage2Node",
+ "GeminiImageNode",
+ "GeminiInputFiles",
+ "GeminiNode",
+ "GenerateTracks",
+ "GetImageSize",
+ "GetVideoComponents",
+ "GrokImageEditNode",
+ "GrokImageNode",
+ "GrokVideoEditNode",
+ "GrokVideoNode",
+ "GrowMask",
+ "HitPawGeneralImageEnhance",
+ "HitPawVideoEnhance",
+ "Hunyuan3Dv2Conditioning",
+ "Hunyuan3Dv2ConditioningMultiView",
+ "HunyuanImageToVideo",
+ "HunyuanRefinerLatent",
+ "HunyuanVideo15ImageToVideo",
+ "HunyuanVideo15LatentUpscaleWithModel",
+ "HunyuanVideo15SuperResolution",
+ "HyperTile",
+ "HypernetworkLoader",
+ "IdeogramV1",
+ "IdeogramV2",
+ "IdeogramV3",
+ "ImageAddNoise",
+ "ImageBatch",
+ "ImageBlend",
+ "ImageBlur",
+ "ImageColorToMask",
+ "ImageCompare",
+ "ImageCompositeMasked",
+ "ImageCrop",
+ "ImageFlip",
+ "ImageFromBatch",
+ "ImageInvert",
+ "ImageOnlyCheckpointLoader",
+ "ImageOnlyCheckpointSave",
+ "ImagePadForOutpaint",
+ "ImageProcessingNode",
+ "ImageQuantize",
+ "ImageRGBToYUV",
+ "ImageRotate",
+ "ImageScale",
+ "ImageScaleBy",
+ "ImageScaleToMaxDimension",
+ "ImageScaleToTotalPixels",
+ "ImageSharpen",
+ "ImageStitch",
+ "ImageToMask",
+ "ImageUpscaleWithModel",
+ "ImageYUVToRGB",
+ "InpaintModelConditioning",
+ "InstructPixToPixConditioning",
+ "InvertBooleanNode",
+ "InvertMask",
+ "JoinAudioChannels",
+ "JoinImageWithAlpha",
+ "KSampler",
+ "KSamplerAdvanced",
+ "KSamplerSelect",
+ "Kandinsky5ImageToVideo",
+ "KarrasScheduler",
+ "KlingCameraControlI2VNode",
+ "KlingCameraControlT2VNode",
+ "KlingCameraControls",
+ "KlingDualCharacterVideoEffectNode",
+ "KlingImage2VideoNode",
+ "KlingImageGenerationNode",
+ "KlingImageToVideoWithAudio",
+ "KlingLipSyncAudioToVideoNode",
+ "KlingLipSyncTextToVideoNode",
+ "KlingMotionControl",
+ "KlingOmniProEditVideoNode",
+ "KlingOmniProFirstLastFrameNode",
+ "KlingOmniProImageNode",
+ "KlingOmniProImageToVideoNode",
+ "KlingOmniProTextToVideoNode",
+ "KlingOmniProVideoToVideoNode",
+ "KlingSingleImageVideoEffectNode",
+ "KlingStartEndFrameNode",
+ "KlingTextToVideoNode",
+ "KlingTextToVideoWithAudio",
+ "KlingVideoExtendNode",
+ "KlingVirtualTryOnNode",
+ "LTXAVTextEncoderLoader",
+ "LTXVAddGuide",
+ "LTXVAudioVAEDecode",
+ "LTXVAudioVAEEncode",
+ "LTXVAudioVAELoader",
+ "LTXVConcatAVLatent",
+ "LTXVConditioning",
+ "LTXVCropGuides",
+ "LTXVEmptyLatentAudio",
+ "LTXVImgToVideo",
+ "LTXVImgToVideoInplace",
+ "LTXVLatentUpsampler",
+ "LTXVPreprocess",
+ "LTXVScheduler",
+ "LTXVSeparateAVLatent",
+ "LaplaceScheduler",
+ "LatentAdd",
+ "LatentApplyOperation",
+ "LatentApplyOperationCFG",
+ "LatentBatch",
+ "LatentBatchSeedBehavior",
+ "LatentBlend",
+ "LatentComposite",
+ "LatentCompositeMasked",
+ "LatentConcat",
+ "LatentCrop",
+ "LatentCut",
+ "LatentCutToBatch",
+ "LatentFlip",
+ "LatentFromBatch",
+ "LatentInterpolate",
+ "LatentMultiply",
+ "LatentOperationSharpen",
+ "LatentOperationTonemapReinhard",
+ "LatentRotate",
+ "LatentSubtract",
+ "LatentUpscale",
+ "LatentUpscaleBy",
+ "LatentUpscaleModelLoader",
+ "LazyCache",
+ "Load3D",
+ "LoadAudio",
+ "LoadImage",
+ "LoadImageDataSetFromFolder",
+ "LoadImageMask",
+ "LoadImageOutput",
+ "LoadImageTextDataSetFromFolder",
+ "LoadLatent",
+ "LoadTrainingDataset",
+ "LoadVideo",
+ "LoraLoader",
+ "LoraLoaderBypass",
+ "LoraLoaderBypassModelOnly",
+ "LoraLoaderModelOnly",
+ "LoraModelLoader",
+ "LoraSave",
+ "LossGraphNode",
+ "LotusConditioning",
+ "LtxvApiImageToVideo",
+ "LtxvApiTextToVideo",
+ "LumaConceptsNode",
+ "LumaImageModifyNode",
+ "LumaImageNode",
+ "LumaImageToVideoNode",
+ "LumaReferenceNode",
+ "LumaVideoNode",
+ "MagnificImageRelightNode",
+ "MagnificImageSkinEnhancerNode",
+ "MagnificImageStyleTransferNode",
+ "MagnificImageUpscalerCreativeNode",
+ "MagnificImageUpscalerPreciseV2Node",
+ "Mahiro",
+ "MakeTrainingDataset",
+ "ManualSigmas",
+ "MaskComposite",
+ "MaskPreview",
+ "MaskToImage",
+ "MeshyAnimateModelNode",
+ "MeshyImageToModelNode",
+ "MeshyMultiImageToModelNode",
+ "MeshyRefineNode",
+ "MeshyRigModelNode",
+ "MeshyTextToModelNode",
+ "MeshyTextureNode",
+ "MinimaxHailuoVideoNode",
+ "MinimaxImageToVideoNode",
+ "MinimaxSubjectToVideoNode",
+ "MinimaxTextToVideoNode",
+ "ModelComputeDtype",
+ "ModelMergeAdd",
+ "ModelMergeAuraflow",
+ "ModelMergeBlocks",
+ "ModelMergeCosmos14B",
+ "ModelMergeCosmos7B",
+ "ModelMergeCosmosPredict2_14B",
+ "ModelMergeCosmosPredict2_2B",
+ "ModelMergeFlux1",
+ "ModelMergeLTXV",
+ "ModelMergeMochiPreview",
+ "ModelMergeQwenImage",
+ "ModelMergeSD1",
+ "ModelMergeSD2",
+ "ModelMergeSD35_Large",
+ "ModelMergeSD3_2B",
+ "ModelMergeSDXL",
+ "ModelMergeSimple",
+ "ModelMergeSubtract",
+ "ModelMergeWAN2_1",
+ "ModelPatchLoader",
+ "ModelSamplingAuraFlow",
+ "ModelSamplingContinuousEDM",
+ "ModelSamplingContinuousV",
+ "ModelSamplingDiscrete",
+ "ModelSamplingFlux",
+ "ModelSamplingLTXV",
+ "ModelSamplingSD3",
+ "ModelSamplingStableCascade",
+ "ModelSave",
+ "MoonvalleyImg2VideoNode",
+ "MoonvalleyTxt2VideoNode",
+ "MoonvalleyVideo2VideoNode",
+ "Morphology",
+ "NormalizeVideoLatentStart",
+ "OpenAIChatConfig",
+ "OpenAIChatNode",
+ "OpenAIDalle2",
+ "OpenAIDalle3",
+ "OpenAIGPTImage1",
+ "OpenAIInputFiles",
+ "OpenAIVideoSora2",
+ "OptimalStepsScheduler",
+ "PatchModelAddDownscale",
+ "PerpNeg",
+ "PerpNegGuider",
+ "PerturbedAttentionGuidance",
+ "PhotoMakerEncode",
+ "PhotoMakerLoader",
+ "PixverseImageToVideoNode",
+ "PixverseTemplateNode",
+ "PixverseTextToVideoNode",
+ "PixverseTransitionVideoNode",
+ "PolyexponentialScheduler",
+ "PorterDuffImageComposite",
+ "Preview3D",
+ "PreviewAny",
+ "PreviewAudio",
+ "PreviewImage",
+ "PrimitiveBoolean",
+ "PrimitiveFloat",
+ "PrimitiveInt",
+ "PrimitiveString",
+ "PrimitiveStringMultiline",
+ "QuadrupleCLIPLoader",
+ "QwenImageDiffsynthControlnet",
+ "RandomNoise",
+ "RebatchImages",
+ "RebatchLatents",
+ "RecordAudio",
+ "RecraftColorRGB",
+ "RecraftControls",
+ "RecraftCreateStyleNode",
+ "RecraftCrispUpscaleNode",
+ "RecraftImageInpaintingNode",
+ "RecraftImageToImageNode",
+ "RecraftRemoveBackgroundNode",
+ "RecraftReplaceBackgroundNode",
+ "RecraftStyleV3InfiniteStyleLibrary",
+ "RecraftStyleV3RealisticImage",
+ "RecraftTextToImageNode",
+ "RecraftTextToVectorNode",
+ "RecraftVectorizeImageNode",
+ "ReferenceLatent",
+ "ReferenceTimbreAudio",
+ "RegexExtract",
+ "RegexMatch",
+ "RegexReplace",
+ "RenormCFG",
+ "RepeatImageBatch",
+ "RepeatLatentBatch",
+ "ReplaceVideoLatentFrames",
+ "RescaleCFG",
+ "ResizeAndPadImage",
+ "ResizeImageMaskNode",
+ "ResolutionBucket",
+ "Rodin3D_Detail",
+ "Rodin3D_Gen2",
+ "Rodin3D_Regular",
+ "Rodin3D_Sketch",
+ "Rodin3D_Smooth",
+ "RunwayFirstLastFrameNode",
+ "RunwayImageToVideoNodeGen3a",
+ "RunwayImageToVideoNodeGen4",
+ "RunwayTextToImageNode",
+ "SDTurboScheduler",
+ "SD_4XUpscale_Conditioning",
+ "SV3D_Conditioning",
+ "SVD_img2vid_Conditioning",
+ "SamplerCustom",
+ "SamplerCustomAdvanced",
+ "SamplerDPMAdaptative",
+ "SamplerDPMPP_2M_SDE",
+ "SamplerDPMPP_2S_Ancestral",
+ "SamplerDPMPP_3M_SDE",
+ "SamplerDPMPP_SDE",
+ "SamplerER_SDE",
+ "SamplerEulerAncestral",
+ "SamplerEulerAncestralCFGPP",
+ "SamplerEulerCFGpp",
+ "SamplerLCMUpscale",
+ "SamplerLMS",
+ "SamplerSASolver",
+ "SamplerSEEDS2",
+ "SamplingPercentToSigma",
+ "SaveAnimatedPNG",
+ "SaveAnimatedWEBP",
+ "SaveAudio",
+ "SaveAudioMP3",
+ "SaveAudioOpus",
+ "SaveGLB",
+ "SaveImage",
+ "SaveImageDataSetToFolder",
+ "SaveImageTextDataSetToFolder",
+ "SaveImageWebsocket",
+ "SaveLatent",
+ "SaveLoRA",
+ "SaveSVGNode",
+ "SaveTrainingDataset",
+ "SaveVideo",
+ "SaveWEBM",
+ "ScaleROPE",
+ "SelfAttentionGuidance",
+ "SetFirstSigma",
+ "SetLatentNoiseMask",
+ "SetUnionControlNetType",
+ "ShuffleImageTextDataset",
+ "SkipLayerGuidanceDiT",
+ "SkipLayerGuidanceDiTSimple",
+ "SkipLayerGuidanceSD3",
+ "SolidMask",
+ "SplitAudioChannels",
+ "SplitImageWithAlpha",
+ "SplitSigmas",
+ "SplitSigmasDenoise",
+ "StabilityAudioInpaint",
+ "StabilityAudioToAudio",
+ "StabilityStableImageSD_3_5Node",
+ "StabilityStableImageUltraNode",
+ "StabilityTextToAudio",
+ "StabilityUpscaleConservativeNode",
+ "StabilityUpscaleCreativeNode",
+ "StabilityUpscaleFastNode",
+ "StableCascade_EmptyLatentImage",
+ "StableCascade_StageB_Conditioning",
+ "StableCascade_StageC_VAEEncode",
+ "StableCascade_SuperResolutionControlnet",
+ "StableZero123_Conditioning",
+ "StableZero123_Conditioning_Batched",
+ "StringCompare",
+ "StringConcatenate",
+ "StringContains",
+ "StringLength",
+ "StringReplace",
+ "StringSubstring",
+ "StringTrim",
+ "StubConstantImage",
+ "StubFloat",
+ "StubImage",
+ "StubInt",
+ "StubMask",
+ "StyleModelApply",
+ "StyleModelLoader",
+ "T5TokenizerOptions",
+ "TCFG",
+ "TemporalScoreRescaling",
+ "TencentImageToModelNode",
+ "TencentTextToModelNode",
+ "TestAccumulateNode",
+ "TestAccumulationGetItemNode",
+ "TestAccumulationGetLengthNode",
+ "TestAccumulationHeadNode",
+ "TestAccumulationSetItemNode",
+ "TestAccumulationTailNode",
+ "TestAccumulationToListNode",
+ "TestAsyncBatchProcessing",
+ "TestAsyncConcurrentLimit",
+ "TestAsyncError",
+ "TestAsyncLazyCheck",
+ "TestAsyncProgressUpdate",
+ "TestAsyncResourceUser",
+ "TestAsyncTimeout",
+ "TestAsyncValidation",
+ "TestAsyncValidationError",
+ "TestBoolOperationNode",
+ "TestCustomIsChanged",
+ "TestCustomValidation1",
+ "TestCustomValidation2",
+ "TestCustomValidation3",
+ "TestCustomValidation4",
+ "TestCustomValidation5",
+ "TestDynamicAsyncGeneration",
+ "TestDynamicDependencyCycle",
+ "TestExecutionBlocker",
+ "TestFloatConditions",
+ "TestForLoopClose",
+ "TestForLoopOpen",
+ "TestIntConditions",
+ "TestIntMathOperation",
+ "TestIsChangedWithConstants",
+ "TestLazyMixImages",
+ "TestListToAccumulationNode",
+ "TestMakeListNode",
+ "TestMixedExpansionReturns",
+ "TestOutputNodeWithSocketOutput",
+ "TestParallelSleep",
+ "TestSamplingInExpansion",
+ "TestSleep",
+ "TestStringConditions",
+ "TestSyncError",
+ "TestSyncProgressUpdate",
+ "TestToBoolNode",
+ "TestVariadicAverage",
+ "TestWhileLoopClose",
+ "TestWhileLoopOpen",
+ "TextEncodeAceStepAudio",
+ "TextEncodeAceStepAudio1.5",
+ "TextEncodeHunyuanVideo_ImageToVideo",
+ "TextEncodeQwenImageEdit",
+ "TextEncodeQwenImageEditPlus",
+ "TextEncodeZImageOmni",
+ "TextProcessingNode",
+ "ThresholdMask",
+ "TomePatchModel",
+ "TopazImageEnhance",
+ "TopazVideoEnhance",
+ "TorchCompileModel",
+ "TrainLoraNode",
+ "TrimAudioDuration",
+ "TrimVideoLatent",
+ "TripleCLIPLoader",
+ "TripoConversionNode",
+ "TripoImageToModelNode",
+ "TripoMultiviewToModelNode",
+ "TripoRefineNode",
+ "TripoRetargetNode",
+ "TripoRigNode",
+ "TripoTextToModelNode",
+ "TripoTextureNode",
+ "UNETLoader",
+ "UNetCrossAttentionMultiply",
+ "UNetSelfAttentionMultiply",
+ "UNetTemporalAttentionMultiply",
+ "USOStyleReference",
+ "UpscaleModelLoader",
+ "VAEDecode",
+ "VAEDecodeAudio",
+ "VAEDecodeAudioTiled",
+ "VAEDecodeHunyuan3D",
+ "VAEDecodeTiled",
+ "VAEEncode",
+ "VAEEncodeAudio",
+ "VAEEncodeForInpaint",
+ "VAEEncodeTiled",
+ "VAELoader",
+ "VAESave",
+ "VPScheduler",
+ "Veo3FirstLastFrameNode",
+ "VeoVideoGenerationNode",
+ "VideoLinearCFGGuidance",
+ "VideoTriangleCFGGuidance",
+ "Vidu2ImageToVideoNode",
+ "Vidu2ReferenceVideoNode",
+ "Vidu2StartEndToVideoNode",
+ "Vidu2TextToVideoNode",
+ "Vidu3ImageToVideoNode",
+ "Vidu3TextToVideoNode",
+ "ViduExtendVideoNode",
+ "ViduImageToVideoNode",
+ "ViduMultiFrameVideoNode",
+ "ViduReferenceVideoNode",
+ "ViduStartEndToVideoNode",
+ "ViduTextToVideoNode",
+ "VoxelToMesh",
+ "VoxelToMeshBasic",
+ "Wan22FunControlToVideo",
+ "Wan22ImageToVideoLatent",
+ "WanAnimateToVideo",
+ "WanCameraEmbedding",
+ "WanCameraImageToVideo",
+ "WanFirstLastFrameToVideo",
+ "WanFunControlToVideo",
+ "WanFunInpaintToVideo",
+ "WanHuMoImageToVideo",
+ "WanImageToImageApi",
+ "WanImageToVideo",
+ "WanImageToVideoApi",
+ "WanInfiniteTalkToVideo",
+ "WanMoveConcatTrack",
+ "WanMoveTrackToVideo",
+ "WanMoveTracksFromCoords",
+ "WanMoveVisualizeTracks",
+ "WanPhantomSubjectToVideo",
+ "WanReferenceVideoApi",
+ "WanSoundImageToVideo",
+ "WanSoundImageToVideoExtend",
+ "WanTextToImageApi",
+ "WanTextToVideoApi",
+ "WanTrackToVideo",
+ "WanVaceToVideo",
+ "WavespeedFlashVSRNode",
+ "WavespeedImageUpscaleNode",
+ "WebcamCapture",
+ "ZImageFunControlnet",
+ "unCLIPCheckpointLoader",
+ "unCLIPConditioning",
+ "wanBlockSwap"
+ ],
+ {
+ "title_aux": "ComfyUI"
+ }
+ ],
+ "https://github.com/comfyanonymous/ComfyUI_TensorRT": [
+ [
+ "DYNAMIC_TRT_MODEL_CONVERSION",
+ "STATIC TRT_MODEL CONVERSION",
+ "STATIC_TRT_MODEL_CONVERSION",
+ "TensorRTLoader"
+ ],
+ {
+ "title_aux": "TensorRT Node for ComfyUI"
+ }
+ ],
+ "https://github.com/comfyanonymous/ComfyUI_experiments": [
+ [
+ "ModelMergeBlockNumber",
+ "ModelMergeSDXL",
+ "ModelMergeSDXLDetailedTransformers",
+ "ModelMergeSDXLTransformers",
+ "ModelSamplerTonemapNoiseTest",
+ "ReferenceOnlySimple",
+ "RescaleClassifierFreeGuidanceTest",
+ "TonemapNoiseWithRescaleCFG"
+ ],
+ {
+ "title_aux": "ComfyUI_experiments"
+ }
+ ],
+ "https://github.com/comfyui/snacknodes": [
+ [
+ "ImageInfo",
+ "ImageScaler",
+ "TextBox",
+ "TextProcessor"
+ ],
+ {}
+ ],
+ "https://github.com/comfyuistudio/ComfyUI-Studio-nodes": [
+ [
+ "AspectRatioImageSize",
+ "AspectRatioResizeImage",
+ "GitCloneManager",
+ "HuggingFaceDownloader",
+ "MarkdownModelNote",
+ "TransparentVideoSave"
+ ],
+ {
+ "title_aux": "ComfyUI-Studio-nodes"
+ }
+ ],
+ "https://github.com/comnote-max/builmenlabo": [
+ [
+ "GeminiPoseAnalyzer",
+ "LlamaCppAIO",
+ "LlamaCppCompleteUnload",
+ "LlamaCppGenerate",
+ "LlamaCppLoader",
+ "LlamaCppMemoryInfo",
+ "LlamaCppSafeUnload",
+ "LlamaCppUnload",
+ "MultiControlNetLoader",
+ "PromptTranslator"
+ ],
+ {
+ "nodename_pattern": "builmenlabo",
+ "title_aux": "ComfyUI builmenlabo - Unified Package"
+ }
+ ],
+ "https://github.com/comrender/ComfyUI-NanoB-Edit-Gemini": [
+ [
+ "NanoBEditGemini"
+ ],
+ {
+ "title_aux": "ComfyUI-NanoB-Edit-Gemini"
+ }
+ ],
+ "https://github.com/comrender/ComfyUI-NanoSeed": [
+ [
+ "NanoSeedEdit"
+ ],
+ {
+ "title_aux": "ComfyUI-NanoSeed"
+ }
+ ],
+ "https://github.com/comrender/ComfyUI-Topaz-Upscaler": [
+ [
+ "TopazUpscaler"
+ ],
+ {
+ "title_aux": "ComfyUI-Topaz-Upscaler"
+ }
+ ],
+ "https://github.com/concarne000/ComfyUI-Stacker": [
+ [
+ "StackPopFloat",
+ "StackPopImage",
+ "StackPopInt",
+ "StackPopObject",
+ "StackPopString",
+ "StackPushFloat",
+ "StackPushImage",
+ "StackPushInt",
+ "StackPushObject",
+ "StackPushString"
+ ],
+ {
+ "title_aux": "ComfyUI-Stacker"
+ }
+ ],
+ "https://github.com/concarne000/ConCarneNode": [
+ [
+ "BingImageGrabber",
+ "Hermes",
+ "Zephyr"
+ ],
+ {
+ "title_aux": "ConCarneNode"
+ }
+ ],
+ "https://github.com/conquestace/ComfyUI-ImageUploader": [
+ [
+ "ImageUploader"
+ ],
+ {
+ "author": "ConquestAce",
+ "description": "Upload to temporary websites with API.",
+ "nickname": "Image Uploader",
+ "title": "Image Uploader",
+ "title_aux": "Image Uploader"
+ }
+ ],
+ "https://github.com/coreyryanhanson/ComfyQR": [
+ [
+ "comfy-qr-by-image-size",
+ "comfy-qr-by-module-size",
+ "comfy-qr-by-module-split",
+ "comfy-qr-mask_errors"
+ ],
+ {
+ "title_aux": "ComfyQR"
+ }
+ ],
+ "https://github.com/coreyryanhanson/ComfyQR-scanning-nodes": [
+ [
+ "comfy-qr-read",
+ "comfy-qr-validate"
+ ],
+ {
+ "title_aux": "ComfyQR-scanning-nodes"
+ }
+ ],
+ "https://github.com/coulterj/comfyui-svg-visual-normalize": [
+ [
+ "SVGVisualBoundsNormalize"
+ ],
+ {
+ "title_aux": "ComfyUI SVG Visual Normalize & Margin Node"
+ }
+ ],
+ "https://github.com/cozy-comfyui/cozy_comm": [
+ [
+ "CozyDiscordPost"
+ ],
+ {
+ "nodename_pattern": " \\(cozy\\)",
+ "title_aux": "Cozy Communication"
+ }
+ ],
+ "https://github.com/cozymantis/cozy-utils-comfyui-nodes": [
+ [
+ "Cozy Sampler Options"
+ ],
+ {
+ "title_aux": "Cozy Utils"
+ }
+ ],
+ "https://github.com/cozymantis/human-parser-comfyui-node": [
+ [
+ "Cozy Human Parser ATR",
+ "Cozy Human Parser LIP",
+ "Cozy Human Parser Pascal"
+ ],
+ {
+ "title_aux": "Cozy Human Parser"
+ }
+ ],
+ "https://github.com/cozymantis/pose-generator-comfyui-node": [
+ [
+ "Cozy Pose Body Reference",
+ "Cozy Pose Face Reference"
+ ],
+ {
+ "title_aux": "Cozy Reference Pose Generator"
+ }
+ ],
+ "https://github.com/cr7Por/ComfyUI_DepthFlow": [
+ [
+ "DepthFlow Simple",
+ "DepthFlowSimple"
+ ],
+ {
+ "title_aux": "ComfyUI_DepthFlow"
+ }
+ ],
+ "https://github.com/craig-tanaka/comfyui_animeseg": [
+ [
+ "AdvancedAnimeSeg",
+ "SimpleAnimeSeg"
+ ],
+ {
+ "title_aux": "ComfyUI Anime Segmentation Nodes v1.1.0"
+ }
+ ],
+ "https://github.com/crave33/RenesStuffDanbooruTagGet": [
+ [
+ "DanbooruTagFetcher"
+ ],
+ {
+ "title_aux": "RenesStuffDanboruTagGet"
+ }
+ ],
+ "https://github.com/cristian1980/ComfyUI-Caption-Cleaner": [
+ [
+ "CleanCaptionNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Caption-Cleaner"
+ }
+ ],
+ "https://github.com/crystian/ComfyUI-Crystools": [
+ [],
+ {
+ "author": "Crystian",
+ "description": "Plugins for multiples uses, mainly for debugging, you need them! IG: https://www.instagram.com/crystian.ia",
+ "nickname": "Crystools",
+ "nodename_pattern": " \\[Crystools\\]$",
+ "title": "Crystools",
+ "title_aux": "Crystools"
+ }
+ ],
+ "https://github.com/cuban044/ComfyUI-Veo3-Experimental": [
+ [
+ "Veo3TextToVideo",
+ "Veo3ToVHS",
+ "Veo3VideoPreview"
+ ],
+ {
+ "title_aux": "[Unofficial] ComfyUI-Veo3-Experimental"
+ }
+ ],
+ "https://github.com/cubiq/Block_Patcher_ComfyUI": [
+ [
+ "FluxBlockPatcherSampler",
+ "FluxBlockShareKV",
+ "PlotBlockParams"
+ ],
+ {
+ "title_aux": "Flux blocks patcher sampler"
+ }
+ ],
+ "https://github.com/cubiq/ComfyUI_FaceAnalysis": [
+ [
+ "FaceAlign",
+ "FaceAnalysisModels",
+ "FaceBoundingBox",
+ "FaceEmbedDistance",
+ "FaceSegmentation",
+ "FaceWarp"
+ ],
+ {
+ "title_aux": "Face Analysis for ComfyUI"
+ }
+ ],
+ "https://github.com/cubiq/ComfyUI_IPAdapter_plus": [
+ [
+ "IPAAdapterFaceIDBatch",
+ "IPAdapter",
+ "IPAdapterAdvanced",
+ "IPAdapterBatch",
+ "IPAdapterClipVisionEnhancer",
+ "IPAdapterClipVisionEnhancerBatch",
+ "IPAdapterCombineEmbeds",
+ "IPAdapterCombineParams",
+ "IPAdapterCombineWeights",
+ "IPAdapterEmbeds",
+ "IPAdapterEmbedsBatch",
+ "IPAdapterEncoder",
+ "IPAdapterFaceID",
+ "IPAdapterFaceIDKolors",
+ "IPAdapterFromParams",
+ "IPAdapterInsightFaceLoader",
+ "IPAdapterLoadEmbeds",
+ "IPAdapterMS",
+ "IPAdapterModelLoader",
+ "IPAdapterNoise",
+ "IPAdapterPreciseComposition",
+ "IPAdapterPreciseCompositionBatch",
+ "IPAdapterPreciseStyleTransfer",
+ "IPAdapterPreciseStyleTransferBatch",
+ "IPAdapterPromptScheduleFromWeightsStrategy",
+ "IPAdapterRegionalConditioning",
+ "IPAdapterSaveEmbeds",
+ "IPAdapterStyleComposition",
+ "IPAdapterStyleCompositionBatch",
+ "IPAdapterTiled",
+ "IPAdapterTiledBatch",
+ "IPAdapterUnifiedLoader",
+ "IPAdapterUnifiedLoaderCommunity",
+ "IPAdapterUnifiedLoaderFaceID",
+ "IPAdapterWeights",
+ "IPAdapterWeightsFromStrategy",
+ "PrepImageForClipVision"
+ ],
+ {
+ "preemptions": [
+ "IPAAdapterFaceIDBatch",
+ "IPAdapter",
+ "IPAdapterAdvanced",
+ "IPAdapterBatch",
+ "IPAdapterClipVisionEnhancer",
+ "IPAdapterClipVisionEnhancerBatch",
+ "IPAdapterCombineEmbeds",
+ "IPAdapterCombineParams",
+ "IPAdapterCombineWeights",
+ "IPAdapterEmbeds",
+ "IPAdapterEmbedsBatch",
+ "IPAdapterEncoder",
+ "IPAdapterFaceID",
+ "IPAdapterFromParams",
+ "IPAdapterInsightFaceLoader",
+ "IPAdapterLoadEmbeds",
+ "IPAdapterMS",
+ "IPAdapterModelLoader",
+ "IPAdapterNoise",
+ "IPAdapterPreciseComposition",
+ "IPAdapterPreciseCompositionBatch",
+ "IPAdapterPreciseStyleTransfer",
+ "IPAdapterPreciseStyleTransferBatch",
+ "IPAdapterPromptScheduleFromWeightsStrategy",
+ "IPAdapterRegionalConditioning",
+ "IPAdapterSaveEmbeds",
+ "IPAdapterStyleComposition",
+ "IPAdapterStyleCompositionBatch",
+ "IPAdapterTiled",
+ "IPAdapterTiledBatch",
+ "IPAdapterUnifiedLoader",
+ "IPAdapterUnifiedLoaderCommunity",
+ "IPAdapterUnifiedLoaderFaceID",
+ "IPAdapterWeights",
+ "IPAdapterWeightsFromStrategy",
+ "PrepImageForClipVision"
+ ],
+ "title_aux": "ComfyUI_IPAdapter_plus"
+ }
+ ],
+ "https://github.com/cubiq/ComfyUI_InstantID": [
+ [
+ "ApplyInstantID",
+ "ApplyInstantIDAdvanced",
+ "ApplyInstantIDControlNet",
+ "FaceKeypointsPreprocessor",
+ "InstantIDAttentionPatch",
+ "InstantIDFaceAnalysis",
+ "InstantIDModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI InstantID (Native Support)"
+ }
+ ],
+ "https://github.com/cubiq/ComfyUI_essentials": [
+ [
+ "ApplyCLIPSeg+",
+ "BatchCount+",
+ "CLIPTextEncodeSDXL+",
+ "ConditioningCombineMultiple+",
+ "ConsoleDebug+",
+ "DebugTensorShape+",
+ "DisplayAny",
+ "DrawText+",
+ "FluxAttentionSeeker+",
+ "FluxBlocksBuster+",
+ "FluxSamplerParams+",
+ "GetImageSize+",
+ "GuidanceTimestepping+",
+ "ImageApplyLUT+",
+ "ImageBatchMultiple+",
+ "ImageBatchToList+",
+ "ImageCASharpening+",
+ "ImageColorMatch+",
+ "ImageColorMatchAdobe+",
+ "ImageComposite+",
+ "ImageCompositeFromMaskBatch+",
+ "ImageCrop+",
+ "ImageDesaturate+",
+ "ImageEnhanceDifference+",
+ "ImageExpandBatch+",
+ "ImageFlip+",
+ "ImageFromBatch+",
+ "ImageHistogramMatch+",
+ "ImageListToBatch+",
+ "ImagePosterize+",
+ "ImagePreviewFromLatent+",
+ "ImageRandomTransform+",
+ "ImageRemoveAlpha+",
+ "ImageRemoveBackground+",
+ "ImageResize+",
+ "ImageSeamCarving+",
+ "ImageSmartSharpen+",
+ "ImageTile+",
+ "ImageToDevice+",
+ "ImageUntile+",
+ "InjectLatentNoise+",
+ "KSamplerVariationsStochastic+",
+ "KSamplerVariationsWithNoise+",
+ "LoadCLIPSegModels+",
+ "LorasForFluxParams+",
+ "MaskBatch+",
+ "MaskBlur+",
+ "MaskBoundingBox+",
+ "MaskExpandBatch+",
+ "MaskFix+",
+ "MaskFlip+",
+ "MaskFromBatch+",
+ "MaskFromColor+",
+ "MaskFromList+",
+ "MaskFromRGBCMYBW+",
+ "MaskFromSegmentation+",
+ "MaskPreview+",
+ "MaskSmooth+",
+ "ModelCompile+",
+ "ModelSamplingSD3Advanced+",
+ "NoiseFromImage+",
+ "PixelOEPixelize+",
+ "PlotParameters+",
+ "RemBGSession+",
+ "RemoveLatentMask+",
+ "SD3AttentionSeekerLG+",
+ "SD3AttentionSeekerT5+",
+ "SD3NegativeConditioning+",
+ "SDXLEmptyLatentSizePicker+",
+ "SamplerSelectHelper+",
+ "SchedulerSelectHelper+",
+ "SimpleComparison+",
+ "SimpleCondition+",
+ "SimpleMath+",
+ "SimpleMathBoolean+",
+ "SimpleMathCondition+",
+ "SimpleMathDual+",
+ "SimpleMathFloat+",
+ "SimpleMathInt+",
+ "SimpleMathPercent+",
+ "SimpleMathSlider+",
+ "SimpleMathSliderLowRes+",
+ "TextEncodeForSamplerParams+",
+ "TransitionMask+",
+ "TransparentBGSession+"
+ ],
+ {
+ "title_aux": "ComfyUI Essentials"
+ }
+ ],
+ "https://github.com/cubiq/PuLID_ComfyUI": [
+ [
+ "ApplyPulid",
+ "ApplyPulidAdvanced",
+ "PulidEvaClipLoader",
+ "PulidInsightFaceLoader",
+ "PulidModelLoader"
+ ],
+ {
+ "title_aux": "PuLID_ComfyUI"
+ }
+ ],
+ "https://github.com/cuongloveit/comfy_http_request": [
+ [
+ "Send Http Request",
+ "Send Http request"
+ ],
+ {
+ "title_aux": "comfy_http_request"
+ }
+ ],
+ "https://github.com/curiousjp/ComfyUI-MaskBatchPermutations": [
+ [
+ "CombinatorialDetailer",
+ "FlattenAgainstOriginal",
+ "PermuteMaskBatch"
+ ],
+ {
+ "title_aux": "ComfyUI-MaskBatchPermutations"
+ }
+ ],
+ "https://github.com/cyan9977/ComfyUI_PromptQueue": [
+ [
+ "NegativePromptQueue",
+ "SimpleStylePromptQueue",
+ "SimpleStylePromptQueueBatch",
+ "StylePromptQueue",
+ "StylePromptQueueBatch"
+ ],
+ {
+ "title_aux": "ComfyUI_PromptQueue"
+ }
+ ],
+ "https://github.com/cyberhirsch/seb_nodes": [
+ [
+ "AspectRatioSeb",
+ "DepthInpaintSeb",
+ "SaveImageSeb",
+ "SwitchMasksSeb",
+ "SwitchSeb",
+ "UnifiedPrompterSeb"
+ ],
+ {
+ "title_aux": "Seb Nodes"
+ }
+ ],
+ "https://github.com/cybernaut4/comfyui_arkl1te_toolkit": [
+ [
+ "AnythingToString",
+ "Concatenate",
+ "CountFilesInDirectory",
+ "GetNewFileIndex",
+ "PadZeroes"
+ ],
+ {
+ "title_aux": "Arkl1te's Toolkit"
+ }
+ ],
+ "https://github.com/czcz1024/Comfyui-FaceCompare": [
+ [
+ "FaceCompare"
+ ],
+ {
+ "author": "czcz1024",
+ "description": "Face Compare",
+ "nickname": "Face Compare",
+ "title": "Face Compare",
+ "title_aux": "Face Compare"
+ }
+ ],
+ "https://github.com/d3cker/comfyui_remove_background": [
+ [
+ "RemoveBackground"
+ ],
+ {
+ "title_aux": "comfyui_remove_background"
+ }
+ ],
+ "https://github.com/da2el-ai/ComfyUI-d2-send-eagle": [
+ [
+ "D2 Send Eagle"
+ ],
+ {
+ "author": "da2el",
+ "description": "Send images to Eagle, an image management application",
+ "title": "D2 Send Eagle",
+ "title_aux": "D2 Send Eagle"
+ }
+ ],
+ "https://github.com/da2el-ai/ComfyUI-d2-size-selector": [
+ [
+ "D2_SizeSelector"
+ ],
+ {
+ "author": "da2el",
+ "description": "Easy select image size",
+ "title": "D2 Size Selector",
+ "title_aux": "D2 Size Selector"
+ }
+ ],
+ "https://github.com/da2el-ai/ComfyUI-d2-steps": [
+ [
+ "D2 Refiner Steps",
+ "D2 Refiner Steps A1111",
+ "D2 Refiner Steps Tester"
+ ],
+ {
+ "author": "da2el",
+ "description": "Calculate the steps for the refiner",
+ "title": "D2 Steps",
+ "title_aux": "D2 Steps"
+ }
+ ],
+ "https://github.com/da2el-ai/ComfyUI-d2-xyplot-utils": [
+ [
+ "D2 Checkpoint Loader",
+ "D2 Multi Output",
+ "D2 Prompt SR",
+ "D2 Regex Switcher"
+ ],
+ {
+ "author": "da2el",
+ "description": "A parameter output node compatible with qq-nodes-comfyui. It outputs parameters such as Prompt S/R and seed.",
+ "title": "D2 XYPlot Utils",
+ "title_aux": "D2 XYPlot Utils"
+ }
+ ],
+ "https://github.com/da2el-ai/D2-SavePSD-ComfyUI": [
+ [
+ "D2 Apply Alpha Channel",
+ "D2 Extract Alpha",
+ "D2 Save PSD"
+ ],
+ {
+ "author": "da2el",
+ "description": "",
+ "title": "D2 Save PSD",
+ "title_aux": "D2-SavePSD-ComfyUI"
+ }
+ ],
+ "https://github.com/da2el-ai/D2-nodes-ComfyUI": [
+ [
+ "D2 Any Delivery",
+ "D2 Checkpoint Loader",
+ "D2 Controlnet Loader",
+ "D2 Cut By Mask",
+ "D2 EmptyImage Alpha",
+ "D2 Filename Template",
+ "D2 Filename Template2",
+ "D2 Folder Image Queue",
+ "D2 Get Image Size",
+ "D2 Grid Image",
+ "D2 Image Mask Stack",
+ "D2 Image Resize",
+ "D2 Image Stack",
+ "D2 KSampler",
+ "D2 KSampler(Advanced)",
+ "D2 List To String",
+ "D2 Load Folder Images",
+ "D2 Load Image",
+ "D2 Load Lora",
+ "D2 Model and CLIP Merge SDXL",
+ "D2 Mosaic Filter",
+ "D2 Multi Output",
+ "D2 Paste By Mask",
+ "D2 Pipe",
+ "D2 Preview Image",
+ "D2 Prompt",
+ "D2 Refiner Steps",
+ "D2 Refiner Steps A1111",
+ "D2 Refiner Steps Tester",
+ "D2 Regex Replace",
+ "D2 Regex Switcher",
+ "D2 Resize Calculator",
+ "D2 Save Image",
+ "D2 Save Image Eagle",
+ "D2 Send File Eagle",
+ "D2 Size Selector",
+ "D2 Token Counter",
+ "D2 XY Annotation",
+ "D2 XY Folder Images",
+ "D2 XY Grid Image",
+ "D2 XY List To Plot",
+ "D2 XY Model List",
+ "D2 XY Plot",
+ "D2 XY Plot Easy",
+ "D2 XY Plot Easy Mini",
+ "D2 XY Prompt SR",
+ "D2 XY Prompt SR2",
+ "D2 XY Seed",
+ "D2 XY Seed2",
+ "D2 XY String To Plot",
+ "D2 XY Upload Image"
+ ],
+ {
+ "author": "da2el",
+ "description": "A Collection of Handy Custom Nodes for ComfyUI",
+ "title": "D2 Nodes",
+ "title_aux": "D2 Nodes ComfyUI"
+ }
+ ],
+ "https://github.com/dadoirie/ComfyUI_Dados_Nodes": [
+ [
+ "DN_CSVMultiDropDownNode",
+ "DN_ChutesChromaImageNode",
+ "DN_ChutesFluxImageNode",
+ "DN_ChutesHiDreamNode",
+ "DN_ChutesHunyuanImage3Node",
+ "DN_ChutesIllustriousNode",
+ "DN_ChutesImageGenNode",
+ "DN_ChutesImageToVideoNode",
+ "DN_ChutesLLMNode",
+ "DN_ChutesNetaLuminaNode",
+ "DN_ChutesParallelImageNode",
+ "DN_ChutesQwenImageEditNode",
+ "DN_ChutesQwenImageNode",
+ "DN_ChutesSDxlNode",
+ "DN_ChutesTextToVideoNode",
+ "DN_GroqLLMNode",
+ "DN_ImageBatcher",
+ "DN_JoyTaggerNode",
+ "DN_MemoryStorage",
+ "DN_MultilineString",
+ "DN_PixAITaggerNode",
+ "DN_PreviewImage",
+ "DN_PromptSectionsExtractor",
+ "DN_SmolVLMNode",
+ "DN_TagOpsNode",
+ "DN_TextConcatenateNode",
+ "DN_TextDropDownNode",
+ "DN_WildcardPromptEditorNode",
+ "DN_WildcardSelectorComposerV2",
+ "DN_WildcardsProcessor",
+ "DN_pyPinNode"
+ ],
+ {
+ "author": "Dado",
+ "description": "Utilities for creating and analyzing wildcard JSON structures.",
+ "title": "Wildcard Structure Utils",
+ "title_aux": "ComfyUI_Dados_Nodes"
+ }
+ ],
+ "https://github.com/daehwa00/ComfyUI-NanoBananaAPI": [
+ [
+ "NanoBanana API\ud83c\udf4c"
+ ],
+ {
+ "title_aux": "ComfyUI-NanoBananaAPI"
+ }
+ ],
+ "https://github.com/dafeng012/comfyui-imgmake": [
+ [
+ "LoadImageListPlus",
+ "LoadImagesFromPath_lp",
+ "SaveImagePlus",
+ "SaveImage_lp",
+ "SelectImageName",
+ "VideoKeyFramesExtractor",
+ "ebsynth_hecheng",
+ "ebsynth_main",
+ "ebsynth_process",
+ "image2mask",
+ "video2image"
+ ],
+ {
+ "title_aux": "comfyui-imgmake"
+ }
+ ],
+ "https://github.com/dagthomas/comfyui_dagthomas": [
+ [
+ "APNextBloom",
+ "APNextColorGrading",
+ "APNextCrossProcessing",
+ "APNextFilmHalation",
+ "APNextGlitchArt",
+ "APNextHDRToneMapping",
+ "APNextNoise",
+ "APNextRough",
+ "APNextSharpen",
+ "APNextSplitToning",
+ "ClaudeTextNode",
+ "ClaudeVisionNode",
+ "GrokTextNode",
+ "GrokVisionNode",
+ "GroqTextNode",
+ "GroqVisionNode",
+ "MiniCPMImageNode",
+ "MiniCPMVideoNode",
+ "SentenceMixerNode"
+ ],
+ {
+ "title_aux": "SDXL Auto Prompter"
+ }
+ ],
+ "https://github.com/danTheMonk/comfyui-int-and-float": [
+ [
+ "FloatToInt",
+ "IntToFloat"
+ ],
+ {
+ "title_aux": "ComfyUI Int and Float Conversion Nodes"
+ }
+ ],
+ "https://github.com/dandancow874/ComfyUI-LMStudio-Controller": [
+ [
+ "LMS_VisionController"
+ ],
+ {
+ "title_aux": "ComfyUI-LMStudio-Controller"
+ }
+ ],
+ "https://github.com/danger-electrodes/ComfyUI_Fawfluencer_Nodes": [
+ [
+ "FawfaceModelSpreadsheetRealismNode",
+ "FawfakeAuthenticImageSaveNode",
+ "FawfluxencerNode",
+ "FawfulizedAddImagesToImageList",
+ "FawfulizedEmptyImageList",
+ "FawfulizedHunyuanAddNoise",
+ "FawfulizedHunyuanBasicGuider",
+ "FawfulizedHunyuanBasicScheduler",
+ "FawfulizedHunyuanBetaSamplingScheduler",
+ "FawfulizedHunyuanCFGGuider",
+ "FawfulizedHunyuanControlNetApply",
+ "FawfulizedHunyuanControlNetApplyAdvanced",
+ "FawfulizedHunyuanControlNetLoader",
+ "FawfulizedHunyuanDiffControlNetLoader",
+ "FawfulizedHunyuanDisableNoise",
+ "FawfulizedHunyuanDualCFGGuider",
+ "FawfulizedHunyuanExponentialScheduler",
+ "FawfulizedHunyuanFlipSigmas",
+ "FawfulizedHunyuanKSamplerSelect",
+ "FawfulizedHunyuanKarrasScheduler",
+ "FawfulizedHunyuanLaplaceScheduler",
+ "FawfulizedHunyuanLatentVideo",
+ "FawfulizedHunyuanPolyexponentialScheduler",
+ "FawfulizedHunyuanRandomNoise",
+ "FawfulizedHunyuanSDTurboScheduler",
+ "FawfulizedHunyuanSamplerCustom",
+ "FawfulizedHunyuanSamplerCustomAdvanced",
+ "FawfulizedHunyuanSamplerDPMAdaptative",
+ "FawfulizedHunyuanSamplerDPMPP_2M_SDE",
+ "FawfulizedHunyuanSamplerDPMPP_2S_Ancestral",
+ "FawfulizedHunyuanSamplerDPMPP_3M_SDE",
+ "FawfulizedHunyuanSamplerDPMPP_SDE",
+ "FawfulizedHunyuanSamplerEulerAncestral",
+ "FawfulizedHunyuanSamplerEulerAncestralCFGPP",
+ "FawfulizedHunyuanSamplerLMS",
+ "FawfulizedHunyuanSetFirstSigma",
+ "FawfulizedHunyuanSetLatentNoiseMask",
+ "FawfulizedHunyuanSplitSigmas",
+ "FawfulizedHunyuanSplitSigmasDenoise",
+ "FawfulizedHunyuanVPScheduler",
+ "Img2ImgFawfluencerNodeSDXL"
+ ],
+ {
+ "title_aux": "ComfyUI_Fawfluencer_Nodes"
+ }
+ ],
+ "https://github.com/daniabib/ComfyUI_ProPainter_Nodes": [
+ [
+ "ProPainterInpaint",
+ "ProPainterOutpaint"
+ ],
+ {
+ "title_aux": "ComfyUI ProPainter Nodes"
+ }
+ ],
+ "https://github.com/daniel-lewis-ab/ComfyUI-Llama": [
+ [
+ "Call LLM Advanced",
+ "Call LLM Basic",
+ "LLM Create Completion Advanced",
+ "LLM Detokenize",
+ "LLM Embed",
+ "LLM Eval",
+ "LLM Reset",
+ "LLM Sample",
+ "LLM Tokenize",
+ "LLM_Create_Completion Advanced",
+ "LLM_Detokenize",
+ "LLM_Embed",
+ "LLM_Eval",
+ "LLM_Load_State",
+ "LLM_Reset",
+ "LLM_Sample",
+ "LLM_Save_State",
+ "LLM_Token_BOS",
+ "LLM_Token_EOS",
+ "LLM_Tokenize",
+ "Load LLM Model Advanced",
+ "Load LLM Model Basic"
+ ],
+ {
+ "title_aux": "ComfyUI-Llama"
+ }
+ ],
+ "https://github.com/daniel-lewis-ab/ComfyUI-TTS": [
+ [
+ "Load_Piper_Model",
+ "Piper_Speak_Text"
+ ],
+ {
+ "title_aux": "ComfyUI-TTS"
+ }
+ ],
+ "https://github.com/danieljanata/ComfyUI-Prompting-System": [
+ [
+ "PS_MetadataCleaner",
+ "PS_MetadataReader",
+ "PS_PromptSaver",
+ "PS_SmartText"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompting-System"
+ }
+ ],
+ "https://github.com/danielvw/ComfyUI-WanMove-Adapter": [
+ [
+ "CoordsToWanTracks"
+ ],
+ {
+ "title_aux": "ComfyUI-WanMove-Adapter"
+ }
+ ],
+ "https://github.com/danielwolber-wood/ComfyUI-FString": [
+ [
+ "SimpleFStringNode"
+ ],
+ {
+ "title_aux": "ComfyUI-FString"
+ }
+ ],
+ "https://github.com/danielwolber-wood/ComfyUI-Inspector": [
+ [
+ "SimpleDisplayNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Inspector"
+ }
+ ],
+ "https://github.com/danielwolber-wood/ComfyUI-QuickResolutionSelector": [
+ [
+ "ResolutionSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-QuickResolutionSelector"
+ }
+ ],
+ "https://github.com/darkamenosa/comfy_inpaint_blend": [
+ [
+ "EnhancedImageCompositeMasked"
+ ],
+ {
+ "title_aux": "Enhanced Image Composite Masked"
+ }
+ ],
+ "https://github.com/darkamenosa/comfy_nanobanana": [
+ [
+ "BatchImages",
+ "NanoBananaGeminiImageNode"
+ ],
+ {
+ "title_aux": "Comfy Nano Banana"
+ }
+ ],
+ "https://github.com/darkpixel/darkprompts": [
+ [
+ "DarkAnyToString",
+ "DarkCheckpointRandomizer",
+ "DarkCheckpointSwitcher",
+ "DarkCombine",
+ "DarkFaceIndexGenerator",
+ "DarkFaceIndexShuffle",
+ "DarkFolders",
+ "DarkLoRALoader",
+ "DarkLoraStackFromString",
+ "DarkPopLoraFromStack",
+ "DarkPrompt"
+ ],
+ {
+ "title_aux": "DarkPrompts"
+ }
+ ],
+ "https://github.com/darrell-goh/ComfyUI-NanoBanana_node": [
+ [
+ "NanoBananaMultipleOutputsNode",
+ "NanoBananaNode"
+ ],
+ {
+ "title_aux": "ComfyUI-NanoBanana_node"
+ }
+ ],
+ "https://github.com/darth-veitcher/comfydv": [
+ [
+ "CircuitBreaker",
+ "FormatString",
+ "RandomChoice"
+ ],
+ {
+ "author": "Darth Veitcher",
+ "description": "This collection of nodes provides string formatting, random choices, model memory management, and other quality of life improvements.",
+ "nickname": "DV Nodes",
+ "title": "Comfy DV Nodes",
+ "title_aux": "Comfy DV"
+ }
+ ],
+ "https://github.com/darth-veitcher/comfyui-ollama-model-manager": [
+ [
+ "OllamaChatCompletion",
+ "OllamaClient",
+ "OllamaDebugHistory",
+ "OllamaHistoryLength",
+ "OllamaLoadModel",
+ "OllamaModelSelector",
+ "OllamaOptionExtraBody",
+ "OllamaOptionMaxTokens",
+ "OllamaOptionRepeatPenalty",
+ "OllamaOptionSeed",
+ "OllamaOptionTemperature",
+ "OllamaOptionTopK",
+ "OllamaOptionTopP",
+ "OllamaUnloadModel"
+ ],
+ {
+ "author": "darth-veitcher",
+ "description": "Custom nodes for managing Ollama models in ComfyUI workflows. Load and unload models on-demand to optimize memory usage.",
+ "nickname": "Ollama Manager",
+ "title": "ComfyUI Ollama Model Manager",
+ "title_aux": "ComfyUI Ollama Model Manager"
+ }
+ ],
+ "https://github.com/daryltucker/ComfyUI-LoadFiles": [
+ [
+ "CountLines",
+ "ListFilenames",
+ "LoadImages"
+ ],
+ {
+ "title_aux": "ComfyUI-LoadFiles"
+ }
+ ],
+ "https://github.com/dasilva333/ComfyUI_ContrastingColor": [
+ [
+ "ContrastingComplementaryColor|pysssss"
+ ],
+ {
+ "title_aux": "ComfyUI_ContrastingColor"
+ }
+ ],
+ "https://github.com/dasilva333/ComfyUI_HunyuanVideo-Foley": [
+ [
+ "HunyuanFoleyAudio"
+ ],
+ {
+ "title_aux": "ComfyUI HunyuanVideo-Foley Custom Node"
+ }
+ ],
+ "https://github.com/dasilva333/ComfyUI_MarkdownImage": [
+ [
+ "CreateDialogImage",
+ "CreateDialogImageV2",
+ "CreateMarkdownImage",
+ "CreateMarkdownImageV2"
+ ],
+ {
+ "title_aux": "ComfyUI_MarkdownImage"
+ }
+ ],
+ "https://github.com/dave-palt/comfyui_DSP_imagehelpers": [
+ [
+ "dsp-imagehelpers-concat"
+ ],
+ {
+ "title_aux": "comfyui_DSP_imagehelpers"
+ }
+ ],
+ "https://github.com/daveand/ComfyUI-daveand-nodes": [
+ [
+ "BatchResizer",
+ "CascadedTileUpscaler",
+ "CheckpointLoaderWithConfig",
+ "DoubleKSampler",
+ "ImageAnalyzer",
+ "ImageCropAndPlace",
+ "LatentImageAndSeed",
+ "PromptCameraSelector",
+ "PromptConstructor",
+ "PromptLightingSelector",
+ "Test1",
+ "TiledKSampler",
+ "TiledKSamplerWithUpscaler",
+ "TrainingDatasetSaver"
+ ],
+ {
+ "title_aux": "ComfyUI-daveand-nodes"
+ }
+ ],
+ "https://github.com/davidgressett/comfyui-systemlevel": [
+ [
+ "CartesianCSVNode"
+ ],
+ {
+ "title_aux": "CartesianCSVNode for ComfyUI"
+ }
+ ],
+ "https://github.com/daxcay/ComfyUI-DataSet": [
+ [
+ "DataSet_ClaudeAIChat",
+ "DataSet_ClaudeAIChatImage",
+ "DataSet_ConceptManager",
+ "DataSet_CopyFiles",
+ "DataSet_FindAndReplace",
+ "DataSet_GroqChat",
+ "DataSet_GroqChatImage",
+ "DataSet_LoadImage",
+ "DataSet_OpenAIChat",
+ "DataSet_OpenAIChatImage",
+ "DataSet_OpenAIChatImageBatch",
+ "DataSet_PathSelector",
+ "DataSet_SaveImage",
+ "DataSet_SaveImagePro",
+ "DataSet_TextFilesLoad",
+ "DataSet_TextFilesLoadFromList",
+ "DataSet_TextFilesSave",
+ "DataSet_TriggerWords",
+ "DataSet_Visualizer"
+ ],
+ {
+ "author": "Daxton Caylor",
+ "description": "Data Research, Preparation, and Manipulation Nodes for Model Trainers, Artists, Designers, and Animators.",
+ "nickname": "ComfyUI-DataSet",
+ "title": "ComfyUI-DataSet",
+ "title_aux": "ComfyUI-DataSet"
+ }
+ ],
+ "https://github.com/daxcay/ComfyUI-JDCN": [
+ [
+ "JDCN_AnyCheckpointLoader",
+ "JDCN_AnyFileList",
+ "JDCN_AnyFileListHelper",
+ "JDCN_AnyFileListRandom",
+ "JDCN_AnyFileSelector",
+ "JDCN_BatchCounter",
+ "JDCN_BatchCounterAdvance",
+ "JDCN_BatchImageLoadFromDir",
+ "JDCN_BatchImageLoadFromList",
+ "JDCN_BatchLatentLoadFromDir",
+ "JDCN_BatchLatentLoadFromList",
+ "JDCN_BatchSaveLatent",
+ "JDCN_BoolInt",
+ "JDCN_EnableDisable",
+ "JDCN_FileMover",
+ "JDCN_ImageSaver",
+ "JDCN_ListToString",
+ "JDCN_LoadImage",
+ "JDCN_ReBatch",
+ "JDCN_SeamlessExperience",
+ "JDCN_ShowAny",
+ "JDCN_SplitString",
+ "JDCN_StringManipulator",
+ "JDCN_StringToList",
+ "JDCN_SwapInputs",
+ "JDCN_TXTFileSaver",
+ "JDCN_VHSFileMover"
+ ],
+ {
+ "author": "Daxton Caylor & Jerry Davos",
+ "description": "Custom Utility Nodes for Artists, Designers and Animators.",
+ "nickname": "ComfyUI-JDCN",
+ "title": "ComfyUI-JDCN",
+ "title_aux": "ComfyUI-JDCN"
+ }
+ ],
+ "https://github.com/daxcay/ComfyUI-TG": [
+ [
+ "TG_ImageSaver"
+ ],
+ {
+ "author": "Daxton Caylor",
+ "description": "This node enables someone to run comfyui in telegram.",
+ "nickname": "ComfyUI-TG",
+ "title": "ComfyUI-TG",
+ "title_aux": "ComfyUI-TG"
+ }
+ ],
+ "https://github.com/daxcay/ComfyUI-WA": [
+ [
+ "WA_ImageSaver"
+ ],
+ {
+ "author": "Daxton Caylor",
+ "description": "This node enables someone to run comfyui in whatsapp.",
+ "nickname": "ComfyUI-WA",
+ "title": "ComfyUI-WA",
+ "title_aux": "ComfyUI-WA"
+ }
+ ],
+ "https://github.com/daxcay/ComfyUI-YouTubeVideoPlayer": [
+ [
+ "YouTubeVideoPlayer"
+ ],
+ {
+ "author": "Daxton Caylor & Jerry Davos",
+ "description": "YouTube Video Player in Comfy.",
+ "nickname": "ComfyUI-YouTubeVideoPlayer",
+ "title": "ComfyUI-YouTubeVideoPlayer",
+ "title_aux": "ComfyUI-YouTubeVideoPlayer"
+ }
+ ],
+ "https://github.com/dchatel/comfyui_davcha": [
+ [
+ "ApplyMask",
+ "ConditioningCompress",
+ "DStack",
+ "DavchaCLIPMergeSimple",
+ "DavchaCLIPTextEncode",
+ "DavchaConditioningConcat",
+ "DavchaEmptyLatentImage",
+ "DavchaLLM",
+ "DavchaLLMAdvanced",
+ "DavchaLoadLLM",
+ "DavchaLoadVideo",
+ "DavchaMaskImage",
+ "DavchaModelMergeSD1",
+ "DavchaModelMergeSDXL",
+ "DavchaModelMergeSimple",
+ "DavchaPop",
+ "DavchaQwenImageEditLoraTagLoader",
+ "DavchaRescaleSigmas",
+ "DavchaSamplerCustomAdvanced",
+ "DavchaSamplerCustomAdvanced2",
+ "DavchaScheduledSampler",
+ "DavchaScheduledTextEncoderQwenImageEditPlus",
+ "DavchaTextEncodeQwenImageEditPlus",
+ "DavchaWan22LoraTagLoader",
+ "DavchaWan22LoraTagParser",
+ "PadAndResize",
+ "PercentPadding",
+ "ResizeCropFit",
+ "SmartMask",
+ "SoftErosion",
+ "StringScheduleHelper"
+ ],
+ {
+ "title_aux": "comfyui_davcha"
+ }
+ ],
+ "https://github.com/dchatel/comfyui_facetools": [
+ [
+ "BiSeNetMask",
+ "CropFaces",
+ "DetectFaces",
+ "GenderFaceFilter",
+ "JonathandinuMask",
+ "MergeWarps",
+ "OrderedFaceFilter",
+ "WarpFacesBack"
+ ],
+ {
+ "title_aux": "comfyui_facetools"
+ }
+ ],
+ "https://github.com/dcyd-lun/ComfyUI_text_diff": [
+ [
+ "TextDiff"
+ ],
+ {
+ "title_aux": "ComfyUI_text_diff"
+ }
+ ],
+ "https://github.com/ddontsov93/ComfyUI-AudioSeparator": [
+ [
+ "AudioSeparatorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-AudioSeparator"
+ }
+ ],
+ "https://github.com/denfrost/Den_ComfyUI_Workflow": [
+ [
+ "Den_CropImage_AS",
+ "Den_Eval_AS",
+ "Den_FaceRestoreCFWithModel",
+ "Den_GPTLoaderSimple_llama",
+ "Den_GPTSampler_llama",
+ "Den_ImageMixMasked_As",
+ "Den_ImageToLatentSpace",
+ "Den_ImageToMask_AS",
+ "Den_Int2Any_AS",
+ "Den_LatentAdd_AS",
+ "Den_LatentMixMasked_As",
+ "Den_LatentMix_AS",
+ "Den_LatentToImages_AS",
+ "Den_LoadLatent_AS",
+ "Den_MapRange_AS",
+ "Den_MaskToImage_AS",
+ "Den_Math_AS",
+ "Den_NoiseImage_AS",
+ "Den_Number2Float_AS",
+ "Den_Number2Int_AS",
+ "Den_Number_AS",
+ "Den_SVD_img2vid",
+ "Den_SaveLatent_AS",
+ "Den_TextToImage_AS",
+ "Den_TextWildcardList_AS"
+ ],
+ {
+ "title_aux": "Den_ComfyUI_Workflows"
+ }
+ ],
+ "https://github.com/deng-wei/ComfyUI-MiVolo-V2": [
+ [
+ "MiVOLOAgeGenderPredictorFromCrops",
+ "MiVOLOAgeGenderPredictorWithDetector",
+ "MiVOLODetectorLoader",
+ "MiVOLOLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-MiVolo-V2"
+ }
+ ],
+ "https://github.com/deroberon/StableZero123-comfyui": [
+ [
+ "SDZero ImageSplit",
+ "Stablezero123"
+ ],
+ {
+ "title_aux": "StableZero123-comfyui"
+ }
+ ],
+ "https://github.com/deroberon/demofusion-comfyui": [
+ [
+ "Batch Unsampler",
+ "Demofusion",
+ "Demofusion From Single File",
+ "Iterative Mixing KSampler"
+ ],
+ {
+ "title_aux": "demofusion-comfyui"
+ }
+ ],
+ "https://github.com/dfghsdh/ComfyUI_FluxPromptGen": [
+ [
+ "FluxImageCaptionNode",
+ "FluxPromptGeneratorNode"
+ ],
+ {
+ "title_aux": "ComfyUI_FluxPromptGen"
+ }
+ ],
+ "https://github.com/dfl/comfyui-clip-with-break": [
+ [
+ "AdvancedCLIPTextEncodeWithBreak",
+ "CLIPTextEncodeWithBreak"
+ ],
+ {
+ "author": "dfl",
+ "description": "CLIP text encoder that does BREAK prompting like A1111",
+ "nickname": "CLIP with BREAK",
+ "title": "CLIP with BREAK syntax",
+ "title_aux": "comfyui-clip-with-break"
+ }
+ ],
+ "https://github.com/dfl/comfyui-tcd-scheduler": [
+ [
+ "SamplerTCD",
+ "SamplerTCD EulerA",
+ "TCDScheduler"
+ ],
+ {
+ "title_aux": "ComfyUI-TCD-scheduler"
+ }
+ ],
+ "https://github.com/diStyApps/ComfyUI-disty-Flow": [
+ [
+ "Flow"
+ ],
+ {
+ "title_aux": "Flow - Streamlined Way to ComfyUI"
+ }
+ ],
+ "https://github.com/diStyApps/ComfyUI_FrameMaker": [
+ [
+ "FrameMaker",
+ "FrameMakerBatch"
+ ],
+ {
+ "title_aux": "ComfyUI Frame Maker"
+ }
+ ],
+ "https://github.com/dicksensei69/comfyui_loops": [
+ [
+ "LoopImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI Loops"
+ }
+ ],
+ "https://github.com/dicksondickson/ComfyUI-Dickson-Nodes": [
+ [
+ "DicksonColorMatch",
+ "DicksonLoadImage",
+ "Dickson_TTP_Preprocessor_Simple",
+ "Dickson_TTP_Preprocessor_cufoff",
+ "Dickson_TTP_Tile_Preprocessor_GF",
+ "Dickson_TTP_Tile_Preprocessor_Simple",
+ "Dickson_TTP_Tile_Preprocessor_cufoff"
+ ],
+ {
+ "description": "This is a set of custom nodes that I've either written myself or adapted from other authors for my own convenience. Currently includes color matching node forked from StableSR and TTPlanet's controlnet preprocessor. https://github.com/dicksondickson",
+ "nickname": "Dickson Nodes",
+ "title": "Dickson Nodes",
+ "title_aux": "ComfyUI-Dickson-Nodes"
+ }
+ ],
+ "https://github.com/diffussy69/comfyui-curved_weight_schedule": [
+ [
+ "Advanced Curved ControlNet Scheduler",
+ "Apply_CN_Extras_Masks",
+ "AutoBackgroundMask",
+ "AutoPersonMask",
+ "Batch_Images_to_Timestep_Keyframes",
+ "CurveFormulaBuilder",
+ "Curved ControlNet Scheduler",
+ "Curved_Blur_Batch_Preprocessor",
+ "InteractiveCurveDesigner",
+ "MaskSymmetryTool",
+ "Multi-ControlNet Curve Coordinator",
+ "MultiLayerMaskEditor",
+ "MultiLayerMaskEditorSimple",
+ "MultiMaskCombinerBatch",
+ "MultiMaskCombinerBatch10",
+ "MultiMaskStrengthCombiner10",
+ "MultiMaskStrengthCombiner5",
+ "Redistribute_Keyframe_Percents",
+ "RegionalPromptInterpolation",
+ "RegionalPrompting"
+ ],
+ {
+ "title_aux": "ComfyUI-curved_weight_schedule"
+ }
+ ],
+ "https://github.com/digitaljohn/comfyui-propost": [
+ [
+ "ProPostApplyLUT",
+ "ProPostDepthMapBlur",
+ "ProPostFilmGrain",
+ "ProPostRadialBlur",
+ "ProPostVignette"
+ ],
+ {
+ "title_aux": "ComfyUI-ProPost"
+ }
+ ],
+ "https://github.com/dimtion/comfyui-raw-image": [
+ [
+ "Load Raw Image"
+ ],
+ {
+ "title_aux": "ComfyUI-Raw-Image"
+ }
+ ],
+ "https://github.com/dimtoneff/ComfyUI-PixelArt-Detector": [
+ [
+ "PixelArtAddDitherPattern",
+ "PixelArtDetectorConverter",
+ "PixelArtDetectorSave",
+ "PixelArtDetectorToImage",
+ "PixelArtLoadPalettes",
+ "PixelArtPaletteGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI PixelArt Detector"
+ }
+ ],
+ "https://github.com/dimtoneff/ComfyUI-VL-Nodes": [
+ [
+ "GGUF_VLM_ImageToText",
+ "GGUF_VLM_ModelLoader",
+ "InternVL3_5_ImageToText",
+ "InternVL3_5_ModelLoader",
+ "KeyeModelLoader",
+ "KeyeNode",
+ "LFM2TransformerImageToText",
+ "LFM2TransformerModelLoader",
+ "LoadImagesFromDirBatch_VL",
+ "LoadImagesFromDirList_VL",
+ "Ovis25ImageToText",
+ "Ovis25ModelLoader",
+ "OvisU1ImageCaption",
+ "OvisU1VLModelLoader",
+ "TextSave_VL",
+ "VLNodesFreeMemoryAPI"
+ ],
+ {
+ "title_aux": "ComfyUI-VL-Nodes"
+ }
+ ],
+ "https://github.com/diodiogod/TTS-Audio-Suite": [
+ [
+ "ASRSRTAdvancedOptionsNode",
+ "AudioAnalyzerNode",
+ "AudioAnalyzerOptionsNode",
+ "CharacterVoicesNode",
+ "ChatterBoxAudioAnalyzer",
+ "ChatterBoxAudioAnalyzerOptions",
+ "ChatterBoxEngineNode",
+ "ChatterBoxF5TTSEditOptions",
+ "ChatterBoxF5TTSEditVoice",
+ "ChatterBoxOfficial23LangEngineNode",
+ "ChatterBoxVoiceCapture",
+ "CosyVoice Engine",
+ "CosyVoiceEngineNode",
+ "F5TTSEngineNode",
+ "HiggsAudioEngineNode",
+ "IndexTTS Engine",
+ "IndexTTSEmotionOptionsNode",
+ "IndexTTSEngineNode",
+ "LoadRVCModelNode",
+ "MergeAudioNode",
+ "MouthMovementAnalyzer",
+ "PhonemeTextNormalizer",
+ "Qwen3TTSEngineNode",
+ "Qwen3TTSVoiceDesignerNode",
+ "QwenEmotionNode",
+ "RVCEngineNode",
+ "RVCPitchOptionsNode",
+ "RefreshVoiceCacheNode",
+ "Step Audio EditX Engine",
+ "StepAudioEditXAudioEditorNode",
+ "StepAudioEditXEngineNode",
+ "StringMultilineTagEditor",
+ "UnifiedASRTranscribeNode",
+ "UnifiedTTSSRTNode",
+ "UnifiedTTSTextNode",
+ "UnifiedVoiceChangerNode",
+ "VibeVoiceEngineNode",
+ "VisemeDetectionOptionsNode",
+ "VocalRemovalNode",
+ "VoiceFixerNode"
+ ],
+ {
+ "title_aux": "TTS Audio Suite"
+ }
+ ],
+ "https://github.com/diontimmer/ComfyUI-Vextra-Nodes": [
+ [
+ "Add Text To Image",
+ "Apply Instagram Filter",
+ "Create Solid Color",
+ "Flatten Colors",
+ "Generate Noise Image",
+ "GlitchThis Effect",
+ "Hue Rotation",
+ "Load Picture Index",
+ "Pixel Sort",
+ "Play Sound At Execution",
+ "Prettify Prompt Using distilgpt2",
+ "Swap Color Mode"
+ ],
+ {
+ "title_aux": "ComfyUI-Vextra-Nodes"
+ }
+ ],
+ "https://github.com/discopixel-studio/comfyui-discopixel": [
+ [
+ "PhotoroomRemoveBG"
+ ],
+ {
+ "author": "Anson Kao",
+ "description": "A small collection of custom nodes for use with ComfyUI, by Discopixel",
+ "nickname": "ComfyUI Discopixel",
+ "title": "ComfyUI Discopixel",
+ "title_aux": "PhotoRoom Nodes by Discopixel"
+ }
+ ],
+ "https://github.com/discus0434/comfyui-caching-embeddings": [
+ [
+ "CachingCLIPTextEncode"
+ ],
+ {
+ "title_aux": "ComfyUI Caching Embeddings"
+ }
+ ],
+ "https://github.com/discus0434/comfyui-flux-accelerator": [
+ [
+ "\ud83c\udf6dFluxAccelerator"
+ ],
+ {
+ "title_aux": "ComfyUI Flux Accelerator"
+ }
+ ],
+ "https://github.com/djbielejeski/a-person-mask-generator": [
+ [
+ "APersonFaceLandmarkMaskGenerator",
+ "APersonMaskGenerator"
+ ],
+ {
+ "title_aux": "a-person-mask-generator"
+ }
+ ],
+ "https://github.com/dmMaze/sketch2manga": [
+ [
+ "BlendScreentone",
+ "EmptyLatentImageAdvanced"
+ ],
+ {
+ "title_aux": "Sketch2Manga"
+ }
+ ],
+ "https://github.com/dmarx/ComfyUI-AudioReactive": [
+ [
+ "ARDrawSignal",
+ "ARReadAudio",
+ "OpAbs",
+ "OpBandpass",
+ "OpClamp",
+ "OpHarmonic",
+ "OpModulo",
+ "OpNormalize",
+ "OpNovelty",
+ "OpPercussive",
+ "OpPow",
+ "OpPow2",
+ "OpPredominant_pulse",
+ "OpQuantize",
+ "OpRms",
+ "OpSmoosh",
+ "OpSmooth",
+ "OpSqrt",
+ "OpStretch",
+ "OpSustain",
+ "OpThreshold",
+ "SignalToCurve"
+ ],
+ {
+ "title_aux": "ComfyUI-AudioReactive"
+ }
+ ],
+ "https://github.com/dmarx/ComfyUI-Keyframed": [
+ [
+ "Example",
+ "KfAddCurveToPGroup",
+ "KfAddCurveToPGroupx10",
+ "KfApplyCurveToCond",
+ "KfConditioningAdd",
+ "KfConditioningAddx10",
+ "KfCurveConstant",
+ "KfCurveDraw",
+ "KfCurveFromString",
+ "KfCurveFromYAML",
+ "KfCurvesAdd",
+ "KfCurvesAddx10",
+ "KfCurvesDivide",
+ "KfCurvesMultiply",
+ "KfCurvesMultiplyx10",
+ "KfCurvesSubtract",
+ "KfDebug_Clip",
+ "KfDebug_Cond",
+ "KfDebug_Curve",
+ "KfDebug_Float",
+ "KfDebug_Image",
+ "KfDebug_Int",
+ "KfDebug_Latent",
+ "KfDebug_Model",
+ "KfDebug_Segs",
+ "KfDebug_String",
+ "KfDebug_Vae",
+ "KfDrawSchedule",
+ "KfEvaluateCurveAtT",
+ "KfGetCurveFromPGroup",
+ "KfGetScheduleConditionAtTime",
+ "KfGetScheduleConditionSlice",
+ "KfKeyframedCondition",
+ "KfKeyframedConditionWithText",
+ "KfPGroupCurveAdd",
+ "KfPGroupCurveMultiply",
+ "KfPGroupDraw",
+ "KfPGroupSum",
+ "KfSetCurveLabel",
+ "KfSetKeyframe",
+ "KfSinusoidalAdjustAmplitude",
+ "KfSinusoidalAdjustFrequency",
+ "KfSinusoidalAdjustPhase",
+ "KfSinusoidalAdjustWavelength",
+ "KfSinusoidalEntangledZeroOneFromFrequencyx2",
+ "KfSinusoidalEntangledZeroOneFromFrequencyx3",
+ "KfSinusoidalEntangledZeroOneFromFrequencyx4",
+ "KfSinusoidalEntangledZeroOneFromFrequencyx5",
+ "KfSinusoidalEntangledZeroOneFromFrequencyx6",
+ "KfSinusoidalEntangledZeroOneFromFrequencyx7",
+ "KfSinusoidalEntangledZeroOneFromFrequencyx8",
+ "KfSinusoidalEntangledZeroOneFromFrequencyx9",
+ "KfSinusoidalEntangledZeroOneFromWavelengthx2",
+ "KfSinusoidalEntangledZeroOneFromWavelengthx3",
+ "KfSinusoidalEntangledZeroOneFromWavelengthx4",
+ "KfSinusoidalEntangledZeroOneFromWavelengthx5",
+ "KfSinusoidalEntangledZeroOneFromWavelengthx6",
+ "KfSinusoidalEntangledZeroOneFromWavelengthx7",
+ "KfSinusoidalEntangledZeroOneFromWavelengthx8",
+ "KfSinusoidalEntangledZeroOneFromWavelengthx9",
+ "KfSinusoidalGetAmplitude",
+ "KfSinusoidalGetFrequency",
+ "KfSinusoidalGetPhase",
+ "KfSinusoidalGetWavelength",
+ "KfSinusoidalWithFrequency",
+ "KfSinusoidalWithWavelength"
+ ],
+ {
+ "title_aux": "ComfyUI-Keyframed"
+ }
+ ],
+ "https://github.com/domprosys/ComfyUI-LTXVideo-Extra": [
+ [
+ "LTXVImgToVideoInplaceAtIndex"
+ ],
+ {
+ "title_aux": "ComfyUI-LTXVideo-Extra"
+ }
+ ],
+ "https://github.com/dorpxam/ComfyUI-FramePack-F1-T2V": [
+ [
+ "FramePackF1T2VLoraStack",
+ "FramePackF1T2VSampler",
+ "FramePackF1T2VSamplerSettings",
+ "FramePackF1T2VTextEncode",
+ "FramePackF1T2VUserSettings"
+ ],
+ {
+ "title_aux": "ComfyUI-FramePack-F1-T2V"
+ }
+ ],
+ "https://github.com/dorpxam/ComfyUI-LTXVideoLoRA": [
+ [
+ "LTXVLoRABlockEdit",
+ "LTXVLoRALoader",
+ "LTXVLoRASelector"
+ ],
+ {
+ "title_aux": "ComfyUI-LTXVideoLoRA"
+ }
+ ],
+ "https://github.com/dothings/comfyui_placeholder_prompting": [
+ [
+ "PlaceholderPrompting"
+ ],
+ {
+ "title_aux": "comfyui_placeholder_prompting"
+ }
+ ],
+ "https://github.com/doubletwisted/ComfyUI-Deadline-Plugin": [
+ [
+ "DeadlineSeed",
+ "DeadlineSubmit"
+ ],
+ {
+ "nodename_pattern": "DeadlineSubmitNode",
+ "title_aux": "ComfyUI Deadline Submission"
+ }
+ ],
+ "https://github.com/downlifted/ComfyUI_GROQ-PromptWizard": [
+ [
+ "GroqAudioProcessor",
+ "GroqCodeAssistant",
+ "GroqDocumentAnalyzer",
+ "GroqLLM",
+ "GroqVision"
+ ],
+ {
+ "title_aux": "ComfyUI_ComfyGroq"
+ }
+ ],
+ "https://github.com/drago87/ComfyUI_Dragos_Nodes": [
+ [
+ "file_padding",
+ "image_info",
+ "lora_loader",
+ "vae_loader"
+ ],
+ {
+ "title_aux": "ComfyUI_Dragos_Nodes"
+ }
+ ],
+ "https://github.com/drawthingsai/draw-things-comfyui": [
+ [
+ "DrawThingsControlNet",
+ "DrawThingsHints",
+ "DrawThingsLoRA",
+ "DrawThingsNegative",
+ "DrawThingsPositive",
+ "DrawThingsPrompt",
+ "DrawThingsRefiner",
+ "DrawThingsSampler",
+ "DrawThingsUpscaler"
+ ],
+ {
+ "title_aux": "draw-things-comfyui"
+ }
+ ],
+ "https://github.com/dreamhartley/ComfyUI_show_seed": [
+ [
+ "Show Seed"
+ ],
+ {
+ "title_aux": "ComfyUI_show_seed"
+ }
+ ],
+ "https://github.com/drmbt/comfyui-dreambait-nodes": [
+ [
+ "AudioInfoPlus",
+ "BoolPlusPlus",
+ "CompareImageSimilarity",
+ "DRMBT_AspectPadImageForOutpainting",
+ "DRMBT_LoadMedia",
+ "DRMBT_MultiMinMax",
+ "DRMBT_String_Item_Menu",
+ "DictToOutputs",
+ "DownloadAndLoadMiniCPMV",
+ "DrawMana",
+ "DrawText",
+ "DreambaitFolderOpener",
+ "DynamicDictionary",
+ "DynamicStringConcatenate",
+ "ImageFrameBlend",
+ "ImageResizeFaceAware",
+ "ListItemExtract",
+ "ListItemSelector",
+ "LoadAudioPlus",
+ "MiniCPMVNode",
+ "MusicGen",
+ "NormalizeAudio",
+ "NumberPlusPlus",
+ "NumberRemap",
+ "Qwen2AudioInstruct",
+ "ShotHistory",
+ "StringToDict",
+ "SwitchDuo",
+ "TextBoxStyle",
+ "TextLineSelect",
+ "TextLinesToList",
+ "TextMargins",
+ "TextPlusPlus",
+ "TextShadow"
+ ],
+ {
+ "title_aux": "comfyui-dreambait-nodes"
+ }
+ ],
+ "https://github.com/drozbay/ComfyUI-WanVaceAdvanced": [
+ [
+ "HuMoI2VPatch",
+ "StringToFloatListRanged",
+ "VACEAdvDetailerHookProvider",
+ "VaceAdvancedModelPatch",
+ "VaceStrengthTester",
+ "WVAOptionsNode",
+ "WVAPipeSimple",
+ "WanMaskToLatentSpace",
+ "WanNoiseMaskToLatentSpace",
+ "WanVacePhantomDual",
+ "WanVacePhantomDualV2",
+ "WanVacePhantomExperimental",
+ "WanVacePhantomExperimentalV2",
+ "WanVacePhantomSimple",
+ "WanVacePhantomSimpleV2",
+ "WanVaceReplace",
+ "WanVaceToVideoLatent",
+ "WanVaceWindowReferences"
+ ],
+ {
+ "title_aux": "ComfyUI-WanVaceAdvanced"
+ }
+ ],
+ "https://github.com/drphero/comfyui_prompttester": [
+ [
+ "PromptTester"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptTester"
+ }
+ ],
+ "https://github.com/drustan-hawk/primitive-types": [
+ [
+ "float",
+ "int",
+ "string",
+ "string_multiline"
+ ],
+ {
+ "title_aux": "primitive-types"
+ }
+ ],
+ "https://github.com/dseditor/Comfy-MCP": [
+ [
+ "MCPConfigGenerator"
+ ],
+ {
+ "title_aux": "Comfy-MCP"
+ }
+ ],
+ "https://github.com/dseditor/ComfyUI-ListHelper": [
+ [
+ "AudioListCombine",
+ "AudioListGenerator",
+ "AudioToFrameCount",
+ "AutoWhiteBalance",
+ "BatchToPSD",
+ "CeilDivide",
+ "ChineseConverter",
+ "ChineseTranslate",
+ "FrameMatch",
+ "GGUFInference",
+ "ImageListSplitHeadTail",
+ "ModelDownloader",
+ "NumberListGenerator",
+ "OpenAIHelper",
+ "OpenRouterLLM",
+ "PersonFeatureExtractor",
+ "PersonFeatureParser",
+ "PhotoMagazineMaker",
+ "PhotoMagazineParser",
+ "PhotoMagazinePromptGenerator",
+ "PromptListGenerator",
+ "QwenGPUInference",
+ "ShowText|ListHelper",
+ "SimpleWildCardPlayer"
+ ],
+ {
+ "title_aux": "ComfyUI-ListHelper"
+ }
+ ],
+ "https://github.com/dseditor/ComfyUI-ScheduledTask": [
+ [
+ "DailyPromptScheduler",
+ "ShutdownNode",
+ "TimeToSeedList"
+ ],
+ {
+ "title_aux": "ComfyUI-ScheduledTask"
+ }
+ ],
+ "https://github.com/dseditor/ComfyUI-Thread": [
+ [
+ "PublishThread",
+ "StartWithLongLiveToken",
+ "ThreadPublishVideo",
+ "ThreadsHistory"
+ ],
+ {
+ "title_aux": "ComfyUI-Thread"
+ }
+ ],
+ "https://github.com/dskjal/comfyui-yolov8-dsuksampler": [
+ [
+ "Yolov8DSUKsampler"
+ ],
+ {
+ "title_aux": "comfyui-yolov8-dsuksampler"
+ }
+ ],
+ "https://github.com/dskjal/comfyui-yolov8-simple": [
+ [
+ "ImageCompositeBlurred",
+ "Yolov8DS"
+ ],
+ {
+ "title_aux": "comfyui-yolov8-simple"
+ }
+ ],
+ "https://github.com/duchamps0305/comfyui-white-extractor": [
+ [
+ "WhitePercentage"
+ ],
+ {
+ "title_aux": "comfyui-white-extractor"
+ }
+ ],
+ "https://github.com/ducido/ObjectFusion_ComfyUI_nodes": [
+ [
+ "Custom ESAM_ModelLoader_Zho",
+ "Custom Generate Stable Diffsution Prompt With LLM",
+ "Custom Yoloworld_ESAM_Zho",
+ "Custom Yoloworld_ModelLoader_Zho",
+ "ObjectCrop"
+ ],
+ {
+ "title_aux": "ObjectFusion_ComfyUI_nodes"
+ }
+ ],
+ "https://github.com/duldduld/ComfyUI_md5": [
+ [
+ "FileToMD5",
+ "ImgToMD5",
+ "StringToMD5"
+ ],
+ {
+ "title_aux": "ComfyUI_md5"
+ }
+ ],
+ "https://github.com/duskfallcrew/Comfyui_EmbeddingMerge_Node/raw/refs/heads/main/merge_embed.py": [
+ [
+ "EmbeddingMerger"
+ ],
+ {
+ "title_aux": "Embedding Merge for ComfyUI"
+ }
+ ],
+ "https://github.com/dymokomi/comfyui_dygen": [
+ [
+ "AdaptiveColorCircles",
+ "AdaptiveColorLines",
+ "AdaptiveColorRectangles",
+ "BinaryPatternStamper",
+ "DYImageCluster",
+ "DYImageMasks",
+ "DYImagePalette",
+ "DYImageQuantize",
+ "ImageListToGrid",
+ "ImageScaler",
+ "RandomLines"
+ ],
+ {
+ "title_aux": "comfyui_dygen"
+ }
+ ],
+ "https://github.com/dzqdzq/ComfyUI-crop-alpha": [
+ [
+ "FastAlphaCropper",
+ "ShrinkImage"
+ ],
+ {
+ "title_aux": "ComfyUI-crop-alpha"
+ }
+ ],
+ "https://github.com/dzy1128/ComfyUI-Vector-Engine": [
+ [
+ "VectorEngineGPT",
+ "VectorEngineGemini"
+ ],
+ {
+ "title_aux": "ComfyUI-Vector-Engine"
+ }
+ ],
+ "https://github.com/dzy1128/ComfyUI-VertexAI": [
+ [
+ "GeminiImageGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-VertexAI"
+ }
+ ],
+ "https://github.com/dzy1128/Seedream-Image-Generate-ComfyUI": [
+ [
+ "SeedreamImageGenerate"
+ ],
+ {
+ "title_aux": "Seedream Image Generate ComfyUI Node"
+ }
+ ],
+ "https://github.com/e-tier-newbie/ComfyUI-E-Tier-TextSaver": [
+ [
+ "E_TierTextSaver"
+ ],
+ {
+ "title_aux": "ComfyUI-E-Tier-TextSaver"
+ }
+ ],
+ "https://github.com/e7mac/ComfyUI-ShadertoyGL": [
+ [
+ "ColorChannelOffset",
+ "Shader",
+ "Shadertoy"
+ ],
+ {
+ "title_aux": "ComfyUI-ShadertoyGL"
+ }
+ ],
+ "https://github.com/eRepublik-Labs/comfyui-nodes-erpk": [
+ [
+ "ClaudeAPIClient",
+ "ClaudeConversation",
+ "ClaudeConversationInfo",
+ "ClaudePromptEnhancer",
+ "ClaudeTextGeneration",
+ "ClaudeTokenCounter",
+ "ClaudeUsageStats",
+ "ClaudeVisionAnalysis",
+ "ERPK Foreground Refinement (BlurFusion)",
+ "ERPK Get Mask (BiRefNet)",
+ "ERPK Remove Background (BiRefNet)",
+ "ERPK Remove Background (InSPyReNet)",
+ "ERPK Remove Background (rembg)",
+ "ERPK SHARP Predict",
+ "ERPK SHARP Render Video",
+ "ERPK SHARP Render Views",
+ "ERPK_ConcatenateStrings",
+ "GeminiAPIConfig",
+ "GeminiChat",
+ "GeminiImageEdit",
+ "GeminiImageGeneration",
+ "GeminiSafetySettings",
+ "GeminiSystemInstruction",
+ "GeminiTextGeneration",
+ "GeminiVision",
+ "OpenAIAPIConfig",
+ "OpenAIChat",
+ "OpenAIImageEdit",
+ "OpenAIImageGeneration",
+ "OpenAISystemInstruction",
+ "OpenAITextGeneration",
+ "OpenAIVision",
+ "VeoImageToVideo",
+ "VeoTextToVideo",
+ "WaveSpeed Custom Client",
+ "WaveSpeed Custom Preview Video",
+ "WaveSpeed Custom QwenImageEdit",
+ "WaveSpeed Custom QwenImageEditPlus",
+ "WaveSpeed Custom QwenImageT2I",
+ "WaveSpeed Custom Save Audio",
+ "WaveSpeed Custom SeedreamV4",
+ "WaveSpeed Custom SeedreamV4Edit",
+ "WaveSpeed Custom SeedreamV4EditSequential",
+ "WaveSpeed Custom SeedreamV4Sequential",
+ "WaveSpeed Custom SeedreamV4_5",
+ "WaveSpeed Custom SeedreamV4_5Edit",
+ "WaveSpeed Custom SeedreamV4_5EditSequential",
+ "WaveSpeed Custom SeedreamV4_5Sequential",
+ "WaveSpeed Custom Upload Image"
+ ],
+ {
+ "title_aux": "ERPK Collection"
+ }
+ ],
+ "https://github.com/ealkanat/comfyui-easy-padding": [
+ [
+ "comfyui-easy-padding"
+ ],
+ {
+ "title_aux": "ComfyUI Easy Padding"
+ }
+ ],
+ "https://github.com/eastoc/ComfyUI_SemanticSAM": [
+ [
+ "PointPrompt",
+ "SemanticSAMLoader",
+ "SemanticSAMSegment"
+ ],
+ {
+ "title_aux": "Semantic-SAM"
+ }
+ ],
+ "https://github.com/easygoing0114/ComfyUI-easygoing-nodes": [
+ [
+ "CLIPSaveQwen",
+ "CLIPScaleDualSDXLBlock",
+ "CLIPScaleQwenBlock",
+ "HDR Effects with LAB Adjust",
+ "HDREffectsLabAdjust",
+ "ModelMergeHiDream",
+ "ModelMergeZImage",
+ "ModelScaleFlux2Klein",
+ "ModelScaleHiDream",
+ "ModelScaleQwenImage",
+ "ModelScaleZImage",
+ "SaveImageWithPrompt",
+ "VAEMergeAdd",
+ "VAEMergeSDXLBlock",
+ "VAEMergeSimple",
+ "VAEMergeSubtract",
+ "VAEScaleFlux2Block",
+ "VAEScaleFluxBlock",
+ "VAEScaleQwenBlock",
+ "VAEScaleSDXLBlock"
+ ],
+ {
+ "title_aux": "ComfyUI-easygoing-nodes"
+ }
+ ],
+ "https://github.com/ebrinz/ComfyUI-MusicGen-HF": [
+ [
+ "AudioOutputToConditioningQueue",
+ "BPMDurationInput",
+ "ConditioningQueueManager",
+ "HuggingFaceMusicGen",
+ "LoadAudioStandalone",
+ "LoopingAudioPreview",
+ "MusicGenAudioToFile",
+ "ProfessionalLoopTransition",
+ "SaveAudioStandalone",
+ "SmoothAudioQueue",
+ "custom_nodes"
+ ],
+ {
+ "title_aux": "ComfyUI-MusicGen-HF"
+ }
+ ],
+ "https://github.com/eddyhhlure1Eddy/ComfyUI-EddySevenResonance": [
+ [
+ "EddyIntSevenRandomV2",
+ "EddyLuckySeedNode"
+ ],
+ {
+ "title_aux": "ComfyUI-EddySevenResonance"
+ }
+ ],
+ "https://github.com/eddyhhlure1Eddy/ComfyUI-LLM-GGUF": [
+ [
+ "ClearModelCache",
+ "LLMChat",
+ "ListSessions",
+ "LoadGGUFModel",
+ "ResetChat"
+ ],
+ {
+ "title_aux": "ComfyUI-LLM-GGUF"
+ }
+ ],
+ "https://github.com/eddyhhlure1Eddy/ComfyUI-MemoryCleaner": [
+ [
+ "MemoryCleaner",
+ "MemoryStatus"
+ ],
+ {
+ "title_aux": "ComfyUI-MemoryCleaner"
+ }
+ ],
+ "https://github.com/eddyhhlure1Eddy/ComfyUI-PreviewImageNode": [
+ [
+ "PreviewImageStandalone",
+ "SaveImageStandalone"
+ ],
+ {
+ "title_aux": "ComfyUI-PreviewImageNode"
+ }
+ ],
+ "https://github.com/eddyhhlure1Eddy/ComfyUI-QwenFrameSelector": [
+ [
+ "QwenFrameSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenFrameSelector"
+ }
+ ],
+ "https://github.com/eddyhhlure1Eddy/ComfyUI-QwenVideo": [
+ [
+ "GetVideoPath",
+ "QwenVideoPromptReversal",
+ "ShowQwenPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenVideo"
+ }
+ ],
+ "https://github.com/eddyhhlure1Eddy/ComfyUI-TorchCompileSpeed": [
+ [
+ "ApplyTorchCompile",
+ "TorchCompileSpeedSettings"
+ ],
+ {
+ "title_aux": "ComfyUI-TorchCompileSpeed"
+ }
+ ],
+ "https://github.com/edelvarden/ComfyUI-Display-Value": [
+ [
+ "DisplayValue"
+ ],
+ {
+ "title_aux": "ComfyUI-Display-Value"
+ }
+ ],
+ "https://github.com/edenartlab/eden_comfy_pipelines": [
+ [
+ "AnimatedShapeMaskNode",
+ "Animation_RGB_Mask",
+ "AspectPadImageForOutpainting",
+ "CLIP_Interrogator",
+ "ConvertToGrayscale",
+ "DepthSlicer",
+ "Eden_AllMediaLoader",
+ "Eden_Bool",
+ "Eden_BoolBinaryOperation",
+ "Eden_Compare",
+ "Eden_Debug_Anything",
+ "Eden_DepthSlice_MaskVideo",
+ "Eden_DetermineFrameCount",
+ "Eden_FaceToMask",
+ "Eden_Face_Crop",
+ "Eden_Float",
+ "Eden_FloatToInt",
+ "Eden_GPTPromptEnhancer",
+ "Eden_GPTStructuredOutput",
+ "Eden_IMG_padder",
+ "Eden_IMG_unpadder",
+ "Eden_ImageMaskComposite",
+ "Eden_Image_Math",
+ "Eden_Int",
+ "Eden_IntToFloat",
+ "Eden_MaskBoundingBox",
+ "Eden_MaskCombiner",
+ "Eden_Math",
+ "Eden_RGBA_to_RGB",
+ "Eden_RandomFilepathSampler",
+ "Eden_RandomNumberSampler",
+ "Eden_RandomPromptFromFile",
+ "Eden_Regex_Replace",
+ "Eden_RepeatLatentBatch",
+ "Eden_Save_Param_Dict",
+ "Eden_Seed",
+ "Eden_String",
+ "Eden_StringHash",
+ "Eden_StringReplace",
+ "Eden_gpt4_node",
+ "Eden_randbool",
+ "Extend_Sequence",
+ "FolderScanner",
+ "GetRandomFile",
+ "Get_Prefixed_Imgs",
+ "HistogramMatching",
+ "IMG_blender",
+ "IMG_resolution_multiple_of",
+ "IMG_scaler",
+ "IP_Adapter_Settings_Distribution",
+ "If ANY execute A else B",
+ "ImageDescriptionNode",
+ "ImageFolderIterator",
+ "KeyframeBlender",
+ "LatentTypeConversion",
+ "Linear_Combine_IP_Embeds",
+ "LoadImagesByFilename",
+ "LoadRandomImage",
+ "Load_Embeddings_From_Folder",
+ "MaskFromRGB_KMeans",
+ "MaskedRegionVideoExport",
+ "OrganicFillNode",
+ "ParallaxZoom",
+ "ProjectionPreview",
+ "Random_Style_Mixture",
+ "SDAnyConverter",
+ "SDTypeConverter",
+ "SaveImageAdvanced",
+ "SavePosEmbeds",
+ "SurfaceRadiometricCompensation",
+ "VAEDecode_to_folder",
+ "VideoFrameSelector",
+ "WidthHeightPicker"
+ ],
+ {
+ "title_aux": "Eden.art nodesuite"
+ }
+ ],
+ "https://github.com/edenartlab/sd-lora-trainer": [
+ [
+ "Eden_LoRa_trainer"
+ ],
+ {
+ "title_aux": "Eden.art LoRa Trainer"
+ }
+ ],
+ "https://github.com/edoardocompagnucci/ComfyUI-HSyn9DHPE": [
+ [
+ "HSyn9DHPE"
+ ],
+ {
+ "title_aux": "ComfyUI-HSyn9DHPE"
+ }
+ ],
+ "https://github.com/educator-art/ComfyUI-Load-DirectoryFiles": [
+ [
+ "Load Images and Prompts from Directory",
+ "Load Images and Prompts from Directory(Advanced)"
+ ],
+ {
+ "title_aux": "ComfyUI-Load-DirectoryFiles"
+ }
+ ],
+ "https://github.com/educator-art/ComfyUI-gpt-oss-PromptDesigner": [
+ [
+ "Load gpt-oss Prompt Designer"
+ ],
+ {
+ "title_aux": "ComfyUI-gpt-oss-PromptDesigner"
+ }
+ ],
+ "https://github.com/efortin/ComfyUI-Ollama-Enhancer": [
+ [
+ "OllamaEnhancerNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Manufnode"
+ }
+ ],
+ "https://github.com/eg0pr0xy/comfyui_noisegen": [
+ [
+ "AudioAnalyzer",
+ "AudioMixer",
+ "AudioSave",
+ "BandLimitedNoise",
+ "ChaosNoiseMix",
+ "ConvolutionReverb",
+ "FeedbackProcessor",
+ "GranularProcessor",
+ "GranularSequencer",
+ "HarshFilter",
+ "MicrosoundSculptor",
+ "ModulationMatrix",
+ "MultiDistortion",
+ "NoiseGenerator",
+ "PerlinNoise",
+ "SpectralProcessor",
+ "SpectrumAnalyzer",
+ "TrueChaos"
+ ],
+ {
+ "title_aux": "ComfyUI-NoiseGen"
+ }
+ ],
+ "https://github.com/einhorn13/ComfyUI-ImageProcessUtilities": [
+ [
+ "CombineCoords",
+ "CropByCoords",
+ "ImageTiler",
+ "ImageUntiler",
+ "PasteByCoords",
+ "ReorderBatch",
+ "SplitCoords",
+ "StringToIntegers"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageProcessUtilities"
+ }
+ ],
+ "https://github.com/elgalardi/comfyui-clip-prompt-splitter": [
+ [
+ "CLIPPromptSplitter5"
+ ],
+ {
+ "title_aux": "comfyui-clip-prompt-splitter"
+ }
+ ],
+ "https://github.com/elgalardi/comfyui-prompt-splitter": [
+ [
+ "PromptSplitter10Lines",
+ "PromptSplitter3Lines",
+ "PromptSplitter5Lines"
+ ],
+ {
+ "title_aux": "comfyui-prompt-splitter"
+ }
+ ],
+ "https://github.com/elyetis/Comfyui-ColorMatchNodes": [
+ [
+ "ColorMatch2Refs",
+ "ColorMatchBlendAutoWeights"
+ ],
+ {
+ "title_aux": "Comfyui-ColorMatchNodes"
+ }
+ ],
+ "https://github.com/emojiiii/ComfyUI_Emojiiii_Custom_Nodes": [
+ [
+ "BatchImageProcessor",
+ "Caption",
+ "CaptionDownload",
+ "KolorsMultiTextEncode",
+ "MultiTextEncode"
+ ],
+ {
+ "title_aux": "ComfyUI_Emojiiii_Custom_Nodes"
+ }
+ ],
+ "https://github.com/engineer6980/ComfyUI-Image-Cipher": [
+ [
+ "ImageCipherDecode",
+ "ImageCipherEncode"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Cipher"
+ }
+ ],
+ "https://github.com/envy-ai/ComfyUI-ConDelta": [
+ [
+ "ApplyConDelta",
+ "ApplyConDeltaAutoScale",
+ "CFGlessNegativePrompt",
+ "ClampConDelta",
+ "ConditioningAddConDelta",
+ "ConditioningAddConDeltaAutoScale",
+ "ConditioningAverageMultiple",
+ "ConditioningGetNoise",
+ "ConditioningGetRandom",
+ "ConditioningScale",
+ "ConditioningSubtract",
+ "ExtendedConditioningAverage",
+ "GetConDeltaFromPrompt",
+ "HardClampConDelta",
+ "LoadConditioningDelta",
+ "MaskConDelta",
+ "MultiDimensionalPromptTravel",
+ "PromptTravel",
+ "QuickConDelta",
+ "SaveConditioningDelta",
+ "ThresholdConditioning"
+ ],
+ {
+ "title_aux": "ComfyUI-ConDelta"
+ }
+ ],
+ "https://github.com/eric183/ComfyUI-Only": [
+ [
+ "ArchiveImageLoader",
+ "LatentLoaderAdvanced",
+ "WorkflowImageFileLoader",
+ "WorkflowJSONParser"
+ ],
+ {
+ "title_aux": "ComfyUI-Only"
+ }
+ ],
+ "https://github.com/erosDiffusion/ComfyUI-EulerDiscreteScheduler": [
+ [
+ "FlowMatchEulerDiscreteScheduler (Custom)",
+ "ImageMetadataExtractor",
+ "NunchakuQwenPatches",
+ "PatchFlashAttention"
+ ],
+ {
+ "title_aux": "ComfyUI-EulerDiscreteScheduler"
+ }
+ ],
+ "https://github.com/erosDiffusion/ComfyUI-ZImageDit": [
+ [
+ "LoadZImageSDNQ",
+ "ZImageSDNQGenerate"
+ ],
+ {
+ "title_aux": "ComfyUI-ZImageDit"
+ }
+ ],
+ "https://github.com/erosDiffusion/ComfyUI-enricos-nodes": [
+ [
+ "Compositor3",
+ "Compositor4",
+ "Compositor4MasksOutput",
+ "Compositor4TransformsOut",
+ "CompositorColorPicker",
+ "CompositorConfig3",
+ "CompositorConfig4",
+ "CompositorMasksOutputV3",
+ "CompositorTools3",
+ "CompositorTransformsOutV3",
+ "ImageColorSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-enricos-nodes"
+ }
+ ],
+ "https://github.com/errew/ComfyUI-Wireless": [
+ [
+ "WirelessGetAny",
+ "WirelessGetImage",
+ "WirelessGetLatent",
+ "WirelessSetAny",
+ "WirelessSetImage",
+ "WirelessSetLatent"
+ ],
+ {
+ "title_aux": "ComfyUI-Wireless"
+ }
+ ],
+ "https://github.com/esp-dev/comfyui-loadheicimage": [
+ [
+ "LoadImagePlusHEIC"
+ ],
+ {
+ "title_aux": "comfyui-loadheicimage"
+ }
+ ],
+ "https://github.com/esp-dev/comfyui-videoframenode": [
+ [
+ "VideoFirstLastFrame"
+ ],
+ {
+ "title_aux": "comfyui-videoframenode"
+ }
+ ],
+ "https://github.com/ethanfel/ComfyUI-Sharp-Selector": [
+ [
+ "FastAbsoluteSaver",
+ "ParallelSharpnessLoader",
+ "SharpFrameSelector",
+ "SharpnessAnalyzer"
+ ],
+ {
+ "title_aux": "ComfyUI-Sharp-Selector"
+ }
+ ],
+ "https://github.com/ethanfel/Comfyui-JSON-Manager": [
+ [
+ "JSONLoaderBatchI2V",
+ "JSONLoaderBatchLoRA",
+ "JSONLoaderBatchVACE",
+ "JSONLoaderCustom1",
+ "JSONLoaderCustom3",
+ "JSONLoaderCustom6",
+ "JSONLoaderLoRA",
+ "JSONLoaderStandard",
+ "JSONLoaderVACE"
+ ],
+ {
+ "title_aux": "Comfyui-JSON-Manager"
+ }
+ ],
+ "https://github.com/euan-gwd/comfyui-character-prompt-builder": [
+ [
+ "Character Prompt Builder Actions",
+ "Character Prompt Builder Female Fashion",
+ "Character Prompt Builder Female Person",
+ "Character Prompt Builder Female Poses",
+ "Character Prompt Builder Male Fashion",
+ "Character Prompt Builder Male Person",
+ "Character Prompt Builder Male Poses",
+ "Character Prompt Builder Person",
+ "Character Prompt Builder Scene"
+ ],
+ {
+ "title_aux": "comfyui-character-prompt-builder"
+ }
+ ],
+ "https://github.com/evanspearman/ComfyMath": [
+ [
+ "CM_BoolBinaryOperation",
+ "CM_BoolToInt",
+ "CM_BoolUnaryOperation",
+ "CM_BreakoutVec2",
+ "CM_BreakoutVec3",
+ "CM_BreakoutVec4",
+ "CM_ComposeVec2",
+ "CM_ComposeVec3",
+ "CM_ComposeVec4",
+ "CM_FloatBinaryCondition",
+ "CM_FloatBinaryOperation",
+ "CM_FloatToInt",
+ "CM_FloatToNumber",
+ "CM_FloatUnaryCondition",
+ "CM_FloatUnaryOperation",
+ "CM_IntBinaryCondition",
+ "CM_IntBinaryOperation",
+ "CM_IntToBool",
+ "CM_IntToFloat",
+ "CM_IntToNumber",
+ "CM_IntUnaryCondition",
+ "CM_IntUnaryOperation",
+ "CM_NearestSDXLExtendedResolution",
+ "CM_NearestSDXLResolution",
+ "CM_NumberBinaryCondition",
+ "CM_NumberBinaryOperation",
+ "CM_NumberToFloat",
+ "CM_NumberToInt",
+ "CM_NumberUnaryCondition",
+ "CM_NumberUnaryOperation",
+ "CM_SDXLExtendedResolution",
+ "CM_SDXLResolution",
+ "CM_Vec2BinaryCondition",
+ "CM_Vec2BinaryOperation",
+ "CM_Vec2ScalarOperation",
+ "CM_Vec2ToScalarBinaryOperation",
+ "CM_Vec2ToScalarUnaryOperation",
+ "CM_Vec2UnaryCondition",
+ "CM_Vec2UnaryOperation",
+ "CM_Vec3BinaryCondition",
+ "CM_Vec3BinaryOperation",
+ "CM_Vec3ScalarOperation",
+ "CM_Vec3ToScalarBinaryOperation",
+ "CM_Vec3ToScalarUnaryOperation",
+ "CM_Vec3UnaryCondition",
+ "CM_Vec3UnaryOperation",
+ "CM_Vec4BinaryCondition",
+ "CM_Vec4BinaryOperation",
+ "CM_Vec4ScalarOperation",
+ "CM_Vec4ToScalarBinaryOperation",
+ "CM_Vec4ToScalarUnaryOperation",
+ "CM_Vec4UnaryCondition",
+ "CM_Vec4UnaryOperation"
+ ],
+ {
+ "title_aux": "ComfyMath"
+ }
+ ],
+ "https://github.com/excelwong/ComfyUI-PromptComposer": [
+ [
+ "PromptComposer"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Composer"
+ }
+ ],
+ "https://github.com/exdysa/comfyui-selector": [
+ [
+ "Recourse",
+ "RecourseAny",
+ "RecourseCkpt",
+ "RecourseImage",
+ "RecoursePolar",
+ "RecourseStrings",
+ "SelInClip",
+ "SelInFloat",
+ "SelInGuider",
+ "SelInInt",
+ "SelInLatent",
+ "SelInModel",
+ "SelInPolar",
+ "SelInSampler",
+ "SelInSigmas",
+ "SelInVae",
+ "SelOutCLIP",
+ "SelOutModel",
+ "SelOutPolar",
+ "Selector",
+ "Selector Advanced",
+ "Selector Hub"
+ ],
+ {
+ "author": "\"\u02f6\ud835\udfa2\u292c\u2ad2\u2d56s\u143c\u02f6\"",
+ "description": "\"EXDYSA. Selector and Recourse. Presets & failsafes. Work flow.\"",
+ "nickname": "\"Selector\"",
+ "title": "\"Selector\"",
+ "title_aux": "comfyui-selector"
+ }
+ ],
+ "https://github.com/exectails/comfyui-et_dynamicprompts": [
+ [
+ "ETDynamicPrompt"
+ ],
+ {
+ "title_aux": "Dynamic Prompts"
+ }
+ ],
+ "https://github.com/exectails/comfyui-et_infoutils": [
+ [
+ "ETInspectTextNode",
+ "ETIntBoxNode",
+ "ETPresentImageNode",
+ "ETShowDataNode",
+ "ETStringBoxNode",
+ "ETTextBoxNode",
+ "ETTokenCountNode"
+ ],
+ {
+ "title_aux": "Info Utils"
+ }
+ ],
+ "https://github.com/exectails/comfyui-et_stringutils": [
+ [
+ "ETATOI",
+ "ETFTOA",
+ "ETITOA",
+ "ETJoinTextNode",
+ "ETReplaceTextNode",
+ "ETSplitTextNode",
+ "ETSwitchTextNode",
+ "ETTextFormatter10Node",
+ "ETTextFormatter2Node",
+ "ETTextFormatter5Node"
+ ],
+ {
+ "title_aux": "String Utils"
+ }
+ ],
+ "https://github.com/exedesign/Hunyuan-3D-v3": [
+ [
+ "Hunyuan3DPreview",
+ "HunyuanBatchImageTo3D",
+ "HunyuanBatchPreview",
+ "HunyuanConfig",
+ "HunyuanImageTo3D",
+ "HunyuanTextTo3D"
+ ],
+ {
+ "nodename_pattern": "Hunyuan",
+ "title_aux": "ComfyUI-Hunyuan3D-v3"
+ }
+ ],
+ "https://github.com/ez-af/ComfyUI-EZ-AF-Nodes": [
+ [
+ "EZ_CSV_Loader",
+ "EZ_Extract_Prompt",
+ "EZ_Find_Replace",
+ "EZ_Input",
+ "EZ_Prompt_Loader",
+ "EZ_Switch",
+ "EZ_Tag_Loader",
+ "EZ_Text_Concat",
+ "EZ_Text_to_Size"
+ ],
+ {
+ "title_aux": "ComfyUI-EZ-AF-Nodes"
+ }
+ ],
+ "https://github.com/fabbarix/comfyui-promptstore": [
+ [
+ "Prompt Selector",
+ "Prompt Template"
+ ],
+ {
+ "title_aux": "comfyui-promptstore"
+ }
+ ],
+ "https://github.com/facefusion/facefusion-comfyui": [
+ [
+ "SwapFaceImage",
+ "SwapFaceVideo"
+ ],
+ {
+ "title_aux": "FaceFusion ComfyUI"
+ }
+ ],
+ "https://github.com/facok/ComfyUI-HunyuanVideoMultiLora": [
+ [
+ "HunyuanVideoLoraLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-HunyuanVideoMultiLora"
+ }
+ ],
+ "https://github.com/facok/ComfyUI-TeaCacheHunyuanVideo": [
+ [
+ "TeaCacheHunyuanVideoSampler_FOK"
+ ],
+ {
+ "title_aux": "ComfyUI-TeaCacheHunyuanVideo"
+ }
+ ],
+ "https://github.com/facok/comfyui-meancache-z": [
+ [
+ "MeanCache_ZImage"
+ ],
+ {
+ "title_aux": "comfyui-meancache-z"
+ }
+ ],
+ "https://github.com/fairy-root/ComfyUI-GLHF": [
+ [
+ "glhf_chat"
+ ],
+ {
+ "title_aux": "ComfyUI-GLHF"
+ }
+ ],
+ "https://github.com/fairy-root/ComfyUI-OpenAI-FM": [
+ [
+ "OpenAIFMNode"
+ ],
+ {
+ "title_aux": "ComfyUI-OpenAI-FM"
+ }
+ ],
+ "https://github.com/fairy-root/ComfyUI-Show-Text": [
+ [
+ "ShowText"
+ ],
+ {
+ "title_aux": "ComfyUI-Show-Text"
+ }
+ ],
+ "https://github.com/fairy-root/Flux-Prompt-Generator": [
+ [
+ "FluxPromptGenerator"
+ ],
+ {
+ "title_aux": "Flux Prompt Generator for ComfyUI"
+ }
+ ],
+ "https://github.com/fairy-root/comfyui-ollama-llms": [
+ [
+ "ConcatenateText",
+ "llava",
+ "ollama"
+ ],
+ {
+ "title_aux": "Ollama and Llava Vision integration for ComfyUI"
+ }
+ ],
+ "https://github.com/fallingmeteorite/nsfw-image-check-comfyui": [
+ [
+ "NsfwAreaCoverNode",
+ "NsfwCheckNode"
+ ],
+ {
+ "title_aux": "nsfw-image-check-comfyui"
+ }
+ ],
+ "https://github.com/fashn-AI/ComfyUI-FASHN": [
+ [
+ "FASHN"
+ ],
+ {
+ "title_aux": "FASHN Virtual Try-On"
+ }
+ ],
+ "https://github.com/fat-tire/comfyui-unified-media-suite": [
+ [
+ "MediaLoad",
+ "MediaMerge",
+ "MediaSave"
+ ],
+ {
+ "title_aux": "ComfyUI Unified Media Suite"
+ }
+ ],
+ "https://github.com/fblissjr/ComfyUI-DatasetHelper": [
+ [
+ "DatasetBatchNode"
+ ],
+ {
+ "title_aux": "ComfyUI Dataset Helper & Batch Node"
+ }
+ ],
+ "https://github.com/fblissjr/ComfyUI-EmbeddingPipelineAnalytics": [
+ [
+ "EmbeddingAnalyzer",
+ "EmbeddingPipelineCapture",
+ "Hunyuan"
+ ],
+ {
+ "title_aux": "ComfyUI-EmbeddingPipelineAnalytics"
+ }
+ ],
+ "https://github.com/fblissjr/ComfyUI-QwenImageWanBridge": [
+ [
+ "HunyuanVideoCLIPLoader",
+ "HunyuanVideoEmptyLatent",
+ "HunyuanVideoPromptExpander",
+ "HunyuanVideoTextEncoder",
+ "HunyuanVideoVisionLoader",
+ "LLMOutputParser",
+ "PromptKeyFilter",
+ "QwenDebugController",
+ "QwenEliGenEntityControl",
+ "QwenEliGenMaskPainter",
+ "QwenImageBatch",
+ "QwenInpaintSampler",
+ "QwenLowresFixNode",
+ "QwenMaskProcessor",
+ "QwenSmartCrop",
+ "QwenSpatialTokenGenerator",
+ "QwenTemplateBuilder",
+ "QwenTemplateBuilderV2",
+ "QwenTemplateConnector",
+ "QwenToChronoEditBridge",
+ "QwenToWanFirstFrameLatent",
+ "QwenToWanImageSaver",
+ "QwenToWanLatentSaver",
+ "QwenTokenAnalyzer",
+ "QwenTokenAnalyzerStandalone",
+ "QwenTokenDebugger",
+ "QwenVLCLIPLoader",
+ "QwenVLEmptyLatent",
+ "QwenVLImageToLatent",
+ "QwenVLTextEncoder",
+ "QwenVLTextEncoderAdvanced",
+ "TemplateInfluenceAnalyzer",
+ "ZImageEmptyLatent",
+ "ZImageTextEncoder",
+ "ZImageTextEncoderSimple",
+ "ZImageTurnBuilder",
+ "ZImageWanVAEDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenImageWanBridge"
+ }
+ ],
+ "https://github.com/fblissjr/ComfyUI-WanActivationEditor": [
+ [
+ "WanVideoActivationEditor",
+ "WanVideoAdvancedActivationEditor",
+ "WanVideoBlockActivationBuilder",
+ "WanVideoBlockActivationViewer",
+ "WanVideoBlockStrengthBuilder",
+ "WanVideoDirectInjector",
+ "WanVideoEmbeddingAmplifier",
+ "WanVideoEmbeddingAnalyzer",
+ "WanVideoEmbeddingDatabase",
+ "WanVideoGuidanceController",
+ "WanVideoInjectionTester",
+ "WanVideoLatentEncoder",
+ "WanVideoLatentInjector",
+ "WanVideoNoiseController",
+ "WanVideoProjectionBooster",
+ "WanVideoSequentialMixer",
+ "WanVideoStrengthVisualizer",
+ "WanVideoVectorArithmetic",
+ "WanVideoVectorDifference",
+ "WanVideoVectorInterpolation"
+ ],
+ {
+ "title_aux": "ComfyUI-WanActivationEditor"
+ }
+ ],
+ "https://github.com/fblissjr/ComfyUI-WanSeamlessFlow": [
+ [
+ "WanAdaptiveFlow",
+ "WanBlendVisualize",
+ "WanEmbeddingPreviz",
+ "WanEmbeddingPrevizCanvas",
+ "WanMinimalCanvasTest",
+ "WanSmartBlend"
+ ],
+ {
+ "title_aux": "wanvideo - seamless flow"
+ }
+ ],
+ "https://github.com/fblissjr/shrug-prompter": [
+ [
+ "AccumulationNodeCompat",
+ "AdvancedVLMSampler",
+ "AnyTypePassthrough",
+ "AutoMemoryManager",
+ "DualProviderConfig",
+ "GlobalMemoryCleanup",
+ "ImageToAny",
+ "LoadAudio",
+ "LoopAwareResponseIterator",
+ "LoopAwareVLMAccumulator",
+ "LoopSafeAccumulator",
+ "PromptTemplateLoader",
+ "RemoteTextEncoder",
+ "RobustImageRangeExtractor",
+ "SeedPromptGenerator",
+ "ShrugASRNode",
+ "ShrugPromptBatchFromFile",
+ "ShrugPrompter",
+ "SmartImageRangeExtractor",
+ "TextCleanup",
+ "TextListCleanup",
+ "TextListIndexer",
+ "TextListToString",
+ "TwoRoundVLMPrompter",
+ "VLMImagePassthrough",
+ "VLMImageProcessor",
+ "VLMImageResizer",
+ "VLMPrompterFast",
+ "VLMProviderConfig",
+ "VLMResponseExtractor",
+ "VLMResultCollector",
+ "VLMResultIterator",
+ "VLMResultsToGeneric",
+ "VLMStyleRewriter",
+ "VideoFramePairExtractor",
+ "VideoSegmentAssembler"
+ ],
+ {
+ "title_aux": "Shrug-Prompter: Unified VLM Integration for ComfyUI"
+ }
+ ],
+ "https://github.com/fchangjun/Baidu_Meux_ComfyTools": [
+ [
+ "MeuxAdvancedImageCrop",
+ "MeuxImageLoader",
+ "MeuxMultiSaveImage",
+ "MeuxOutpaintSizePresetSafe",
+ "MeuxSimpleLLMNode",
+ "MeuxSizePresetSafe",
+ "MeuxSmartEmptyLatent",
+ "MeuxSmartExactResize",
+ "MeuxTextAreaInput"
+ ],
+ {
+ "title_aux": "BaiduMeux_Comfy Tools"
+ }
+ ],
+ "https://github.com/fchangjun/Comfyui_MultiSaveImage": [
+ [
+ "MeuxAdvancedImageCrop",
+ "MeuxImageLoader",
+ "MeuxMultiSaveImage",
+ "MeuxOutpaintSizePresetSafe",
+ "MeuxSimpleLLMNode",
+ "MeuxSizePresetSafe",
+ "MeuxSmartEmptyLatent",
+ "MeuxSmartExactResize",
+ "MeuxTextAreaInput"
+ ],
+ {
+ "title_aux": "MultiSaveImage Node"
+ }
+ ],
+ "https://github.com/fearnworks/ComfyUI_FearnworksNodes": [
+ [
+ "Count Files in Directory (FW)",
+ "Count Tokens (FW)",
+ "CountTokens",
+ "FileCountInDirectory",
+ "Token Count Ranker(FW)",
+ "TokenCountRanker",
+ "Trim To Tokens (FW)",
+ "TrimToTokens"
+ ],
+ {
+ "title_aux": "Fearnworks Nodes"
+ }
+ ],
+ "https://github.com/febogallo/ComfyUI-Freepik": [
+ [
+ "FreepikMystic",
+ "FreepikRemoveBackground",
+ "FreepikUpscalerCreative",
+ "FreepikUpscalerPrecision"
+ ],
+ {
+ "title_aux": "ComfyUI-Freepik"
+ }
+ ],
+ "https://github.com/feffy380/comfyui-chroma-cache": [
+ [
+ "ChromaCache"
+ ],
+ {
+ "title_aux": "Chroma Cache"
+ }
+ ],
+ "https://github.com/feixuetuba/Spleeter": [
+ [
+ "Spleeter"
+ ],
+ {
+ "title_aux": "Spleeter"
+ }
+ ],
+ "https://github.com/felixszeto/ComfyUI-RequestNodes": [
+ [
+ "Chainable Upload Image",
+ "ChainableUploadImage",
+ "Form Post Request Node",
+ "FormPostRequestNode",
+ "Get Request Node",
+ "GetRequestNode",
+ "Image To Base64 Node",
+ "Image To Blob Node",
+ "ImageToBase64Node",
+ "ImageToBlobNode",
+ "Key/Value Node",
+ "KeyValueNode",
+ "Post Request Node",
+ "PostRequestNode",
+ "Rest Api Node",
+ "RestApiNode",
+ "Retry Settings Node",
+ "RetrySettingNode",
+ "String Replace Node",
+ "StringReplaceNode"
+ ],
+ {
+ "title_aux": "ComfyUI-RequestNodes"
+ }
+ ],
+ "https://github.com/fexli/fexli-util-node-comfyui": [
+ [
+ "FEAnyToDict",
+ "FEAnyToString",
+ "FEBCPrompt",
+ "FEBatchGenStringBCDocker",
+ "FEColor2Image",
+ "FEColorOut",
+ "FEDataInsertor",
+ "FEDataPacker",
+ "FEDataUnpacker",
+ "FEDeepClone",
+ "FEDictCombine",
+ "FEDictPacker",
+ "FEDictUnpacker",
+ "FEEncLoraAutoLoader",
+ "FEEncLoraAutoLoaderStack",
+ "FEEncLoraLoader",
+ "FEExtraInfoAdd",
+ "FEGenStringBCDocker",
+ "FEGenStringGPT",
+ "FEGenStringNBus",
+ "FEImageNoiseGenerate",
+ "FEImagePadForOutpaint",
+ "FEImagePadForOutpaintByImage",
+ "FEInterruptCondition",
+ "FELoadImageQQUrl",
+ "FEOperatorIf",
+ "FERandomBool",
+ "FERandomLoraSelect",
+ "FERandomPrompt",
+ "FERandomizedColor2Image",
+ "FERandomizedColorOut",
+ "FERerouteWithName",
+ "FESaveEncryptImage",
+ "FETextCombine",
+ "FETextCombine2Any",
+ "FETextInput"
+ ],
+ {
+ "title_aux": "fexli-util-node-comfyui"
+ }
+ ],
+ "https://github.com/fexploit/ComfyUI-AutoLabel": [
+ [
+ "AutoLabel"
+ ],
+ {
+ "title_aux": "ComfyUI-AutoLabel"
+ }
+ ],
+ "https://github.com/fexploit/ComfyUI-AutoTrimBG": [
+ [
+ "RonLayers/TrimBg: RonLayersTrimBgUltraV2"
+ ],
+ {
+ "title_aux": "ComfyUI-AutoTrimBG"
+ }
+ ],
+ "https://github.com/fexploit/ComfyUI-Classifier": [
+ [
+ "ClassifierNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Classifier"
+ }
+ ],
+ "https://github.com/fidecastro/comfyui-llamacpp-client": [
+ [
+ "LlamaCppClient"
+ ],
+ {
+ "title_aux": "comfyui-llamacpp-client"
+ }
+ ],
+ "https://github.com/filipemeneses/comfy_pixelization": [
+ [
+ "Pixelization"
+ ],
+ {
+ "title_aux": "Pixelization"
+ }
+ ],
+ "https://github.com/filliptm/ComfyUI-FL-DiffVSR": [
+ [
+ "FL_DiffVSR_LoadModel",
+ "FL_DiffVSR_Upscale"
+ ],
+ {
+ "title_aux": "ComfyUI-FL-DiffVSR"
+ }
+ ],
+ "https://github.com/filliptm/ComfyUI_FL-ClearVoice": [
+ [
+ "FL_ClearVoice_ModelLoader",
+ "FL_ClearVoice_Process"
+ ],
+ {
+ "title_aux": "ComfyUI_FL-ClearVoice"
+ }
+ ],
+ "https://github.com/filliptm/ComfyUI_FL-CosyVoice3": [
+ [
+ "FL_CosyVoice3_AudioCrop",
+ "FL_CosyVoice3_CrossLingual",
+ "FL_CosyVoice3_Dialog",
+ "FL_CosyVoice3_ModelLoader",
+ "FL_CosyVoice3_VoiceConversion",
+ "FL_CosyVoice3_ZeroShot"
+ ],
+ {
+ "title_aux": "ComfyUI_FL-CosyVoice3"
+ }
+ ],
+ "https://github.com/filliptm/ComfyUI_FL-Path-Animator": [
+ [
+ "FL_PathAnimator"
+ ],
+ {
+ "title_aux": "ComfyUI_FL-Path-Animator"
+ }
+ ],
+ "https://github.com/filliptm/ComfyUI_FL-SongGen": [
+ [
+ "FL_SongGen_AutoStyle",
+ "FL_SongGen_DescriptionBuilder",
+ "FL_SongGen_Generate",
+ "FL_SongGen_LyricsFormatter",
+ "FL_SongGen_ModelLoader",
+ "FL_SongGen_StyleTransfer"
+ ],
+ {
+ "title_aux": "ComfyUI_FL-SongGen"
+ }
+ ],
+ "https://github.com/filliptm/ComfyUI_FL-Trainer": [
+ [
+ "FL_ImageCaptionSaver",
+ "FL_KohyaSSAdvConfig",
+ "FL_KohyaSSDatasetConfig",
+ "FL_KohyaSSInitWorkspace",
+ "FL_KohyaSSTrain",
+ "FL_Kohya_EasyTrain",
+ "FL_LoadImagesFromDirectoryPath"
+ ],
+ {
+ "title_aux": "ComfyUI_FL-Trainer"
+ }
+ ],
+ "https://github.com/filliptm/ComfyUI_Fill-ChatterBox": [
+ [
+ "FL_ChatterboxDialogTTS",
+ "FL_ChatterboxMultilingualTTS",
+ "FL_ChatterboxTTS",
+ "FL_ChatterboxTurboTTS",
+ "FL_ChatterboxVC"
+ ],
+ {
+ "title_aux": "ComfyUI_Fill-ChatterBox"
+ }
+ ],
+ "https://github.com/filliptm/ComfyUI_Fill-Nodes": [
+ [
+ "FL_API_Base64_ImageLoader",
+ "FL_API_ImageSaver",
+ "FL_AnimatedShapePatterns",
+ "FL_AnimeLineExtractor",
+ "FL_ApplyMask",
+ "FL_Ascii",
+ "FL_Audio_BPM_Analyzer",
+ "FL_Audio_Beat_Visualizer",
+ "FL_Audio_Crop",
+ "FL_Audio_Drum_Detector",
+ "FL_Audio_Envelope_Visualizer",
+ "FL_Audio_Music_Video_Sequencer",
+ "FL_Audio_Reactive_Brightness",
+ "FL_Audio_Reactive_Edge_Glow",
+ "FL_Audio_Reactive_Envelope",
+ "FL_Audio_Reactive_Saturation",
+ "FL_Audio_Reactive_Scale",
+ "FL_Audio_Reactive_Speed",
+ "FL_Audio_Segment_Extractor",
+ "FL_Audio_Separation",
+ "FL_Audio_Shot_Iterator",
+ "FL_BatchAlign",
+ "FL_BlackFrameReject",
+ "FL_BulkPDFLoader",
+ "FL_BulletHellGame",
+ "FL_CSVExtractor",
+ "FL_CaptionSaver_V2",
+ "FL_CaptionToCSV",
+ "FL_ClipScanner",
+ "FL_CodeNode",
+ "FL_ColorPicker",
+ "FL_Dalle3",
+ "FL_DirectoryCrawl",
+ "FL_Dither",
+ "FL_FILM",
+ "FL_Fal_Gemini_ImageEdit",
+ "FL_Fal_Kling_AIAvatar",
+ "FL_Fal_Kontext",
+ "FL_Fal_Pixverse",
+ "FL_Fal_Pixverse_LipSync",
+ "FL_Fal_Pixverse_Transition",
+ "FL_Fal_SeedVR_Upscale",
+ "FL_Fal_Seedance_i2v",
+ "FL_Fal_Seedream_Edit",
+ "FL_Fal_Sora",
+ "FL_Float",
+ "FL_FloatToInt",
+ "FL_FractalKSampler",
+ "FL_GPT_Image1",
+ "FL_GPT_Image1_ADV",
+ "FL_GPT_Text",
+ "FL_GPT_Vision",
+ "FL_GeminiImageEditor",
+ "FL_GeminiImageGenADV",
+ "FL_GeminiTextAPI",
+ "FL_GeminiVideoCaptioner",
+ "FL_Glitch",
+ "FL_GoogleCloudStorage",
+ "FL_GoogleDriveDownloader",
+ "FL_GoogleDriveImageDownloader",
+ "FL_GradGenerator",
+ "FL_HFDatasetDownloader",
+ "FL_HFHubModelUploader",
+ "FL_HF_Character",
+ "FL_HF_UploaderAbsolute",
+ "FL_HalftonePattern",
+ "FL_Hedra_API",
+ "FL_HexagonalPattern",
+ "FL_ImageAddNoise",
+ "FL_ImageAddToBatch",
+ "FL_ImageAdjuster",
+ "FL_ImageAspectCropper",
+ "FL_ImageBatch",
+ "FL_ImageBatchToGrid",
+ "FL_ImageBatchToImageList",
+ "FL_ImageBlank",
+ "FL_ImageCaptionLayout",
+ "FL_ImageCaptionLayoutPDF",
+ "FL_ImageCaptionSaver",
+ "FL_ImageCollage",
+ "FL_ImageCrop",
+ "FL_ImageDimensionDisplay",
+ "FL_ImageListToImageBatch",
+ "FL_ImageNotes",
+ "FL_ImageOverlay",
+ "FL_ImagePicker",
+ "FL_ImagePixelator",
+ "FL_ImageRandomizer",
+ "FL_ImageSelector",
+ "FL_ImageSlicer",
+ "FL_ImagesToPDF",
+ "FL_InfiniteZoom",
+ "FL_InpaintCrop",
+ "FL_Inpaint_Stitch",
+ "FL_IntToFloat",
+ "FL_JS",
+ "FL_KSamplerXYZPlot",
+ "FL_KsamplerBasic",
+ "FL_KsamplerPlus",
+ "FL_KsamplerPlusV2",
+ "FL_KsamplerSettings",
+ "FL_LoadCSV",
+ "FL_LoadImage",
+ "FL_MadLibGenerator",
+ "FL_Math",
+ "FL_MirrorAndAppendCaptions",
+ "FL_ModelInspector",
+ "FL_NFTGenerator",
+ "FL_NodeLoader",
+ "FL_NodePackLoader",
+ "FL_OllamaCaptioner",
+ "FL_PDFEncryptor",
+ "FL_PDFImageExtractor",
+ "FL_PDFLoader",
+ "FL_PDFMerger",
+ "FL_PDFSaver",
+ "FL_PDFTextExtractor",
+ "FL_PDFToImages",
+ "FL_Padding",
+ "FL_PaddingRemover",
+ "FL_PaperDrawn",
+ "FL_PasteByMask",
+ "FL_PasteOnCanvas",
+ "FL_PathAnimator",
+ "FL_PathTypeChecker",
+ "FL_PixVerseAPI",
+ "FL_PixelArtShader",
+ "FL_PixelSort",
+ "FL_ProResVideo",
+ "FL_PromptBasic",
+ "FL_PromptMulti",
+ "FL_PromptSelector",
+ "FL_PromptSelectorBasic",
+ "FL_QwenImageEditStrength",
+ "FL_RIFE",
+ "FL_RandomNumber",
+ "FL_RandomShapeGenerator",
+ "FL_ReplaceColor",
+ "FL_RetroEffect",
+ "FL_Ripple",
+ "FL_RunwayAct2",
+ "FL_RunwayImageAPI",
+ "FL_SDUltimate_Slices",
+ "FL_SamplerStrings",
+ "FL_SaveAndDisplayImage",
+ "FL_SaveCSV",
+ "FL_SaveImages",
+ "FL_SaveRGBAAnimatedWebP",
+ "FL_SaveWebM",
+ "FL_SaveWebPImage(SaveImage)",
+ "FL_SchedulerStrings",
+ "FL_SendToDiscordWebhook",
+ "FL_SeparateMaskComponents",
+ "FL_Shadertoy",
+ "FL_SimpleGPTVision",
+ "FL_Switch",
+ "FL_Switch_Big",
+ "FL_SystemCheck",
+ "FL_TetrisGame",
+ "FL_TextOverlayNode",
+ "FL_TextToPDF",
+ "FL_TimeLine",
+ "FL_UnloadAllModels",
+ "FL_UnloadModel",
+ "FL_UpscaleModel",
+ "FL_Veo3VideoGen",
+ "FL_VertexGemini25FlashImage",
+ "FL_VideoBatchSplitter",
+ "FL_VideoCadence",
+ "FL_VideoCadenceCompile",
+ "FL_VideoCaptionSaver",
+ "FL_VideoCropMask",
+ "FL_VideoCrossfade",
+ "FL_VideoCut",
+ "FL_VideoRecompose",
+ "FL_VideoTrim",
+ "FL_WF_Agent",
+ "FL_WanFirstLastFrameToVideo",
+ "FL_WanVaceToVideoMultiRef",
+ "FL_WanVideoBlender",
+ "FL_WanVideoBlender3Way",
+ "FL_WanVideoContinuationBlender",
+ "FL_WanVideoContinue",
+ "FL_WordFrequencyGraph",
+ "FL_ZipDirectory",
+ "FL_ZipSave",
+ "GradientImageGenerator",
+ "SaveWebPImage"
+ ],
+ {
+ "title_aux": "ComfyUI_Fill-Nodes"
+ }
+ ],
+ "https://github.com/fkxianzhou/ComfyUI-Jimeng-API": [
+ [
+ "JimengAPIClient",
+ "JimengReferenceImage2Video",
+ "JimengSeedance1",
+ "JimengSeedance1_5",
+ "JimengSeedream3",
+ "JimengSeedream4",
+ "JimengVideoQueryTasks"
+ ],
+ {
+ "title_aux": "ComfyUI-Jimeng-API"
+ }
+ ],
+ "https://github.com/flamacore/ComfyUI-YouTubeUploader": [
+ [
+ "YouTubeAuthNode",
+ "YouTubeUploaderNode"
+ ],
+ {
+ "title_aux": "ComfyUI YouTube Uploader"
+ }
+ ],
+ "https://github.com/florestefano1975/ComfyUI-Advanced-Sequence-Seed": [
+ [
+ "AdvancedSequenceSeedNode"
+ ],
+ {
+ "title_aux": "Advanced Sequence Seed Generator"
+ }
+ ],
+ "https://github.com/florestefano1975/ComfyUI-CogVideoX": [
+ [
+ "CogVideoX Image-2-Video Extended",
+ "CogVideoX Save Video"
+ ],
+ {
+ "title_aux": "ComfyUI-CogVideoX"
+ }
+ ],
+ "https://github.com/florestefano1975/ComfyUI-HiDiffusion": [
+ [
+ "HiDiffusionSD15",
+ "HiDiffusionSD21",
+ "HiDiffusionSDXL",
+ "HiDiffusionSDXLTurbo"
+ ],
+ {
+ "title_aux": "ComfyUI HiDiffusion"
+ }
+ ],
+ "https://github.com/florestefano1975/ComfyUI-StabilityAI-Suite": [
+ [
+ "StabilityAI Suite - Creative Upscale",
+ "StabilityAI Suite - Creative Upscale Recover File",
+ "StabilityAI Suite - Image Core + Style Preset",
+ "StabilityAI Suite - Inpainting",
+ "StabilityAI Suite - Outpainting",
+ "StabilityAI Suite - Remove Background",
+ "StabilityAI Suite - SD3",
+ "StabilityAI Suite - Search and Replace"
+ ],
+ {
+ "title_aux": "ComfyUI StabilityAI Suite"
+ }
+ ],
+ "https://github.com/florestefano1975/comfyui-portrait-master": [
+ [
+ "PortraitMaster",
+ "PortraitMasterBaseCharacter",
+ "PortraitMasterFaceGenerator",
+ "PortraitMasterMakeup",
+ "PortraitMasterPromptStyler",
+ "PortraitMasterSkinDetails",
+ "PortraitMasterStylePose"
+ ],
+ {
+ "title_aux": "comfyui-portrait-master"
+ }
+ ],
+ "https://github.com/florestefano1975/comfyui-prompt-composer": [
+ [
+ "PromptComposerCustomLists",
+ "PromptComposerEffect",
+ "PromptComposerGrouping",
+ "PromptComposerMerge",
+ "PromptComposerStyler",
+ "PromptComposerTextSingle",
+ "promptComposerTextMultiple"
+ ],
+ {
+ "title_aux": "comfyui-prompt-composer"
+ }
+ ],
+ "https://github.com/flowers6421/ComfyUI-SimpleTunerFlux2": [
+ [
+ "SimpleTunerFlux2LoRALoader",
+ "SimpleTunerFlux2LoRASelector",
+ "SimpleTunerFlux2LoRAUnloader",
+ "SimpleTunerFlux2PipelineLoader",
+ "SimpleTunerFlux2Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI-SimpleTunerFlux2"
+ }
+ ],
+ "https://github.com/flowtyone/ComfyUI-Flowty-CRM": [
+ [
+ "CCMSampler",
+ "CRMModelLoader",
+ "CRMModeler",
+ "CRMModelerCuda",
+ "CRMPoseSampler",
+ "CRMPoserConfig",
+ "CRMPreprocessForPoser",
+ "CRMViewer"
+ ],
+ {
+ "title_aux": "ComfyUI-Flowty-CRM"
+ }
+ ],
+ "https://github.com/flowtyone/ComfyUI-Flowty-LDSR": [
+ [
+ "LDSRModelLoader",
+ "LDSRUpscale",
+ "LDSRUpscaler"
+ ],
+ {
+ "title_aux": "ComfyUI-Flowty-LDSR"
+ }
+ ],
+ "https://github.com/flowtyone/ComfyUI-Flowty-TripoSR": [
+ [
+ "TripoSRModelLoader",
+ "TripoSRSampler",
+ "TripoSRViewer"
+ ],
+ {
+ "title_aux": "ComfyUI-Flowty-TripoSR"
+ }
+ ],
+ "https://github.com/fluffydiveX/ComfyUI-hvBlockswap": [
+ [
+ "hvBlockSwap"
+ ],
+ {
+ "title_aux": "ComfyUI-hvBlockswap"
+ }
+ ],
+ "https://github.com/flybirdxx/ComfyUI-RexOmni": [
+ [
+ "RexOmniDetector",
+ "RexOmniLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Rex-Omni"
+ }
+ ],
+ "https://github.com/flybirdxx/ComfyUI-SDMatte": [
+ [
+ "SDMatteApply"
+ ],
+ {
+ "title_aux": "ComfyUI-SDMatte"
+ }
+ ],
+ "https://github.com/flybirdxx/ComfyUI-SoulX-Podcast": [
+ [
+ "SoulXPodcastGenerate",
+ "SoulXPodcastInputParser",
+ "SoulXPodcastLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-SoulX-Podcast"
+ }
+ ],
+ "https://github.com/flycarl/ComfyUI-Pixelate": [
+ [
+ "ComfyUIPixelate"
+ ],
+ {
+ "title_aux": "ComfyUI-Pixelate"
+ }
+ ],
+ "https://github.com/flyingshutter/As_ComfyUI_CustomNodes": [
+ [
+ "CropImage_AS",
+ "Eval_AS",
+ "ImageMixMasked_As",
+ "ImageToMask_AS",
+ "Int2Any_AS",
+ "LatentAdd_AS",
+ "LatentMixMasked_As",
+ "LatentMix_AS",
+ "LatentToImages_AS",
+ "LoadLatent_AS",
+ "MapRange_AS",
+ "MaskToImage_AS",
+ "Math_AS",
+ "NoiseImage_AS",
+ "Number2Float_AS",
+ "Number2Int_AS",
+ "Number_AS",
+ "SaveLatent_AS",
+ "TextToImage_AS",
+ "TextWildcardList_AS"
+ ],
+ {
+ "title_aux": "As_ComfyUI_CustomNodes"
+ }
+ ],
+ "https://github.com/fmartinellidev/ComfyUI-Prompt_util_pack": [
+ [
+ "PromptHiddenProcessor",
+ "PromptSnippetExtractor",
+ "PromptVariableExtractor",
+ "PromptVariableSubstitutor"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt_util_pack"
+ }
+ ],
+ "https://github.com/fmatray/ComfyUI_BattlemapGrid": [
+ [
+ "Battlemap Grid",
+ "Compass",
+ "Map Generator",
+ "Map Generator(Outdoors)"
+ ],
+ {
+ "title_aux": "ComfyUI_BattlemapGrid"
+ }
+ ],
+ "https://github.com/fofr/ComfyUI-HyperSDXL1StepUnetScheduler": [
+ [
+ "HyperSDXL1StepUnetScheduler"
+ ],
+ {
+ "title_aux": "ComfyUI-HyperSDXL1StepUnetScheduler (ByteDance)"
+ }
+ ],
+ "https://github.com/fofr/ComfyUI-Prompter-fofrAI": [
+ [
+ "List sampler \ud83e\udeb4",
+ "Prompt from template \ud83e\udeb4"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompter-fofrAI"
+ }
+ ],
+ "https://github.com/fofr/comfyui-basic-auth": [
+ [
+ "BasicAuthSetup"
+ ],
+ {
+ "title_aux": "ComfyUI-Basic-Auth"
+ }
+ ],
+ "https://github.com/fofr/comfyui-fofr-toolkit": [
+ [
+ "Incrementer \ud83e\udeb4",
+ "Width and height for scaling image to ideal resolution \ud83e\udeb4",
+ "Width and height from aspect ratio \ud83e\udeb4"
+ ],
+ {
+ "title_aux": "comfyui-fofr-toolkit"
+ }
+ ],
+ "https://github.com/forever22777/comfyui-self-guidance": [
+ [
+ "CLIPConditioning",
+ "CheckpointLoaderMixWithDiffusers",
+ "SelfGuidanceSampler"
+ ],
+ {
+ "title_aux": "Self-Guidance nodes"
+ }
+ ],
+ "https://github.com/fotobudka-team/comfyui-ai-faces": [
+ [
+ "PhotoVerification"
+ ],
+ {
+ "title_aux": "ComfyUI AI Faces - Photo Verification Node"
+ }
+ ],
+ "https://github.com/foxtrot-roger/comfyui-rf-nodes": [
+ [
+ "LogBool",
+ "LogFloat",
+ "LogInt",
+ "LogNumber",
+ "LogString",
+ "LogVec2",
+ "LogVec3",
+ "RF_AtIndexString",
+ "RF_BoolToString",
+ "RF_FloatToString",
+ "RF_IntToString",
+ "RF_JsonStyleLoader",
+ "RF_MergeLines",
+ "RF_NumberToString",
+ "RF_OptionsString",
+ "RF_RangeFloat",
+ "RF_RangeInt",
+ "RF_RangeNumber",
+ "RF_SavePromptInfo",
+ "RF_SplitLines",
+ "RF_TextConcatenate",
+ "RF_TextInput",
+ "RF_TextReplace",
+ "RF_Timestamp",
+ "RF_ToString",
+ "RF_Vec2ToString",
+ "RF_Vec3ToString",
+ "TextLine"
+ ],
+ {
+ "title_aux": "RF Nodes"
+ }
+ ],
+ "https://github.com/fpgaminer/joycaption_comfyui": [
+ [
+ "JJC_JoyCaption",
+ "JJC_JoyCaption_Custom"
+ ],
+ {
+ "title_aux": "JoyCaption Nodes"
+ }
+ ],
+ "https://github.com/fplu/comfyui_lama_with_refiner": [
+ [
+ "INPAINT_InpaintWithLaMaRefinerModel",
+ "INPAINT_LoadInpaintLaMaModel"
+ ],
+ {
+ "title_aux": "lama_with_refiner"
+ }
+ ],
+ "https://github.com/fr0nky0ng/ComfyUI-Face-Comparator": [
+ [
+ "FaceComparator"
+ ],
+ {
+ "title_aux": "ComfyUI-Face-Comparator"
+ }
+ ],
+ "https://github.com/fr0nky0ng/ComfyUI-JSON-Prompt": [
+ [
+ "FormatLLMOutput",
+ "JSONPromptGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-JSON-Prompt"
+ }
+ ],
+ "https://github.com/fr0nky0ng/ComfyUI-frankAI-banana": [
+ [
+ "BananaApiKeyNode",
+ "BananaMainNode",
+ "BananaPromptSelector",
+ "FrankApiKeyNode",
+ "GoogleApiKeyNode",
+ "ImageListCollector"
+ ],
+ {
+ "title_aux": "ComfyUI-frankAI-banana"
+ }
+ ],
+ "https://github.com/francarl/ComfyUI-OnDemand-Loaders": [
+ [
+ "OnDemandCLIPLoader",
+ "OnDemandCLIPVisionLoader",
+ "OnDemandCheckpointLoader",
+ "OnDemandCivitaiLikedLoraLoader",
+ "OnDemandControlNetLoader",
+ "OnDemandDualCLIPLoader",
+ "OnDemandGGUFLoader",
+ "OnDemandLoraLoader",
+ "OnDemandModelPatchLoader",
+ "OnDemandUNETLoader",
+ "OnDemandVAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-OnDemand-Lora-Loader"
+ }
+ ],
+ "https://github.com/franciscotorrado/ComfyUI-Automation": [
+ [
+ "IteratorCounter",
+ "IteratorItem",
+ "IteratorList",
+ "IteratorSignal",
+ "VideoConcatenation"
+ ],
+ {
+ "title_aux": "ComfyUI-Automation"
+ }
+ ],
+ "https://github.com/frankchieng/ComfyUI_Aniportrait": [
+ [
+ "AniPortrait_Audio2Video",
+ "AniPortrait_Audio_Path",
+ "AniPortrait_LoadVideoPath",
+ "AniPortrait_Pose_Gen_Video",
+ "AniPortrait_Ref_Image_Path",
+ "AniPortrait_Video_Gen_Pose"
+ ],
+ {
+ "title_aux": "ComfyUI_Aniportrait"
+ }
+ ],
+ "https://github.com/frankchieng/ComfyUI_MagicClothing": [
+ [
+ "MagicClothing_Animatediff",
+ "MagicClothing_Generate",
+ "MagicClothing_Inpainting"
+ ],
+ {
+ "title_aux": "ComfyUI_MagicClothing"
+ }
+ ],
+ "https://github.com/frankchieng/ComfyUI_llm_easyanimiate": [
+ [],
+ {
+ "nodename_pattern": "^FrankChiengEasyAnimate",
+ "title_aux": "ComfyUI_llm_easyanimiate"
+ }
+ ],
+ "https://github.com/frankluise5220/ComfyUI-Lorahelper": [
+ [
+ "LH_AutoRatio",
+ "LH_History_Monitor",
+ "LH_LlamaInstruct",
+ "LH_LoraLoader",
+ "LH_MultiTextSelector",
+ "LH_SuperText",
+ "LH_TextDirectoryLoader",
+ "LoRA_AllInOne_Saver",
+ "UniversalAIChat",
+ "UniversalGGUFLoader",
+ "UniversalOllamaLoader"
+ ],
+ {
+ "nodename_pattern": "UniversalGGUFLoader|UniversalOllamaLoader|UniversalAIChat|LH_LlamaInstruct|LH_History_Monitor|LH_MultiTextSelector|LoRA_AllInOne_Saver|LH_SimpleText",
+ "title_aux": "ComfyUI-LoraHelper"
+ }
+ ],
+ "https://github.com/fredhopp/comfyui-flipflopnodes": [
+ [
+ "FF Group Positioner",
+ "FF Load Image with Metadata",
+ "FF Text"
+ ],
+ {
+ "title_aux": "comfyui-flipflopnodes"
+ }
+ ],
+ "https://github.com/fredlef/Comfyui_FSL_Nodes": [
+ [
+ "FSL Composite With Mask",
+ "FSL Image Passthrough",
+ "FSL Image Switch 8Way",
+ "FSL Manual Alpha Mask Painter",
+ "FSL Save And Strip Alpha",
+ "FSLEnsureNHWCBatch",
+ "FSLGeminiChat",
+ "FSLGeminiGenerateImage",
+ "FSLGeminiGenerateImageV8",
+ "FSLGeminiImageGenerator",
+ "FSLImageMemoryClear",
+ "FSLImageMemoryClearAll",
+ "FSLImageMemoryRecallSafe",
+ "FSLImageMemoryStore",
+ "FSLImageSaverWithMetadata",
+ "FSLImageSaverWithMetadataV5",
+ "FSLPromptCompose",
+ "FSLVeoGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI FSL Nodes"
+ }
+ ],
+ "https://github.com/freelifehacker/ComfyUI-ImgMask2PNG": [
+ [
+ "ImageMask2PNG"
+ ],
+ {
+ "title_aux": "ComfyUI-ImgMask2PNG"
+ }
+ ],
+ "https://github.com/fsdymy1024/ComfyUI_fsdymy": [
+ [
+ "IPAdapterLayerWeight",
+ "Preview Image Without Metadata",
+ "PreviewImageWithoutMetadata",
+ "Save Image Without Metadata",
+ "SaveImageWithoutMetadata",
+ "ShowText",
+ "ZhiPuAiNode"
+ ],
+ {
+ "title_aux": "ComfyUI_fsdymy"
+ }
+ ],
+ "https://github.com/fssorc/ComfyUI_FFT": [
+ [
+ "FFTNode",
+ "FindFFTSpot",
+ "InvertFFTNode",
+ "InvertFFTWithMask"
+ ],
+ {
+ "title_aux": "ComfyUI_FFT"
+ }
+ ],
+ "https://github.com/fssorc/ComfyUI_FaceShaper": [
+ [
+ "FaceAlignmentCropper",
+ "FaceShaper",
+ "FaceShaperComposite",
+ "FaceShaperCropper",
+ "FaceShaperFaceMask",
+ "FaceShaperLoadInsightFaceCropper",
+ "FaceShaperLoadMediaPipeCropper",
+ "FaceShaperMatchV2",
+ "FaceShaperModels",
+ "FaceShaperShowLandMarks",
+ "FaceShaperV2"
+ ],
+ {
+ "title_aux": "ComfyUI_FaceShaper"
+ }
+ ],
+ "https://github.com/fssorc/ComfyUI_RopeWrapper": [
+ [
+ "RopeWrapper_DetectNode",
+ "RopeWrapper_FaceRestore",
+ "RopeWrapper_LoadModels",
+ "RopeWrapper_LoadSwapInfo",
+ "RopeWrapper_OptionNode",
+ "RopeWrapper_SaveSwapInfo",
+ "RopeWrapper_SwapNode"
+ ],
+ {
+ "title_aux": "ComfyUI_RopeWrapper"
+ }
+ ],
+ "https://github.com/fssorc/ComfyUI_pose_inter": [
+ [
+ "GenTPose",
+ "PoseModify",
+ "Pose_Inter",
+ "Pose_Inter_V2"
+ ],
+ {
+ "title_aux": "ComfyUI_pose_inter"
+ }
+ ],
+ "https://github.com/fudosanit/ComfyUI-Random-Resolution": [
+ [
+ "RandomResolutionSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-Random-Resolution"
+ }
+ ],
+ "https://github.com/fuselayer/comfyui-lite-tracker": [
+ [
+ "LiteTracker_LoadModel",
+ "LiteTracker_Track",
+ "RectEditor"
+ ],
+ {
+ "title_aux": "comfyui-lite-tracker"
+ }
+ ],
+ "https://github.com/fuselayer/comfyui-mosaic-blur": [
+ [
+ "ImageMosaic"
+ ],
+ {
+ "title_aux": "comfyui-mosaic-blur"
+ }
+ ],
+ "https://github.com/fuselayer/comfyui-noise-match": [
+ [
+ "ApplyNoisePattern",
+ "NoisePatternVisualizer",
+ "NoiseRegionDetector",
+ "RealNoiseExtractor"
+ ],
+ {
+ "title_aux": "comfyui-noise-match"
+ }
+ ],
+ "https://github.com/g0kuvonlange/ComfyUI-Load-From-URL": [
+ [
+ "Load LoRA From URL",
+ "Load LoRAs from JSON",
+ "Load Video From URL"
+ ],
+ {
+ "title_aux": "ComfyUI Load From URL"
+ }
+ ],
+ "https://github.com/g7b2/ComfyUI-Artist-Tester": [
+ [
+ "ArtistListIterator",
+ "ArtistPromptComposer",
+ "SaveImageWithArtistTag"
+ ],
+ {
+ "title_aux": "ComfyUI-Artist-Tester"
+ }
+ ],
+ "https://github.com/g7b2/ComfyUI-MultiCheckpoint-Tester": [
+ [
+ "MultiCheckpointIncrementalNamer"
+ ],
+ {
+ "title_aux": "ComfyUI-MultiCheckpoint-Tester"
+ }
+ ],
+ "https://github.com/gabe-init/ComfyUI-11labs": [
+ [
+ "ElevenLabsNode"
+ ],
+ {
+ "title_aux": "ComfyUI-11labs"
+ }
+ ],
+ "https://github.com/gabe-init/ComfyUI-Google-Image-Search": [
+ [
+ "GoogleImageSearchNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Google-Image-Search"
+ }
+ ],
+ "https://github.com/gabe-init/ComfyUI-Openrouter_node": [
+ [
+ "OpenRouterNode"
+ ],
+ {
+ "title_aux": "ComfyUI OpenRouter Node"
+ }
+ ],
+ "https://github.com/gabe-init/ComfyUI-String-Similarity": [
+ [
+ "StringSimilarity"
+ ],
+ {
+ "title_aux": "ComfyUI-String-Similarity"
+ }
+ ],
+ "https://github.com/game4d/ComfyUI-BDsInfiniteYou": [
+ [
+ "InfiniteYou_Image",
+ "InfiniteYou_Load"
+ ],
+ {
+ "title_aux": "ComfyUI-BDsInfiniteYou"
+ }
+ ],
+ "https://github.com/garg-aayush/ComfyUI-Svg2Raster": [
+ [
+ "LoadSVGImage",
+ "RasterizeSVG"
+ ],
+ {
+ "title_aux": "ComfyUI-Svg2Raster"
+ }
+ ],
+ "https://github.com/gasdyueer/comfyui-yolo-mask-process": [
+ [
+ "MaskedImageEffects",
+ "YoloDetectionAndSegmentation"
+ ],
+ {
+ "title_aux": "ComfyUI YOLO Mask Process"
+ }
+ ],
+ "https://github.com/gasparuff/CustomSelector": [
+ [
+ "CustomSelector"
+ ],
+ {
+ "title_aux": "comfyui-customselector"
+ }
+ ],
+ "https://github.com/gateway/ComfyUI-Kie-API": [
+ [
+ "KIEParsePromptGridJSON",
+ "KIE_Flux2_I2I",
+ "KIE_Gemini3Pro_LLM",
+ "KIE_GetRemainingCredits",
+ "KIE_GridSlice",
+ "KIE_Kling25_I2V_Pro",
+ "KIE_Kling26Motion_I2V",
+ "KIE_Kling26_I2V",
+ "KIE_Kling26_T2V",
+ "KIE_NanoBananaPro_Image",
+ "KIE_Seedance15Pro_I2V",
+ "KIE_SeedanceV1Pro_Fast_I2V",
+ "KIE_Seedream45_Edit",
+ "KIE_Seedream45_TextToImage",
+ "KIE_Suno_Music_Advanced",
+ "KIE_Suno_Music_Basic",
+ "KIE_SystemPrompt_Selector"
+ ],
+ {
+ "title_aux": "ComfyUI-Kie-API"
+ }
+ ],
+ "https://github.com/gelasdev/ComfyUI-FLUX-BFL-API": [
+ [
+ "FluxConfig_BFL",
+ "FluxDeleteFinetune_BFL",
+ "FluxDevRedux_BFL",
+ "FluxDev_BFL",
+ "FluxFinetuneDetails_BFL",
+ "FluxFinetuneStatus_BFL",
+ "FluxFinetune_BFL",
+ "FluxKontextMax_BFL",
+ "FluxKontextPro_BFL",
+ "FluxMyFinetunes_BFL",
+ "FluxPro11Redux_BFL",
+ "FluxPro11UltraFinetune_BFL",
+ "FluxPro11UltraRedux_BFL",
+ "FluxPro11Ultra_BFL",
+ "FluxPro11_BFL",
+ "FluxProCannyFinetune_BFL",
+ "FluxProCanny_BFL",
+ "FluxProDepthFinetune_BFL",
+ "FluxProDepth_BFL",
+ "FluxProFillFinetune_BFL",
+ "FluxProFill_BFL",
+ "FluxProFinetune_BFL",
+ "FluxPro_BFL"
+ ],
+ {
+ "title_aux": "ComfyUI-FLUX-BFL-API"
+ }
+ ],
+ "https://github.com/gemell1/ComfyUI_GMIC": [
+ [
+ "GmicCliWrapper",
+ "GmicQtWrapper"
+ ],
+ {
+ "title_aux": "ComfyUI_GMIC"
+ }
+ ],
+ "https://github.com/gen1nya/ComfyUI-Remote-Upscale": [
+ [
+ "RefreshRemoteModels",
+ "RemoteUpscaleImage"
+ ],
+ {
+ "title_aux": "ComfyUI Remote Upscale"
+ }
+ ],
+ "https://github.com/geocine/geocine-comfyui": [
+ [
+ "Image Scale",
+ "Image Selector",
+ "LoRA Name List",
+ "Prompt Text",
+ "Seed to Noise",
+ "ShowTextNode",
+ "Text Replace"
+ ],
+ {
+ "title_aux": "geocine-comfyui"
+ }
+ ],
+ "https://github.com/georgitsenov/ComfyUI-R2": [
+ [
+ "S3SaveNode"
+ ],
+ {
+ "title_aux": "ComfyUI S3 Save Node"
+ }
+ ],
+ "https://github.com/geroldmeisinger/ComfyUI-outputlists-combiner": [
+ [
+ "CombineOutputLists",
+ "ConvertNumberToIntFloatStr",
+ "FormattedString",
+ "JSONOutputList",
+ "KSamplerImmediateSave",
+ "LoadAnyFile",
+ "NumberOutputList",
+ "SpreadsheetOutputList",
+ "StringOutputList",
+ "WorkflowDiscriminator",
+ "XyzGridPlot"
+ ],
+ {
+ "title_aux": "ComfyUI-outputlists-combiner"
+ }
+ ],
+ "https://github.com/ggarra13/ComfyUI-mrv2": [
+ [
+ "mrv2AnnotationsImageNode",
+ "mrv2SaveEXRImage"
+ ],
+ {
+ "title_aux": "ComfyUI-mrv2"
+ }
+ ],
+ "https://github.com/giriss/comfy-image-saver": [
+ [
+ "Cfg Literal",
+ "Checkpoint Selector",
+ "Int Literal",
+ "Sampler Selector",
+ "Save Image w/Metadata",
+ "Scheduler Selector",
+ "Seed Generator",
+ "String Literal",
+ "Width/Height Literal"
+ ],
+ {
+ "title_aux": "Save Image with Generation Metadata"
+ }
+ ],
+ "https://github.com/gisu/comfyui-foxpack": [
+ [
+ "Add_To_List",
+ "BaseSamplerSetup",
+ "Big_Prompter",
+ "Change_Entries_In_A_List",
+ "Change_Entry_From_List",
+ "CheckpointMetaExtractor",
+ "CheckpointSelector",
+ "Complete_Setup",
+ "Convert_Into",
+ "Negate_Boolean",
+ "Optional_Value_Override",
+ "OverrideSamplerSetup",
+ "Override_Value_If_Unset",
+ "Pick_Value_From_Dict",
+ "Pick_Values_From_List",
+ "Refine_Prompt",
+ "Refine_Setup",
+ "Remap_Values",
+ "Remove_Values_From_List",
+ "Select_By_Index",
+ "Select_Line_By_Index",
+ "Select_String_By_Index",
+ "SetupSelector",
+ "Show_Type",
+ "Split_Entry_In_2Chunks",
+ "Split_Entry_In_4Chunks",
+ "Split_Entry_In_6Chunks",
+ "Split_Entry_In_8Chunks",
+ "Step_Denoise",
+ "UniversalLatentHelper",
+ "Universal_VAE_Loader"
+ ],
+ {
+ "title_aux": "foxpack"
+ }
+ ],
+ "https://github.com/gitadmini/comfyui_extractstoryboards": [
+ [
+ "ExtractStoryboards_xuhuan1024",
+ "IntBatchSize_xuhuan1024",
+ "IntBatch_xuhuan1024",
+ "String2Ints_xuhuan1024"
+ ],
+ {
+ "title_aux": "ExtractStoryboards"
+ }
+ ],
+ "https://github.com/gitcapoom/comfyui_fovestimator": [
+ [
+ "DepthFOVEstimator",
+ "FOVEstimator"
+ ],
+ {
+ "title_aux": "ComfyUI FOV Estimator"
+ }
+ ],
+ "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER": [
+ [
+ "ChangeImageBorder"
+ ],
+ {
+ "title_aux": "ComfyUI_Change_IMAGE_BOREDER"
+ }
+ ],
+ "https://github.com/githubYiheng/ComfyUI_GetFileNameFromURL": [
+ [
+ "GetFileNameFromURL"
+ ],
+ {
+ "title_aux": "ComfyUI_GetFileNameFromURL"
+ }
+ ],
+ "https://github.com/githubYiheng/comfyui_kmeans_filter": [
+ [
+ "ImageKmeansFilter"
+ ],
+ {
+ "title_aux": "comfyui_kmeans_filter"
+ }
+ ],
+ "https://github.com/githubYiheng/comfyui_meanshift_filter": [
+ [
+ "ImageMeanshiftFilter"
+ ],
+ {
+ "title_aux": "comfyui_meanshift_filter"
+ }
+ ],
+ "https://github.com/githubYiheng/comfyui_private_postprocessor": [
+ [
+ "ImageCPostprocessor",
+ "PrivateImageMask"
+ ],
+ {
+ "title_aux": "comfyui_private_postprocessor"
+ }
+ ],
+ "https://github.com/glibsonoran/Plush-for-ComfyUI": [
+ [
+ "AI Chooser",
+ "Add Parameters",
+ "AdvPromptEnhancer",
+ "Custom API Key",
+ "DalleImage",
+ "Enhancer",
+ "GPT Image",
+ "Gemini Image",
+ "Image Mixer",
+ "Imagen Image",
+ "ImgTextSwitch",
+ "Load Remote Models",
+ "LoadText|plush",
+ "Model-CLIP Output Switch",
+ "ParseJSON",
+ "Plush-Exif Wrangler",
+ "Random Image Output",
+ "Random Mixer",
+ "Random Output",
+ "Remove Text",
+ "Tagger",
+ "Text (Any)",
+ "Type Converter",
+ "mulTextSwitch"
+ ],
+ {
+ "title_aux": "Plush-for-ComfyUI"
+ }
+ ],
+ "https://github.com/glifxyz/ComfyUI-GlifNodes": [
+ [
+ "FilmGrain",
+ "FluxReduxFloatRamp",
+ "GlifConsistencyDecoder",
+ "GlifPatchConsistencyDecoderTiled",
+ "GlifVariable",
+ "HFHubEmbeddingLoader",
+ "HFHubLoraLoader",
+ "ImagePaddingAdvanced",
+ "ImageToMultipleOf",
+ "LoraLoaderFromURL",
+ "SDXLAspectRatio"
+ ],
+ {
+ "title_aux": "ComfyUI-GlifNodes"
+ }
+ ],
+ "https://github.com/glitchinthemetrix16/ComfyUI-Roop": [
+ [
+ "RoopBatchFaceSwap",
+ "RoopFaceSwap",
+ "RoopFaceSwapVideo",
+ "RoopFaceSwapWithEnhancer",
+ "RoopSendWebhookFile",
+ "RoopSendWebhookImage"
+ ],
+ {
+ "title_aux": "ComfyUI Roop Custom Nodes"
+ }
+ ],
+ "https://github.com/glowcone/comfyui-base64-to-image": [
+ [
+ "LoadImageFromBase64"
+ ],
+ {
+ "title_aux": "Load Image From Base64 URI"
+ }
+ ],
+ "https://github.com/glowcone/comfyui-string-converter": [
+ [
+ "StringToFloat",
+ "StringToInt"
+ ],
+ {
+ "title_aux": "String Converter"
+ }
+ ],
+ "https://github.com/gmorks/ComfyUI-Animagine-Prompt": [
+ [
+ "AnimaginePrompt",
+ "MultiWildcardLoader",
+ "MultilineTextInput",
+ "TextFileLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Animagine-Prompt"
+ }
+ ],
+ "https://github.com/gmorks/ComfyUI-SendToDiscord": [
+ [
+ "PreviewImageWithDiscord"
+ ],
+ {
+ "title_aux": "ComfyUI-SendToDiscord"
+ }
+ ],
+ "https://github.com/gmorks/ComfyUI-WatchPoint": [
+ [
+ "WatchPoint"
+ ],
+ {
+ "title_aux": "ComfyUI-WatchPoint"
+ }
+ ],
+ "https://github.com/goburiin/nsfwrecog-comfyui": [
+ [
+ "NSFWDetectorNode"
+ ],
+ {
+ "title_aux": "nsfwrecog-comfyui"
+ }
+ ],
+ "https://github.com/godmt/ComfyUI-IP-Composer": [
+ [
+ "IPCompConceptMerge",
+ "IPCompConceptSubspace",
+ "IPCompLoadOpenCLIP",
+ "IPLoadConceptSubspace",
+ "IPSaveConceptSubspace"
+ ],
+ {
+ "title_aux": "ComfyUI-IP-Composer"
+ }
+ ],
+ "https://github.com/godmt/ComfyUI-List-Utils": [
+ [
+ "GODMT_AnyCast",
+ "GODMT_AnyToDict",
+ "GODMT_BatchGetByIndex",
+ "GODMT_BatchItemCast",
+ "GODMT_BatchSlice",
+ "GODMT_BatchToList",
+ "GODMT_CreateArange",
+ "GODMT_CreateBatch",
+ "GODMT_CreateLinspace",
+ "GODMT_CreateList",
+ "GODMT_CreateRange",
+ "GODMT_Exec",
+ "GODMT_GetLength",
+ "GODMT_GetShape",
+ "GODMT_GetWidgetsValues",
+ "GODMT_ListDir",
+ "GODMT_ListGetByIndex",
+ "GODMT_ListSlice",
+ "GODMT_ListToBatch",
+ "GODMT_MergeBatch",
+ "GODMT_MergeList",
+ "GODMT_Pack",
+ "GODMT_SplitString",
+ "GODMT_Unpack"
+ ],
+ {
+ "title_aux": "ComfyUI-List-Utils"
+ }
+ ],
+ "https://github.com/godspede/ComfyUI_Substring": [
+ [
+ "SubstringTheory"
+ ],
+ {
+ "title_aux": "ComfyUI Substring"
+ }
+ ],
+ "https://github.com/gokayfem/ComfyUI-Depth-Visualization": [
+ [
+ "DepthViewer"
+ ],
+ {
+ "title_aux": "ComfyUI-Depth-Visualization"
+ }
+ ],
+ "https://github.com/gokayfem/ComfyUI-Dream-Interpreter": [
+ [
+ "DreamViewer"
+ ],
+ {
+ "title_aux": "ComfyUI-Dream-Interpreter"
+ }
+ ],
+ "https://github.com/gokayfem/ComfyUI-Texture-Simple": [
+ [
+ "TextureViewer"
+ ],
+ {
+ "title_aux": "ComfyUI-Texture-Simple"
+ }
+ ],
+ "https://github.com/gokayfem/ComfyUI-fal-API": [
+ [
+ "Bria_Video_Increase_Resolution_fal",
+ "CombinedVideoGeneration_fal",
+ "DYWanFun22_fal",
+ "DYWanUpscaler_fal",
+ "Dreamina31TextToImage_fal",
+ "FluxDev_fal",
+ "FluxGeneral_fal",
+ "FluxLoraTrainer_fal",
+ "FluxLora_fal",
+ "FluxPro11_fal",
+ "FluxPro1Fill_fal",
+ "FluxProKontextMulti_fal",
+ "FluxProKontextTextToImage_fal",
+ "FluxProKontext_fal",
+ "FluxPro_fal",
+ "FluxSchnell_fal",
+ "FluxUltra_fal",
+ "GPTImage15Edit_fal",
+ "GPTImage15_fal",
+ "Hidreamfull_fal",
+ "HunyuanVideoLoraTrainer_fal",
+ "Ideogramv3_fal",
+ "Imagen4Preview_fal",
+ "InfinityStarTextToVideo_fal",
+ "Kling21Pro_fal",
+ "Kling25TurboPro_fal",
+ "Kling26Pro_fal",
+ "KlingMaster_fal",
+ "KlingOmniImageToVideo_fal",
+ "KlingOmniReferenceToVideo_fal",
+ "KlingOmniVideoToVideoEdit_fal",
+ "KlingOmniVideoToVideoReference_fal",
+ "KlingPro10_fal",
+ "KlingPro16_fal",
+ "Kling_fal",
+ "Krea_Wan14b_VideoToVideo_fal",
+ "LLM_fal",
+ "LoadVideoURL",
+ "LtxVideoTrainer_fal",
+ "LumaDreamMachine_fal",
+ "MiniMaxSubjectReference_fal",
+ "MiniMaxTextToVideo_fal",
+ "MiniMax_fal",
+ "NanoBananaEdit_fal",
+ "NanoBananaPro_fal",
+ "NanoBananaTextToImage_fal",
+ "PixverseSwapNode_fal",
+ "QwenImageEditPlusLoRA_fal",
+ "QwenImageEdit_fal",
+ "Recraft_fal",
+ "ReveTextToImage_fal",
+ "RunwayGen3_fal",
+ "Sana_fal",
+ "SeedEditV3_fal",
+ "SeedanceImageToVideo_fal",
+ "SeedanceProImageToVideo_fal",
+ "SeedanceTextToVideo_fal",
+ "SeedreamV4Edit_fal",
+ "Seedvr_Upscale_Video_fal",
+ "Seedvr_Upscaler_fal",
+ "Sora2Pro_fal",
+ "Topaz_Upscale_Video_fal",
+ "UploadFile_fal",
+ "UploadVideo_fal",
+ "Upscaler_fal",
+ "VLM_fal",
+ "Veo2ImageToVideo_fal",
+ "Veo31Fast_fal",
+ "Veo31_fal",
+ "Veo3_fal",
+ "VideoUpscaler_fal",
+ "Wan2214b_animate_move_character_fal",
+ "Wan2214b_animate_replace_character_fal",
+ "Wan22VACEFun14b_fal",
+ "Wan25_preview_fal",
+ "Wan26ReferenceToVideo_fal",
+ "Wan26_fal",
+ "WanLoraTrainer_fal",
+ "WanPro_fal",
+ "WanVACEVideoEdit_fal"
+ ],
+ {
+ "title_aux": "ComfyUI-fal-API"
+ }
+ ],
+ "https://github.com/gokayfem/ComfyUI_VLM_nodes": [
+ [
+ "AudioLDM2Node",
+ "ChatMusician",
+ "CreativeArtPromptGenerator",
+ "Joytag",
+ "JsonToText",
+ "KeywordExtraction",
+ "Kosmos2model",
+ "LLMLoader",
+ "LLMOptionalMemoryFreeAdvanced",
+ "LLMOptionalMemoryFreeSimple",
+ "LLMPromptGenerator",
+ "LLMSampler",
+ "LLava Loader Simple",
+ "LLavaOptionalMemoryFreeAdvanced",
+ "LLavaOptionalMemoryFreeSimple",
+ "LLavaPromptGenerator",
+ "LLavaSamplerAdvanced",
+ "LLavaSamplerSimple",
+ "LlavaClipLoader",
+ "MCLLaVAModel",
+ "MiniCPMNode",
+ "MolmoNode",
+ "MoonDream",
+ "Moondream2model",
+ "Paligemma",
+ "PlayMusic",
+ "PromptGenerateAPI",
+ "Qwen2VLNode",
+ "SaveAudioNode",
+ "SimpleText",
+ "StructuredOutput",
+ "Suggester",
+ "UformGen2QwenNode",
+ "ViewText"
+ ],
+ {
+ "title_aux": "VLM_nodes"
+ }
+ ],
+ "https://github.com/goldwins520/Comfyui_saveimg2webdav": [
+ [
+ "SaveFileToWebDAV",
+ "SaveImageToWebDAV"
+ ],
+ {
+ "title_aux": "Save Image To Webdav"
+ }
+ ],
+ "https://github.com/gonzalu/ComfyUI_YFG_Comical": [
+ [
+ "Image10Switcher_node",
+ "Image15Switcher_node",
+ "Image20Switcher_node",
+ "Image3Switcher_node",
+ "Image5Switcher_node",
+ "MonoClip_node",
+ "PixelArt_node",
+ "RandomImageFromDirectory_node",
+ "RandomOrgTrueRandomNumber_node",
+ "RandomOrgV2TrueRandomNumber",
+ "RandomOrgV2TrueRandomNumber_node",
+ "VAEDecodePreview_node",
+ "image2contrastMask_node",
+ "image2imbgg_node",
+ "image_halftone",
+ "image_histograms_node",
+ "image_histograms_node_compact",
+ "images_side_by_side",
+ "imgbbLoader_node",
+ "smartCheckpointLoader_node",
+ "storeURL_node",
+ "textMaskOverlay_node"
+ ],
+ {
+ "author": "Manny Gonzalez",
+ "description": "Utility custom nodes for special effects, image manipulation and quality of life tools.",
+ "nickname": "\ud83d\udc2f YFG Comical Nodes",
+ "title": "\ud83d\udc2f YFG Comical Nodes",
+ "title_aux": "\ud83d\ude38 YFG Comical Nodes"
+ }
+ ],
+ "https://github.com/gorillaframeai/GF_nodes": [
+ [
+ "GFrbmg2",
+ "GFrbmg2Plus"
+ ],
+ {
+ "title_aux": "GFrbmg2"
+ }
+ ],
+ "https://github.com/gorillaframeai/GF_translate": [
+ [
+ "GFDeepTranslate",
+ "GFJsonTranslate"
+ ],
+ {
+ "title_aux": "GF_translate"
+ }
+ ],
+ "https://github.com/gpdev-Pilcothink/comfyui_pilcothink_VisionSLM": [
+ [
+ "MergeTextsWithGap",
+ "OllamaConnective",
+ "OllamaGenerator",
+ "Pilcothink-RAG",
+ "RemoveSpecificPatterns",
+ "SLMGenerator",
+ "SLMModelSelector",
+ "SLMVisionGenerator",
+ "SLMVisionModelSelector",
+ "String_Text",
+ "VLLMConnective",
+ "VLLMGenerator"
+ ],
+ {
+ "title_aux": "comfyui_pilcothink_VisionSLM"
+ }
+ ],
+ "https://github.com/greengerong/ComfyUI-JanusPro-PL": [
+ [
+ "JanusProImageGenerator",
+ "JanusProImageUnderstanding",
+ "JanusProModelLoader"
+ ],
+ {
+ "title_aux": "Janus-Pro ComfyUI Plugin"
+ }
+ ],
+ "https://github.com/gregory-richard/ComfyUI-WarpPipe": [
+ [
+ "Dead End",
+ "FD Scheduler Adapter",
+ "Unwarp",
+ "Warp",
+ "Warp Provider",
+ "custom_nodes"
+ ],
+ {
+ "title_aux": "WarpPipe Nodes"
+ }
+ ],
+ "https://github.com/gremlation/ComfyUI-ImageLabel": [
+ [
+ "gremlation:ComfyUI-ImageLabel:ImageLabel"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageLabel"
+ }
+ ],
+ "https://github.com/gremlation/ComfyUI-JMESPath": [
+ [
+ "gremlation:ComfyUI-JMESPath"
+ ],
+ {
+ "title_aux": "ComfyUI-JMESPath"
+ }
+ ],
+ "https://github.com/gremlation/ComfyUI-ViewData": [
+ [
+ "gremlation:ComfyUI-ViewData:ViewData"
+ ],
+ {
+ "title_aux": "ComfyUI-ViewData"
+ }
+ ],
+ "https://github.com/gremlation/ComfyUI-jq": [
+ [
+ "gremlation:ComfyUI-jq"
+ ],
+ {
+ "title_aux": "ComfyUI-jq"
+ }
+ ],
+ "https://github.com/griptape-ai/ComfyUI-Griptape": [
+ [
+ "Griptape Agent Config: Amazon Bedrock Drivers",
+ "Griptape Agent Config: Amazon Bedrock [DEPRECATED]",
+ "Griptape Agent Config: Anthropic Drivers",
+ "Griptape Agent Config: Anthropic [DEPRECATED]",
+ "Griptape Agent Config: Azure OpenAI Drivers",
+ "Griptape Agent Config: Azure OpenAI [DEPRECATED]",
+ "Griptape Agent Config: Cohere Drivers",
+ "Griptape Agent Config: Custom Structure",
+ "Griptape Agent Config: Environment Variables",
+ "Griptape Agent Config: Expand",
+ "Griptape Agent Config: Google Drivers",
+ "Griptape Agent Config: Google [DEPRECATED]",
+ "Griptape Agent Config: Griptape Cloud",
+ "Griptape Agent Config: Grok Drivers",
+ "Griptape Agent Config: Groq Drivers",
+ "Griptape Agent Config: HuggingFace Drivers",
+ "Griptape Agent Config: HuggingFace [DEPRECATED]",
+ "Griptape Agent Config: LM Studio Drivers",
+ "Griptape Agent Config: LM Studio [DEPRECATED]",
+ "Griptape Agent Config: Ollama Drivers",
+ "Griptape Agent Config: Ollama [DEPRECATED]",
+ "Griptape Agent Config: OpenAI Compatible Drivers",
+ "Griptape Agent Config: OpenAI Compatible [DEPRECATED]",
+ "Griptape Agent Config: OpenAI Drivers",
+ "Griptape Agent Config: OpenAI [DEPRECATED]",
+ "Griptape Audio Transcription Driver: Groq",
+ "Griptape Audio Transcription Driver: OpenAI",
+ "Griptape Code: Run Griptape Cloud Structure",
+ "Griptape Code: Run Python [DEPRECATED]",
+ "Griptape Combine: Merge Dictionary",
+ "Griptape Combine: Merge Inputs",
+ "Griptape Combine: Merge Texts",
+ "Griptape Combine: RAG Module List",
+ "Griptape Combine: Rules List",
+ "Griptape Combine: String List",
+ "Griptape Combine: Tool List",
+ "Griptape Convert: Agent to Tool",
+ "Griptape Convert: Text to CLIP Encode",
+ "Griptape Convert: Text to Combo",
+ "Griptape Create: Agent",
+ "Griptape Create: Agent from Config",
+ "Griptape Create: CLIP Text Encode",
+ "Griptape Create: Image Inpainting Variation",
+ "Griptape Create: Image Variation",
+ "Griptape Create: Image from Text",
+ "Griptape Create: Key Value Pair",
+ "Griptape Create: Rules",
+ "Griptape Create: Text",
+ "Griptape Display: Data as Text",
+ "Griptape Display: Dictionary",
+ "Griptape Display: Image",
+ "Griptape Display: Text",
+ "Griptape Display: Text as Markdown",
+ "Griptape Driver: Amazon Bedrock Stable Diffusion",
+ "Griptape Driver: Amazon Bedrock Titan",
+ "Griptape Driver: Azure OpenAI Image Generation",
+ "Griptape Driver: Black Forest Labs Image Generation",
+ "Griptape Driver: Leonardo.AI",
+ "Griptape Driver: OpenAI Compatible Image Generation",
+ "Griptape Driver: OpenAI Image Generation",
+ "Griptape Embedding Driver: Amazon Bedrock Titan",
+ "Griptape Embedding Driver: Amazon SageMaker Jumpstart",
+ "Griptape Embedding Driver: Azure OpenAI",
+ "Griptape Embedding Driver: Cohere",
+ "Griptape Embedding Driver: Google",
+ "Griptape Embedding Driver: HuggingFace",
+ "Griptape Embedding Driver: LM Studio",
+ "Griptape Embedding Driver: Ollama",
+ "Griptape Embedding Driver: OpenAI",
+ "Griptape Embedding Driver: OpenAI Compatible",
+ "Griptape Embedding Driver: Voyage AI",
+ "Griptape End Workflow",
+ "Griptape Expand: Agent Nodes",
+ "Griptape Load: Audio",
+ "Griptape Load: Image From URL",
+ "Griptape Load: Text",
+ "Griptape Prompt Driver: Amazon Bedrock",
+ "Griptape Prompt Driver: Amazon SageMaker Jumpstart",
+ "Griptape Prompt Driver: Anthropic",
+ "Griptape Prompt Driver: Azure OpenAI",
+ "Griptape Prompt Driver: Cohere",
+ "Griptape Prompt Driver: Google",
+ "Griptape Prompt Driver: Griptape Cloud",
+ "Griptape Prompt Driver: Grok",
+ "Griptape Prompt Driver: Groq",
+ "Griptape Prompt Driver: HuggingFace",
+ "Griptape Prompt Driver: LM Studio",
+ "Griptape Prompt Driver: Ollama",
+ "Griptape Prompt Driver: OpenAI",
+ "Griptape Prompt Driver: OpenAI Compatible",
+ "Griptape RAG Query: Translate Module",
+ "Griptape RAG Rerank: Text Chunks Module",
+ "Griptape RAG Response: Footnote Prompt Module",
+ "Griptape RAG Response: Prompt Module",
+ "Griptape RAG Response: Text Chunks Module",
+ "Griptape RAG Retrieve: Text Loader Module",
+ "Griptape RAG Retrieve: Vector Store Module",
+ "Griptape RAG: Engine",
+ "Griptape Replace: Rulesets on Agent",
+ "Griptape Replace: Tools on Agent",
+ "Griptape Rerank Driver: Cohere",
+ "Griptape Rerank Driver: Local",
+ "Griptape Retrieve: Cloud Ruleset",
+ "Griptape Run: Agent",
+ "Griptape Run: Audio Transcription",
+ "Griptape Run: Cloud Assistant",
+ "Griptape Run: Image Description",
+ "Griptape Run: Parallel Image Description",
+ "Griptape Run: Parallel Prompt Task",
+ "Griptape Run: Task",
+ "Griptape Run: Text Extraction",
+ "Griptape Run: Text Summary",
+ "Griptape Run: Text to Speech",
+ "Griptape Save: Text",
+ "Griptape Set: Default Agent",
+ "Griptape Start Workflow",
+ "Griptape Text To Speech Driver: ElevenLabs",
+ "Griptape Text To Speech Driver: OpenAI",
+ "Griptape Tool: Audio Transcription",
+ "Griptape Tool: Calculator",
+ "Griptape Tool: DateTime",
+ "Griptape Tool: Extraction",
+ "Griptape Tool: FileManager",
+ "Griptape Tool: Griptape Cloud KnowledgeBase",
+ "Griptape Tool: Prompt Summary",
+ "Griptape Tool: Query",
+ "Griptape Tool: RAG",
+ "Griptape Tool: Text to Speech",
+ "Griptape Tool: VectorStore",
+ "Griptape Tool: WebScraper",
+ "Griptape Tool: WebSearch",
+ "Griptape Util: Create Agent Modelfile",
+ "Griptape Util: Create Model from Modelfile",
+ "Griptape Util: Remove Ollama Model",
+ "Griptape Util: Switch Node",
+ "Griptape Vector Store Driver: Amazon OpenSearch",
+ "Griptape Vector Store Driver: Azure MongoDB",
+ "Griptape Vector Store Driver: Griptape Cloud",
+ "Griptape Vector Store Driver: Local",
+ "Griptape Vector Store Driver: Marqo",
+ "Griptape Vector Store Driver: MongoDB Atlas",
+ "Griptape Vector Store Driver: PGVector",
+ "Griptape Vector Store Driver: Pinecone",
+ "Griptape Vector Store Driver: Qdrant",
+ "Griptape Vector Store Driver: Redis",
+ "Griptape Vector Store: Add Text",
+ "Griptape Vector Store: Query",
+ "Griptape WebSearch Driver: DuckDuckGo",
+ "Griptape WebSearch Driver: Exa",
+ "Griptape WebSearch Driver: Google",
+ "Griptape WebSearch Driver: Serper",
+ "Griptape WebSearch Driver: Tavily"
+ ],
+ {
+ "author": "Jason Schleifer",
+ "description": "This extension offers various nodes that allow you to work with LLMs using the Griptape Python Framework (https://griptape.ai)",
+ "nickname": "ComfyUI-Griptape",
+ "title": "ComfyUI Griptape Nodes",
+ "title_aux": "ComfyUI Griptape Nodes"
+ }
+ ],
+ "https://github.com/grmchn/ComfyUI-ProportionChanger": [
+ [
+ "PoseDataToPoseKeypoint",
+ "PoseJSONToPoseKeypoint",
+ "PoseKeypointPreview",
+ "PoseKeypointResize",
+ "ProportionChangerDWPoseDetector",
+ "ProportionChangerDWPoseRender",
+ "ProportionChangerInterpolator",
+ "ProportionChangerKeypointDenoiser",
+ "ProportionChangerKeypointDenoiserAdvanced",
+ "ProportionChangerParams",
+ "ProportionChangerReference"
+ ],
+ {
+ "title_aux": "ComfyUI-ProportionChanger"
+ }
+ ],
+ "https://github.com/grovergol/comfyui-grover-nodes": [
+ [
+ "OpenPathNode"
+ ],
+ {
+ "title_aux": "ComfyUI Grover Nodes"
+ }
+ ],
+ "https://github.com/gseth/ControlAltAI-Nodes": [
+ [
+ "BooleanBasic",
+ "BooleanReverse",
+ "ChooseUpscaleModel",
+ "FluxAttentionCleanup",
+ "FluxAttentionControl",
+ "FluxControlNetApply",
+ "FluxResolutionNode",
+ "FluxSampler",
+ "FluxUnionControlNetApply",
+ "GetImageSizeRatio",
+ "HiDreamResolutionNode",
+ "IntegerSettings",
+ "IntegerSettingsAdvanced",
+ "NoisePlusBlend",
+ "PerturbationTexture",
+ "RegionMaskConditioning",
+ "RegionMaskGenerator",
+ "RegionMaskProcessor",
+ "RegionMaskValidator",
+ "RegionOverlayVisualizer",
+ "TextBridge",
+ "ThreeWaySwitch",
+ "TwoWaySwitch"
+ ],
+ {
+ "title_aux": "ControlAltAI Nodes"
+ }
+ ],
+ "https://github.com/gsusgg/ComfyUI_CozyGen": [
+ [
+ "CozyGenChoiceInput",
+ "CozyGenDynamicInput",
+ "CozyGenFloatInput",
+ "CozyGenImageInput",
+ "CozyGenIntInput",
+ "CozyGenOutput",
+ "CozyGenStringInput",
+ "CozyGenVideoOutput"
+ ],
+ {
+ "title_aux": "ComfyUI-CozyGen"
+ }
+ ],
+ "https://github.com/gt732/ComfyUI-DreamWaltz-G": [
+ [
+ "DreamWaltzGStageOneTrainer",
+ "DreamWaltzGStageTwoTrainer"
+ ],
+ {
+ "title_aux": "ComfyUI-DreamWaltz-G"
+ }
+ ],
+ "https://github.com/guerreiro/comfyg-switch": [
+ [
+ "ComfygSwitch"
+ ],
+ {
+ "title_aux": "Comfyg Switch"
+ }
+ ],
+ "https://github.com/guill/abracadabra-comfyui": [
+ [
+ "AbracadabraNode",
+ "AbracadabraNodeDefSummary"
+ ],
+ {
+ "title_aux": "abracadabra-comfyui"
+ }
+ ],
+ "https://github.com/guill/comfyui-stegaflow": [
+ [
+ "SaveImageStegaflow"
+ ],
+ {
+ "title_aux": "Stegaflow"
+ }
+ ],
+ "https://github.com/guyaton/guy-nodes-comfyui": [
+ [
+ "GuyRecommendedLatentResCalc"
+ ],
+ {
+ "title_aux": "guy-nodes-comfyui"
+ }
+ ],
+ "https://github.com/guyouyue/ComfyUI_VideoAutoSplit": [
+ [
+ "ExtractKeyFrames",
+ "ExtractKeyFramesAndSplit"
+ ],
+ {
+ "title_aux": "ComfyUI_VideoAutoSplit"
+ }
+ ],
+ "https://github.com/gvfarns/comfyui_gvf": [
+ [
+ "CheckpointLoaderWithName",
+ "CropToAspectRatio",
+ "CropToAspectRatioMinMax",
+ "IfElseFloat",
+ "IfElseInt",
+ "SizeFromAspect"
+ ],
+ {
+ "title_aux": "comfyui_gvf"
+ }
+ ],
+ "https://github.com/hackafterdark/ComfyUI-HackAfterDark-Nodes": [
+ [
+ "FilmARSizeSelector",
+ "GeminiImagePromptBuilder"
+ ],
+ {
+ "author": "HackAfterDark",
+ "description": "A node to generate image prompts or images using the Google Gemini API, with support for multiple images and presets.",
+ "nickname": "Gemini Prompter",
+ "title": "Gemini Image Prompt Builder",
+ "title_aux": "AfterDark Film AR Selector"
+ }
+ ],
+ "https://github.com/hackkhai/ComfyUI-Image-Matting": [
+ [
+ "ApplyMatting",
+ "CreateTrimap",
+ "MattingModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Matting"
+ }
+ ],
+ "https://github.com/hanL34/ComfyUI-Power-Artist-Loader": [
+ [
+ "PowerArtistLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Power-Artist-Loader"
+ }
+ ],
+ "https://github.com/hanoixan/ComfyUI-DataBeast": [
+ [
+ "DBConvertToBoolean //DataBeast",
+ "DBConvertToFloat //DataBeast",
+ "DBConvertToInt //DataBeast",
+ "DBConvertToString //DataBeast",
+ "DBFloatExpression //DataBeast",
+ "DBGetBatchList //DataBeast",
+ "DBGetItem //DataBeast",
+ "DBLoadData //DataBeast",
+ "DBStringExpression //DataBeast"
+ ],
+ {
+ "author": "hanoixan",
+ "description": "This extension provides nodes for controlling data-driven processing in Comfy-UI",
+ "nickname": "DataBeast",
+ "title": "DataBeast",
+ "title_aux": "ComfyUI DataBeast"
+ }
+ ],
+ "https://github.com/hao-ai-lab/FastVideo": [
+ [
+ "DITConfig",
+ "InferenceArgs",
+ "LoadImagePath",
+ "TextEncoderConfig",
+ "VAEConfig",
+ "VideoGenerator"
+ ],
+ {
+ "title_aux": "FastVideo"
+ }
+ ],
+ "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector": [
+ [
+ "Image Selector"
+ ],
+ {
+ "title_aux": "ComfyUI-HH-Image-Selector"
+ }
+ ],
+ "https://github.com/hardik-uppal/ComfyUI-QwenVL-MultiImage": [
+ [
+ "QwenVL_MultiImage",
+ "QwenVL_MultiImage_Advanced"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenVL-MultiImage"
+ }
+ ],
+ "https://github.com/harishcmgit/comfyui_ds": [
+ [
+ "BlackBackgroundScanner",
+ "DocumentScanner",
+ "SimpleDocumentScanner"
+ ],
+ {
+ "title_aux": "comfyui_ds"
+ }
+ ],
+ "https://github.com/hassan-sd/comfyui-image-prompt-loader": [
+ [
+ "ImagePromptLoader",
+ "apt",
+ "author",
+ "category",
+ "description",
+ "files",
+ "install_type",
+ "js_path",
+ "license",
+ "name",
+ "nodename_pattern",
+ "pip",
+ "preemptions",
+ "reference",
+ "repository",
+ "tags",
+ "title_aux",
+ "version"
+ ],
+ {
+ "title_aux": "ComfyUI Image & Prompt Loader"
+ }
+ ],
+ "https://github.com/havvk/ComfyUI_AIIA": [
+ [
+ "AIIA_Audio_Denoise",
+ "AIIA_Audio_Enhance",
+ "AIIA_Audio_Info",
+ "AIIA_Audio_PostProcess",
+ "AIIA_Audio_Silence_Splitter",
+ "AIIA_Audio_Speaker_Isolator",
+ "AIIA_Audio_Speaker_Merge",
+ "AIIA_Audio_Splice_Analyzer",
+ "AIIA_BodySway",
+ "AIIA_CosyVoice_ModelLoader",
+ "AIIA_CosyVoice_TTS",
+ "AIIA_CosyVoice_VoiceConversion",
+ "AIIA_Dialogue_TTS",
+ "AIIA_DittoLoader",
+ "AIIA_DittoSampler",
+ "AIIA_E2E_Speaker_Diarization",
+ "AIIA_EchoMimicLoader",
+ "AIIA_EchoMimicSampler",
+ "AIIA_FloatProcess_InMemory",
+ "AIIA_FloatProcess_ToDisk",
+ "AIIA_GenerateSpeakerSegments",
+ "AIIA_ImageSmartCrop",
+ "AIIA_PersonaLive_PhotoSampler_InMemory",
+ "AIIA_PersonaLive_PhotoSampler_ToDisk",
+ "AIIA_Podcast_Script_Parser",
+ "AIIA_Qwen_Dialogue_TTS",
+ "AIIA_Qwen_Loader",
+ "AIIA_Qwen_Model_Router",
+ "AIIA_Qwen_TTS",
+ "AIIA_Segment_Merge",
+ "AIIA_Subtitle_Gen",
+ "AIIA_Subtitle_Preview",
+ "AIIA_Subtitle_To_Segments",
+ "AIIA_TextDebugSplicer",
+ "AIIA_Utils_Image_Concanate",
+ "AIIA_VibeVoice_Loader",
+ "AIIA_VibeVoice_Preset_Maker",
+ "AIIA_VibeVoice_Realtime_TTS",
+ "AIIA_VibeVoice_TTS",
+ "AIIA_VideoCombine",
+ "AIIA_VoxCPM_Loader",
+ "AIIA_VoxCPM_TTS",
+ "AIIA_Web_Export",
+ "PersonaLiveCheckpointLoader",
+ "PersonaLivePhotoSampler"
+ ],
+ {
+ "title_aux": "ComfyUI_AIIA"
+ }
+ ],
+ "https://github.com/hay86/ComfyUI_DDColor": [
+ [
+ "D_DDColor"
+ ],
+ {
+ "title_aux": "ComfyUI DDColor"
+ }
+ ],
+ "https://github.com/hay86/ComfyUI_Dreamtalk": [
+ [
+ "D_DreamTalk"
+ ],
+ {
+ "title_aux": "ComfyUI Dreamtalk"
+ }
+ ],
+ "https://github.com/hay86/ComfyUI_Hallo": [
+ [
+ "D_HalloNode"
+ ],
+ {
+ "title_aux": "ComfyUI Hallo"
+ }
+ ],
+ "https://github.com/hay86/ComfyUI_LatentSync": [
+ [
+ "D_LatentSyncNode"
+ ],
+ {
+ "title_aux": "ComfyUI LatentSync"
+ }
+ ],
+ "https://github.com/hay86/ComfyUI_MiniCPM-V": [
+ [
+ "D_MiniCPM_VQA"
+ ],
+ {
+ "title_aux": "ComfyUI MiniCPM-V"
+ }
+ ],
+ "https://github.com/hay86/ComfyUI_OpenVoice": [
+ [
+ "D_OpenVoice_STS",
+ "D_OpenVoice_TTS",
+ "D_OpenVoice_TTS_V2"
+ ],
+ {
+ "title_aux": "ComfyUI OpenVoice"
+ }
+ ],
+ "https://github.com/hayd-zju/ICEdit-ComfyUI-official": [
+ [
+ "SaveImageWebsocket"
+ ],
+ {
+ "title_aux": "ICEdit-ComfyUI-official"
+ }
+ ],
+ "https://github.com/hayde0096/Comfyui-EasySettingpipes": [
+ [
+ "ConvertAny",
+ "PowerLoraLoader",
+ "PowerLoraStacker",
+ "SamplerSetup",
+ "SamplerSetupUnpack"
+ ],
+ {
+ "title_aux": "EasySettingpipes"
+ }
+ ],
+ "https://github.com/hben35096/ComfyUI-ReplenishNodes": [
+ [
+ "Batch Image Blend",
+ "FLOAT Output",
+ "Fill Alpha",
+ "Get Batch Count",
+ "Image Align",
+ "Image Blend BG",
+ "Integer Output",
+ "Load CLIP Name",
+ "Load Ckpt Name",
+ "Load Lora Name",
+ "Load Sampler Name",
+ "Load Scheduler Name",
+ "Load UNET Name",
+ "Mask Levels Adjust",
+ "Multi Line Text",
+ "Multiple Image Blend",
+ "Multiple Image Blend 2",
+ "Preview Image-JPEG",
+ "Reference Resize",
+ "Seed Output",
+ "To JPEG",
+ "To RGB"
+ ],
+ {
+ "title_aux": "ComfyUI-ReplenishNodes"
+ }
+ ],
+ "https://github.com/heheok/comfyui_wan2.1_vace_infinite_helpers": [
+ [
+ "CyclicCharacterAndBackgroundPrompt",
+ "LatestVideoFromFolder",
+ "PrepareControlVideo"
+ ],
+ {
+ "title_aux": "comfyui_wan2.1_vace_infinite_helpers"
+ }
+ ],
+ "https://github.com/hekmon/comfyui-checkpoint-extract": [
+ [
+ "CLIPModelSaver",
+ "VAEModelSaver"
+ ],
+ {
+ "title_aux": "comfyui-checkpoint-extract"
+ }
+ ],
+ "https://github.com/hekmon/comfyui-openai-api": [
+ [
+ "OAIAPI_ChatCompletion",
+ "OAIAPI_Client",
+ "OAIAPI_DeveloperRole",
+ "OAIAPI_ExtraBody",
+ "OAIAPI_FrequencyPenalty",
+ "OAIAPI_MaxTokens",
+ "OAIAPI_PresencePenalty",
+ "OAIAPI_Seed",
+ "OAIAPI_Temperature",
+ "OAIAPI_TopP"
+ ],
+ {
+ "title_aux": "ComfyUI OpenAI API"
+ }
+ ],
+ "https://github.com/heshengtao/comfyui_LLM_party": [
+ [
+ "About_us",
+ "AmapRegeoTool",
+ "AmapWeatherTool",
+ "Browser_display",
+ "CLIPTextEncode_party",
+ "Combine_Videos_party",
+ "Dingding",
+ "Dingding_tool",
+ "EasyOCR_advance",
+ "EasyOCR_choose",
+ "FeishuDownloadAudio",
+ "FeishuDownloadImage",
+ "FeishuGetHistory",
+ "FeishuSendMsg",
+ "FileOnlineDelete_gitee",
+ "FileOnlineStorage_gitee",
+ "FilePathExists",
+ "FolderCleaner",
+ "GGUFLoader",
+ "GeocodeTool",
+ "Image2Video_party",
+ "Images2Image",
+ "KG_csv_toolkit_developer",
+ "KG_csv_toolkit_user",
+ "KG_json_toolkit_developer",
+ "KG_json_toolkit_user",
+ "KG_neo_toolkit_developer",
+ "KG_neo_toolkit_user",
+ "KSampler_party",
+ "LLM",
+ "LLM_api_loader",
+ "LLM_local",
+ "LLM_local_loader",
+ "LLavaLoader",
+ "LorapathLoader",
+ "Lorebook",
+ "Mcp_tool",
+ "RSS_loader",
+ "RSS_tool",
+ "SpeedChange",
+ "URL2IMG",
+ "VAEDecode_party",
+ "accuweather_tool",
+ "advance_ebd_tool",
+ "aisuite_loader",
+ "any2str",
+ "any_switcher",
+ "api_function",
+ "api_tool",
+ "arxiv_tool",
+ "bing_loader",
+ "bing_tool",
+ "bool_logic",
+ "browser_use_tool",
+ "check_text",
+ "check_web_tool",
+ "classify_function",
+ "classify_function_plus",
+ "classify_persona",
+ "classify_persona_plus",
+ "clear_file",
+ "clear_model",
+ "custom_persona",
+ "custom_string_format",
+ "dall_e_tool",
+ "discord_bot",
+ "discord_file_monitor",
+ "discord_send",
+ "duckduckgo_loader",
+ "duckduckgo_tool",
+ "easy_GGUFLoader",
+ "easy_LLM_api_loader",
+ "easy_LLM_local_loader",
+ "easy_LLavaLoader",
+ "easy_load_llm_lora",
+ "easy_vlmLoader",
+ "ebd_tool",
+ "embeddings_function",
+ "end_anything",
+ "end_dialog",
+ "end_workflow",
+ "extra_parameters",
+ "feishu",
+ "feishu_tool",
+ "file_combine",
+ "file_combine_plus",
+ "file_path_iterator",
+ "files_read_tool",
+ "fish_tts",
+ "fish_whisper",
+ "flux_persona",
+ "get_string",
+ "github_tool",
+ "google_loader",
+ "google_tool",
+ "got_ocr",
+ "gpt_sovits",
+ "graph_md_to_html",
+ "html2img_function",
+ "ic_lora_persona",
+ "image_iterator",
+ "img2path",
+ "img_hosting",
+ "interpreter_function",
+ "interpreter_tool",
+ "interrupt_loop",
+ "json2text",
+ "json_extractor",
+ "json_get_value",
+ "json_iterator",
+ "json_parser",
+ "json_writing",
+ "keyword_tool",
+ "list_append",
+ "list_append_plus",
+ "list_extend",
+ "list_extend_plus",
+ "listen_audio",
+ "load_SQL_memo",
+ "load_bool",
+ "load_ebd",
+ "load_excel",
+ "load_file",
+ "load_file_folder",
+ "load_float",
+ "load_img_path",
+ "load_int",
+ "load_keyword",
+ "load_llm_lora",
+ "load_memo",
+ "load_name",
+ "load_openai_ebd",
+ "load_persona",
+ "load_redis_memo",
+ "load_url",
+ "load_wikipedia",
+ "md_to_excel",
+ "md_to_html",
+ "mini_error_correction",
+ "mini_flux_prompt",
+ "mini_flux_tag",
+ "mini_intent_recognition",
+ "mini_ocr",
+ "mini_party",
+ "mini_sd_prompt",
+ "mini_sd_tag",
+ "mini_story",
+ "mini_summary",
+ "mini_translate",
+ "none2false",
+ "omost_decode",
+ "omost_json2py",
+ "omost_setting",
+ "open_url_function",
+ "open_url_tool",
+ "openai_dall_e",
+ "openai_ebd_tool",
+ "openai_tts",
+ "openai_whisper",
+ "parameter_combine",
+ "parameter_combine_plus",
+ "parameter_function",
+ "path2img_tool",
+ "red_book_text_persona",
+ "replace_string",
+ "save_SQL_memo",
+ "save_ebd_database",
+ "save_memo",
+ "save_openai_ebd",
+ "save_redis_memo",
+ "savepersona",
+ "searxng_tool",
+ "send_to_wechat_official",
+ "show_text_party",
+ "sql_tool",
+ "srt2txt",
+ "start_anything",
+ "start_dialog",
+ "start_workflow",
+ "story_json_tool",
+ "str2float",
+ "str2int",
+ "string_combine",
+ "string_combine_plus",
+ "string_logic",
+ "substring",
+ "svg2html",
+ "svg2img_function",
+ "text2json",
+ "text2parameters",
+ "text_iterator",
+ "text_writing",
+ "time_sleep",
+ "time_tool",
+ "tool_combine",
+ "tool_combine_plus",
+ "translate_persona",
+ "txt2srt",
+ "url2img_tool",
+ "vlmLoader",
+ "weekday_tool",
+ "whisper_local",
+ "wikipedia_tool",
+ "work_wechat",
+ "work_wechat_tool",
+ "workflow_tool",
+ "workflow_transfer",
+ "workflow_transfer_v2"
+ ],
+ {
+ "title_aux": "comfyui_LLM_party"
+ }
+ ],
+ "https://github.com/heshengtao/comfyui_LLM_schools": [
+ [
+ "CausalLM_trainer",
+ "IA3_Arguments",
+ "LLM_Arguments",
+ "Lora_or_adapter_Arguments",
+ "P_or_Prompt_Arguments",
+ "Prefix_Arguments",
+ "download_dataset",
+ "get_dataset_name",
+ "split_dataset"
+ ],
+ {
+ "title_aux": "comfyui_LLM_schools"
+ }
+ ],
+ "https://github.com/hetima/ComfyUI-SingleLinePicker": [
+ [
+ "SLPFilenamePrefix",
+ "SLPLoraLoader",
+ "SLPLoraLoaderModelOnly",
+ "SLPSingleLinePicker"
+ ],
+ {
+ "title_aux": "ComfyUI-SingleLinePicker"
+ }
+ ],
+ "https://github.com/hexxacubic/ComfyUI-Prompt_Library": [
+ [
+ "Double_Prompt_Encode",
+ "FiveRandomLines",
+ "Multi_Wildcard_Loader",
+ "Prompt_Extender",
+ "Prompt_Library",
+ "Simple_Prompt_Library"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt_Library"
+ }
+ ],
+ "https://github.com/heyburns/PortraitUtils": [
+ [
+ "AutoAdjustNode",
+ "AutoColorConfigNode",
+ "AutoCropBorders",
+ "AutoWBColorMatch",
+ "ComparisonGate",
+ "CropImageByMargins",
+ "CropMaskByMargins",
+ "FilenameAppendSuffix",
+ "FitAspectHeadSafe",
+ "FluxResolutionPrepare",
+ "GpuSyncCacheClear",
+ "ImageMegapixelSelector",
+ "LoadImageCombined",
+ "MQBBoxMin",
+ "MultiPromptNode",
+ "OutpaintConfigNode",
+ "OutpaintPaddingComputeNode",
+ "PairedImageLoader",
+ "SeedVR2Prep",
+ "SimpleImageSaver",
+ "StitchByMask",
+ "StripBottomBanner",
+ "StripSolidBorders",
+ "WorkflowConfig"
+ ],
+ {
+ "title_aux": "PortraitUtils"
+ }
+ ],
+ "https://github.com/heyburns/image-chooser-classic": [
+ [
+ "Image Chooser",
+ "Image Chooser Classic",
+ "Preview Chooser Fabric",
+ "Simple Chooser"
+ ],
+ {
+ "author": "chrisgoringe",
+ "description": "Workflow-pausing image choosers (overlay and inline widgets) for ComfyUI",
+ "nickname": "Image Chooser Classic",
+ "title": "Image Chooser Classic",
+ "title_aux": "Image Chooser Classic"
+ }
+ ],
+ "https://github.com/hgabha/WWAA-CustomNodes": [
+ [
+ "WWAA_AdvancedGridLayoutNode",
+ "WWAA_AdvancedTextFileReader",
+ "WWAA_AdvancedTextReader",
+ "WWAA_BasicMathNode",
+ "WWAA_BeforeAfterSlider",
+ "WWAA_BuildString",
+ "WWAA_CameraAngleBuilder",
+ "WWAA_DisplayAny",
+ "WWAA_DitherNode",
+ "WWAA_GBCamera",
+ "WWAA_GridLayoutNode",
+ "WWAA_ImageDimensionCalculator",
+ "WWAA_ImageLoader",
+ "WWAA_ImageSwitcher",
+ "WWAA_ImageToTextFile",
+ "WWAA_IndexGridLayoutNode",
+ "WWAA_JPEGPreview",
+ "WWAA_JSONPromptBuilder",
+ "WWAA_LineCount",
+ "WWAA_MetadataSaver",
+ "WWAA_NestedLoopCounter",
+ "WWAA_NumberRangeAsString",
+ "WWAA_PromptWriter",
+ "WWAA_SaveJPEG",
+ "WWAA_SearchReplaceMulti",
+ "WWAA_SearchReplaceText",
+ "WWAA_SlicedArt",
+ "WWAA_Switch_Int",
+ "WWAA_VideoResolution"
+ ],
+ {
+ "title_aux": "WWAA-CustomNodes"
+ }
+ ],
+ "https://github.com/hhhzzyang/Comfyui_Lama": [
+ [
+ "LamaApply",
+ "LamaModelLoader",
+ "YamlConfigLoader"
+ ],
+ {
+ "title_aux": "Comfyui-Lama"
+ }
+ ],
+ "https://github.com/hiderminer/ComfyUI-HM-Utilities": [
+ [
+ "AutoCropImage",
+ "NormalizeImageWithRectangle"
+ ],
+ {
+ "title_aux": "ComfyUI-HM-Tools"
+ }
+ ],
+ "https://github.com/hieuck/ComfyUI-BiRefNet": [
+ [
+ "BiRefNet"
+ ],
+ {
+ "title_aux": "ComfyUI-BiRefNet-Fix utils"
+ }
+ ],
+ "https://github.com/hiforce/comfyui-hiforce-plugin": [
+ [
+ "HfBoolSwitchKSampleStatus",
+ "HfImageAutoExpansionSquare",
+ "HfImageToRGB",
+ "HfImageToRGBA",
+ "HfInitImageWithMaxSize",
+ "HfIterativeLatentUpscale",
+ "HfLoadImageWithCropper",
+ "HfLookbackSamplerLoader",
+ "HfLoopback",
+ "HfResizeImage",
+ "HfSampler",
+ "HfSamplerLoader",
+ "HfSamplerLoopback",
+ "HfSaveImage",
+ "HfSwitchKSampleStatus",
+ "HfTwoSamplersForMask",
+ "HfTwoStepSamplers",
+ "LoadImageFromURL"
+ ],
+ {
+ "title_aux": "Comfyui HiFORCE Plugin"
+ }
+ ],
+ "https://github.com/hinablue/ComfyUI_3dPoseEditor": [
+ [
+ "Hina.PoseEditor3D"
+ ],
+ {
+ "title_aux": "ComfyUI 3D Pose Editor"
+ }
+ ],
+ "https://github.com/hmwl/ComfyUI-TaskMonitor": [
+ [
+ "TaskMonitorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-TaskMonitor"
+ }
+ ],
+ "https://github.com/hmwl/ComfyUI_zip": [
+ [
+ "CleanFolders",
+ "CompressImages",
+ "UnzipToInput"
+ ],
+ {
+ "title_aux": "ComfyUI_zip"
+ }
+ ],
+ "https://github.com/hnmr293/comfyui-savemem": [
+ [
+ "SaveImagesMemory",
+ "SaveLatentsMemory"
+ ],
+ {
+ "title_aux": "ComfyUI-SaveMem"
+ }
+ ],
+ "https://github.com/hobinrude/ComfyUI_DWposeDeluxe": [
+ [
+ "BatchKeypoints",
+ "CherryPickerFrames",
+ "CherryPickerTwoInputs",
+ "CustomOptions",
+ "DWposeDeluxeNode",
+ "FrameNumberNode",
+ "KeypointConverter",
+ "KeypointDiff",
+ "KeypointPrinter",
+ "KeypointRangeFromBatch",
+ "LoadPoseKeypoints",
+ "MergeKeypoints",
+ "PoseInterpolation",
+ "PoseResize",
+ "ReverseKeypoints"
+ ],
+ {
+ "title_aux": "ComfyUI_DWposeDeluxe"
+ }
+ ],
+ "https://github.com/hodanajan/optimal-crop-resolution": [
+ [
+ "AspectRatioCalculator",
+ "ResolutionMatcher"
+ ],
+ {
+ "title_aux": "optimal-crop-resolution"
+ }
+ ],
+ "https://github.com/hoveychen/ComfyUI-MusePose-Remaster": [
+ [
+ "musepose_getposes",
+ "musepose_inference"
+ ],
+ {
+ "title_aux": "ComfyUI-MusePose-Remaster"
+ }
+ ],
+ "https://github.com/hua1995116/comfyui_goenhance_ffmpeg_wm": [
+ [
+ "GOENHANCE_FFmpegWatermark"
+ ],
+ {
+ "title_aux": "comfyui_goenhance_ffmpeg_wm"
+ }
+ ],
+ "https://github.com/huagetai/ComfyUI-Gaffer": [
+ [
+ "ApplyICLight",
+ "CalculateNormalMap",
+ "GrayScaler",
+ "ICLightModelLoader",
+ "LightSource"
+ ],
+ {
+ "title_aux": "comfyui's gaffer(ComfyUI native implementation of IC-Light. )"
+ }
+ ],
+ "https://github.com/huagetai/ComfyUI_LightGradient": [
+ [
+ "ImageGradient",
+ "MaskGradient"
+ ],
+ {
+ "title_aux": "Light Gradient for ComfyUI"
+ }
+ ],
+ "https://github.com/huanngzh/ComfyUI-MVAdapter": [
+ [
+ "BiRefNet",
+ "ControlImagePreprocessor",
+ "ControlNetModelLoader",
+ "CustomLoraModelLoader",
+ "DiffusersMVModelMakeup",
+ "DiffusersMVPipelineLoader",
+ "DiffusersMVSampler",
+ "DiffusersMVSchedulerLoader",
+ "DiffusersMVVaeLoader",
+ "ImagePreprocessor",
+ "LdmPipelineLoader",
+ "LdmVaeLoader",
+ "ViewSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-MVAdapter"
+ }
+ ],
+ "https://github.com/hubentu/ComfyUI-loras-loader": [
+ [
+ "ConvertGreyscaleNode",
+ "DynamicLoRALoader",
+ "ImageBatchToImageList",
+ "LoRAStringAdapter",
+ "MultiLoRAnameLoader",
+ "MultiLoraLoader",
+ "MultiTriggerLoader"
+ ],
+ {
+ "title_aux": "Multiple LoRA Loader for ComfyUI"
+ }
+ ],
+ "https://github.com/hubo502/ComfyUI-Env-Loader": [
+ [
+ "EnvKeySelector",
+ "EnvKeys"
+ ],
+ {
+ "title_aux": "ComfyUI-Env-Loader"
+ }
+ ],
+ "https://github.com/huchenlei/ComfyUI-IC-Light-Native": [
+ [
+ "ICLightApply",
+ "ICLightApplyMaskGrey",
+ "ICLightAppply",
+ "VAEEncodeArgMax"
+ ],
+ {
+ "title_aux": "ComfyUI-IC-Light-Native"
+ }
+ ],
+ "https://github.com/huchenlei/ComfyUI-layerdiffuse": [
+ [
+ "LayeredDiffusionApply",
+ "LayeredDiffusionCondApply",
+ "LayeredDiffusionCondJointApply",
+ "LayeredDiffusionDecode",
+ "LayeredDiffusionDecodeRGBA",
+ "LayeredDiffusionDecodeSplit",
+ "LayeredDiffusionDiffApply",
+ "LayeredDiffusionJointApply"
+ ],
+ {
+ "title_aux": "ComfyUI-layerdiffuse (layerdiffusion)"
+ }
+ ],
+ "https://github.com/huchenlei/ComfyUI-openpose-editor": [
+ [
+ "huchenlei.LoadOpenposeJSON"
+ ],
+ {
+ "title_aux": "ComfyUI-openpose-editor"
+ }
+ ],
+ "https://github.com/huchenlei/ComfyUI_DanTagGen": [
+ [
+ "PromptDanTagGen"
+ ],
+ {
+ "title_aux": "ComfyUI_DanTagGen"
+ }
+ ],
+ "https://github.com/huchenlei/ComfyUI_densediffusion": [
+ [
+ "DenseDiffusionAddCondNode",
+ "DenseDiffusionApplyNode"
+ ],
+ {
+ "title_aux": "ComfyUI DenseDiffusion"
+ }
+ ],
+ "https://github.com/huchenlei/ComfyUI_omost": [
+ [
+ "OmostDenseDiffusionLayoutNode",
+ "OmostGreedyBagsTextEmbeddingNode",
+ "OmostLLMChatNode",
+ "OmostLLMHTTPServerNode",
+ "OmostLLMLoaderNode",
+ "OmostLayoutCondNode",
+ "OmostLoadCanvasConditioningNode",
+ "OmostLoadCanvasPythonCodeNode",
+ "OmostRenderCanvasConditioningNode"
+ ],
+ {
+ "title_aux": "ComfyUI_omost"
+ }
+ ],
+ "https://github.com/hughescr/ComfyUI-OpenPose-Keypoint-Extractor": [
+ [
+ "Openpose Keypoint Extractor"
+ ],
+ {
+ "title_aux": "OpenPose Keypoint Extractor"
+ }
+ ],
+ "https://github.com/hugobb/FastGAN-ComfyUI-Node": [
+ [
+ "BlendLatents",
+ "GANImg2Img",
+ "GenerateImages",
+ "InvertToLatent",
+ "LoadFastGAN",
+ "LoadLatent",
+ "SampleLatent",
+ "SaveLatent"
+ ],
+ {
+ "title_aux": "fastgan-comfyui"
+ }
+ ],
+ "https://github.com/huihuihuiz/lora_downloader": [
+ [
+ "LoraDownloader"
+ ],
+ {
+ "title_aux": "LoRA Downloader for ComfyUI"
+ }
+ ],
+ "https://github.com/huihuihuiz/plugin_downloader": [
+ [
+ "PluginDownloader"
+ ],
+ {
+ "title_aux": "Plugin Downloader for ComfyUI"
+ }
+ ],
+ "https://github.com/huihuihuiz/unet_downloader": [
+ [
+ "UNetDownloader"
+ ],
+ {
+ "title_aux": "UNet Downloader for ComfyUI"
+ }
+ ],
+ "https://github.com/huihuihuiz/upscaler_downloader": [
+ [
+ "UpscalerDownloader"
+ ],
+ {
+ "title_aux": "Upscaler Downloader for ComfyUI"
+ }
+ ],
+ "https://github.com/huixingyun/ComfyUI-HX-Captioner": [
+ [
+ "HXOllamaCaptioner"
+ ],
+ {
+ "title_aux": "ComfyUI-HX-Captioner"
+ }
+ ],
+ "https://github.com/hujuying/ComfyUI-ModelScope-API": [
+ [
+ "ModelScopeImageCaptionNode",
+ "ModelScopeImageEditNode",
+ "ModelScopeImageNode",
+ "ModelScopeLoraPresetNode",
+ "ModelScopeMultiLoraLoaderNode",
+ "ModelScopeSingleLoraLoaderNode",
+ "ModelScopeTextNode",
+ "ModelScopeVisionNode"
+ ],
+ {
+ "title_aux": "ComfyUI ModelScope API Node"
+ }
+ ],
+ "https://github.com/hum-ma/ComfyUI-TiledVaeLite": [
+ [
+ "LTTiledVAEDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-TiledVaeLite"
+ }
+ ],
+ "https://github.com/hunzmusic/ComfyUI-IG2MV": [
+ [
+ "DiffusersIGMVModelMakeup",
+ "DiffusersIGMVSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-IG2MV"
+ }
+ ],
+ "https://github.com/hustille/ComfyUI_Fooocus_KSampler": [
+ [
+ "KSampler With Refiner (Fooocus)",
+ "KSamplerWithRefiner"
+ ],
+ {
+ "title_aux": "ComfyUI_Fooocus_KSampler"
+ }
+ ],
+ "https://github.com/hustille/ComfyUI_hus_utils": [
+ [
+ "3way Prompt Styler",
+ "Batch State",
+ "BatchState",
+ "Date Time Format",
+ "DateTimeFormat",
+ "Debug Extra",
+ "DebugExtra",
+ "Fetch widget value",
+ "FetchNodeValue",
+ "PromptStylerCSV3Way",
+ "Text Hash",
+ "TextHash"
+ ],
+ {
+ "title_aux": "hus' utils for ComfyUI"
+ }
+ ],
+ "https://github.com/huwenkai26/comfyui-remove-text": [
+ [
+ "ImageRemoveText"
+ ],
+ {
+ "title_aux": "ComfyUI Text Remove Node"
+ }
+ ],
+ "https://github.com/huygiatrng/Facefusion_comfyui": [
+ [
+ "AdvancedSwapFaceImage",
+ "AdvancedSwapFaceVideo",
+ "FaceDataVisualizer",
+ "FaceDetectorNode",
+ "FaceMaskVisualizer",
+ "FaceSwapApplier",
+ "PixelBoostNode",
+ "SwapFaceImage",
+ "SwapFaceVideo"
+ ],
+ {
+ "title_aux": "Facefusion_comfyui"
+ }
+ ],
+ "https://github.com/huyl3-cpu/ComfyUI-PyTorch210Patcher": [
+ [
+ "PyTorch210CompatibilityPatcher",
+ "PyTorchVersionChecker"
+ ],
+ {
+ "title_aux": "ComfyUI-PyTorch210Patcher"
+ }
+ ],
+ "https://github.com/huyl3-cpu/comfyui-sortlist": [
+ [
+ "AdaptiveResolution",
+ "ColabKeepAlive",
+ "RAMCleanup",
+ "Set Value With Path",
+ "SetValuesFromPanel",
+ "TunnelAutoReconnect",
+ "VF9_SetValue",
+ "VHS_ExtractVideoPath",
+ "image_to_sha256",
+ "move_file",
+ "rename_file",
+ "sort_list_string",
+ "steg_alpha_embed",
+ "steg_alpha_extract",
+ "steg_rgb_extract",
+ "string_clear_if_contains",
+ "video_audio_concat",
+ "video_cut_to_segments",
+ "video_dir_combiner",
+ "video_dir_combiner_ultra",
+ "video_mute_from_url",
+ "video_scene_splitter"
+ ],
+ {
+ "title_aux": "comfyui-huyl2-nodes"
+ }
+ ],
+ "https://github.com/hvppycoding/comfyui-json-prompt-renderer": [
+ [
+ "ExtractJSON",
+ "TemplateRenderFromJSON"
+ ],
+ {
+ "title_aux": "json prompt renderer"
+ }
+ ],
+ "https://github.com/hvppycoding/comfyui-random-sampler-scheduler-steps": [
+ [
+ "RandomSamplerSchedulerSteps"
+ ],
+ {
+ "title_aux": "RandomSamplerSchedulerSteps for ComfyUI"
+ }
+ ],
+ "https://github.com/hw5511/comfyui_hf_upscaler_loader": [
+ [
+ "CLIPModelLoaderFromHF",
+ "GGUFModelLoaderFromHF",
+ "UNETModelLoaderFromHF",
+ "UpscaleModelLoaderFromHF",
+ "VAEModelLoaderFromHF"
+ ],
+ {
+ "title_aux": "Woohee HF Upscaler Loader"
+ }
+ ],
+ "https://github.com/hwhaocool/ComfyUI-Select-Any": [
+ [
+ "SelectAnyValues"
+ ],
+ {
+ "title_aux": "ComfyUI-Select-Any"
+ }
+ ],
+ "https://github.com/hybskgks28275/ComfyUI-hybs-nodes": [
+ [
+ "HYBS_ConditionalLoRALoader",
+ "HYBS_RandomResolutionSelector",
+ "HYBS_ResolutionSelector",
+ "HYBS_SeedListGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-hybs-nodes"
+ }
+ ],
+ "https://github.com/hyukudan/comfyui-video-resolution": [
+ [
+ "VideoResolutionNode"
+ ],
+ {
+ "title_aux": "comfyui-video-resolution"
+ }
+ ],
+ "https://github.com/hyunamy/comfy-ui-on-complete-email-me": [
+ [
+ "OnCompleteEmailMe",
+ "OnCompletePlaySound",
+ "OnCompleteWebhook"
+ ],
+ {
+ "title_aux": "Comfy-UI on-complete-email-me"
+ }
+ ],
+ "https://github.com/iDAPPA/ComfyUI-AMDGPUMonitor": [
+ [
+ "AMDGPUMonitor"
+ ],
+ {
+ "title_aux": "AMD GPU Monitor for ComfyUI"
+ }
+ ],
+ "https://github.com/iFREEGROUP/comfyui-undistort": [
+ [
+ "IG_LoadCheckerboardImageForCalibrateCamera",
+ "IG_MatrixAndDistCoefToText",
+ "IG_Undistort"
+ ],
+ {
+ "title_aux": "comfyui-undistort"
+ }
+ ],
+ "https://github.com/iGavroche/ComfyUI-Ninode-Utils": [
+ [
+ "OpenAICompatibleChatNode"
+ ],
+ {
+ "title_aux": "Ninode Utils"
+ }
+ ],
+ "https://github.com/iGavroche/rocm-ninodes": [
+ [
+ "ROCMFluxBenchmark",
+ "ROCMLoRALoader",
+ "ROCMMemoryOptimizer",
+ "ROCMOptimizedCheckpointLoader",
+ "ROCMOptimizedKSampler",
+ "ROCMOptimizedKSamplerAdvanced",
+ "ROCMOptimizedVAEDecode",
+ "ROCMOptimizedVAEDecodeTiled",
+ "ROCMQuantizedModelOptimizer",
+ "ROCMSamplerPerformanceMonitor",
+ "ROCMVAEPerformanceMonitor",
+ "ROCmDiffusionLoader",
+ "ROCmGGUFLoader"
+ ],
+ {
+ "title_aux": "RocM Ninodes"
+ }
+ ],
+ "https://github.com/iSuneast/ComfyUI-WebhookNotifier": [
+ [
+ "WebhookNotifierAnyNode",
+ "WebhookNotifierNode"
+ ],
+ {
+ "title_aux": "ComfyUI-WebhookNotifier"
+ }
+ ],
+ "https://github.com/iacoposk8/ComfyUI-Fooocus-Inpaint-Wrapper": [
+ [
+ "AlignYourStepsScheduler",
+ "BasicScheduler",
+ "CLIPLoader",
+ "CLIPMergeSimple",
+ "CLIPSave",
+ "CLIPSetLastLayer",
+ "CLIPTextEncode",
+ "CLIPTextEncodeSDXL",
+ "CLIPTextEncodeSDXLRefiner",
+ "CLIPVisionEncode",
+ "CLIPVisionLoader",
+ "Canny",
+ "CheckpointLoader",
+ "CheckpointLoaderSimple",
+ "CheckpointSave",
+ "ConditioningAverage",
+ "ConditioningCombine",
+ "ConditioningConcat",
+ "ConditioningSetArea",
+ "ConditioningSetAreaPercentage",
+ "ConditioningSetMask",
+ "ConditioningSetTimestepRange",
+ "ConditioningZeroOut",
+ "ControlNetApply",
+ "ControlNetApplyAdvanced",
+ "ControlNetLoader",
+ "CropMask",
+ "DiffControlNetLoader",
+ "DiffusersLoader",
+ "DualCLIPLoader",
+ "EmptyImage",
+ "EmptyLatentImage",
+ "ExponentialScheduler",
+ "FeatherMask",
+ "FirstNode",
+ "FlipSigmas",
+ "FooocusInpaintWrapper",
+ "FreeU",
+ "FreeU_V2",
+ "GLIGENLoader",
+ "GLIGENTextBoxApply",
+ "GrowMask",
+ "HyperTile",
+ "HypernetworkLoader",
+ "ImageBatch",
+ "ImageBlend",
+ "ImageBlur",
+ "ImageColorToMask",
+ "ImageCompositeMasked",
+ "ImageCrop",
+ "ImageInvert",
+ "ImageOnlyCheckpointLoader",
+ "ImageOnlyCheckpointSave",
+ "ImagePadForOutpaint",
+ "ImageQuantize",
+ "ImageScale",
+ "ImageScaleBy",
+ "ImageScaleToTotalPixels",
+ "ImageSharpen",
+ "ImageToMask",
+ "ImageUpscaleWithModel",
+ "InpaintModelConditioning",
+ "InvertMask",
+ "JoinImageWithAlpha",
+ "KSampler",
+ "KSamplerAdvanced",
+ "KSamplerSelect",
+ "KarrasScheduler",
+ "LatentAdd",
+ "LatentBatch",
+ "LatentBatchSeedBehavior",
+ "LatentBlend",
+ "LatentComposite",
+ "LatentCompositeMasked",
+ "LatentCrop",
+ "LatentFlip",
+ "LatentFromBatch",
+ "LatentInterpolate",
+ "LatentMultiply",
+ "LatentRotate",
+ "LatentSubtract",
+ "LatentUpscale",
+ "LatentUpscaleBy",
+ "LoadImage",
+ "LoadImageMask",
+ "LoadLatent",
+ "LoraLoader",
+ "LoraLoaderModelOnly",
+ "MaskComposite",
+ "MaskToImage",
+ "ModelMergeAdd",
+ "ModelMergeBlocks",
+ "ModelMergeSimple",
+ "ModelMergeSubtract",
+ "ModelSamplingContinuousEDM",
+ "ModelSamplingDiscrete",
+ "PatchModelAddDownscale",
+ "PerpNeg",
+ "PhotoMakerEncode",
+ "PhotoMakerLoader",
+ "PolyexponentialScheduler",
+ "PorterDuffImageComposite",
+ "PreviewImage",
+ "RebatchImages",
+ "RebatchLatents",
+ "RepeatImageBatch",
+ "RepeatLatentBatch",
+ "RescaleCFG",
+ "SDTurboScheduler",
+ "SD_4XUpscale_Conditioning",
+ "SVD_img2vid_Conditioning",
+ "SamplerCustom",
+ "SamplerDPMPP_2M_SDE",
+ "SamplerDPMPP_SDE",
+ "SamplerTCD",
+ "SaveAnimatedPNG",
+ "SaveAnimatedWEBP",
+ "SaveImage",
+ "SaveLatent",
+ "SelfAttentionGuidance",
+ "SetLatentNoiseMask",
+ "SolidMask",
+ "SplitImageWithAlpha",
+ "SplitSigmas",
+ "StableZero123_Conditioning",
+ "StableZero123_Conditioning_Batched",
+ "StyleModelApply",
+ "StyleModelLoader",
+ "TomePatchModel",
+ "UNETLoader",
+ "UpscaleModelLoader",
+ "VAEDecode",
+ "VAEDecodeTiled",
+ "VAEEncode",
+ "VAEEncodeForInpaint",
+ "VAEEncodeTiled",
+ "VAELoader",
+ "VAESave",
+ "VPScheduler",
+ "VideoLinearCFGGuidance",
+ "unCLIPCheckpointLoader",
+ "unCLIPConditioning"
+ ],
+ {
+ "title_aux": "ComfyUI Fooocus Inpaint Wrapper"
+ }
+ ],
+ "https://github.com/iacoposk8/xor_pickle_nodes": [
+ [
+ "DecryptXORText",
+ "Load XOR Pickle From File",
+ "Save XOR Pickle To File"
+ ],
+ {
+ "title_aux": "ComfyUI XOR Text & Pickle Nodes"
+ }
+ ],
+ "https://github.com/ialhabbal/ComfyUI-Prompt-Verify": [
+ [
+ "Prompt Verify"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Verify"
+ }
+ ],
+ "https://github.com/ialhabbal/OcclusionMask": [
+ [
+ "BatchLoadImages",
+ "ImageOcclusion"
+ ],
+ {
+ "title_aux": "OcclusionMask"
+ }
+ ],
+ "https://github.com/iamandeepsandhu/ComfyUI-NSFW-Check": [
+ [
+ "NSFWScore"
+ ],
+ {
+ "title_aux": "NSFW Check for ComfyUI"
+ }
+ ],
+ "https://github.com/icesun963/ComfyUI_HFDownLoad": [
+ [
+ "Apply EasyOCR V2",
+ "HFDownLoad_Tool",
+ "LayerMask: SegmentAnythingUltra V2.1",
+ "LayerUtility: LaMa V2"
+ ],
+ {
+ "author": "chflame",
+ "description": "A set of nodes for ComfyUI that can composite layer and mask to achieve Photoshop like functionality.",
+ "nickname": "LayerStyle",
+ "title": "LayerStyle",
+ "title_aux": "HFDownLoad Node for ComfyUI"
+ }
+ ],
+ "https://github.com/ichabodcole/ComfyUI-Ichis-Pack": [
+ [
+ "ICHIS_Aspect_Ratio_Plus",
+ "ICHIS_Extract_Tags",
+ "ICHIS_Save_Tags",
+ "ICHIS_Tag_Category_Select",
+ "ICHIS_Tag_File_Loader",
+ "ICHIS_Tag_Sampler",
+ "ICHIS_Text_Selector"
+ ],
+ {
+ "title_aux": "ComfyUI-Ichis-Pack"
+ }
+ ],
+ "https://github.com/id7238/ComfyUI-PackedPipes": [
+ [
+ "PipePacker",
+ "PipeUnpacker"
+ ],
+ {
+ "title_aux": "ComfyUI-PackedPipes"
+ }
+ ],
+ "https://github.com/idrirap/ComfyUI-Lora-Auto-Trigger-Words": [
+ [
+ "FusionText",
+ "LoraListNames",
+ "LoraLoaderAdvanced",
+ "LoraLoaderStackedAdvanced",
+ "LoraLoaderStackedVanilla",
+ "LoraLoaderVanilla",
+ "LoraTagsOnly",
+ "Randomizer",
+ "TagsFormater",
+ "TagsSelector",
+ "TextInputBasic"
+ ],
+ {
+ "title_aux": "ComfyUI-Lora-Auto-Trigger-Words"
+ }
+ ],
+ "https://github.com/idvdii/ComfyUI-DvD-LoraTriggerwordsManager": [
+ [
+ "DvD_LoraLoader_ModelOnly",
+ "DvD_LoraLoader_Stack",
+ "DvD_LoraLoader_Standard"
+ ],
+ {
+ "title_aux": "ComfyUI-DvD-LoraTriggerwordsManager"
+ }
+ ],
+ "https://github.com/iemesowum/ComfyUI_IsaacNodes": [
+ [
+ "I_AmplitudeToWeights",
+ "I_BinaryAmplitudeGate",
+ "I_UnmixAudio",
+ "I_WeightsListToWeights"
+ ],
+ {
+ "author": "Isaac Emesowum",
+ "description": "This extension offers automatic drums extraction from audio files, as well as a few helper nodes to support my audio synchronization AnimateDiff workflows.",
+ "nickname": "Isaac's Nodes",
+ "title": "Isaac's Nodes",
+ "title_aux": "Isaac's Nodes"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-IF_AI_Dreamtalk": [
+ [
+ "IF_DreamTalk",
+ "IF_Dreamtalk"
+ ],
+ {
+ "title_aux": "IF_Dreamtalk"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode": [
+ [
+ "IF_HFDownload",
+ "IF_HFDownloadNode"
+ ],
+ {
+ "title_aux": "IF_AI_HFDownloaderNode"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-IF_AI_ParlerTTSNode": [
+ [
+ "IF_ParlerTTS"
+ ],
+ {
+ "title_aux": "IF_ParlerTTSNode"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-IF_AI_WishperSpeechNode": [
+ [
+ "IF_WhisperSpeech"
+ ],
+ {
+ "title_aux": "IF_AI_WishperSpeechNode"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-IF_DatasetMkr": [
+ [
+ "IF_DatasetMkr",
+ "IF_HyDatasetMkr"
+ ],
+ {
+ "title_aux": "IF_DatasetMkr"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-IF_Gemini": [
+ [
+ "IFGeminiNode",
+ "IFPromptCombiner",
+ "IFTaskPromptManager"
+ ],
+ {
+ "title_aux": "IF_Gemini"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-IF_LLM": [
+ [
+ "IF_DisplayText",
+ "IF_JoinText",
+ "IF_LLM",
+ "IF_LLM_DisplayOmni",
+ "IF_LLM_DisplayText",
+ "IF_LLM_DisplayTextWildcard",
+ "IF_LLM_JoinText",
+ "IF_LLM_ListModels",
+ "IF_LLM_LoadImagesS",
+ "IF_LLM_SaveText",
+ "IF_LLM_TextTyper",
+ "IF_LoadImagesS",
+ "IF_TextTyper",
+ "IF_saveText",
+ "ListModelsNode"
+ ],
+ {
+ "title_aux": "IF_LLM"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-IF_MemoAvatar": [
+ [
+ "IF_MemoAvatar",
+ "IF_MemoCheckpointLoader"
+ ],
+ {
+ "title_aux": "IF_MemoAvatar"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-IF_Trellis": [
+ [
+ "IF_TrellisCheckpointLoader",
+ "IF_TrellisImageTo3D"
+ ],
+ {
+ "title_aux": "IF_Trellis"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-IF_VideoPrompts": [
+ [
+ "VideoPromptNode"
+ ],
+ {
+ "title_aux": "IF_VideoPrompts"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-WanResolutionSelector": [
+ [
+ "VideoResolutionSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-WanResolutionSelector"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI-yt_dl": [
+ [
+ "YouTubeDownloader"
+ ],
+ {
+ "title_aux": "ComfyUI-yt_dl"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI_HunyuanVideoFoley": [
+ [
+ "HunyuanVideoFoley",
+ "HunyuanVideoFoleyDependenciesLoader",
+ "HunyuanVideoFoleyGeneratorAdvanced",
+ "HunyuanVideoFoleyModelLoader",
+ "HunyuanVideoFoleyTorchCompile"
+ ],
+ {
+ "title_aux": "ComfyUI HunyuanVideo-Foley"
+ }
+ ],
+ "https://github.com/if-ai/ComfyUI_IF_AI_LoadImages": [
+ [
+ "IF_LoadImagesS"
+ ],
+ {
+ "title_aux": "IF_AI_LoadImages"
+ }
+ ],
+ "https://github.com/ifmylove2011/comfyui-missed-tool": [
+ [
+ "ColorImageFillRm",
+ "ImageQueueLoader",
+ "LoadImageA",
+ "LoraLoad",
+ "LoraMerge",
+ "LoraSaver",
+ "ScaleMultilplePixels",
+ "TextSplitToList",
+ "TrimBG",
+ "TrimBGAdvanced",
+ "TxtSave"
+ ],
+ {
+ "title_aux": "comfyui-missed-tool"
+ }
+ ],
+ "https://github.com/iguanesolutions/comfyui-ig1-tools": [
+ [
+ "IG1AspectRatioProperties",
+ "IG1FluxReport",
+ "IG1ImageSelector",
+ "IG1LoadImage",
+ "IG1QwenImageNativesResolutions",
+ "IG1Resolution",
+ "IG1ResolutionAdvisor",
+ "IG1ResolutionProperties"
+ ],
+ {
+ "title_aux": "Flux Resolution"
+ }
+ ],
+ "https://github.com/ihmily/ComfyUI-Light-Tool": [
+ [
+ "Light-Tool: AddBackground",
+ "Light-Tool: AddBackgroundV2",
+ "Light-Tool: BoundingBoxCropping",
+ "Light-Tool: Calculate",
+ "Light-Tool: ConvertNumType",
+ "Light-Tool: CropImage",
+ "Light-Tool: DeserializeJsonString",
+ "Light-Tool: GetImageSize",
+ "Light-Tool: GetImagesCount",
+ "Light-Tool: GetSideLength",
+ "Light-Tool: Hex2RGB",
+ "Light-Tool: ImageConcat",
+ "Light-Tool: ImageMaskApply",
+ "Light-Tool: ImageOverlay",
+ "Light-Tool: ImageToMask",
+ "Light-Tool: InputText",
+ "Light-Tool: InputTextList",
+ "Light-Tool: InvertMask",
+ "Light-Tool: IsTransparent",
+ "Light-Tool: KeyValue",
+ "Light-Tool: LoadImage",
+ "Light-Tool: LoadImageFromURL",
+ "Light-Tool: LoadImagesFromDir",
+ "Light-Tool: LoadMetadataFromURL",
+ "Light-Tool: LoadVideo",
+ "Light-Tool: MaskBoundingBoxCropping",
+ "Light-Tool: MaskContourExtractor",
+ "Light-Tool: MaskImageToTransparent",
+ "Light-Tool: MaskToImage",
+ "Light-Tool: MorphologicalTF",
+ "Light-Tool: PhantomTankEffect",
+ "Light-Tool: PreviewVideo",
+ "Light-Tool: RGB2Hex",
+ "Light-Tool: RGB2RGBA",
+ "Light-Tool: RGBA2RGB",
+ "Light-Tool: ResizeImage",
+ "Light-Tool: ResizeImageByMaxSize",
+ "Light-Tool: ResizeImageByMinSize",
+ "Light-Tool: ResizeImageByRatio",
+ "Light-Tool: ResizeImageV2",
+ "Light-Tool: SaveMetadata",
+ "Light-Tool: SaveToAliyunOSS",
+ "Light-Tool: SaveVideo",
+ "Light-Tool: ScaleImage",
+ "Light-Tool: SerializeJsonObject",
+ "Light-Tool: ShowAnything",
+ "Light-Tool: ShowText",
+ "Light-Tool: SimpleImageOverlay",
+ "Light-Tool: SimpleTextConnect",
+ "Light-Tool: SolidColorBackground",
+ "Light-Tool: TextConnect",
+ "Light-Tool: TextReplace",
+ "Light-Tool: UpscaleImage"
+ ],
+ {
+ "author": "Hmily",
+ "description": "An awesome light tool nodes for ComfyUI.",
+ "nickname": "ComfyUI-Light-Tool",
+ "title": "ComfyUI-Light-Tool",
+ "title_aux": "ComfyUI-Light-Tool"
+ }
+ ],
+ "https://github.com/ihmily/comfy-deploy": [
+ [
+ "ComfyDeployExternalFloat",
+ "ComfyDeployExternalImage",
+ "ComfyDeployExternalImageBatch",
+ "ComfyDeployExternalInt",
+ "ComfyDeployExternalText"
+ ],
+ {
+ "author": "Hmily",
+ "description": "Easy deploy API for ComfyUI.",
+ "nickname": "comfy-deploy",
+ "title": "comfy-deploy",
+ "title_aux": "comfy-deploy"
+ }
+ ],
+ "https://github.com/illuminatianon/comfyui-csvwildcards": [
+ [
+ "CSVWildcardNode",
+ "DisplayTextNode"
+ ],
+ {
+ "title_aux": "CSV Wildcard Node for ComfyUI"
+ }
+ ],
+ "https://github.com/illuminatianon/comfyui-lumi-tools": [
+ [
+ "LumiGeminiImagenConfig",
+ "LumiGoogleImagenProvider",
+ "LumiLLMImagenProcessor",
+ "LumiLLMPromptProcessor",
+ "LumiNoiseToSeed",
+ "LumiOpenRouterImagenProvider",
+ "LumiOpenRouterProvider",
+ "LumiSaveImage",
+ "LumiSeed",
+ "LumiShowText",
+ "LumiShufflePrompt",
+ "LumiTextInput",
+ "LumiWildcardProcessor",
+ "LumiWrapText"
+ ],
+ {
+ "title_aux": "comfyui-lumi-tools"
+ }
+ ],
+ "https://github.com/imb101/ComfyUI-FaceSwap": [
+ [
+ "FaceSwapNode"
+ ],
+ {
+ "title_aux": "FaceSwap"
+ }
+ ],
+ "https://github.com/infinigence/ComfyUI-Infinigence-Nodes": [
+ [
+ "DrawTextNode",
+ "Qwen2.5VL_api"
+ ],
+ {
+ "title_aux": "ComfyUI-Infinigence-Nodes"
+ }
+ ],
+ "https://github.com/injet-zhou/comfyui_extra_api": [
+ [
+ "SimpleGenImageInterface"
+ ],
+ {
+ "title_aux": "comfyui_extra_api"
+ }
+ ],
+ "https://github.com/inventorado/ComfyUI_NNT": [
+ [
+ "NntAnalyzeInferenceMetrics",
+ "NntAnalyzeModel",
+ "NntCompileModel",
+ "NntDataLoader",
+ "NntDatasetToImageTensor",
+ "NntDatasetToTargetTensor",
+ "NntDatasetToTensor",
+ "NntDatasetToTextTensor",
+ "NntDefineActivationLayer",
+ "NntDefineAlibiPositionalBias",
+ "NntDefineConvLayer",
+ "NntDefineDenseLayer",
+ "NntDefineFlattenLayer",
+ "NntDefineGRULayer",
+ "NntDefineLSTMLayer",
+ "NntDefineLinearAttention",
+ "NntDefineLocalAttention",
+ "NntDefineMultiheadAttention",
+ "NntDefineNormLayer",
+ "NntDefinePoolingLayer",
+ "NntDefinePositionalEncoding",
+ "NntDefineRNNLayer",
+ "NntDefineReformerAttention",
+ "NntDefineRelativePositionBias",
+ "NntDefineReshapeLayer",
+ "NntDefineRotaryPositionalEmbedding",
+ "NntDefineTransformerEncoderLayer",
+ "NntDefineTransformerXLAttention",
+ "NntDefineVanillaAttention",
+ "NntEditModelLayers",
+ "NntEvaluatePredictions",
+ "NntFileLoader",
+ "NntFineTuneModel",
+ "NntHuggingFaceDataLoader",
+ "NntImageToTensor",
+ "NntInference",
+ "NntInputLayer",
+ "NntLoadModel",
+ "NntMergeExtendModel",
+ "NntPlotTensors",
+ "NntRandomTensorGenerator",
+ "NntSHAPSummaryNode",
+ "NntSaveModel",
+ "NntShowLayerStack",
+ "NntShowModelInfo",
+ "NntTensorElementToImage",
+ "NntTensorOperations",
+ "NntTensorSlice",
+ "NntTensorToText",
+ "NntTextBatchProcessor",
+ "NntTextToTensor",
+ "NntTimeSeriesDataLoader",
+ "NntTorchvisionDataLoader",
+ "NntTorchvisionDatasets",
+ "NntTrainModel",
+ "NntTrainingHyperparameters",
+ "NntVisualizeConfidenceScores",
+ "NntVisualizeGraph",
+ "NntVisualizePredictionMetrics",
+ "NntVisualizeTrainingMetrics"
+ ],
+ {
+ "title_aux": "ComfyUI Neural Network Toolkit NNT "
+ }
+ ],
+ "https://github.com/irreveloper/ComfyUI-DSD": [
+ [
+ "DSDGeminiPromptEnhancer",
+ "DSDImageGenerator",
+ "DSDModelDownloader",
+ "DSDModelLoader",
+ "DSDModelSelector",
+ "DSDResizeSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-DSD"
+ }
+ ],
+ "https://github.com/isala404/comfy-workflow-api": [
+ [
+ "WebhookReceiver",
+ "WebhookSend",
+ "WebhookTransformer"
+ ],
+ {
+ "title_aux": "comfy-workflow-api"
+ }
+ ],
+ "https://github.com/iwanders/ComfyUI_nodes": [
+ [
+ "IW_JsonPickItem",
+ "IW_ModelHook",
+ "IW_StringConcat",
+ "IW_StringFromInt",
+ "IW_StringNode",
+ "IW_StringPrint",
+ "IW_StringReplace",
+ "IW_StringSave",
+ "IW_TokenizerVocab"
+ ],
+ {
+ "title_aux": "iwanders/ComfyUI_nodes"
+ }
+ ],
+ "https://github.com/jacklukai/ComfyUI_DeployCash": [
+ [
+ "DeployCash",
+ "DeployCash_saveImage",
+ "DeployCash_textInput"
+ ],
+ {
+ "title_aux": "ComfyUI_DeployCash"
+ }
+ ],
+ "https://github.com/jags111/ComfyUI_Jags_Audiotools": [
+ [
+ "BatchJoinAudio",
+ "BatchToList",
+ "BitCrushAudioFX",
+ "BulkVariation",
+ "ChorusAudioFX",
+ "ClippingAudioFX",
+ "CompressorAudioFX",
+ "ConcatAudioList",
+ "ConvolutionAudioFX",
+ "CutAudio",
+ "DelayAudioFX",
+ "DistortionAudioFX",
+ "DuplicateAudio",
+ "GainAudioFX",
+ "GenerateAudioSample",
+ "GenerateAudioWave",
+ "GetAudioFromFolderIndex",
+ "GetSingle",
+ "GetStringByIndex",
+ "HighShelfFilter",
+ "HighpassFilter",
+ "ImageToSpectral",
+ "InvertAudioFX",
+ "JoinAudio",
+ "LadderFilter",
+ "LimiterAudioFX",
+ "ListToBatch",
+ "LoadAudioDir",
+ "LoadAudioFile",
+ "LoadAudioModel (DD)",
+ "LoadVST3",
+ "LowShelfFilter",
+ "LowpassFilter",
+ "MP3CompressorAudioFX",
+ "MixAudioTensors",
+ "NoiseGateAudioFX",
+ "OTTAudioFX",
+ "PeakFilter",
+ "PhaserEffectAudioFX",
+ "PitchShiftAudioFX",
+ "PlotSpectrogram",
+ "PreviewAudioFile",
+ "PreviewAudioTensor",
+ "ResampleAudio",
+ "ReverbAudioFX",
+ "ReverseAudio",
+ "SaveAudioTensor",
+ "SequenceVariation",
+ "SliceAudio",
+ "SoundPlayer",
+ "StretchAudio",
+ "samplerate"
+ ],
+ {
+ "author": "jags111",
+ "description": "This extension offers various audio generation tools",
+ "nickname": "Audiotools",
+ "title": "Jags_Audiotools",
+ "title_aux": "Jags_Audiotools"
+ }
+ ],
+ "https://github.com/jags111/ComfyUI_Jags_VectorMagic": [
+ [
+ "CircularVAEDecode",
+ "JagsCLIPSeg",
+ "JagsClipseg",
+ "JagsCombineMasks",
+ "YoloSEGdetectionNode",
+ "YoloSegNode",
+ "color_drop",
+ "xy_Tiling_KSampler"
+ ],
+ {
+ "author": "jags111",
+ "description": "This extension offers various vector manipulation and generation tools",
+ "nickname": "Jags_VectorMagic",
+ "title": "Jags_VectorMagic",
+ "title_aux": "Jags_VectorMagic"
+ }
+ ],
+ "https://github.com/jags111/efficiency-nodes-comfyui": [
+ [
+ "AnimateDiff Script",
+ "Apply ControlNet Stack",
+ "Control Net Stacker",
+ "Eff. Loader SDXL",
+ "Efficient Loader",
+ "HighRes-Fix Script",
+ "Image Overlay",
+ "Join XY Inputs of Same Type",
+ "KSampler (Efficient)",
+ "KSampler Adv. (Efficient)",
+ "KSampler SDXL (Eff.)",
+ "LatentUpscaler",
+ "LoRA Stack to String converter",
+ "LoRA Stacker",
+ "Manual XY Entry Info",
+ "NNLatentUpscale",
+ "NNlLatentUpscale",
+ "Noise Control Script",
+ "Pack SDXL Tuple",
+ "Tiled Upscaler Script",
+ "Unpack SDXL Tuple",
+ "XY Input: Add/Return Noise",
+ "XY Input: Aesthetic Score",
+ "XY Input: CFG Scale",
+ "XY Input: Checkpoint",
+ "XY Input: Clip Skip",
+ "XY Input: Control Net",
+ "XY Input: Control Net Plot",
+ "XY Input: Denoise",
+ "XY Input: LoRA",
+ "XY Input: LoRA Plot",
+ "XY Input: LoRA Stacks",
+ "XY Input: Manual XY Entry",
+ "XY Input: Prompt S/R",
+ "XY Input: Refiner On/Off",
+ "XY Input: Sampler/Scheduler",
+ "XY Input: Seeds++ Batch",
+ "XY Input: Steps",
+ "XY Input: VAE",
+ "XY Plot"
+ ],
+ {
+ "title_aux": "Efficiency Nodes for ComfyUI Version 2.0+"
+ }
+ ],
+ "https://github.com/jaimitoes/ComfyUI_Wan2_1_lora_trainer": [
+ [
+ "MusubiCompileSettings",
+ "MusubiMemorySettings",
+ "MusubiSamplingSettings",
+ "WanCacheLatents",
+ "WanCacheTextEncoder",
+ "WanDatasetConfig",
+ "WanLoRATrainer"
+ ],
+ {
+ "title_aux": "ComfyUI_Wan2_1_lora_trainer"
+ }
+ ],
+ "https://github.com/jajos12/Comfyui-WanVideo-Context": [
+ [
+ "WanVideoContextSelector"
+ ],
+ {
+ "title_aux": "Comfyui-WanVideo-Context"
+ }
+ ],
+ "https://github.com/jamal-alkharrat/ComfyUI_rotate_image": [
+ [
+ "RotateImage"
+ ],
+ {
+ "title_aux": "ComfyUI_rotate_image"
+ }
+ ],
+ "https://github.com/jamesWalker55/comfyui-p2ldgan": [
+ [
+ "P2LDGAN"
+ ],
+ {
+ "title_aux": "ComfyUI - P2LDGAN Node"
+ }
+ ],
+ "https://github.com/jamesWalker55/comfyui-various": [
+ [
+ "BatchLoadImage",
+ "BatchSaveImage",
+ "GroupInfoExtractFloat",
+ "GroupInfoExtractInt",
+ "GroupLoadBatchImages",
+ "GroupLoadImage",
+ "JWAudioBlend",
+ "JWAudioSaveToPath",
+ "JWDatetimeString",
+ "JWImageBatchCount",
+ "JWImageContrast",
+ "JWImageExtractFromBatch",
+ "JWImageFlip",
+ "JWImageLevels",
+ "JWImageLoadRGB",
+ "JWImageLoadRGBA",
+ "JWImageLoadRGBA From Clipboard",
+ "JWImageLoadRGBFromClipboard",
+ "JWImageLoadRGBIfExists",
+ "JWImageMix",
+ "JWImageResize",
+ "JWImageResizeByFactor",
+ "JWImageResizeByLongerSide",
+ "JWImageResizeByShorterSide",
+ "JWImageResizeToSquare",
+ "JWImageSaturation",
+ "JWImageSaveToPath",
+ "JWImageSequenceExtractFromBatch",
+ "JWImageStackChannels",
+ "JWInfoHashExtractFloat",
+ "JWInfoHashExtractInteger",
+ "JWInfoHashExtractString",
+ "JWInfoHashFromInfoHashList",
+ "JWInfoHashFromRangedInfo",
+ "JWInfoHashListExtractStringList",
+ "JWInfoHashListFromRangedInfo",
+ "JWInfoHashPrint",
+ "JWLoadAudio",
+ "JWLoadImageSequence",
+ "JWLoadImagesFromString",
+ "JWLoopImageSequence",
+ "JWMaskLikeImageSize",
+ "JWMaskResize",
+ "JWMaskSequenceApplyToLatent",
+ "JWMaskSequenceFromMask",
+ "JWMaskSequenceJoin",
+ "JWPrintFloat",
+ "JWPrintImage",
+ "JWPrintInteger",
+ "JWPrintLatent",
+ "JWPrintMask",
+ "JWPrintString",
+ "JWRangedInfoCalculateSubBatch",
+ "JWReferenceOnly",
+ "JWSaveImageSequence",
+ "JWStringListCLIPEncode",
+ "JWStringListFromString",
+ "JWStringListFromStrings",
+ "JWStringListJoin",
+ "JWStringListRepeat",
+ "JWStringListToFormatedString",
+ "JWStringListToString",
+ "JWUncropCrop",
+ "JWUncropNewRect",
+ "JWUncropUncrop",
+ "JamesLoadImageGroup",
+ "RAFTEstimate",
+ "RAFTFlowToImage",
+ "RAFTLoadFlowFromEXRChannels",
+ "RCReceiveFloat",
+ "RCReceiveFloatList",
+ "RCReceiveInt",
+ "RCReceiveIntList",
+ "RCReceiveLatent",
+ "RCSendLatent"
+ ],
+ {
+ "nodename_pattern": "^JW",
+ "title_aux": "Various ComfyUI Nodes by Type"
+ }
+ ],
+ "https://github.com/jamesk9526/NoxPrompter-ComfyUI-CustomNode": [
+ [
+ "NoxPromptActionDirector",
+ "NoxPromptAnalyzer",
+ "NoxPromptBuilder",
+ "NoxPromptCameraMaster",
+ "NoxPromptCamz",
+ "NoxPromptCharacterCreator",
+ "NoxPromptCombiner",
+ "NoxPromptEnhancer",
+ "NoxPromptHumanDesigner",
+ "NoxPromptLightingMaster",
+ "NoxPromptNSFWActionDirector",
+ "NoxPromptNSFWDesigner",
+ "NoxPromptNarrativeWeaver",
+ "NoxPromptPaletteMixer",
+ "NoxPromptPipelineCombiner",
+ "NoxPromptWardrobeDesigner"
+ ],
+ {
+ "title_aux": "ComfyUI Nox Prompter"
+ }
+ ],
+ "https://github.com/jammyfu/ComfyUI_PaintingCoderUtils": [
+ [
+ "PaintingCoder::DynamicImageCombiner",
+ "PaintingCoder::DynamicMaskCombiner",
+ "PaintingCoder::ImageLatentCreator",
+ "PaintingCoder::ImageLatentCreatorPlus",
+ "PaintingCoder::ImageResolutionAdjuster",
+ "PaintingCoder::ImageSizeCreator",
+ "PaintingCoder::ImageSizeCreatorPlus",
+ "PaintingCoder::ImageSwitch",
+ "PaintingCoder::ImageToBase64",
+ "PaintingCoder::LatentSwitch",
+ "PaintingCoder::MaskPreview",
+ "PaintingCoder::MaskSwitch",
+ "PaintingCoder::MultilineTextInput",
+ "PaintingCoder::OutputToTextConverter",
+ "PaintingCoder::RemoveEmptyLinesAndLeadingSpaces",
+ "PaintingCoder::ShowTextPlus",
+ "PaintingCoder::SimpleTextInput",
+ "PaintingCoder::TextCombiner",
+ "PaintingCoder::TextSwitch",
+ "PaintingCoder::WebImageLoader"
+ ],
+ {
+ "title_aux": "Painting Coder Utils"
+ }
+ ],
+ "https://github.com/jandan520/ComfyUI-AdvancedCameraPrompts": [
+ [
+ "AdvancedCameraControlNode"
+ ],
+ {
+ "title_aux": "ComfyUI-AdvancedCameraPrompts"
+ }
+ ],
+ "https://github.com/jasonjgardner/comfui-substance-designer-integration": [
+ [
+ "SubstanceBatchProcessor",
+ "SubstanceCooker",
+ "SubstanceInfoExtractor",
+ "SubstanceParameterController",
+ "SubstanceRenderer"
+ ],
+ {
+ "title_aux": "ComfyUI Substance Designer Integration Plugin"
+ }
+ ],
+ "https://github.com/jasonjgardner/comfyui-pixel-art-scalers": [
+ [
+ "PixelArtScaler"
+ ],
+ {
+ "title_aux": "comfyui-pixel-art-scalers"
+ }
+ ],
+ "https://github.com/jav12z/ComfyUI-ToyShaders": [
+ [
+ "ShaderCodeInput",
+ "ToyShaderNode"
+ ],
+ {
+ "title_aux": "ComfyUI-ToyShaders"
+ }
+ ],
+ "https://github.com/jax-explorer/ComfyUI-InstantCharacter": [
+ [
+ "InstantCharacterGenerate",
+ "InstantCharacterLoadModel",
+ "InstantCharacterLoadModelFromLocal"
+ ],
+ {
+ "title_aux": "ComfyUI-InstantCharacter"
+ }
+ ],
+ "https://github.com/jax-explorer/ComfyUI-VideoBasic": [
+ [
+ "VideoBasicLoadVideo",
+ "VideoBasicMergeVideo",
+ "VideoBasicVideoSave",
+ "VideoBasicVideoUpscaleWithModel"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoBasic"
+ }
+ ],
+ "https://github.com/jax-explorer/ComfyUI-VideoBasicLatentSync": [
+ [
+ "VideoBasicLatentSyncLengthAdjuster",
+ "VideoBasicLatentSyncNode"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoBasicLatentSync"
+ }
+ ],
+ "https://github.com/jax-explorer/ComfyUI-easycontrol": [
+ [
+ "EasyControlGenerate",
+ "EasyControlLoadFlux",
+ "EasyControlLoadLora",
+ "EasyControlLoadMultiLora",
+ "EasyControlLoadStyleLora",
+ "EasyControlLoadStyleLoraFromCivitai"
+ ],
+ {
+ "title_aux": "ComfyUI-easycontrol"
+ }
+ ],
+ "https://github.com/jax-explorer/comfyui-model-dynamic-loader": [
+ [
+ "ComfyOnlineSaveFile",
+ "ComfyOnlineUploadAnything",
+ "EmbeddingLoader",
+ "LoadCheckpointFromCivitAI",
+ "LoadHunyuanLoraFromCivitAI",
+ "LoadHunyuanLoraFromComfyOnline",
+ "LoadHunyuanLoraFromHF",
+ "LoadImageFromURL",
+ "LoadLoraFromCivitAI",
+ "LoadLoraFromComfyOnline",
+ "LoadLoraFromHF",
+ "LoadLoraFromHFWithToken",
+ "LoadWanVideoLoraFromCivitAI",
+ "LoadWanVideoLoraFromComfyOnline",
+ "LoadWanVideoLoraFromHF",
+ "SaveAudioAsWav",
+ "SaveText"
+ ],
+ {
+ "title_aux": "comfyui-model-dynamic-loader"
+ }
+ ],
+ "https://github.com/jax-explorer/fast_video_comfyui": [
+ [
+ "FastImageListToImageBatch"
+ ],
+ {
+ "title_aux": "fast_video_comfyui"
+ }
+ ],
+ "https://github.com/jchiotaka/comfyui-tile-calculator": [
+ [
+ "TileCalculator"
+ ],
+ {
+ "title_aux": "comfyui-tile-calculator"
+ }
+ ],
+ "https://github.com/jeankassio/ComfyUI_MusicTools": [
+ [
+ "Music_AudioMixer",
+ "Music_AudioTrimmer",
+ "Music_AudioUpscale",
+ "Music_Compressor",
+ "Music_Equalize",
+ "Music_Gain",
+ "Music_LufsNormalizer",
+ "Music_MasterAudioEnhancement",
+ "Music_NoiseRemove",
+ "Music_Reverb",
+ "Music_StemRecombination",
+ "Music_StemSeparation",
+ "Music_StereoEnhance"
+ ],
+ {
+ "title_aux": "ComfyUI_MusicTools"
+ }
+ ],
+ "https://github.com/jeankassio/JK-AceStep-Nodes": [
+ [
+ "AceStepClaude_Lyrics",
+ "AceStepCohere_Lyrics",
+ "AceStepCompileSettings",
+ "AceStepFireworks_Lyrics",
+ "AceStepGeminiLyrics",
+ "AceStepGemini_Lyrics",
+ "AceStepGroqLyrics",
+ "AceStepGroq_Lyrics",
+ "AceStepHuggingFace_Lyrics",
+ "AceStepKSampler",
+ "AceStepKSamplerAdvanced",
+ "AceStepOpenAI_Lyrics",
+ "AceStepPerplexity_Lyrics",
+ "AceStepPostProcess",
+ "AceStepPromptGen",
+ "AceStepReplicate_Lyrics",
+ "AceStepSaveText",
+ "AceStepTogetherAI_Lyrics",
+ "AceStepTorchCompile",
+ "AceStepVocoderAdapter",
+ "AudioQualityEvaluator"
+ ],
+ {
+ "title_aux": "JK AceStep Nodes"
+ }
+ ],
+ "https://github.com/jeffrey2212/ComfyUI-PonyCharacterPrompt": [
+ [
+ "Pony Character Prompt Picker"
+ ],
+ {
+ "title_aux": "Pony Character Prompt Picker for ComfyUI"
+ }
+ ],
+ "https://github.com/jeffy5/comfyui-faceless-node": [
+ [
+ "FacelessFaceRestore",
+ "FacelessFaceSwap",
+ "FacelessLoadImageUrl",
+ "FacelessLoadVideo",
+ "FacelessLoadVideoImages",
+ "FacelessLoadVideoUrl",
+ "FacelessMergeVideos",
+ "FacelessRemoveBackground",
+ "FacelessSaveVideo",
+ "FacelessUploadVideo",
+ "FacelessVideoFaceRestore",
+ "FacelessVideoFaceSwap",
+ "FacelessVideoRemoveBackground"
+ ],
+ {
+ "title_aux": "Faceless Node for ComfyUI"
+ }
+ ],
+ "https://github.com/jerrylongyan/ComfyUI-My-Mask": [
+ [
+ "MaskToBottonHalfConvexMask",
+ "MaskToConvexMask"
+ ],
+ {
+ "title_aux": "ComfyUI-My-Mask"
+ }
+ ],
+ "https://github.com/jerrywap/ComfyUI_LoadImageFromHttpURL": [
+ [
+ "LoadImageFromHttpURL"
+ ],
+ {
+ "title_aux": "ComfyUI_LoadImageFromHttpURL"
+ }
+ ],
+ "https://github.com/jerrywap/ComfyUI_UploadToWebhookHTTP": [
+ [
+ "UploadToWebHookHTTP"
+ ],
+ {
+ "title_aux": "ComfyUI_UploadToWebhookHTTP"
+ }
+ ],
+ "https://github.com/jesenzhang/ComfyUI_StreamDiffusion": [
+ [
+ "StreamDiffusion_Loader",
+ "StreamDiffusion_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_StreamDiffusion"
+ }
+ ],
+ "https://github.com/jessesep/SimpleVariables": [
+ [
+ "SimpleClear",
+ "SimpleGet",
+ "SimpleList",
+ "SimpleSet"
+ ],
+ {
+ "title_aux": "SimpleVariables"
+ }
+ ],
+ "https://github.com/jfcantu/ComfyUI-AutoNotes": [
+ [
+ "AutoNotesNode"
+ ],
+ {
+ "title_aux": "ComfyUI AutoNotes"
+ }
+ ],
+ "https://github.com/jfcantu/ComfyUI-Prompt-Companion": [
+ [
+ "PromptCompanion_AddSubprompt",
+ "PromptCompanion_LoadCheckpointWithSubprompt",
+ "PromptCompanion_StringsToSubprompt",
+ "PromptCompanion_SubpromptToStrings"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Companion"
+ }
+ ],
+ "https://github.com/jhj0517/ComfyUI-Moondream-Gaze-Detection": [
+ [
+ "(Down)Load Moondream Model",
+ "Gaze Detection",
+ "Gaze Detection Video"
+ ],
+ {
+ "title_aux": "ComfyUI-Moondream-Gaze-Detection"
+ }
+ ],
+ "https://github.com/jhj0517/ComfyUI-jhj-Kokoro-Onnx": [
+ [
+ "(Down)Load Kokoro Model",
+ "Kokoro Audio Generator"
+ ],
+ {
+ "title_aux": "ComfyUI jhj Kokoro Onnx"
+ }
+ ],
+ "https://github.com/jiafuzeng/comfyui-LatentSync": [
+ [
+ "LatentSyncNode"
+ ],
+ {
+ "title_aux": "LatentSync"
+ }
+ ],
+ "https://github.com/jialuw0830/flux_api_comfyui_plugin": [
+ [
+ "EigenAIFluxNode",
+ "EigenAIKontextNode",
+ "EigenAIQwenNode",
+ "nodes"
+ ],
+ {
+ "title_aux": "Eigen AI FLUX API Plugin"
+ }
+ ],
+ "https://github.com/jianglinbin/ComfyUI-AnglesSelect": [
+ [
+ "AnglesSelector3D",
+ "SimpleAnglesSelector"
+ ],
+ {
+ "title_aux": "ComfyUI 3D Angles Selector"
+ }
+ ],
+ "https://github.com/jiaqianjing/ComfyUI-MidjourneyHub": [
+ [
+ "GPTImageEditNode",
+ "GPTImageGenerateNode",
+ "GeminiImageEditNode",
+ "GeminiImageGenerateNode",
+ "MidjourneyActionNode",
+ "MidjourneyBatchActionNode",
+ "MidjourneyBlendNode",
+ "MidjourneyImagineNode"
+ ],
+ {
+ "title_aux": "ComfyUI-MidjourneyHub"
+ }
+ ],
+ "https://github.com/jiaxiangc/ComfyUI-ResAdapter": [
+ [
+ "ResAdapterLoader"
+ ],
+ {
+ "title_aux": "ResAdapter for ComfyUI"
+ }
+ ],
+ "https://github.com/jinanlongen/ComfyUI-Prompt-Expander": [
+ [
+ "PromptExpanderNode"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Expander Node"
+ }
+ ],
+ "https://github.com/jinchanz/ComfyUI-ADIC": [
+ [
+ "ADICOpenAIGPTImage1",
+ "ADIC_COMMON_API",
+ "AliCloudOSSUpload",
+ "IdeaLabImageGenerate",
+ "ImageTranslateAPI",
+ "ImageTranslateParamsBuilder",
+ "ImageTranslateResultExtractor",
+ "LoadImagesFromUrls",
+ "MaletteFluxKontextImageScale",
+ "MaletteImageConcatFromBatch",
+ "MaletteImageStitch",
+ "MaletteReferenceLatent",
+ "MarketImageGenerateWithPolling",
+ "OpenAIGPTImage1",
+ "PythonCodeExecutor",
+ "StringToJsonArray"
+ ],
+ {
+ "title_aux": "ComfyUI-ADIC"
+ }
+ ],
+ "https://github.com/jitcoder/lora-info": [
+ [
+ "ImageFromURL",
+ "LoraInfo"
+ ],
+ {
+ "title_aux": "LoraInfo"
+ }
+ ],
+ "https://github.com/jjkramhoeft/ComfyUI-Jjk-Nodes": [
+ [
+ "JjkConcat",
+ "JjkShowText",
+ "JjkText",
+ "SDXLRecommendedImageSize"
+ ],
+ {
+ "title_aux": "ComfyUI-Jjk-Nodes"
+ }
+ ],
+ "https://github.com/jkrauss82/ultools-comfyui": [
+ [
+ "CLIPTextEncodeWithStats",
+ "OpenPoseEditorAdv",
+ "SaveImgAdv",
+ "SolidMaskAdv"
+ ],
+ {
+ "title_aux": "ULTools for ComfyUI"
+ }
+ ],
+ "https://github.com/jn-jairo/jn_comfyui": [
+ [
+ "JN_AreaAround",
+ "JN_AreaInfo",
+ "JN_AreaNormalize",
+ "JN_AreaToMask",
+ "JN_AreaWidthHeight",
+ "JN_AreaXY",
+ "JN_AudioArrayToBatch",
+ "JN_AudioAutoTune",
+ "JN_AudioBatchToArray",
+ "JN_AudioCompare",
+ "JN_AudioConcatenation",
+ "JN_AudioGetChannels",
+ "JN_AudioInfo",
+ "JN_AudioNoiseReduction",
+ "JN_AudioNormalize",
+ "JN_AudioPitch",
+ "JN_AudioPlot",
+ "JN_AudioReverberation",
+ "JN_AudioSampleRate",
+ "JN_AudioSetChannels",
+ "JN_AudioSlice",
+ "JN_AudioSpeed",
+ "JN_AudioSplitChannels",
+ "JN_AudioStackChannels",
+ "JN_AudioTempo",
+ "JN_AudioTrimSilence",
+ "JN_AudioVolume",
+ "JN_Blip",
+ "JN_BlipLoader",
+ "JN_BooleanOperation",
+ "JN_Condition",
+ "JN_CoolDown",
+ "JN_CoolDownOutput",
+ "JN_DatetimeFormat",
+ "JN_DatetimeInfo",
+ "JN_DatetimeNow",
+ "JN_Dump",
+ "JN_DumpOutput",
+ "JN_Exec",
+ "JN_ExecOutput",
+ "JN_FaceCrop",
+ "JN_FaceRestoreModelLoader",
+ "JN_FaceRestoreWithModel",
+ "JN_FirstActive",
+ "JN_Flow",
+ "JN_FlowOutput",
+ "JN_ImageAddBackground",
+ "JN_ImageAddMask",
+ "JN_ImageBatch",
+ "JN_ImageCenterArea",
+ "JN_ImageCrop",
+ "JN_ImageGrid",
+ "JN_ImageInfo",
+ "JN_ImageRemoveBackground",
+ "JN_ImageSharpness",
+ "JN_ImageSquare",
+ "JN_ImageToMask",
+ "JN_ImageUncrop",
+ "JN_KSampler",
+ "JN_KSamplerAdvancedParams",
+ "JN_KSamplerFaceRestoreParams",
+ "JN_KSamplerResizeInputParams",
+ "JN_KSamplerResizeMaskAreaParams",
+ "JN_KSamplerResizeOutputParams",
+ "JN_KSamplerSeamlessParams",
+ "JN_KSamplerTileParams",
+ "JN_KeyValue",
+ "JN_LoadAudioDirectory",
+ "JN_LoadImageDirectory",
+ "JN_LogicOperation",
+ "JN_MaskBatch",
+ "JN_MaskInfo",
+ "JN_MaskToArea",
+ "JN_MaskToImage",
+ "JN_MathOperation",
+ "JN_MathOperationArray",
+ "JN_MeowHrtfAudio3d",
+ "JN_MeowHrtfModel",
+ "JN_MeowHrtfPosition",
+ "JN_MeowLoadVoice",
+ "JN_MeowSaveVoice",
+ "JN_MeowSentenceSplit",
+ "JN_MeowTts",
+ "JN_MeowTtsAudioToContext",
+ "JN_MeowTtsCoarse",
+ "JN_MeowTtsDecode",
+ "JN_MeowTtsFine",
+ "JN_MeowTtsLoadContext",
+ "JN_MeowTtsModel",
+ "JN_MeowTtsModelCoarse",
+ "JN_MeowTtsModelEncodec",
+ "JN_MeowTtsModelFine",
+ "JN_MeowTtsModelHubert",
+ "JN_MeowTtsModelSemantic",
+ "JN_MeowTtsSaveContext",
+ "JN_MeowTtsSemantic",
+ "JN_MeowTtsTokenizerHubert",
+ "JN_MeowVc",
+ "JN_MeowVcConvertVoice",
+ "JN_MeowVcEncodeSource",
+ "JN_MeowVcEncodeTarget",
+ "JN_MeowVcLoadSpeaker",
+ "JN_MeowVcModelFreeVC",
+ "JN_MeowVcModelWavLM",
+ "JN_MeowVcSaveSpeaker",
+ "JN_PreviewAudio",
+ "JN_PreviewImage",
+ "JN_PreviewMask",
+ "JN_PrimitiveArrayInfo",
+ "JN_PrimitiveBatchToArray",
+ "JN_PrimitiveBoolean",
+ "JN_PrimitiveFloat",
+ "JN_PrimitiveInt",
+ "JN_PrimitivePrompt",
+ "JN_PrimitiveString",
+ "JN_PrimitiveStringMultiline",
+ "JN_PrimitiveStringToArray",
+ "JN_PrimitiveToArray",
+ "JN_PrimitiveToBoolean",
+ "JN_PrimitiveToFloat",
+ "JN_PrimitiveToInt",
+ "JN_PrimitiveToString",
+ "JN_RemBGSession",
+ "JN_SaveAudio",
+ "JN_SaveImage",
+ "JN_Seamless",
+ "JN_SeamlessBorder",
+ "JN_SeamlessBorderCrop",
+ "JN_SelectItem",
+ "JN_Sleep",
+ "JN_SleepOutput",
+ "JN_SliceOperation",
+ "JN_StopIf",
+ "JN_StopIfOutput",
+ "JN_TensorInfo",
+ "JN_TextConcatenation",
+ "JN_TextReplace",
+ "JN_TimedeltaFormat",
+ "JN_TimedeltaInfo"
+ ],
+ {
+ "title_aux": "JNComfy"
+ }
+ ],
+ "https://github.com/jnxmx/ComfyUI_HuggingFace_Downloader": [
+ [
+ "Hugging Face Download Folder",
+ "Hugging Face Download Model"
+ ],
+ {
+ "title_aux": "ComfyUI_HuggingFace_Downloader"
+ }
+ ],
+ "https://github.com/jo-nike/ComfyUI-SopranoTTS": [
+ [
+ "SopranoLoader",
+ "SopranoTTS",
+ "SopranoTTSBatch",
+ "SopranoTTSStream"
+ ],
+ {
+ "title_aux": "ComfyUI-SopranoTTS"
+ }
+ ],
+ "https://github.com/joanna910225/comfyui-housekeeper": [
+ [
+ "housekeeper-alignment",
+ "housekeeper-alignment-cmd",
+ "vue-basic"
+ ],
+ {
+ "title_aux": "HouseKeeper"
+ }
+ ],
+ "https://github.com/joe002/comfyui-conduit-optimizer": [
+ [
+ "ConduitApply",
+ "ConduitBatchOptimizer",
+ "ConduitCacheClear",
+ "ConduitCore",
+ "ConduitEmbeddingCache",
+ "ConduitGate",
+ "ConduitLatentCache",
+ "ConduitPath",
+ "ConduitPool",
+ "ConduitPrecisionPatcher",
+ "ConduitSeal",
+ "ConduitSense",
+ "ConduitSpeculativeKSampler"
+ ],
+ {
+ "title_aux": "comfyui-conduit-optimizer"
+ }
+ ],
+ "https://github.com/joe002/comfyui-deterministic-nodes": [
+ [
+ "CascadeRefiner",
+ "ChecksumValidator",
+ "DeterministicSampler",
+ "ECHOContextNode",
+ "MoERouterNode"
+ ],
+ {
+ "title_aux": "comfyui-deterministic-nodes"
+ }
+ ],
+ "https://github.com/joe002/comfyui-rtx4090-nodes": [
+ [
+ "BatchImageProcessor",
+ "BatchLatentProcessor",
+ "GPUMonitor",
+ "MemoryManager",
+ "RTX4090Optimizer",
+ "TensorRTAutoConverter"
+ ],
+ {
+ "title_aux": "comfyui-rtx4090-nodes"
+ }
+ ],
+ "https://github.com/joeriben/ai4artsed_comfyui_nodes": [
+ [
+ "ai4artsed_clean_prompt_randomizer",
+ "ai4artsed_conditioning_fusion",
+ "ai4artsed_image_analysis",
+ "ai4artsed_openrouter_key",
+ "ai4artsed_photo_prompt_randomizer",
+ "ai4artsed_prompt_interception",
+ "ai4artsed_random_artform_generator",
+ "ai4artsed_random_instruction_generator",
+ "ai4artsed_random_language_selector",
+ "ai4artsed_stabilitai_key",
+ "ai4artsed_switch_promptsafety",
+ "ai4artsed_t5_clip_fusion",
+ "ai4artsed_text_remix",
+ "ai4artsed_vector_dimension_eliminator"
+ ],
+ {
+ "title_aux": "AI4ArtsEd Nodes"
+ }
+ ],
+ "https://github.com/john-mnz/ComfyUI-Inspyrenet-Rembg": [
+ [
+ "InspyrenetRembg",
+ "InspyrenetRembgAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-Inspyrenet-Rembg"
+ }
+ ],
+ "https://github.com/jojkaart/ComfyUI-sampler-lcm-alternative": [
+ [
+ "LCMScheduler",
+ "SamplerLCMAlternative",
+ "SamplerLCMCycle",
+ "SamplerLCMDualNoise",
+ "SamplerLCMDuoFusion",
+ "SamplerLCMParallel"
+ ],
+ {
+ "title_aux": "ComfyUI-sampler-lcm-alternative"
+ }
+ ],
+ "https://github.com/jomakaze/ComfyUI_JomaNodes": [
+ [
+ "ImageBatchMulti"
+ ],
+ {
+ "title_aux": "ComfyUI_JomaNodes"
+ }
+ ],
+ "https://github.com/jonstreeter/ComfyUI-Reference-Based-Video-Colorization": [
+ [
+ "ColorMNetImage",
+ "ColorMNetVideo",
+ "DeepExColorImageNode",
+ "DeepExColorVideoNode"
+ ],
+ {
+ "title_aux": "Reference-Based Video Colorization"
+ }
+ ],
+ "https://github.com/jonstreeter/comfyui-Lora-Tag-Power-Loader": [
+ [
+ "LoraTagPowerLoader"
+ ],
+ {
+ "title_aux": "comfyui-Lora-Tag-Power-Loader"
+ }
+ ],
+ "https://github.com/jonstreeter/comfyui-compressed-metadata": [
+ [
+ "ConvertToCompressed",
+ "ExtractWorkflowsToJSON",
+ "LoadCompressedWorkflow",
+ "LoadWorkflowJSON",
+ "SaveImageCompressed"
+ ],
+ {
+ "title_aux": "ComfyUI \u2014 Compressed Metadata"
+ }
+ ],
+ "https://github.com/joosthel/ComfyUI-CVOverlay": [
+ [
+ "CV_AestheticOverlay",
+ "CV_BlobTracker",
+ "CV_ModelLoader",
+ "CV_ObjectDetector"
+ ],
+ {
+ "title_aux": "ComfyUI-CVOverlay"
+ }
+ ],
+ "https://github.com/jordoh/ComfyUI-Deepface": [
+ [
+ "AverageList",
+ "DeepfaceAnalyze",
+ "DeepfaceExtractFaces",
+ "DeepfaceVerify"
+ ],
+ {
+ "title_aux": "ComfyUI Deepface"
+ }
+ ],
+ "https://github.com/joreyaesh/comfyui_scroll_over_textarea": [
+ [
+ "ScrollOverTextareaDummyNode"
+ ],
+ {
+ "title_aux": "ComfyUI Scroll Over Textarea"
+ }
+ ],
+ "https://github.com/joreyaesh/comfyui_touchpad_scroll_controller.enableTouchpadScroll": [
+ [
+ "TouchpadScrollControllerDummyNode"
+ ],
+ {
+ "title_aux": "ComfyUI Touchpad Scroll Controller"
+ }
+ ],
+ "https://github.com/joyboy123456/-ComfyUI-GoogleAIStudio": [
+ [
+ "GoogleAIConfig",
+ "GoogleAIConnectionTester",
+ "GoogleAIImageGenerator",
+ "GoogleAIKeyManager",
+ "GoogleAITextToImage",
+ "GoogleAIVideoGenerator",
+ "GoogleAIVideoStoryboard",
+ "PromptAnalyzer",
+ "PromptOptimizer"
+ ],
+ {
+ "title_aux": "ComfyUI Google AI Studio Integration"
+ }
+ ],
+ "https://github.com/jqy-yo/Comfyui-BBoxLowerMask2": [
+ [
+ "BBoxLowerMask2"
+ ],
+ {
+ "title_aux": "BBoxLowerMask2"
+ }
+ ],
+ "https://github.com/jqy-yo/comfyui-gemini-nodes": [
+ [
+ "GeminiFieldExtractor",
+ "GeminiImageBatchProcessor",
+ "GeminiImageEditor",
+ "GeminiImageGenADV",
+ "GeminiImageProcessor",
+ "GeminiJSONExtractor",
+ "GeminiJSONParser",
+ "GeminiStructuredOutput",
+ "GeminiTextAPI",
+ "GeminiVideoCaptioner",
+ "GeminiVideoGenerator",
+ "UnofficialGeminiAPI",
+ "UnofficialGeminiStreamAPI"
+ ],
+ {
+ "title_aux": "ComfyUI Gemini Nodes"
+ }
+ ],
+ "https://github.com/jrabek/BokehDiffusionComfyUI": [
+ [
+ "ApplyBokehAdapter",
+ "BokehAdapterLoader",
+ "BokehKSampler",
+ "BokehLevel"
+ ],
+ {
+ "title_aux": "BokehDiffusionComfyUI"
+ }
+ ],
+ "https://github.com/jroc22/ComfyUI-CSV-prompt-builder": [
+ [
+ "BuildPromptFromCSV"
+ ],
+ {
+ "title_aux": "ComfyUI-CSV-prompt-builder"
+ }
+ ],
+ "https://github.com/jstit/comfyui_custom_node_image": [
+ [
+ "ImageCropCircle"
+ ],
+ {
+ "title_aux": "comfyui_custom_node_image"
+ }
+ ],
+ "https://github.com/jtrue/ComfyUI-JaRue": [
+ [
+ "Text2Image_jru",
+ "YouTube2Prompt_jru"
+ ],
+ {
+ "nodename_pattern": "_jru$",
+ "title_aux": "ComfyUI-JaRue"
+ }
+ ],
+ "https://github.com/jtrue/ComfyUI-Rect": [
+ [
+ "RectCrop",
+ "RectFill",
+ "RectMask",
+ "RectSelect"
+ ],
+ {
+ "description": "Rectangle selection and utilities for ComfyUI (modular).",
+ "nickname": "Rect",
+ "title": "Rect",
+ "title_aux": "ComfyUI-Rect"
+ }
+ ],
+ "https://github.com/jtrue/ComfyUI-WordEmbeddings": [
+ [
+ "WordEmbeddingsEquation",
+ "WordEmbeddingsExplorer",
+ "WordEmbeddingsInterpolator",
+ "WordEmbeddingsLoader",
+ "WordEmbeddingsLocalModelLoader",
+ "WordEmbeddingsTokenAxis",
+ "WordEmbeddingsTokenAxis2D",
+ "WordEmbeddingsTokenAxis3D",
+ "WordEmbeddingsTokenCentrality",
+ "WordEmbeddingsTokenNeighbors"
+ ],
+ {
+ "nodename_pattern": "_jru$",
+ "title_aux": "ComfyUI-WordEmbeddings"
+ }
+ ],
+ "https://github.com/jtydhr88/ComfyUI-AudioMass": [
+ [
+ "ComfyUIAudioMass"
+ ],
+ {
+ "title_aux": "ComfyUI-AudioMass"
+ }
+ ],
+ "https://github.com/jtydhr88/ComfyUI-Hunyuan3D-1-wrapper": [
+ [
+ "Hunyuan3D V1 - Image Loader",
+ "Hunyuan3D V1 - Image2Views",
+ "Hunyuan3D V1 - Image2Views Pipeline Load",
+ "Hunyuan3D V1 - Text2Image",
+ "Hunyuan3D V1 - Text2Image Pipeline Load",
+ "Hunyuan3D V1 - Views2Mesh",
+ "Hunyuan3D V1 - Views2Mesh Pipeline Load"
+ ],
+ {
+ "title_aux": "ComfyUI-Hunyuan3D-1-wrapper"
+ }
+ ],
+ "https://github.com/jtydhr88/ComfyUI-LayerDivider": [
+ [
+ "LayerDivider - Color Base",
+ "LayerDivider - Divide Layer",
+ "LayerDivider - Load SAM Mask Generator",
+ "LayerDivider - Segment Mask"
+ ],
+ {
+ "title_aux": "ComfyUI LayerDivider"
+ }
+ ],
+ "https://github.com/jtydhr88/ComfyUI-OpenCut": [
+ [
+ "ComfyUIOpenCut"
+ ],
+ {
+ "title_aux": "ComfyUI-OpenCut"
+ }
+ ],
+ "https://github.com/jtydhr88/ComfyUI-StableStudio": [
+ [
+ "ComfyUIStableStudio"
+ ],
+ {
+ "title_aux": "ComfyUI-StableStudio"
+ }
+ ],
+ "https://github.com/juddisjudd/ComfyUI-BawkNodes": [
+ [
+ "BawkBatchProcessor",
+ "BawkControlNet",
+ "BawkImageLoader",
+ "BawkSampler",
+ "DiffusionModelLoader",
+ "FluxDynamicLoraStack",
+ "FluxImageSaver",
+ "FluxLoraStackApply",
+ "FluxWildcardEncode",
+ "ZImageModelLoader"
+ ],
+ {
+ "title_aux": "Bawk Nodes Collection"
+ }
+ ],
+ "https://github.com/judian17/ComfyUI-Extract_Flux_Lora": [
+ [
+ "ExtractFluxLoRA"
+ ],
+ {
+ "title_aux": "ComfyUI-Extract_Flux_Lora"
+ }
+ ],
+ "https://github.com/judian17/ComfyUI-JoyCaption-beta-one-hf-llava-Prompt_node": [
+ [
+ "JoyCaptionOllamaExtraOptions",
+ "JoyCaptionOllamaPrompter"
+ ],
+ {
+ "title_aux": "ComfyUI-JoyCaption-beta-one-hf-llava-Prompt_node"
+ }
+ ],
+ "https://github.com/judian17/ComfyUI-SRT-subtitles-VoxCPM": [
+ [
+ "Audio_Trimmer_By_Timestamp",
+ "Load_Text_From_File",
+ "VoxCPM_Cache_Builder",
+ "VoxCPM_Cache_Combiner",
+ "VoxCPM_Loader",
+ "VoxCPM_SRT_Auto_Dubber",
+ "VoxCPM_SRT_Dubber",
+ "VoxCPM_SRT_Processor"
+ ],
+ {
+ "title_aux": "ComfyUI-SRT-subtitles-VoxCPM"
+ }
+ ],
+ "https://github.com/judian17/ComfyUI-UniWorld-jd17": [
+ [
+ "UniWorldEncoderNode",
+ "UniWorldScheduler",
+ "UniWorldSiglipEncoder",
+ "UniWorld_T5_CLIP_Encoder"
+ ],
+ {
+ "title_aux": "ComfyUI-UniWorld-jd17"
+ }
+ ],
+ "https://github.com/judian17/ComfyUI-joycaption-beta-one-GGUF": [
+ [
+ "JJC_JoyCaption_Custom_GGUF",
+ "JJC_JoyCaption_GGUF",
+ "JJC_JoyCaption_GGUF_ExtraOptions"
+ ],
+ {
+ "title_aux": "ComfyUI JoyCaption-Beta-GGUF Node"
+ }
+ ],
+ "https://github.com/judian17/ComfyUI-multiple-inputs": [
+ [
+ "MultipleImageStitch",
+ "MultipleMaskStitch",
+ "MultipleMasksToImage",
+ "MultipleTextInputs"
+ ],
+ {
+ "title_aux": "ComfyUI-multiple-inputs"
+ }
+ ],
+ "https://github.com/judian17/ComfyUI_ZIM": [
+ [
+ "MaskToBbox_ZIM",
+ "MaskToPoints_ZIM",
+ "ZimSegment"
+ ],
+ {
+ "title_aux": "ComfyUI_ZIM"
+ }
+ ],
+ "https://github.com/juehackr/comfyui_fk_server": [
+ [
+ "FK_3dpose",
+ "FK_Node",
+ "FK_ShowBaseNode",
+ "FK_gjttNode2",
+ "FK_imgedit"
+ ],
+ {
+ "title_aux": "comfyui_fk_server"
+ }
+ ],
+ "https://github.com/jurdnf/ComfyUI-JurdnsIterativeNoiseKSampler": [
+ [
+ "KSamplerIterativeNoise"
+ ],
+ {
+ "title_aux": "ComfyUI-JurdnsIterativeNoiseKsampler"
+ }
+ ],
+ "https://github.com/jurdnf/ComfyUI-JurdnsModelSculptor": [
+ [
+ "ModelSculptorFlux",
+ "ModelSculptorSD3",
+ "ModelSculptorSDXL"
+ ],
+ {
+ "title_aux": "ComfyUI-JurdnsModelSculptor"
+ }
+ ],
+ "https://github.com/jurdnisglobby/ComfyUI-Jurdns-Groq-Node": [
+ [
+ "JurdnsGroqAPIPromptEnhancer"
+ ],
+ {
+ "title_aux": "Jurdns Groq API Node"
+ }
+ ],
+ "https://github.com/justUmen/Bjornulf_custom_nodes": [
+ [
+ "Bjornulf_APIGenerateCivitAI",
+ "Bjornulf_APIGenerateCivitAIAddLORA",
+ "Bjornulf_APIGenerateFalAI",
+ "Bjornulf_APIGenerateFlux",
+ "Bjornulf_APIGenerateGPT4o",
+ "Bjornulf_APIGenerateStability",
+ "Bjornulf_AddLineNumbers",
+ "Bjornulf_AllLoraSelector",
+ "Bjornulf_AnythingToFloat",
+ "Bjornulf_AnythingToInt",
+ "Bjornulf_AnythingToText",
+ "Bjornulf_AudioPreview",
+ "Bjornulf_AudioVideoSync",
+ "Bjornulf_BoundingRectangleMask",
+ "Bjornulf_BoundingRectangleMaskBlur",
+ "Bjornulf_CharacterDescriptionGenerator",
+ "Bjornulf_CivitAILoraSelectorHunyuan",
+ "Bjornulf_CivitAILoraSelectorPONY",
+ "Bjornulf_CivitAILoraSelectorSD15",
+ "Bjornulf_CivitAILoraSelectorSDXL",
+ "Bjornulf_CivitAIModelSelectorFLUX_D",
+ "Bjornulf_CivitAIModelSelectorFLUX_S",
+ "Bjornulf_CivitAIModelSelectorPony",
+ "Bjornulf_CivitAIModelSelectorSD15",
+ "Bjornulf_CivitAIModelSelectorSDXL",
+ "Bjornulf_CombineBackgroundOverlay",
+ "Bjornulf_CombineImages",
+ "Bjornulf_CombineTexts",
+ "Bjornulf_CombineTextsByLines",
+ "Bjornulf_CombineVideoAudio",
+ "Bjornulf_ConcatVideos",
+ "Bjornulf_ConcatVideosFromList",
+ "Bjornulf_ConvertVideo",
+ "Bjornulf_DisplayNote",
+ "Bjornulf_FFmpegConfig",
+ "Bjornulf_FourImageViewer",
+ "Bjornulf_FreeVRAM",
+ "Bjornulf_GlobalSeedManager",
+ "Bjornulf_GrayscaleTransform",
+ "Bjornulf_GreenScreenToTransparency",
+ "Bjornulf_HorizontalCutAndShift",
+ "Bjornulf_HuggingFaceDownloader",
+ "Bjornulf_IfElse",
+ "Bjornulf_ImageDetails",
+ "Bjornulf_ImageMaskCutter",
+ "Bjornulf_ImageNote",
+ "Bjornulf_ImageNoteLoadImage",
+ "Bjornulf_ImageUpscaleWithModelTransparency",
+ "Bjornulf_ImagesListToVideo",
+ "Bjornulf_KokoroTTS",
+ "Bjornulf_LargestMaskOnly",
+ "Bjornulf_LatentResolutionSelector",
+ "Bjornulf_LineSelector",
+ "Bjornulf_ListLooper",
+ "Bjornulf_ListLooperCharacter",
+ "Bjornulf_ListLooperOutfitFemale",
+ "Bjornulf_ListLooperOutfitMale",
+ "Bjornulf_ListLooperPose",
+ "Bjornulf_ListLooperScene",
+ "Bjornulf_ListLooperStyle",
+ "Bjornulf_ListSelector",
+ "Bjornulf_LoadCivitAILinks",
+ "Bjornulf_LoadGlobalVariables",
+ "Bjornulf_LoadImageWithTransparency",
+ "Bjornulf_LoadImageWithTransparencyFromPath",
+ "Bjornulf_LoadImagesFromSelectedFolder",
+ "Bjornulf_LoadTextFromFolder",
+ "Bjornulf_LoadTextFromPath",
+ "Bjornulf_LoadTextPickMeGlobal",
+ "Bjornulf_LoaderLoraWithPath",
+ "Bjornulf_LoopAllLines",
+ "Bjornulf_LoopBasicBatch",
+ "Bjornulf_LoopCombosSamplersSchedulers",
+ "Bjornulf_LoopFloat",
+ "Bjornulf_LoopImages",
+ "Bjornulf_LoopInteger",
+ "Bjornulf_LoopIntegerSequential",
+ "Bjornulf_LoopLinesSequential",
+ "Bjornulf_LoopLoraSelector",
+ "Bjornulf_LoopModelClipVae",
+ "Bjornulf_LoopModelSelector",
+ "Bjornulf_LoopRandomSeed",
+ "Bjornulf_LoopSamplers",
+ "Bjornulf_LoopSchedulers",
+ "Bjornulf_LoopTexts",
+ "Bjornulf_LoopWriteText",
+ "Bjornulf_MatchTextToInput",
+ "Bjornulf_MathNode",
+ "Bjornulf_MergeImagesHorizontally",
+ "Bjornulf_MergeImagesVertically",
+ "Bjornulf_ModelClipVaeSelector",
+ "Bjornulf_OllamaConfig",
+ "Bjornulf_OllamaImageVision",
+ "Bjornulf_OllamaSystemJobSelector",
+ "Bjornulf_OllamaSystemPersonaSelector",
+ "Bjornulf_OllamaTalk",
+ "Bjornulf_OllamaVisionPromptSelector",
+ "Bjornulf_OpenAIVisionNode",
+ "Bjornulf_PauseResume",
+ "Bjornulf_PickInput",
+ "Bjornulf_PlayAudio",
+ "Bjornulf_PreviewFirstImage",
+ "Bjornulf_RandomFloatNode",
+ "Bjornulf_RandomImage",
+ "Bjornulf_RandomIntNode",
+ "Bjornulf_RandomLineFromInput",
+ "Bjornulf_RandomLoraSelector",
+ "Bjornulf_RandomModelClipVae",
+ "Bjornulf_RandomModelSelector",
+ "Bjornulf_RandomTexts",
+ "Bjornulf_ReassembleImageGrid",
+ "Bjornulf_RemoveTransparency",
+ "Bjornulf_ResizeImage",
+ "Bjornulf_ResizeImagePercentage",
+ "Bjornulf_SaveBjornulfLobeChat",
+ "Bjornulf_SaveGlobalVariables",
+ "Bjornulf_SaveImagePath",
+ "Bjornulf_SaveImageToFolder",
+ "Bjornulf_SaveText",
+ "Bjornulf_SaveTmpAudio",
+ "Bjornulf_SaveTmpImage",
+ "Bjornulf_SaveTmpVideo",
+ "Bjornulf_ScramblerCharacter",
+ "Bjornulf_SelectImageFromList",
+ "Bjornulf_ShowFloat",
+ "Bjornulf_ShowInt",
+ "Bjornulf_ShowJson",
+ "Bjornulf_ShowStringText",
+ "Bjornulf_ShowText",
+ "Bjornulf_SpeechToText",
+ "Bjornulf_SplitImageGrid",
+ "Bjornulf_StyleSelector",
+ "Bjornulf_SwitchAnything",
+ "Bjornulf_SwitchText",
+ "Bjornulf_TextAnalyzer",
+ "Bjornulf_TextGenerator",
+ "Bjornulf_TextGeneratorCharacterCreature",
+ "Bjornulf_TextGeneratorCharacterFemale",
+ "Bjornulf_TextGeneratorCharacterMale",
+ "Bjornulf_TextGeneratorCharacterObject",
+ "Bjornulf_TextGeneratorCharacterPose",
+ "Bjornulf_TextGeneratorOutfitFemale",
+ "Bjornulf_TextGeneratorOutfitMale",
+ "Bjornulf_TextGeneratorScene",
+ "Bjornulf_TextGeneratorStyle",
+ "Bjornulf_TextReplace",
+ "Bjornulf_TextSplitin10",
+ "Bjornulf_TextSplitin5",
+ "Bjornulf_TextToAnything",
+ "Bjornulf_TextToSpeech",
+ "Bjornulf_TextToStringAndSeed",
+ "Bjornulf_TextToVariable",
+ "Bjornulf_VideoDetails",
+ "Bjornulf_VideoPingPong",
+ "Bjornulf_VideoPreview",
+ "Bjornulf_VideoToImagesList",
+ "Bjornulf_WriteText",
+ "Bjornulf_WriteTextAdvanced",
+ "Bjornulf_WriteTextPickMeChain",
+ "Bjornulf_WriteTextPickMeGlobal",
+ "Bjornulf_XTTSConfig",
+ "Bjornulf_imagesToVideo",
+ "Bjornulf_loadImageBase64Transparency",
+ "Bjornulf_ollamaLoader"
+ ],
+ {
+ "title_aux": "Bjornulf_custom_nodes"
+ }
+ ],
+ "https://github.com/justin-vt/ComfyUI-brushstrokes": [
+ [
+ "OpenCVBrushStrokesNode",
+ "PILBrushStrokesNode",
+ "WandBrushStrokesNode"
+ ],
+ {
+ "title_aux": "ComfyUI-brushstrokes"
+ }
+ ],
+ "https://github.com/k-komarov/comfyui-bunny-cdn-storage": [
+ [
+ "Save Image To BunnyStorage",
+ "Save Image to BunnyStorage"
+ ],
+ {
+ "title_aux": "comfyui-bunny-cdn-storage"
+ }
+ ],
+ "https://github.com/ka-puna/comfyui-yanc": [
+ [
+ "YANC.ConcatStrings",
+ "YANC.FormatDatetimeString",
+ "YANC.GetWidgetValueString",
+ "YANC.IntegerCaster",
+ "YANC.MultilineString",
+ "YANC.SaveImageWEBP",
+ "YANC.TruncateString"
+ ],
+ {
+ "title_aux": "comfyui-yanc"
+ }
+ ],
+ "https://github.com/kaanyalova/ComfyUI_ExtendedImageFormats": [
+ [
+ "DDSSaveImage",
+ "ExtendedSaveImage"
+ ],
+ {
+ "title_aux": "Extended Image Formats for ComfyUI"
+ }
+ ],
+ "https://github.com/kaaskoek232/ComfyUI-MemoryManagement": [
+ [
+ "AutoMemoryCleanup",
+ "MemoryCleanup",
+ "MemoryLeakDetector",
+ "MemoryMonitor",
+ "SmartMemoryManager",
+ "VRAMOptimizer",
+ "VRAMUnload"
+ ],
+ {
+ "title_aux": "ComfyUI-MemoryManagement"
+ }
+ ],
+ "https://github.com/kadirnar/ComfyUI-Transformers": [
+ [
+ "AudioClassificationPipeline",
+ "AutomaticSpeechRecognitionPipeline",
+ "ConversationalPipeline",
+ "DepthEstimationInference",
+ "DocumentQuestionAnsweringPipeline",
+ "FeatureExtractionPipeline",
+ "FillMaskPipeline",
+ "FloatToString",
+ "ImageClassificationPipeline",
+ "ImageFeatureExtractionPipeline",
+ "ImageSegmentationPipeline",
+ "ImageTextToTextPipeline",
+ "ImageToImagePipeline",
+ "ImageToTextPipeline",
+ "IntToString",
+ "LoadDepthModel",
+ "MaskGenerationPipeline",
+ "ObjectDetectionPipeline",
+ "QuestionAnsweringPipeline",
+ "SentenceSimilarityPipeline",
+ "StringToFloat",
+ "StringToInt",
+ "TableQuestionAnsweringPipeline",
+ "TextClassificationPipeline",
+ "TextGenerationPipeline",
+ "TextToSpeechPipeline",
+ "TokenClassificationPipeline",
+ "VideoClassificationPipeline",
+ "VisualQuestionAnsweringPipeline",
+ "ZeroShotAudioClassificationPipeline",
+ "ZeroShotClassificationPipeline",
+ "ZeroShotImageClassificationPipeline",
+ "ZeroShotObjectDetectionPipeline"
+ ],
+ {
+ "title_aux": "ComfyUI-Transformers"
+ }
+ ],
+ "https://github.com/kadirnar/ComfyUI-YOLO": [
+ [
+ "BBoxToCoco",
+ "BBoxToXYWH",
+ "BBoxVisNode",
+ "CocoToNumber",
+ "ConvertToDict",
+ "CustomUltralyticsModelLoader",
+ "GetImageSize",
+ "ImageResizeAdvanced",
+ "UltralyticsInference",
+ "UltralyticsMaskFlatten",
+ "UltralyticsModelLoader",
+ "UltralyticsVisualization",
+ "ViewText"
+ ],
+ {
+ "title_aux": "ComfyUI-YOLO"
+ }
+ ],
+ "https://github.com/kael558/ComfyUI-GGUF-FantasyTalking": [
+ [
+ "CLIPLoaderGGUF",
+ "DownloadAndLoadWav2VecModel",
+ "FantasyTalkingModelLoader",
+ "FantasyTalkingWav2VecEmbeds",
+ "LoadWanVideoT5TextEncoderGGUF",
+ "ReCamMasterPoseVisualizer",
+ "UnetLoaderGGUF",
+ "UnetLoaderGGUF_LowVRAM",
+ "WanVideoATITracks",
+ "WanVideoATITracksVisualize",
+ "WanVideoATI_comfy",
+ "WanVideoControlnet",
+ "WanVideoControlnetLoader",
+ "WanVideoDiffusionForcingSampler",
+ "WanVideoFunCameraEmbeds",
+ "WanVideoReCamMasterCameraEmbed",
+ "WanVideoReCamMasterDefaultCamera",
+ "WanVideoReCamMasterGenerateOrbitCamera",
+ "WanVideoUni3C_ControlnetLoader",
+ "WanVideoUni3C_embeds",
+ "WanVideoUniAnimateDWPoseDetector",
+ "WanVideoUniAnimatePoseInput"
+ ],
+ {
+ "title_aux": "ComfyUI-GGUF-FantasyTalking"
+ }
+ ],
+ "https://github.com/kaibioinfo/ComfyUI_AdvancedRefluxControl": [
+ [
+ "ReduxAdvanced",
+ "StyleModelApplySimple"
+ ],
+ {
+ "title_aux": "Advanced Reflux control"
+ }
+ ],
+ "https://github.com/kaipard/comfyui-auto-latent-size": [
+ [
+ "AutoAspectLatent"
+ ],
+ {
+ "title_aux": "Auto Aspect Latent Generator"
+ }
+ ],
+ "https://github.com/kakachiex2/comfyui-ltx2-efficient": [
+ [
+ "LTX2CombineAVLatent",
+ "LTX2ConditioningHelper",
+ "LTX2EfficientSampler",
+ "LTX2EfficientSamplerPro",
+ "LTX2EmptyAudioLatent",
+ "LTX2ExperimentalKeyframeSampler",
+ "LTX2ModelPatcher",
+ "LTX2SeparateAVLatent",
+ "LTX2TemporalVAEDecode",
+ "LTX2TextEncodeOptimized"
+ ],
+ {
+ "title_aux": "comfyui-ltx2-efficient"
+ }
+ ],
+ "https://github.com/kale4eat/ComfyUI-path-util": [
+ [
+ "path_util_PathAbspath",
+ "path_util_PathBasename",
+ "path_util_PathDirname",
+ "path_util_PathExists",
+ "path_util_PathIsdir",
+ "path_util_PathIsfile",
+ "path_util_PathJoin",
+ "path_util_PathRelpath",
+ "path_util_PathSplitext"
+ ],
+ {
+ "title_aux": "ComfyUI_demucus"
+ }
+ ],
+ "https://github.com/kale4eat/ComfyUI-speech-dataset-toolkit": [
+ [
+ "SDT_AudioProperty",
+ "SDT_BSRoFormerApply",
+ "SDT_BSRoFormerLoader",
+ "SDT_ConcatAudio",
+ "SDT_CutAudio",
+ "SDT_DemucsApply",
+ "SDT_DemucsLoader",
+ "SDT_FasterWhisperListSegments",
+ "SDT_FasterWhisperLoader",
+ "SDT_FasterWhisperSegmentProperty",
+ "SDT_FasterWhisperTextFromSegments",
+ "SDT_FasterWhisperTranscribe",
+ "SDT_GriffinLim",
+ "SDT_HighpassBiquad",
+ "SDT_JoinAudio",
+ "SDT_KotobaWhisperListSegments",
+ "SDT_KotobaWhisperLoaderLong",
+ "SDT_KotobaWhisperLoaderShort",
+ "SDT_KotobaWhisperSegmentProperty",
+ "SDT_KotobaWhisperTranscribeLong",
+ "SDT_KotobaWhisperTranscribeShort",
+ "SDT_LFCC",
+ "SDT_LoadAudio",
+ "SDT_LoadAudios",
+ "SDT_LowpassBiquad",
+ "SDT_MFCC",
+ "SDT_MakeSilenceAudio",
+ "SDT_MelBandRoformerLoader",
+ "SDT_MelSpectrogram",
+ "SDT_NemoAsrLoader",
+ "SDT_NemoAsrTranscribe",
+ "SDT_NueAsrLoader",
+ "SDT_NueAsrTranscribe",
+ "SDT_PlotMelFilterBank",
+ "SDT_PlotPitch",
+ "SDT_PlotSpecgram",
+ "SDT_PlotSpectrogram",
+ "SDT_PlotWaveForm",
+ "SDT_ResampleAudio",
+ "SDT_SaveAudio",
+ "SDT_SilenceAudio",
+ "SDT_SileroVADApply",
+ "SDT_SileroVADCollectChunks",
+ "SDT_SileroVADListTimestamps",
+ "SDT_SileroVADLoader",
+ "SDT_SileroVADTimestampProperty",
+ "SDT_Spectrogram",
+ "SDT_SpeechMOSLoader",
+ "SDT_SpeechMOSScore",
+ "SDT_SplitAudio",
+ "SDT_TrimAudio",
+ "SDT_TrimAudioBySample"
+ ],
+ {
+ "title_aux": "ComfyUI-speech-dataset-toolkit"
+ }
+ ],
+ "https://github.com/kale4eat/ComfyUI-string-util": [
+ [
+ "string_util_Str",
+ "string_util_StrConcat",
+ "string_util_StrCount",
+ "string_util_StrEndsWith",
+ "string_util_StrEqual",
+ "string_util_StrFind",
+ "string_util_StrFormat",
+ "string_util_StrJoin",
+ "string_util_StrLen",
+ "string_util_StrLower",
+ "string_util_StrLstrip",
+ "string_util_StrNotEqual",
+ "string_util_StrReplace",
+ "string_util_StrRstrip",
+ "string_util_StrSlice",
+ "string_util_StrSplit",
+ "string_util_StrStartsWith",
+ "string_util_StrStrip",
+ "string_util_StrUpper"
+ ],
+ {
+ "title_aux": "ComfyUI-string-util"
+ }
+ ],
+ "https://github.com/kale4eat/ComfyUI-text-file-util": [
+ [
+ "text_file_util_ReadAllLines",
+ "text_file_util_ReadAllText",
+ "text_file_util_WriteText",
+ "text_file_util_WriteTextLines",
+ "text_file_util_WriteTextWithSequentialNumbering"
+ ],
+ {
+ "title_aux": "ComfyUI-text-file-util"
+ }
+ ],
+ "https://github.com/kambara/ComfyUI-PromptPalette": [
+ [
+ "PromptPalette"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptPalette"
+ }
+ ],
+ "https://github.com/kana112233/ComfyUI-kaola-ace-step": [
+ [
+ "ACE_STEP_Cover",
+ "ACE_STEP_CreateSample",
+ "ACE_STEP_FormatSample",
+ "ACE_STEP_LoRALoader",
+ "ACE_STEP_Repaint",
+ "ACE_STEP_SimpleMode",
+ "ACE_STEP_TextToMusic",
+ "ACE_STEP_Understand"
+ ],
+ {
+ "title_aux": "ComfyUI-kaola-ace-step"
+ }
+ ],
+ "https://github.com/kanibus/kanibus": [
+ [
+ "AIDepthControl",
+ "AdvancedTrackingPro",
+ "BodyPoseEstimator",
+ "EmotionAnalyzer",
+ "HandTracking",
+ "KanibusMaster",
+ "LandmarkPro468",
+ "MultiControlNetApply",
+ "NeuralPupilTracker",
+ "NormalMapGenerator",
+ "ObjectSegmentation",
+ "SmartFacialMasking",
+ "TemporalSmoother",
+ "VideoFrameLoader"
+ ],
+ {
+ "title_aux": "KANIBUS - Advanced Eye Tracking ControlNet System"
+ }
+ ],
+ "https://github.com/kantan-kanto/ComfyUI-MultiModal-Prompt-Nodes": [
+ [
+ "QwenImageEditPromptGenerator",
+ "VisionLLMNode",
+ "WanVideoPromptGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-MultiModal-Prompt-Nodes"
+ }
+ ],
+ "https://github.com/kantsche/ComfyUI-MixMod": [
+ [
+ "MixModBandFFTGuiderNode",
+ "MixModDepthGuiderNode",
+ "MixModDynamicMaskAlternativeGuiderNode",
+ "MixModDynamicMaskGuiderNode",
+ "MixModFFTGuiderNode",
+ "MixModGuiderComponentNode",
+ "MixModGuiderComponentPipelineNode",
+ "MixModGuiderNode",
+ "MixModHighResGuiderNode",
+ "MixModOptionsMaskNode",
+ "MixModOptionsScaleNode",
+ "MixModOptionsSchedulerNode",
+ "MixModPipelineNode"
+ ],
+ {
+ "author": "Kantsche",
+ "description": "Model Mixture Guider",
+ "nickname": "MixMod",
+ "title": "ComfyUI-MixMod",
+ "title_aux": "ComfyUI-MixMod"
+ }
+ ],
+ "https://github.com/kappa54m/ComfyUI_Usability": [
+ [
+ "KLoadImageByPath",
+ "KLoadImageByPathAdvanced",
+ "KLoadImageDedup"
+ ],
+ {
+ "title_aux": "ComfyUI Usability"
+ }
+ ],
+ "https://github.com/karas17/ComfyUI-Camera-Watermark": [
+ [
+ "CameraWatermarkNode",
+ "ImageLoaderWithEXIF"
+ ],
+ {
+ "title_aux": "ComfyUI Camera Watermark"
+ }
+ ],
+ "https://github.com/karas17/comfyui_GLM_TTS": [
+ [
+ "GLMTTSASR",
+ "GLMTTSLoader",
+ "GLMTTSSampler"
+ ],
+ {
+ "title_aux": "comfyui_GLM_TTS"
+ }
+ ],
+ "https://github.com/karthikg-09/ComfyUI-Vton-Mask": [
+ [
+ "ComfyUIVtonMaskGenerator",
+ "ComfyUIVtonMaskLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Vton-Mask"
+ }
+ ],
+ "https://github.com/karthikg-09/ComfyUI-WanVideoAutoResize": [
+ [
+ "WanVideoAutoImgResize"
+ ],
+ {
+ "title_aux": "ComfyUI WanVideo Auto Resize"
+ }
+ ],
+ "https://github.com/kasukanra/ComfyUI_StringToHex": [
+ [
+ "ColorNameToHex"
+ ],
+ {
+ "title_aux": "ComfyUI_StringToHex"
+ }
+ ],
+ "https://github.com/katalist-ai/comfyUI-nsfw-detection": [
+ [
+ "NudenetDetector"
+ ],
+ {
+ "title_aux": "comfyUI-nsfw-detection"
+ }
+ ],
+ "https://github.com/kaushiknishchay/ComfyUI-Qwen3-ASR": [
+ [
+ "Qwen3ASRTranscriber",
+ "Qwen3ForcedAlignerConfig"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen3-ASR"
+ }
+ ],
+ "https://github.com/kayorlian/ComfyuiSmartColorMatch": [
+ [
+ "SmartColorMatch"
+ ],
+ {
+ "title_aux": "ComfyuiSmartColorMatch"
+ }
+ ],
+ "https://github.com/kazeyori/ComfyUI-QuickImageSequenceProcess": [
+ [
+ "QuickImageSequenceProcess"
+ ],
+ {
+ "author": "kazeyori",
+ "description": "A ComfyUI plugin for efficient image sequence processing. Features frame insertion, duplication, and removal with intuitive controls.",
+ "nickname": "QuickSeq",
+ "title": "Quick Image Sequence Process",
+ "title_aux": "ComfyUI-QuickImageSequenceProcess"
+ }
+ ],
+ "https://github.com/kealiu/ComfyUI-S3-Tools": [
+ [
+ "Load Image From S3",
+ "Save Image To S3"
+ ],
+ {
+ "title_aux": "ComfyUI Load and Save file to S3"
+ }
+ ],
+ "https://github.com/kealiu/ComfyUI-Zero123-Porting": [
+ [
+ "Zero123: Image Preprocess",
+ "Zero123: Image Rotate in 3D"
+ ],
+ {
+ "title_aux": "ComfyUI-Zero123-Porting"
+ }
+ ],
+ "https://github.com/kealiu/ComfyUI-ZeroShot-MTrans": [
+ [
+ "ZeST: Grayout Subject"
+ ],
+ {
+ "title_aux": "ComfyUI-ZeroShot-MTrans"
+ }
+ ],
+ "https://github.com/keghoang/ComfyUI-Charon": [
+ [
+ "CHARON_3D_Auto_Align",
+ "CHARON_Camera_From_DA3"
+ ],
+ {
+ "title_aux": "ComfyUI-Charon"
+ }
+ ],
+ "https://github.com/keit0728/ComfyUI-Image-Toolkit": [
+ [
+ "AlphaFlatten",
+ "AlphaToGrayscale",
+ "AntialiasingImage",
+ "BinarizeImage",
+ "BinarizeImageUsingOtsu",
+ "BrightnessTransparency",
+ "GrayscaleImage",
+ "RemoveWhiteBackgroundNoise"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Toolkit"
+ }
+ ],
+ "https://github.com/keit0728/ComfyUI-keitNodes": [
+ [
+ "AspectRatioResolutionFinder",
+ "M2MTranslator",
+ "PixelLimitResizer",
+ "WanVideoOptimalResizer",
+ "WanVideoResolutionFinder"
+ ],
+ {
+ "title_aux": "ComfyUI-keitNodes"
+ }
+ ],
+ "https://github.com/keit0728/ComfyUI-musubi-tuner": [
+ [
+ "MusubiTunerWanGenerateVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-musubi-tuner"
+ }
+ ],
+ "https://github.com/kenjiqq/qq-nodes-comfyui": [
+ [
+ "Any List",
+ "Any List Iterator",
+ "Any To Any",
+ "Axis Pack",
+ "Axis To Any",
+ "Axis Unpack",
+ "Load Lines From Text File",
+ "Slice List",
+ "Text Splitter",
+ "XY Grid Accumulator",
+ "XY Grid Helper"
+ ],
+ {
+ "title_aux": "qq-nodes-comfyui"
+ }
+ ],
+ "https://github.com/kevinmcmahondev/comfyui-kmcdev-image-filter-adjustments": [
+ [
+ "ImageBlankAlpha",
+ "ImageBlendMask",
+ "ImageFilterAdjustments",
+ "ImageMixColorByMask"
+ ],
+ {
+ "title_aux": "KMCDev Nodes"
+ }
+ ],
+ "https://github.com/kevinmcmahondev/comfyui-skin-tone-detector": [
+ [
+ "SkinToneDetector"
+ ],
+ {
+ "title_aux": "Skin Tone Detector for ComfyUI"
+ }
+ ],
+ "https://github.com/kft334/Knodes": [
+ [
+ "Image(s) To Websocket (Base64)",
+ "ImageOutput",
+ "Load Image (Base64)",
+ "Load Images (Base64)",
+ "LoadImageBase64",
+ "LoadImagesBase64"
+ ],
+ {
+ "title_aux": "Knodes"
+ }
+ ],
+ "https://github.com/khanhlvg/vertex-ai-comfyui-nodes": [
+ [
+ "Chirp",
+ "Gemini",
+ "GeminiImage",
+ "ImagenComputedMaskConfig",
+ "ImagenMaskEditing",
+ "Imagen_Product_Recontext",
+ "Imagen_T2I",
+ "Lyria",
+ "PreviewVideo",
+ "Veo2",
+ "Veo2Extend",
+ "Veo3",
+ "Veo_Prompt_Writer",
+ "Virtual_Try_On"
+ ],
+ {
+ "title_aux": "[Unofficial] Vertex AI Custom Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/kianthos/Earthbound---All-in-one-ComfyUI-Node": [
+ [
+ "EarthboundUltimate"
+ ],
+ {
+ "title_aux": "Earthbound---All-in-one-ComfyUI-Node"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-ADMotionDirector": [
+ [
+ "ADMD_AdditionalModelSelect",
+ "ADMD_CheckpointLoader",
+ "ADMD_ComfyModelLoader",
+ "ADMD_DiffusersLoader",
+ "ADMD_InitializeTraining",
+ "ADMD_LoadLora",
+ "ADMD_MakeBatchList",
+ "ADMD_SaveLora",
+ "ADMD_TrainLora",
+ "ADMD_ValidationSampler",
+ "ADMD_ValidationSettings"
+ ],
+ {
+ "title_aux": "Animatediff MotionLoRA Trainer"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-APISR-KJ": [
+ [
+ "APISR_upscale"
+ ],
+ {
+ "title_aux": "ComfyUI-APISR"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-BrushNet-Wrapper": [
+ [
+ "brushnet_ella_loader",
+ "brushnet_ipadapter_matteo",
+ "brushnet_model_loader",
+ "brushnet_sampler",
+ "brushnet_sampler_ella",
+ "powerpaint_brushnet_sampler"
+ ],
+ {
+ "title_aux": "ComfyUI-BrushNet-Wrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-CCSR": [
+ [
+ "CCSR_Model_Select",
+ "CCSR_Upscale",
+ "DownloadAndLoadCCSRModel"
+ ],
+ {
+ "title_aux": "ComfyUI-CCSR"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-CogVideoXWrapper": [
+ [
+ "CogVideoContextOptions",
+ "CogVideoControlNet",
+ "CogVideoDecode",
+ "CogVideoEnhanceAVideo",
+ "CogVideoImageEncode",
+ "CogVideoImageEncodeFunInP",
+ "CogVideoLatentPreview",
+ "CogVideoLoraSelect",
+ "CogVideoLoraSelectComfy",
+ "CogVideoSampler",
+ "CogVideoTextEncode",
+ "CogVideoTextEncodeCombine",
+ "CogVideoTransformerEdit",
+ "CogVideoXFasterCache",
+ "CogVideoXFunResizeToClosestBucket",
+ "CogVideoXModelLoader",
+ "CogVideoXTeaCache",
+ "CogVideoXTorchCompileSettings",
+ "CogVideoXVAELoader",
+ "DownloadAndLoadCogVideoControlNet",
+ "DownloadAndLoadCogVideoGGUFModel",
+ "DownloadAndLoadCogVideoModel",
+ "DownloadAndLoadToraModel",
+ "ToraEncodeOpticalFlow",
+ "ToraEncodeTrajectory"
+ ],
+ {
+ "title_aux": "ComfyUI CogVideoX Wrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-ControlNeXt-SVD": [
+ [
+ "ControlNextDecode",
+ "ControlNextDiffusersScheduler",
+ "ControlNextGetPoses",
+ "ControlNextSVDApply",
+ "ControlNextSampler",
+ "DownloadAndLoadControlNeXt"
+ ],
+ {
+ "title_aux": "ComfyUI nodes for ControlNext-SVD v2"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-DDColor": [
+ [
+ "DDColor_Colorize"
+ ],
+ {
+ "title_aux": "ComfyUI-DDColor"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-DepthAnythingV2": [
+ [
+ "DepthAnything_V2",
+ "DownloadAndLoadDepthAnythingV2Model"
+ ],
+ {
+ "title_aux": "ComfyUI-DepthAnythingV2"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-DiffusionLight": [
+ [
+ "chrome_ball_to_envmap",
+ "exposure_to_hdr"
+ ],
+ {
+ "title_aux": "DiffusionLight implementation for ComfyUI"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-DynamiCrafterWrapper": [
+ [
+ "DownloadAndLoadCLIPModel",
+ "DownloadAndLoadCLIPVisionModel",
+ "DownloadAndLoadDynamiCrafterCNModel",
+ "DownloadAndLoadDynamiCrafterModel",
+ "DynamiCrafterBatchInterpolation",
+ "DynamiCrafterCNLoader",
+ "DynamiCrafterControlnetApply",
+ "DynamiCrafterI2V",
+ "DynamiCrafterLoadInitNoise",
+ "DynamiCrafterModelLoader",
+ "ToonCrafterDecode",
+ "ToonCrafterInterpolation"
+ ],
+ {
+ "title_aux": "ComfyUI-DynamiCrafterWrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-ELLA-wrapper": [
+ [
+ "diffusers_model_loader",
+ "diffusers_sampler",
+ "ella_model_loader",
+ "ella_sampler",
+ "ella_t5_embeds"
+ ],
+ {
+ "title_aux": "ComfyUI-ELLA-wrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-Florence2": [
+ [
+ "DownloadAndLoadFlorence2Lora",
+ "DownloadAndLoadFlorence2Model",
+ "Florence2ModelLoader",
+ "Florence2Run"
+ ],
+ {
+ "preemptions": [
+ "DownloadAndLoadFlorence2Lora",
+ "DownloadAndLoadFlorence2Model",
+ "Florence2ModelLoader",
+ "Florence2Run"
+ ],
+ "title_aux": "ComfyUI-Florence2"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-FluxTrainer": [
+ [
+ "ExtractFluxLoRA",
+ "FluxKohyaInferenceSampler",
+ "FluxTrainAndValidateLoop",
+ "FluxTrainBlockSelect",
+ "FluxTrainEnd",
+ "FluxTrainLoop",
+ "FluxTrainModelSelect",
+ "FluxTrainResume",
+ "FluxTrainSave",
+ "FluxTrainSaveModel",
+ "FluxTrainValidate",
+ "FluxTrainValidationSettings",
+ "FluxTrainerLossConfig",
+ "InitFluxLoRATraining",
+ "InitFluxTraining",
+ "InitSD3LoRATraining",
+ "InitSDXLLoRATraining",
+ "OptimizerConfig",
+ "OptimizerConfigAdafactor",
+ "OptimizerConfigProdigy",
+ "OptimizerConfigProdigyPlusScheduleFree",
+ "SD3ModelSelect",
+ "SD3TrainValidationSettings",
+ "SDXLModelSelect",
+ "SDXLTrainValidate",
+ "SDXLTrainValidationSettings",
+ "TrainDatasetAdd",
+ "TrainDatasetGeneralConfig",
+ "TrainDatasetRegularization",
+ "TrainNetworkConfig",
+ "UploadToHuggingFace",
+ "VisualizeLoss"
+ ],
+ {
+ "title_aux": "ComfyUI Flux Trainer"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-GIMM-VFI": [
+ [
+ "DownloadAndLoadGIMMVFIModel",
+ "GIMMVFI_interpolate"
+ ],
+ {
+ "title_aux": "ComfyUI-GIMM-VFI"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-Geowizard": [
+ [
+ "geowizard_model_loader",
+ "geowizard_sampler"
+ ],
+ {
+ "title_aux": "Geowizard depth and normal estimation in ComfyUI"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-HFRemoteVae": [
+ [
+ "HFRemoteVAE",
+ "HFRemoteVAEDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-HFRemoteVae"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-HunyuanVideoWrapper": [
+ [
+ "DownloadAndLoadHyVideoTextEncoder",
+ "HunyuanVideoFresca",
+ "HunyuanVideoSLG",
+ "HyVideoBlockSwap",
+ "HyVideoCFG",
+ "HyVideoContextOptions",
+ "HyVideoCustomPromptTemplate",
+ "HyVideoDecode",
+ "HyVideoEmptyTextEmbeds",
+ "HyVideoEncode",
+ "HyVideoEncodeKeyframes",
+ "HyVideoEnhanceAVideo",
+ "HyVideoGetClosestBucketSize",
+ "HyVideoI2VEncode",
+ "HyVideoInverseSampler",
+ "HyVideoLatentPreview",
+ "HyVideoLoopArgs",
+ "HyVideoLoraBlockEdit",
+ "HyVideoLoraSelect",
+ "HyVideoModelLoader",
+ "HyVideoPromptMixSampler",
+ "HyVideoReSampler",
+ "HyVideoSTG",
+ "HyVideoSampler",
+ "HyVideoTeaCache",
+ "HyVideoTextEmbedBridge",
+ "HyVideoTextEmbedsLoad",
+ "HyVideoTextEmbedsSave",
+ "HyVideoTextEncode",
+ "HyVideoTextImageEncode",
+ "HyVideoTorchCompileSettings",
+ "HyVideoVAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-HunyuanVideoWrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-IC-Light": [
+ [
+ "BackgroundScaler",
+ "CalculateNormalsFromImages",
+ "DetailTransfer",
+ "ICLightConditioning",
+ "LightSource",
+ "LoadAndApplyICLightUnet",
+ "LoadHDRImage"
+ ],
+ {
+ "title_aux": "ComfyUI-IC-Light"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-KJNodes": [
+ [
+ "AddLabel",
+ "AddNoiseToTrackPath",
+ "AppendInstanceDiffusionTracking",
+ "AppendStringsToList",
+ "ApplyRifleXRoPE_HunuyanVideo",
+ "ApplyRifleXRoPE_WanVideo",
+ "AudioConcatenate",
+ "BOOLConstant",
+ "BatchCLIPSeg",
+ "BatchCropFromMask",
+ "BatchCropFromMaskAdvanced",
+ "BatchUncrop",
+ "BatchUncropAdvanced",
+ "BboxToInt",
+ "BboxVisualize",
+ "BlockifyMask",
+ "CFGZeroStarAndInit",
+ "CameraPoseVisualizer",
+ "CheckpointLoaderKJ",
+ "CheckpointPerturbWeights",
+ "ColorMatch",
+ "ColorMatchV2",
+ "ColorToMask",
+ "CondPassThrough",
+ "ConditioningMultiCombine",
+ "ConditioningSetMaskAndCombine",
+ "ConditioningSetMaskAndCombine3",
+ "ConditioningSetMaskAndCombine4",
+ "ConditioningSetMaskAndCombine5",
+ "ConsolidateMasksKJ",
+ "CreateAudioMask",
+ "CreateFadeMask",
+ "CreateFadeMaskAdvanced",
+ "CreateFluidMask",
+ "CreateGradientFromCoords",
+ "CreateGradientMask",
+ "CreateInstanceDiffusionTracking",
+ "CreateMagicMask",
+ "CreateShapeImageOnPath",
+ "CreateShapeMask",
+ "CreateShapeMaskOnPath",
+ "CreateTextMask",
+ "CreateTextOnPath",
+ "CreateVoronoiMask",
+ "CrossFadeImages",
+ "CrossFadeImagesMulti",
+ "CustomControlNetWeightsFluxFromList",
+ "CustomSigmas",
+ "CutAndDragOnPath",
+ "DiTBlockLoraLoader",
+ "DifferentialDiffusionAdvanced",
+ "DiffusionModelLoaderKJ",
+ "DiffusionModelSelector",
+ "DownloadAndLoadCLIPSeg",
+ "DrawInstanceDiffusionTracking",
+ "DrawMaskOnImage",
+ "DummyOut",
+ "EmptyLatentImageCustomPresets",
+ "EmptyLatentImagePresets",
+ "EndRecordCUDAMemoryHistory",
+ "FastPreview",
+ "FilterZeroMasksAndCorrespondingImages",
+ "FlipSigmasAdjusted",
+ "FloatConstant",
+ "FloatToMask",
+ "FloatToSigmas",
+ "FluxBlockLoraSelect",
+ "GGUFLoaderKJ",
+ "GLIGENTextBoxApplyBatchCoords",
+ "GenerateNoise",
+ "GetImageRangeFromBatch",
+ "GetImageSizeAndCount",
+ "GetImagesFromBatchIndexed",
+ "GetLatentRangeFromBatch",
+ "GetLatentSizeAndCount",
+ "GetLatentsFromBatchIndexed",
+ "GetMaskSizeAndCount",
+ "GetTrackRange",
+ "GradientToFloat",
+ "GrowMaskWithBlur",
+ "HunyuanVideoBlockLoraSelect",
+ "HunyuanVideoEncodeKeyframesToCond",
+ "INTConstant",
+ "ImageAddMulti",
+ "ImageAndMaskPreview",
+ "ImageBatchExtendWithOverlap",
+ "ImageBatchFilter",
+ "ImageBatchJoinWithTransition",
+ "ImageBatchMulti",
+ "ImageBatchRepeatInterleaving",
+ "ImageBatchTestPattern",
+ "ImageConcanate",
+ "ImageConcatFromBatch",
+ "ImageConcatMulti",
+ "ImageCropByMask",
+ "ImageCropByMaskAndResize",
+ "ImageCropByMaskBatch",
+ "ImageGrabPIL",
+ "ImageGridComposite2x2",
+ "ImageGridComposite3x3",
+ "ImageGridtoBatch",
+ "ImageNoiseAugmentation",
+ "ImageNormalize_Neg1_To_1",
+ "ImagePadForOutpaintMasked",
+ "ImagePadForOutpaintTargetSize",
+ "ImagePadKJ",
+ "ImagePass",
+ "ImagePrepForICLora",
+ "ImageResizeKJ",
+ "ImageResizeKJv2",
+ "ImageTensorList",
+ "ImageTransformByNormalizedAmplitude",
+ "ImageUncropByMask",
+ "ImageUpscaleWithModelBatched",
+ "InjectNoiseToLatent",
+ "InsertImageBatchByIndexes",
+ "InsertImagesToBatchIndexed",
+ "InsertLatentToIndexed",
+ "InterpolateCoords",
+ "Intrinsic_lora_sampling",
+ "JoinStringMulti",
+ "JoinStrings",
+ "LTX2AttentionTunerPatch",
+ "LTX2AudioLatentNormalizingSampling",
+ "LTX2BlockLoraSelect",
+ "LTX2LoraLoaderAdvanced",
+ "LTX2MemoryEfficientSageAttentionPatch",
+ "LTX2SamplingPreviewOverride",
+ "LTX2_NAG",
+ "LTXVAddGuideMulti",
+ "LTXVAddGuidesFromBatch",
+ "LTXVAudioVideoMask",
+ "LTXVChunkFeedForward",
+ "LTXVEnhanceAVideoKJ",
+ "LTXVImgToVideoInplaceKJ",
+ "LatentInpaintTTM",
+ "LazySwitchKJ",
+ "LeapfusionHunyuanI2VPatcher",
+ "LoadAndResizeImage",
+ "LoadImagesFromFolderKJ",
+ "LoadResAdapterNormalization",
+ "LoadVideosFromFolder",
+ "LoraExtractKJ",
+ "LoraReduceRankKJ",
+ "MaskBatchMulti",
+ "MaskOrImageToWeight",
+ "MergeImageChannels",
+ "ModelMemoryUsageFactorOverride",
+ "ModelMemoryUseReportPatch",
+ "ModelPassThrough",
+ "ModelPatchTorchSettings",
+ "ModelSaveKJ",
+ "NABLA_AttentionKJ",
+ "NormalizedAmplitudeToFloatList",
+ "NormalizedAmplitudeToMask",
+ "OffsetMask",
+ "OffsetMaskByNormalizedAmplitude",
+ "PadImageBatchInterleaved",
+ "PatchModelPatcherOrder",
+ "PathchSageAttentionKJ",
+ "PlotCoordinates",
+ "PointsEditor",
+ "PreviewAnimation",
+ "PreviewLatentNoiseMask",
+ "RemapImageRange",
+ "RemapMaskRange",
+ "ReplaceImagesInBatch",
+ "ResizeMask",
+ "ReverseImageBatch",
+ "RoundMask",
+ "SV3D_BatchSchedule",
+ "SamplerSelfRefineVideo",
+ "SaveImageKJ",
+ "SaveImageWithAlpha",
+ "SaveStringKJ",
+ "ScaleBatchPromptSchedule",
+ "ScheduledCFGGuidance",
+ "Screencap_mss",
+ "SeparateMasks",
+ "SetShakkerLabsUnionControlNetType",
+ "ShuffleImageBatch",
+ "SigmasToFloat",
+ "SimpleCalculatorKJ",
+ "SkipLayerGuidanceWanVideo",
+ "Sleep",
+ "SomethingToString",
+ "SoundReactive",
+ "SplineEditor",
+ "SplitBboxes",
+ "SplitImageChannels",
+ "StableZero123_BatchSchedule",
+ "StartRecordCUDAMemoryHistory",
+ "StringConstant",
+ "StringConstantMultiline",
+ "StringToFloatList",
+ "StyleModelApplyAdvanced",
+ "Superprompt",
+ "TimerNodeKJ",
+ "TorchCompileControlNet",
+ "TorchCompileCosmosModel",
+ "TorchCompileLTXModel",
+ "TorchCompileModelAdvanced",
+ "TorchCompileModelFluxAdvanced",
+ "TorchCompileModelFluxAdvancedV2",
+ "TorchCompileModelHyVideo",
+ "TorchCompileModelQwenImage",
+ "TorchCompileModelWanVideo",
+ "TorchCompileModelWanVideoV2",
+ "TorchCompileVAE",
+ "TransitionImagesInBatch",
+ "TransitionImagesMulti",
+ "VAEDecodeLoopKJ",
+ "VAELoaderKJ",
+ "VRAM_Debug",
+ "VisualizeCUDAMemoryHistory",
+ "VisualizeSigmasKJ",
+ "Wan21BlockLoraSelect",
+ "WanChunkFeedForward",
+ "WanImageToVideoSVIPro",
+ "WanVideoEnhanceAVideoKJ",
+ "WanVideoNAG",
+ "WanVideoTeaCacheKJ",
+ "WebcamCaptureCV2",
+ "WeightScheduleConvert",
+ "WeightScheduleExtend",
+ "WidgetToString"
+ ],
+ {
+ "title_aux": "KJNodes for ComfyUI"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-KwaiKolorsWrapper": [
+ [
+ "DownloadAndLoadChatGLM3",
+ "DownloadAndLoadKolorsModel",
+ "KolorsSampler",
+ "KolorsTextEncode",
+ "LoadChatGLM3"
+ ],
+ {
+ "title_aux": "ComfyUI-KwaiKolorsWrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-LBMWrapper": [
+ [
+ "LBMSampler",
+ "LoadLBMModel"
+ ],
+ {
+ "title_aux": "ComfyUI-LBMWrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-LLaVA-OneVision": [
+ [
+ "DownloadAndLoadLLaVAOneVisionModel",
+ "LLaVA_OneVision_Run",
+ "OneVisionCaptionFolder",
+ "SaveCaptionToTextFile"
+ ],
+ {
+ "title_aux": "ComfyUI Llava-OneVision"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-LVCDWrapper": [
+ [
+ "LVCDDecoder",
+ "LVCDSampler",
+ "LoadLVCDModel"
+ ],
+ {
+ "title_aux": "ComfyUI wrapper nodes for LVCD"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-LaVi-Bridge-Wrapper": [
+ [
+ "lavi_bridge_llama_encoder",
+ "lavi_bridge_t5_encoder",
+ "lavibridge_model_loader",
+ "lavibridge_sampler"
+ ],
+ {
+ "title_aux": "ComfyUI-LaVi-Bridge-Wrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-LivePortraitKJ": [
+ [
+ "DownloadAndLoadLivePortraitModels",
+ "KeypointsToImage",
+ "LivePortraitComposite",
+ "LivePortraitCropper",
+ "LivePortraitLoadCropper",
+ "LivePortraitLoadFaceAlignmentCropper",
+ "LivePortraitLoadMediaPipeCropper",
+ "LivePortraitProcess",
+ "LivePortraitRetargeting"
+ ],
+ {
+ "title_aux": "ComfyUI-LivePortraitKJ"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-Lotus": [
+ [
+ "LoadLotusModel",
+ "LotusSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-Lotus"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-LuminaWrapper": [
+ [
+ "DownloadAndLoadGemmaModel",
+ "DownloadAndLoadLuminaModel",
+ "GemmaSampler",
+ "LuminaGemmaTextEncode",
+ "LuminaGemmaTextEncodeArea",
+ "LuminaT2ISampler",
+ "LuminaTextAreaAppend"
+ ],
+ {
+ "title_aux": "ComfyUI-LuminaWrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-Marigold": [
+ [
+ "ColorizeDepthmap",
+ "MarigoldDepthEstimation",
+ "MarigoldDepthEstimationVideo",
+ "MarigoldDepthEstimation_v2",
+ "MarigoldDepthEstimation_v2_video",
+ "MarigoldModelLoader",
+ "RemapDepth",
+ "SaveImageOpenEXR"
+ ],
+ {
+ "title_aux": "Marigold depth estimation in ComfyUI"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-MelBandRoFormer": [
+ [
+ "MelBandRoFormerModelLoader",
+ "MelBandRoFormerSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-MelBandRoFormer"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-MimicMotionWrapper": [
+ [
+ "DiffusersScheduler",
+ "DownloadAndLoadMimicMotionModel",
+ "MimicMotionDecode",
+ "MimicMotionGetPoses",
+ "MimicMotionSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-MimicMotionWrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-MoGe": [
+ [
+ "DownloadAndLoadMoGeModel",
+ "MoGeProcess"
+ ],
+ {
+ "title_aux": "ComfyUI-MoGe"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-OpenDiTWrapper": [
+ [
+ "DownloadAndLoadOpenDiTT5Model",
+ "DownloadAndLoadOpenSoraModel",
+ "DownloadAndLoadOpenSoraVAE",
+ "OpenDiTConditioning",
+ "OpenDiTSampler",
+ "OpenSoraDecode",
+ "OpenSoraEncodeReference"
+ ],
+ {
+ "title_aux": "ComfyUI-OpenDiTWrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-PyramidFlowWrapper": [
+ [
+ "DownloadAndLoadPyramidFlowModel",
+ "PyramidFlowLatentPreview",
+ "PyramidFlowSampler",
+ "PyramidFlowTextEncode",
+ "PyramidFlowTorchCompileSettings",
+ "PyramidFlowTransformerLoader",
+ "PyramidFlowVAEDecode",
+ "PyramidFlowVAEEncode",
+ "PyramidFlowVAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI PyramidFlow Wrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-SCAIL-Pose": [
+ [
+ "ConvertOpenPoseKeypointsToDWPose",
+ "PoseDetectionVitPoseToDWPose",
+ "RenderNLFPoses",
+ "SaveNLFPosesAs3D"
+ ],
+ {
+ "title_aux": "ComfyUI-SCAIL-Pose"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-SUPIR": [
+ [
+ "SUPIR_Upscale",
+ "SUPIR_conditioner",
+ "SUPIR_decode",
+ "SUPIR_encode",
+ "SUPIR_first_stage",
+ "SUPIR_model_loader",
+ "SUPIR_model_loader_v2",
+ "SUPIR_model_loader_v2_clip",
+ "SUPIR_sample",
+ "SUPIR_tiles"
+ ],
+ {
+ "title_aux": "ComfyUI-SUPIR"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-StableXWrapper": [
+ [
+ "DifferenceExtractorNode",
+ "DownloadAndLoadStableXModel",
+ "StableXProcessImage"
+ ],
+ {
+ "title_aux": "ComfyUI-StableXWrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-WanVideoWrapper": [
+ [
+ "CreateCFGScheduleFloatList",
+ "CreateScheduleFloatList",
+ "DownloadAndLoadNLFModel",
+ "DownloadAndLoadWav2VecModel",
+ "DrawArcFaceLandmarks",
+ "DrawGaussianNoiseOnImage",
+ "DrawNLFPoses",
+ "DummyComfyWanModelObject",
+ "ExtractStartFramesForContinuations",
+ "FaceMaskFromPoseKeypoints",
+ "FantasyPortraitFaceDetector",
+ "FantasyPortraitModelLoader",
+ "FantasyTalkingModelLoader",
+ "FantasyTalkingWav2VecEmbeds",
+ "HuMoEmbeds",
+ "LandmarksToImage",
+ "LoadLynxResampler",
+ "LoadNLFModel",
+ "LoadVQVAE",
+ "LoadWanVideoClipTextEncoder",
+ "LoadWanVideoT5TextEncoder",
+ "LynxEncodeFaceIP",
+ "LynxInsightFaceCrop",
+ "MTVCrafterEncodePoses",
+ "MochaEmbeds",
+ "MultiTalkModelLoader",
+ "MultiTalkSilentEmbeds",
+ "MultiTalkWav2VecEmbeds",
+ "NLFPredict",
+ "NormalizeAudioLoudness",
+ "OviMMAudioVAELoader",
+ "QwenLoader",
+ "ReCamMasterPoseVisualizer",
+ "TextImageEncodeQwenVL",
+ "WanMove_native",
+ "WanVideoATITracks",
+ "WanVideoATITracksVisualize",
+ "WanVideoATI_comfy",
+ "WanVideoAddBindweaveEmbeds",
+ "WanVideoAddControlEmbeds",
+ "WanVideoAddDualControlEmbeds",
+ "WanVideoAddExtraLatent",
+ "WanVideoAddFantasyPortrait",
+ "WanVideoAddFlashVSRInput",
+ "WanVideoAddLucyEditLatents",
+ "WanVideoAddLynxEmbeds",
+ "WanVideoAddMTVMotion",
+ "WanVideoAddOneToAllExtendEmbeds",
+ "WanVideoAddOneToAllPoseEmbeds",
+ "WanVideoAddOneToAllReferenceEmbeds",
+ "WanVideoAddOviAudioToLatents",
+ "WanVideoAddPusaNoise",
+ "WanVideoAddS2VEmbeds",
+ "WanVideoAddSCAILPoseEmbeds",
+ "WanVideoAddSCAILReferenceEmbeds",
+ "WanVideoAddStandInLatent",
+ "WanVideoAddSteadyDancerEmbeds",
+ "WanVideoAddStoryMemLatents",
+ "WanVideoAddTTMLatents",
+ "WanVideoAddWanMoveTracks",
+ "WanVideoAnimateEmbeds",
+ "WanVideoApplyNAG",
+ "WanVideoBlockList",
+ "WanVideoBlockSwap",
+ "WanVideoClipVisionEncode",
+ "WanVideoCombineEmbeds",
+ "WanVideoContextOptions",
+ "WanVideoControlEmbeds",
+ "WanVideoControlnet",
+ "WanVideoControlnetLoader",
+ "WanVideoDecode",
+ "WanVideoDecodeOviAudio",
+ "WanVideoDiffusionForcingSampler",
+ "WanVideoEasyCache",
+ "WanVideoEmptyEmbeds",
+ "WanVideoEmptyMMAudioLatents",
+ "WanVideoEncode",
+ "WanVideoEncodeLatentBatch",
+ "WanVideoEncodeOviAudio",
+ "WanVideoEnhanceAVideo",
+ "WanVideoExperimentalArgs",
+ "WanVideoExtraModelSelect",
+ "WanVideoFlashVSRDecoderLoader",
+ "WanVideoFreeInitArgs",
+ "WanVideoFunCameraEmbeds",
+ "WanVideoImageClipEncode",
+ "WanVideoImageResizeToClosest",
+ "WanVideoImageToVideoEncode",
+ "WanVideoImageToVideoMultiTalk",
+ "WanVideoImageToVideoSkyreelsv3_audio",
+ "WanVideoLatentReScale",
+ "WanVideoLongCatAvatarExtendEmbeds",
+ "WanVideoLoopArgs",
+ "WanVideoLoraBlockEdit",
+ "WanVideoLoraSelect",
+ "WanVideoLoraSelectByName",
+ "WanVideoLoraSelectMulti",
+ "WanVideoMagCache",
+ "WanVideoMiniMaxRemoverEmbeds",
+ "WanVideoModelLoader",
+ "WanVideoOviCFG",
+ "WanVideoPassImagesFromSamples",
+ "WanVideoPhantomEmbeds",
+ "WanVideoPreviewEmbeds",
+ "WanVideoPromptExtender",
+ "WanVideoPromptExtenderSelect",
+ "WanVideoReCamMasterCameraEmbed",
+ "WanVideoReCamMasterDefaultCamera",
+ "WanVideoReCamMasterGenerateOrbitCamera",
+ "WanVideoRealisDanceLatents",
+ "WanVideoRoPEFunction",
+ "WanVideoSLG",
+ "WanVideoSVIProEmbeds",
+ "WanVideoSampler",
+ "WanVideoSamplerExtraArgs",
+ "WanVideoSamplerFromSettings",
+ "WanVideoSamplerSettings",
+ "WanVideoSamplerv2",
+ "WanVideoScheduler",
+ "WanVideoSchedulerv2",
+ "WanVideoSetAttentionModeOverride",
+ "WanVideoSetBlockSwap",
+ "WanVideoSetLoRAs",
+ "WanVideoSetRadialAttention",
+ "WanVideoSigmaToStep",
+ "WanVideoTeaCache",
+ "WanVideoTextEmbedBridge",
+ "WanVideoTextEncode",
+ "WanVideoTextEncodeCached",
+ "WanVideoTextEncodeSingle",
+ "WanVideoTextImageEncode",
+ "WanVideoTinyVAELoader",
+ "WanVideoTorchCompileSettings",
+ "WanVideoUltraVicoSettings",
+ "WanVideoUni3C_ControlnetLoader",
+ "WanVideoUni3C_embeds",
+ "WanVideoUniAnimateDWPoseDetector",
+ "WanVideoUniAnimatePoseInput",
+ "WanVideoUniLumosEmbeds",
+ "WanVideoVACEEncode",
+ "WanVideoVACEModelSelect",
+ "WanVideoVACEStartToEndFrame",
+ "WanVideoVAELoader",
+ "WanVideoVRAMManagement",
+ "WanVideoWanDrawWanMoveTracks",
+ "Wav2VecModelLoader",
+ "WhisperModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-WanVideoWrapper"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-depth-fm": [
+ [
+ "Depth_fm"
+ ],
+ {
+ "title_aux": "ComfyUI-depth-fm"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-moondream": [
+ [
+ "MoondreamQuery",
+ "MoondreamQueryCaptions"
+ ],
+ {
+ "title_aux": "ComfyUI-moondream"
+ }
+ ],
+ "https://github.com/kijai/ComfyUI-segment-anything-2": [
+ [
+ "DownloadAndLoadSAM2Model",
+ "Florence2toCoordinates",
+ "Sam2AutoSegmentation",
+ "Sam2Segmentation",
+ "Sam2VideoSegmentation",
+ "Sam2VideoSegmentationAddPoints"
+ ],
+ {
+ "preemptions": [
+ "DownloadAndLoadSAM2Model",
+ "Florence2toCoordinates",
+ "Sam2AutoSegmentation",
+ "Sam2Segmentation",
+ "Sam2VideoSegmentation",
+ "Sam2VideoSegmentationAddPoints"
+ ],
+ "title_aux": "ComfyUI-segment-anything-2"
+ }
+ ],
+ "https://github.com/kimara-ai/ComfyUI-Kimara-AI-Advanced-Watermarks": [
+ [
+ "KimaraAIBatchImages",
+ "KimaraAIWatermarker"
+ ],
+ {
+ "title_aux": "Kimara.ai's Advanced Watermarking Tools"
+ }
+ ],
+ "https://github.com/kinfolk0117/ComfyUI_GradientDeepShrink": [
+ [
+ "GradientPatchModelAddDownscale",
+ "GradientPatchModelAddDownscaleAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI_GradientDeepShrink"
+ }
+ ],
+ "https://github.com/kinfolk0117/ComfyUI_GridSwapper": [
+ [
+ "GridSwapper"
+ ],
+ {
+ "title_aux": "Gridswapper"
+ }
+ ],
+ "https://github.com/kinfolk0117/ComfyUI_Pilgram": [
+ [
+ "Pilgram"
+ ],
+ {
+ "title_aux": "ComfyUI_Pilgram"
+ }
+ ],
+ "https://github.com/kinfolk0117/ComfyUI_SimpleTiles": [
+ [
+ "DynamicTileMerge",
+ "DynamicTileSplit",
+ "TileCalc",
+ "TileMerge",
+ "TileSplit"
+ ],
+ {
+ "title_aux": "SimpleTiles"
+ }
+ ],
+ "https://github.com/kishida/comfyui-text-renderer": [
+ [
+ "TextRenderNode"
+ ],
+ {
+ "title_aux": "comfyui-text-renderer"
+ }
+ ],
+ "https://github.com/kj863257/ComfyUI_RC_Image_Compositor": [
+ [
+ "RC_AddNoise",
+ "RC_AutoColor",
+ "RC_BrightnessContrast",
+ "RC_CanvasPadding",
+ "RC_CanvasResize",
+ "RC_ChannelExtractor",
+ "RC_ChannelMixer",
+ "RC_ColorBalance",
+ "RC_ColorMatch",
+ "RC_CurvesAdjust",
+ "RC_DropShadow",
+ "RC_FilmGrain",
+ "RC_GaussianBlur",
+ "RC_GradientGenerator",
+ "RC_GradientMap",
+ "RC_HighLowFrequencySkinSmoothing",
+ "RC_HueSaturation",
+ "RC_ImageCompositor",
+ "RC_ImageCrop",
+ "RC_ImageScale",
+ "RC_InteractiveCompositor",
+ "RC_LRPreset",
+ "RC_LevelsAdjust",
+ "RC_LoadImageWithAlpha",
+ "RC_MaskApply",
+ "RC_OpacityAdjust",
+ "RC_OuterGlow",
+ "RC_PatternTiling",
+ "RC_PreviewImageNoMetadata",
+ "RC_PreviewImageWithMetadata",
+ "RC_SaveImageNoMetadata",
+ "RC_SaveImageWithMetadata",
+ "RC_Sharpen",
+ "RC_ShineRemoval",
+ "RC_Stroke",
+ "RC_Threshold",
+ "RC_Vibrance"
+ ],
+ {
+ "title_aux": "RC Image Compositor"
+ }
+ ],
+ "https://github.com/kjqwer/SmartSaveImage": [
+ [
+ "Example",
+ "SmartFolderManager",
+ "SmartImageSaver"
+ ],
+ {
+ "nodename_pattern": "Smart",
+ "title_aux": "SmartSaveImage"
+ }
+ ],
+ "https://github.com/kk8bit/KayTool": [
+ [
+ "AB_Images",
+ "AIO_Translater",
+ "Abc_Math",
+ "Baidu_Translater",
+ "Color_Adjustment",
+ "Custom_Save_Image",
+ "Display_Any",
+ "Image_Composer",
+ "Image_Cropper",
+ "Image_Mask_Composer",
+ "Image_Resizer",
+ "Image_Size_Extractor",
+ "Kay_BiRefNet_Loader",
+ "Load_Image_Folder",
+ "Mask_Blur_Plus",
+ "Mask_Filler",
+ "Preview_Mask",
+ "Preview_Mask_Plus",
+ "RemBG_Loader",
+ "Remove_BG",
+ "Slider_10",
+ "Slider_100",
+ "Slider_1000",
+ "Strong_Prompt",
+ "Tencent_Translater",
+ "Text",
+ "To_Int"
+ ],
+ {
+ "title_aux": "KayTool"
+ }
+ ],
+ "https://github.com/klinter007/klinter_nodes": [
+ [
+ "AspectSelector",
+ "BBoxCropper",
+ "FlexibleBatchImage",
+ "FolderLoader",
+ "Json Extractor - klinter",
+ "LoadImagePlus",
+ "LoadVideoForExtendingKlinter",
+ "NanoBananaMultiInput",
+ "OutpaintPadding",
+ "OutputTester",
+ "PixelSnapper",
+ "PrepVideoForExtendKlinter",
+ "SaveAudioPlus",
+ "SizeSelector",
+ "SpeedRamp",
+ "VideoFromFolder",
+ "YellowBus",
+ "ZoomOutComposer",
+ "concat",
+ "filter",
+ "nodevalue2stringmulti",
+ "string_contact_multi"
+ ],
+ {
+ "title_aux": "Klinter_nodes"
+ }
+ ],
+ "https://github.com/kmlbdh/ComfyUI-kmlbdh-VideoCombine": [
+ [
+ "DeleteFolderAny",
+ "KMLBDH_RAMCleaner",
+ "KMLBDH_VideoCombine"
+ ],
+ {
+ "title_aux": "kmlbdh Video Combine (Smart + Tiled)"
+ }
+ ],
+ "https://github.com/kmlbdh/ComfyUI_LocalLLMNodes": [
+ [
+ "AddUserLocalKontextPreset",
+ "ArabicProductDescriptionGenerator",
+ "LocalKontextPromptGenerator",
+ "RemoveUserLocalKontextPreset",
+ "SetLocalLLMServiceConnector"
+ ],
+ {
+ "title_aux": "ComfyUI_LocalLLMNodes"
+ }
+ ],
+ "https://github.com/knishika62/ComfyUI-DualLoraStack": [
+ [
+ "KnishikaDualLoraStack"
+ ],
+ {
+ "title_aux": "ComfyUI-DualLoraStack"
+ }
+ ],
+ "https://github.com/knishika62/ComfyUI-LyricForge": [
+ [
+ "LyricForgeACEStepGenerator",
+ "LyricForgeSongGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-LyricForge"
+ }
+ ],
+ "https://github.com/knuknX/ComfyUI-Image-Tools": [
+ [
+ "BatchImagePathLoader",
+ "ImageBgRemoveProcessor",
+ "ImageCheveretoUploader",
+ "ImageStandardResizeProcessor",
+ "JSONMessageNotifyTool",
+ "PreviewJSONNode",
+ "SingleImagePathLoader",
+ "SingleImageUrlLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Tools"
+ }
+ ],
+ "https://github.com/kohs100/comfyui-ppwc": [
+ [
+ "PPWCReplace",
+ "PPWCTerminate"
+ ],
+ {
+ "author": "Phospholipids",
+ "description": "This extension offers wildcard prompting works solely in workflow.",
+ "nickname": "PPWC",
+ "title": "PPWildCard",
+ "title_aux": "PPWildCard"
+ }
+ ],
+ "https://github.com/kohya-ss/ControlNet-LLLite-ComfyUI": [
+ [
+ "LLLiteLoader"
+ ],
+ {
+ "title_aux": "ControlNet-LLLite-ComfyUI"
+ }
+ ],
+ "https://github.com/koirpraw/ComfyUI-GCP-storage-decouple": [
+ [
+ "GCPStorageDownloadImage",
+ "GCPStorageDownloadModel",
+ "GCPStorageList",
+ "GCPStorageUploadImage",
+ "GCPStorageUploadModel"
+ ],
+ {
+ "title_aux": "ComfyUI GCP Cloud Storage Integration"
+ }
+ ],
+ "https://github.com/komojini/ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes": [
+ [
+ "S3 Bucket LoRA",
+ "S3Bucket_Load_LoRA",
+ "XL DreamBooth LoRA",
+ "XLDB_LoRA"
+ ],
+ {
+ "title_aux": "ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes"
+ }
+ ],
+ "https://github.com/komojini/komojini-comfyui-nodes": [
+ [
+ "BatchCreativeInterpolationNodeDynamicSettings",
+ "CachedGetter",
+ "DragNUWAImageCanvas",
+ "FlowBuilder",
+ "FlowBuilder (adv)",
+ "FlowBuilder (advanced)",
+ "FlowBuilder (advanced) Setter",
+ "FlowBuilderSetter",
+ "FlowBuilderSetter (adv)",
+ "Getter",
+ "ImageCropByRatio",
+ "ImageCropByRatioAndResize",
+ "ImageGetter",
+ "ImageMerger",
+ "ImagesCropByRatioAndResizeBatch",
+ "KSamplerAdvancedCacheable",
+ "KSamplerCacheable",
+ "Setter",
+ "UltimateVideoLoader",
+ "UltimateVideoLoader (simple)",
+ "YouTubeVideoLoader"
+ ],
+ {
+ "title_aux": "komojini-comfyui-nodes"
+ }
+ ],
+ "https://github.com/kostenickj/jk-comfyui-helpers": [
+ [
+ "EasyHRFix",
+ "EasyHRFix_Context",
+ "JKAnythingToString",
+ "JKBigContext",
+ "JKDynamicThresholdingMultiModel",
+ "JKEasyCheckpointLoader",
+ "JKEasyDetailer",
+ "JKEasyDetailer_Context",
+ "JKEasyKSampler_Context",
+ "JKEasyUpscaleImage",
+ "JKEasyWatermark",
+ "JKInspireSchedulerAdapter",
+ "JKLilContext",
+ "JKMultiModelSamplerUnpatch",
+ "JKStringEmpty",
+ "JKStringEquals",
+ "JKStringNotEmpty",
+ "JKStringNotEquals",
+ "JKStringToSamplerAdapter"
+ ],
+ {
+ "title_aux": "comfyui-jk-easy-nodes"
+ }
+ ],
+ "https://github.com/kplkasteel/ComfyUI-SubstringExtractor": [
+ [
+ "SubstringExtractor"
+ ],
+ {
+ "title_aux": "ComfyUI-SubstringExtractor"
+ }
+ ],
+ "https://github.com/kpsss34/ComfyUI-kpsss34": [
+ [
+ "SD35sLoaderSampler"
+ ],
+ {
+ "title_aux": "ComfyUI kpsss34 Custom Node"
+ }
+ ],
+ "https://github.com/krakenunbound/ComfyUI-KrakenTools": [
+ [
+ "KrakenFluxEmptyLatentImage",
+ "KrakenResolutionHelper",
+ "KrakenUpscaleTileCalc"
+ ],
+ {
+ "title_aux": "ComfyUI-KrakenTools"
+ }
+ ],
+ "https://github.com/krakenunbound/comfyui-kraken-tools": [
+ [
+ "KrakenDualCLIPLoader",
+ "KrakenImageProcessor",
+ "KrakenImageResize",
+ "KrakenKSampler",
+ "KrakenLastFrameMeta",
+ "KrakenLoras3",
+ "KrakenOllamaPromptChat",
+ "KrakenResolutionHelper",
+ "KrakenWanHelper",
+ "kraken_checkpoint_loader"
+ ],
+ {
+ "title_aux": "Kraken Tools"
+ }
+ ],
+ "https://github.com/krakenunbound/kraken-discord-bot": [
+ [
+ "KrakenDiscordBot",
+ "KrakenDiscordBotStatus"
+ ],
+ {
+ "title_aux": "Kraken Discord Bot"
+ }
+ ],
+ "https://github.com/kreonxv/ComfyUI-ForgeAPI": [
+ [
+ "ForgeControlNetStack",
+ "ForgeLoraStack",
+ "ForgeSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-ForgeAPI"
+ }
+ ],
+ "https://github.com/kreonxv/ComfyUI-GroupBypasser": [
+ [
+ "GroupBypasserNode"
+ ],
+ {
+ "title_aux": "ComfyUI-GroupBypasser"
+ }
+ ],
+ "https://github.com/kreonxv/ComfyUI-LoraControls": [
+ [
+ "LoRAStepRange",
+ "LoraKeyframes"
+ ],
+ {
+ "title_aux": "ComfyUI-LoraControls"
+ }
+ ],
+ "https://github.com/kreonxv/ComfyUI-T2I_StyleApply": [
+ [
+ "T2I_StyleApply"
+ ],
+ {
+ "title_aux": "ComfyUI-T2I_StyleApply"
+ }
+ ],
+ "https://github.com/kreonxv/ComfyUI-Whiteboard": [
+ [
+ "Whiteboard"
+ ],
+ {
+ "title_aux": "ComfyUI-Whiteboard"
+ }
+ ],
+ "https://github.com/krigeta/qwen-image-controlnets-comfyui": [
+ [
+ "QwenImageBlockwiseControlNetApply",
+ "QwenImageBlockwiseControlNetLoader",
+ "QwenImageCannyPreprocessor",
+ "QwenImageDepthPreprocessor"
+ ],
+ {
+ "title_aux": "qwen-image-controlnets-comfyui"
+ }
+ ],
+ "https://github.com/krmahil/comfyui-hollow-preserve": [
+ [
+ "RemoveEnclosedMaskedAreas"
+ ],
+ {
+ "title_aux": "Hollow Preserve"
+ }
+ ],
+ "https://github.com/kukuo6666/ComfyUI-Equirect": [
+ [
+ "CubemapToEquirect",
+ "EquirectToCubemap"
+ ],
+ {
+ "title_aux": "ComfyUI Equirectangular Tools"
+ }
+ ],
+ "https://github.com/kungful/ComfyUI_to_webui": [
+ [
+ "BarcodeGeneratorNode",
+ "Barcode_seed",
+ "DeepseekNode",
+ "Go_to_image",
+ "GradioInputImage",
+ "GradioTextBad",
+ "GradioTextOk",
+ "HuaFloatNode",
+ "HuaIntNode",
+ "Hua_CheckpointLoaderSimple",
+ "Hua_LoraLoader",
+ "Hua_LoraLoaderModelOnly",
+ "Hua_Output",
+ "Hua_UNETLoader",
+ "Hua_Video_Output",
+ "Hua_gradio_Seed",
+ "Hua_gradio_jsonsave",
+ "Hua_gradio_resolution",
+ "Huaword",
+ "Modelhua",
+ "brucelee",
+ "\u5c0f\u5b57\u4f53\u8bf4\u660e\uff1a\u6211\u662fcomfyui_hua_boy\u7684model"
+ ],
+ {
+ "title_aux": "ComfyUI_to_webui"
+ }
+ ],
+ "https://github.com/kunieone/ComfyUI_alkaid": [
+ [
+ "A_EmptyLatentImageLongside",
+ "A_Face3DSwapper",
+ "A_FaceCrop",
+ "A_FacePaste",
+ "A_GetImageSize",
+ "A_OpenPosePreprocessor",
+ "AdapterFace",
+ "AdapterFaceLoader",
+ "AdapterStyle",
+ "AdapterStyleLoader",
+ "AlkaidLoader",
+ "ApplyAdapter",
+ "ApplyControlNet_KPS",
+ "CombineAdapterPatch",
+ "KSamplerHires"
+ ],
+ {
+ "title_aux": "ComfyUI_alkaid"
+ }
+ ],
+ "https://github.com/kusurin/ComfyUI-chronophotography": [
+ [
+ "CreateChronophotography"
+ ],
+ {
+ "title_aux": "ComfyUI-chronophotography"
+ }
+ ],
+ "https://github.com/kwaroran/abg-comfyui": [
+ [
+ "Remove Image Background (abg)"
+ ],
+ {
+ "title_aux": "abg-comfyui"
+ }
+ ],
+ "https://github.com/kycg/comfyui-Lora-auto-downloader": [
+ [
+ "Kw_JsonLoraLoader",
+ "Kw_Json_Lora_CivitAIDownloader"
+ ],
+ {
+ "title_aux": "Kw_Json_Lora_CivitAIDownloader"
+ }
+ ],
+ "https://github.com/l-comm/WatermarkRemoval": [
+ [
+ "FindWatermarkNode",
+ "RemoveWatermarkNode"
+ ],
+ {
+ "author": "l-comm",
+ "description": "Remove watermark",
+ "nickname": "Watermark Removal",
+ "title": "Watermark Removal",
+ "title_aux": "WatermarkRemoval"
+ }
+ ],
+ "https://github.com/l20richo/ComfyUI-Azure-Blob-Storage": [
+ [
+ "DownloadFileBLOB",
+ "LoadImageBLOB",
+ "SaveImageBLOB",
+ "SaveVideoFilesBLOB",
+ "UploadFileBLOB"
+ ],
+ {
+ "title_aux": "ComfyUI-Azure-Blob-Storage"
+ }
+ ],
+ "https://github.com/l3ony2k/comfyui-leon-nodes": [
+ [
+ "Leon_DALLE_Image_API_Node",
+ "Leon_Flux_2_Image_API_Node",
+ "Leon_Flux_Image_API_Node",
+ "Leon_Flux_Kontext_API_Node",
+ "Leon_GPT_Image_API_Node",
+ "Leon_Google_Image_API_Node",
+ "Leon_Grok2_Image_API_Node",
+ "Leon_Hypr_Upload_Node",
+ "Leon_Ideogram_Image_API_Node",
+ "Leon_Image_Array_Builder_Node",
+ "Leon_Image_Split_4Grid_Node",
+ "Leon_ImgBB_Upload_Node",
+ "Leon_LLM_Chat_API_Node",
+ "Leon_LLM_JSON_API_Node",
+ "Leon_Luma_AI_Image_API_Node",
+ "Leon_Midjourney_Describe_API_Node",
+ "Leon_Midjourney_Proxy_API_Node",
+ "Leon_Midjourney_Upload_API_Node",
+ "Leon_Model_Selector_Node",
+ "Leon_Nano_Banana_API_Node",
+ "Leon_Nano_Banana_Edit_Tuzi_API_Node",
+ "Leon_Nano_Banana_Tuzi_API_Node",
+ "Leon_Qwen_Image_API_Node",
+ "Leon_Qwen_Image_Edit_API_Node",
+ "Leon_Recraft_Image_API_Node",
+ "Leon_Seedream3_API_Node",
+ "Leon_Seedream4_API_Node",
+ "Leon_StableDiffusion_35_API_Node",
+ "Leon_StableDiffusion_3_Ultra_API_Node",
+ "Leon_StableDiffusion_XL_API_Node",
+ "Leon_String_Combine_Node"
+ ],
+ {
+ "nodename_pattern": "^\ud83e\udd16 Leon",
+ "title_aux": "Leon's Utility and API Integration Nodes"
+ }
+ ],
+ "https://github.com/lakkiy/ComfyUI-RWImageS3": [
+ [
+ "Is Mask Empty",
+ "Read Image From S3",
+ "Save Image To S3"
+ ],
+ {
+ "title_aux": "ComfyUI-RWImageS3"
+ }
+ ],
+ "https://github.com/laksjdjf/Batch-Condition-ComfyUI": [
+ [
+ "Batch String",
+ "CLIP Text Encode (Batch)",
+ "String Input"
+ ],
+ {
+ "title_aux": "Batch-Condition-ComfyUI"
+ }
+ ],
+ "https://github.com/laksjdjf/ComfyUI-Imatrix": [
+ [
+ "ImatrixUNETLoader",
+ "LoRAdiff",
+ "SaveImatrix"
+ ],
+ {
+ "title_aux": "ComfyUI-Imatrix"
+ }
+ ],
+ "https://github.com/laksjdjf/LCMSampler-ComfyUI": [
+ [
+ "SamplerLCM",
+ "TAESDLoader"
+ ],
+ {
+ "title_aux": "LCMSampler-ComfyUI"
+ }
+ ],
+ "https://github.com/laksjdjf/LoRTnoC-ComfyUI": [
+ [
+ "LortnocLoader"
+ ],
+ {
+ "title_aux": "LoRTnoC-ComfyUI"
+ }
+ ],
+ "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI": [
+ [
+ "CDTuner",
+ "Negapip",
+ "Negpip"
+ ],
+ {
+ "title_aux": "cd-tuner_negpip-ComfyUI"
+ }
+ ],
+ "https://github.com/laksjdjf/cgem156-ComfyUI": [
+ [
+ "GradualLatentSampler",
+ "LCMSamplerRCFG",
+ "LoadAestheticShadow",
+ "PredictAesthetic",
+ "TCDSampler",
+ "TextScheduler"
+ ],
+ {
+ "title_aux": "cgem156-ComfyUI\ud83c\udf4c"
+ }
+ ],
+ "https://github.com/laksjdjf/pfg-ComfyUI": [
+ [
+ "PFG"
+ ],
+ {
+ "title_aux": "pfg-ComfyUI"
+ }
+ ],
+ "https://github.com/laolaoruqin/ComfyUI-free-drag-crop": [
+ [
+ "FreeDragCrop"
+ ],
+ {
+ "title_aux": "ComfyUI-free-drag-crop"
+ }
+ ],
+ "https://github.com/larsupb/LoRA-Merger-ComfyUI": [
+ [
+ "PM Breadcrumbs (Mergekit)",
+ "PM DARE (Mergekit)",
+ "PM Dare (Mergekit)",
+ "PM Della (Mergekit)",
+ "PM KArcher (Mergekit)",
+ "PM Linear (Mergekit)",
+ "PM LoRA Apply",
+ "PM LoRA Block Sampler",
+ "PM LoRA Merger (Mergekit)",
+ "PM LoRA Modifier",
+ "PM LoRA Parameter Sweep Sampler",
+ "PM LoRA Power Stacker",
+ "PM LoRA Resizer",
+ "PM LoRA Save",
+ "PM LoRA Select",
+ "PM LoRA Stack Decompose",
+ "PM LoRA Stack Sampler",
+ "PM LoRA Stacker (from Directory)",
+ "PM NearSwap (Mergekit)",
+ "PM NuSlerp (Mergekit)",
+ "PM SCE (Mergekit)",
+ "PM Slerp (Mergekit)",
+ "PM TIES (Mergekit)",
+ "PM Task Arithmetic (Mergekit)",
+ "PM Ties (Mergekit)"
+ ],
+ {
+ "title_aux": "LoRA Power-Merger ComfyUI"
+ }
+ ],
+ "https://github.com/latenightlabs/ComfyUI-LNL": [
+ [
+ "LNL_FrameSelectorV3",
+ "LNL_FrameSelectorV4"
+ ],
+ {
+ "title_aux": "LNL Frame Selector"
+ }
+ ],
+ "https://github.com/latentastronaut/comfyui-latent-astronaut-suite": [
+ [
+ "BatchLastImage",
+ "ChatterBoxTTS",
+ "ChatterBoxTTSLoader",
+ "ChatterBoxTTSLoaderAuto",
+ "ChatterBoxTTSSimple",
+ "ChatterBoxVC",
+ "ChatterBoxVCLoader",
+ "ChatterBoxVCLoaderAuto",
+ "ChatterBoxVCSimple",
+ "ForLoopEnd",
+ "ForLoopStart",
+ "ImageResizeToTotalPixels",
+ "LLMConfig",
+ "LLMPromptEnhancer",
+ "LoraLoaderModelOnlySelector",
+ "LoraLoaderSelector",
+ "SizeSelector",
+ "StringListCombine",
+ "StringListFromText",
+ "StringListIndex",
+ "VideoLengthFromBatch"
+ ],
+ {
+ "title_aux": "comfyui-latent-astronaut-suite"
+ }
+ ],
+ "https://github.com/lazniak/Head-Orientation-Node-for-ComfyUI---by-PabloGFX": [
+ [
+ "HeadOrientationNode"
+ ],
+ {
+ "title_aux": "Head-Orientation-Node - by PabloGFX"
+ }
+ ],
+ "https://github.com/lazniak/LiquidTime-Interpolation": [
+ [
+ "LiquidTime"
+ ],
+ {
+ "title_aux": "LiquidTime - by PabloGFX"
+ }
+ ],
+ "https://github.com/lazniak/comfyui-google-photos-loader": [
+ [
+ "ContentFilter",
+ "DatePicker",
+ "Google Photos Album Lister",
+ "Google Photos Album Loader",
+ "Google Photos Album Selector",
+ "Google Photos Cache Manager",
+ "Google Photos Clear Cache",
+ "Google Photos Images Loader",
+ "Google Photos Login/Logout"
+ ],
+ {
+ "title_aux": "Google Photos Loader - by PabloGFX"
+ }
+ ],
+ "https://github.com/lazyq666/gemini-3-simply-comfyui": [
+ [
+ "Gemini3Camera3DPrompt",
+ "Gemini3ProImagePreview",
+ "Gemini3ProPreviewText",
+ "GeminiSeedInt32"
+ ],
+ {
+ "title_aux": "gemini-3-simply-comfyui"
+ }
+ ],
+ "https://github.com/lc03lc/Comfyui_OmniConsistency": [
+ [
+ "Comfyui_OmniConsistency"
+ ],
+ {
+ "title_aux": "ComfyUI OmniConsistency Nodes"
+ }
+ ],
+ "https://github.com/lceric/comfyui-gpt-image": [
+ [
+ "GPTImage1Generate"
+ ],
+ {
+ "title_aux": "comfyui-gpt-image"
+ }
+ ],
+ "https://github.com/leafiy/comfyui_psd_smart_object": [
+ [
+ "PSDMockupEmbedder",
+ "PSDSmartObjectInspector"
+ ],
+ {
+ "title_aux": "comfyui_psd_smart_object"
+ }
+ ],
+ "https://github.com/lebrosoft/ComfyUI-VideoChatWrapper": [
+ [
+ "AudioCombine",
+ "ConcatAudio",
+ "ConvertAudioChannels",
+ "JoinAudio",
+ "ResampleAudio",
+ "SplitAudio",
+ "VCW_LoadVideo",
+ "VCW_ModelLoader",
+ "VCW_VideoSummary"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoChatWrapper"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_1Prompt1Story": [
+ [
+ "GenerateStoryImage",
+ "PromptStoryModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_1Prompt1Story"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_ChatGen": [
+ [
+ "ChatGenGenerate",
+ "ChatGenImageProcessor",
+ "ChatGenModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_ChatGen"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_Cogview4": [
+ [
+ "CogView4ImageGenerator",
+ "CogView4ModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_Cogview4"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_CompareModelWeights": [
+ [
+ "CheckPointLoader_Compare",
+ "CompareModelWeightsDiff",
+ "CompareModelWeightsDiffNormalized",
+ "PreviewImageCompareModelWeights"
+ ],
+ {
+ "title_aux": "ComfyUI_CompareModelWeights"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_CrossImageAttention": [
+ [
+ "AppearanceTransferInference",
+ "AppearanceTransferModelModelLoader",
+ "CIAConfig",
+ "LoadImagePath",
+ "LoadLatents"
+ ],
+ {
+ "title_aux": "ComfyUI nodes to use CrossImageAttention"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_DeepSeekVL2": [
+ [
+ "deepseek_vl2_inference",
+ "deepseek_vl2_model_loader"
+ ],
+ {
+ "title_aux": "ComfyUI_DeepSeekVL2"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_FluxAttentionMask": [
+ [
+ "AMModelLoader",
+ "AMSample",
+ "AttentionMask"
+ ],
+ {
+ "title_aux": "ComfyUI nodes to use AttentionMask"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_FluxClipWeight": [
+ [
+ "CLIPTextEncodeFluxWeight"
+ ],
+ {
+ "title_aux": "ComfyUI nodes to use FluxClipWeight"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_FluxCustomId": [
+ [
+ "ApplyCustomIDFlux",
+ "CustomIDModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_FluxCustomId"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_FluxLayerDiffuse": [
+ [
+ "FluxTransparentI2I",
+ "FluxTransparentModelLoader",
+ "FluxTransparentT2I"
+ ],
+ {
+ "title_aux": "ComfyUI_FluxLayerDiffuse"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_Gemma3": [
+ [
+ "ApplyGemma3",
+ "Gemma3ModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_Gemma3"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_InternVL2": [
+ [
+ "DynamicPreprocess",
+ "InternVLHFInference",
+ "InternVLModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_InternVL2"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_LLaSM": [
+ [
+ "LLaSM2Interface",
+ "LLaSM2ModelLoader",
+ "LLaSMLoadAudio"
+ ],
+ {
+ "title_aux": "ComfyUI_LLaSM"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_M3Net": [
+ [
+ "M3Net_Interface",
+ "M3Net_ModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_M3Net"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_MasaCtrl": [
+ [
+ "DirectSampler",
+ "MasaCtrlConcatImage",
+ "MasaCtrlInversion",
+ "MasaCtrlLoadImage",
+ "MasaCtrlModelLoader",
+ "MutualSelfAttentionControlMaskAutoSampler",
+ "MutualSelfAttentionControlMaskSampler",
+ "MutualSelfAttentionControlSampler"
+ ],
+ {
+ "title_aux": "ComfyUI nodes to use MasaCtrl"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_QWQ32B": [
+ [
+ "QwQModelLoader",
+ "QwQTextGenerator",
+ "QweQModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_QWQ32B"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_Qwen3Omni": [
+ [
+ "QwenOmniAudioProcessor",
+ "QwenOmniChat",
+ "QwenOmniModelLoader",
+ "QwenOmniVideoProcessor"
+ ],
+ {
+ "title_aux": "ComfyUI_Qwen3Omni"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_Style_Aligned": [
+ [
+ "SAControlnet_ModelLoader",
+ "SADepth",
+ "SAHandler",
+ "SAInversion",
+ "SASDXLControlnetKsampler",
+ "SASDXLKampler",
+ "SASDXLTransferKsampler",
+ "SASDXL_ModelLoader",
+ "SchedulerLoader"
+ ],
+ {
+ "title_aux": "ComfyUI nodes to use Style-Aligned"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_VideoEditing": [
+ [
+ "LoadVideo2Images",
+ "VEdit_ControlNet_ModelLoader",
+ "VEdit_ModelLoader",
+ "VEdit_Sampler",
+ "VEdit_image2canny"
+ ],
+ {
+ "title_aux": "ComfyUI nodes to use VideoEditing"
+ }
+ ],
+ "https://github.com/leeguandong/ComfyUI_VisualAttentionMap": [
+ [
+ "DecodeLatent",
+ "HFModelLoader",
+ "ShowCrossAttn",
+ "ShowImages",
+ "ShowSelfAttn",
+ "Text2ImageInference"
+ ],
+ {
+ "title_aux": "ComfyUI_VisualAttentionMap"
+ }
+ ],
+ "https://github.com/leeooo001/comfyui-Hunyuan-PromptEnhancer": [
+ [
+ "XX_Hunyuan_PromptEnhancer"
+ ],
+ {
+ "title_aux": "comfyui-Hunyuan-PromptEnhancer"
+ }
+ ],
+ "https://github.com/leestuartx/ComfyUI-GG": [
+ [
+ "AddPaddingToImage",
+ "ForLoopNode",
+ "ImageAndTextDescriptionBySeed",
+ "ImageMetadataExtractor",
+ "InputNode",
+ "MetadataExtractBySeed",
+ "MetadataExtractorBySeed",
+ "OutputNode",
+ "ResizeImageProportionally",
+ "WorkspaceNode"
+ ],
+ {
+ "title_aux": "ComfyUI-GG"
+ }
+ ],
+ "https://github.com/leewinder/comfyui-crop-to-center": [
+ [
+ "CropToCenter"
+ ],
+ {
+ "title_aux": "Crop To Center"
+ }
+ ],
+ "https://github.com/leewinder/comfyui-mureka-api": [
+ [
+ "Mureka API Key",
+ "Mureka Billing",
+ "Mureka Decode Audio",
+ "Mureka Instrumental",
+ "Mureka Mock Generation",
+ "Mureka Save",
+ "Mureka Song",
+ "Mureka Text Prompt"
+ ],
+ {
+ "title_aux": "Mureka API"
+ }
+ ],
+ "https://github.com/lenML/comfyui_qwen_image_edit_adv": [
+ [
+ "QwenImageEditScale",
+ "QwenImageEditSimpleScale",
+ "TextEncodeQwenImageEditAdv",
+ "TextEncodeQwenImageEditInfAdv",
+ "TextEncodeQwenImageEditPlusAdv"
+ ],
+ {
+ "title_aux": "comfyui_qwen_image_edit_adv"
+ }
+ ],
+ "https://github.com/lenskikh/ComfyUI-Prompt-Worker": [
+ [
+ "Clip and Text -> Encode",
+ "Prompt Body",
+ "Prompt Clothes",
+ "Prompt Merger",
+ "Prompt Worker",
+ "Prompt \u0421onstructor"
+ ],
+ {
+ "title_aux": "Propmt Worker"
+ }
+ ],
+ "https://github.com/leoleelxh/Comfy-Topaz-Photo": [
+ [
+ "ComfyTopazPhoto",
+ "ComfyTopazPhotoTestAndClean"
+ ],
+ {
+ "title_aux": "Comfy-Topaz-Photo"
+ }
+ ],
+ "https://github.com/leoleelxh/ComfyUI-LLMs": [
+ [
+ "LLMs Chat",
+ "LLMs Vision Unified",
+ "LLMs_Vision_Unified"
+ ],
+ {
+ "title_aux": "ComfyUI-LLMs"
+ }
+ ],
+ "https://github.com/leonardomiramondi/flux-context-comfyui": [
+ [
+ "FluxKontextNode"
+ ],
+ {
+ "title_aux": "Flux Context ComfyUI Node"
+ }
+ ],
+ "https://github.com/lepiai/ComfyUI-Minitools": [
+ [
+ "LP-CropTransparentEdges",
+ "LP-ImageToMaskWithAlpha",
+ "LP-TranslateToEN",
+ "LP-color2RGB",
+ "LP-hex2dec",
+ "NumericSlider"
+ ],
+ {
+ "title_aux": "ComfyUI-Minitools"
+ }
+ ],
+ "https://github.com/lerignoux/ComfyUI-PechaKucha": [
+ [
+ "DownloadPechaKucha",
+ "GeneratePowerpoint",
+ "SplitPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-PechaKucha"
+ }
+ ],
+ "https://github.com/lerignoux/ComfyUI-Stable3DGen": [
+ [
+ "Stable3DGenerate3D",
+ "Stable3DLoadModels",
+ "Stable3DPreprocessImage"
+ ],
+ {
+ "title_aux": "ComfyUI Stable3DGen"
+ }
+ ],
+ "https://github.com/leylahviolet/ComfyUI-Violet-Tools": [
+ [
+ "AestheticAlchemist",
+ "BodyBard",
+ "CharacterCurator",
+ "EncodingEnchantress",
+ "GlamourGoddess",
+ "NegativityNullifier",
+ "OracleOverride",
+ "PosePriestess",
+ "QualityQueen",
+ "SaveSiren",
+ "SceneSeductress"
+ ],
+ {
+ "title_aux": "iolet Tools \ud83d\udc85"
+ }
+ ],
+ "https://github.com/lgldlk/ComfyUI-PC-ding-dong": [
+ [
+ "pc ding dong",
+ "pc ding dong text",
+ "pc time sleep"
+ ],
+ {
+ "title_aux": "ComfyUI-PC-ding-dong"
+ }
+ ],
+ "https://github.com/lgldlk/ComfyUI-PSD-Replace": [
+ [
+ "psd replace"
+ ],
+ {
+ "title_aux": "ComfyUI-PSD-Replace"
+ }
+ ],
+ "https://github.com/liangt/comfyui-loadimagewithsubfolder": [
+ [
+ "LoadImageWithSubfolder"
+ ],
+ {
+ "title_aux": "comfyui-loadimagewithsubfolder"
+ }
+ ],
+ "https://github.com/licanhua/ComfyUI-StrokeReveal": [
+ [
+ "StrokeReveal"
+ ],
+ {
+ "title_aux": "ComfyUI-StrokeReveal"
+ }
+ ],
+ "https://github.com/licyk/ComfyUI-HakuImg": [
+ [
+ "BlendImage",
+ "Blur",
+ "Chromatic",
+ "Color",
+ "Curve",
+ "CustomExif",
+ "Flip",
+ "Glow",
+ "InOutPaint",
+ "LenDistortion",
+ "OutlineExpansion",
+ "PixelOE",
+ "Pixelize",
+ "PreResize",
+ "SaveImageWithCustomExif",
+ "Sketch",
+ "TiltShift"
+ ],
+ {
+ "title_aux": "ComfyUI-HakuImg"
+ }
+ ],
+ "https://github.com/licyk/ComfyUI-TCD-Sampler": [
+ [
+ "TCDScheduler"
+ ],
+ {
+ "title_aux": "ComfyUI-TCD-Sampler"
+ }
+ ],
+ "https://github.com/liewcc/ComfyUI-Qwen-Canvas": [
+ [
+ "QwenCanvas",
+ "QwenCanvasPlus"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen-Canvas"
+ }
+ ],
+ "https://github.com/lihaoyun6/ComfyUI-BlindWatermark": [
+ [
+ "ApplyBlindWatermark",
+ "ApplyBlindWatermarkAdvanced",
+ "DecodeBlindWatermark",
+ "DecodeBlindWatermarkAdvanced",
+ "EncryptDecryptImage"
+ ],
+ {
+ "title_aux": "ComfyUI-BlindWatermark"
+ }
+ ],
+ "https://github.com/lihaoyun6/ComfyUI-FlashVSR_Ultra_Fast": [
+ [
+ "FlashVSRInitPipe",
+ "FlashVSRNode",
+ "FlashVSRNodeAdv"
+ ],
+ {
+ "title_aux": "ComfyUI-FlashVSR_Ultra_Fast"
+ }
+ ],
+ "https://github.com/lihaoyun6/ComfyUI-QwenPromptRewriter": [
+ [
+ "GeneralPromptRewriter",
+ "QwenPromptRewriter",
+ "TextEncodeQwenImageEditAdv",
+ "TextEncodeQwenImageEditPlusAdv"
+ ],
+ {
+ "title_aux": "Comfyui-QwenPromptRewriter"
+ }
+ ],
+ "https://github.com/lihaoyun6/ComfyUI-Segformer_Ultra_Fast": [
+ [
+ "Grow_Mask_Ultra_Fast",
+ "Mask_To_Bbox_SAM2",
+ "SegformerB2ClothesUltraBatch",
+ "Segformer_B2_Clothes_Fashion_Labels",
+ "Segformer_B2_Clothes_Labels"
+ ],
+ {
+ "title_aux": "ComfyUI-Segformer_Ultra_Fast"
+ }
+ ],
+ "https://github.com/liming123332/ComfyUI-Ranbooru": [
+ [
+ "RanbooruPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-Ranbooru"
+ }
+ ],
+ "https://github.com/lingha0h/comfyui_kj": [
+ [
+ "cpm_textInput"
+ ],
+ {
+ "title_aux": "comfyui_kj"
+ }
+ ],
+ "https://github.com/linjian-ufo/ComfyUI_GLM4V_voltspark": [
+ [
+ "Glm4vBatchNode",
+ "Glm4vNode"
+ ],
+ {
+ "title_aux": "GLM-4V Image Descriptor"
+ }
+ ],
+ "https://github.com/linjian-ufo/comfyui_deepseek_lj257_update": [
+ [
+ "DeepSeekChatNode"
+ ],
+ {
+ "title_aux": "DeepSeek Chat Node for ComfyUI"
+ }
+ ],
+ "https://github.com/linshier/comfyui-remote-tools": [
+ [
+ "LoadBase64(js)",
+ "LoadBase64FromRemote",
+ "SendBase64ToRemote"
+ ],
+ {
+ "title_aux": "comfyui-remote-tools"
+ }
+ ],
+ "https://github.com/lisaks/comfyui-panelforge": [
+ [
+ "FrameNode",
+ "PageNode",
+ "RowNode"
+ ],
+ {
+ "title_aux": "Pixstri ComfyUI Comics"
+ }
+ ],
+ "https://github.com/liuqianhonga/ComfyUI-Html2Image": [
+ [
+ "CameraWatermark",
+ "TemplateToImage",
+ "WebpageScreenshot"
+ ],
+ {
+ "title_aux": "ComfyUI-Html2Image"
+ }
+ ],
+ "https://github.com/liuqianhonga/ComfyUI-Image-Compressor": [
+ [
+ "BatchImageCompressor",
+ "ImageCompressor"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Compressor"
+ }
+ ],
+ "https://github.com/liuqianhonga/ComfyUI-QHNodes": [
+ [
+ "BatchImageCompressor",
+ "CameraWatermark",
+ "DownloadCheckpoint",
+ "DownloadControlNet",
+ "DownloadLora",
+ "DownloadUNET",
+ "DownloadVAE",
+ "DynamicExpression",
+ "FileSave",
+ "Gemini",
+ "ImageCompressor",
+ "ImageCountFromFolder",
+ "JsonToCSV",
+ "JsonUnpack",
+ "LoadImageFromFolder",
+ "LoadLoraFromFolder",
+ "LoadPromptsFromFolder",
+ "PresetSizeLatent",
+ "SamplerSettings",
+ "ShowTranslateString",
+ "StringConverter",
+ "StringFormatter",
+ "StringList",
+ "StringListFromCSV",
+ "StringListToCSV",
+ "StringMatcher",
+ "StringTranslate",
+ "TemplateToImage",
+ "TimeFormatter",
+ "UnifiedPromptGenerator",
+ "WebpageScreenshot"
+ ],
+ {
+ "title_aux": "ComfyUI-QHNodes"
+ }
+ ],
+ "https://github.com/liuqianhonga/ComfyUI-String-Helper": [
+ [
+ "JsonToCSV",
+ "ShowTranslateString",
+ "StringConverter",
+ "StringFormatter",
+ "StringList",
+ "StringListFromCSV",
+ "StringListToCSV",
+ "StringMatcher",
+ "StringTranslate",
+ "TimeFormatter"
+ ],
+ {
+ "title_aux": "ComfyUI-String-Helper"
+ }
+ ],
+ "https://github.com/liushuchun/ComfyUI_Lora_List_With_Url_Loader": [
+ [
+ "LoraListUrlLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_Lora_List_With_Url_Loader"
+ }
+ ],
+ "https://github.com/liusida/ComfyUI-AutoCropFaces": [
+ [
+ "AutoCropFaces"
+ ],
+ {
+ "title_aux": "ComfyUI-AutoCropFaces"
+ }
+ ],
+ "https://github.com/liusida/ComfyUI-B-LoRA": [
+ [
+ "LoadBLoRA"
+ ],
+ {
+ "title_aux": "ComfyUI-B-LoRA"
+ }
+ ],
+ "https://github.com/liusida/ComfyUI-Debug": [
+ [
+ "DebugModelInspectorNode",
+ "DebugModelPrintOutNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Debug"
+ }
+ ],
+ "https://github.com/liusida/ComfyUI-SD3-nodes": [
+ [
+ "SD3EmptyLatent",
+ "SD3LoadCLIPs",
+ "SD3LoadCheckpoint"
+ ],
+ {
+ "title_aux": "ComfyUI-SD3-nodes"
+ }
+ ],
+ "https://github.com/livepeer/ComfyUI-Stream-Pack": [
+ [
+ "AudioTranscriptionNode",
+ "FaceMeshDrawNode",
+ "FaceMeshMaskNode",
+ "FaceMeshNode",
+ "FeatureBankAttentionProcessor",
+ "SRTGeneratorNode",
+ "SuperResolutionModelLoader",
+ "SuperResolutionUpscale"
+ ],
+ {
+ "title_aux": "ComfyUI-Stream-Pack"
+ }
+ ],
+ "https://github.com/ljleb/comfy-mecha": [
+ [
+ "Already Loaded Model Mecha Recipe",
+ "Any Model Mecha Recipe",
+ "Blocks Mecha Hyper",
+ "Bool Mecha Hyper",
+ "Float Mecha Hyper",
+ "Int Mecha Hyper",
+ "Lora Mecha Recipe",
+ "Mecha Converter",
+ "Mecha Deserializer",
+ "Mecha Merge Method Cache Unit",
+ "Mecha Merger",
+ "Mecha Recipe List",
+ "Mecha Regex Weights",
+ "Mecha Serializer",
+ "Mecha Subtract Recipe List",
+ "Model Mecha Recipe",
+ "SD1-LDM Mecha Blocks Parameters",
+ "SDXL-SGM Mecha Blocks Parameters",
+ "String Mecha Hyper"
+ ],
+ {
+ "title_aux": "Mecha Merge Node Pack"
+ }
+ ],
+ "https://github.com/lks-ai/ComfyUI-StableAudioSampler": [
+ [
+ "StableAudioConditioning",
+ "StableAudioLoadModel",
+ "StableAudioPrompt",
+ "StableAudioSampler"
+ ],
+ {
+ "author": "lks-ai",
+ "description": "A Simple integration of Stable Audio Diffusion with knobs and stuff!",
+ "nickname": "stableaudio",
+ "title": "StableAudioSampler",
+ "title_aux": "ComfyUI Stable Audio Open 1.0 Sampler"
+ }
+ ],
+ "https://github.com/lks-ai/anynode": [
+ [
+ "AnyNode",
+ "AnyNodeAnthropic",
+ "AnyNodeGemini",
+ "AnyNodeLocal"
+ ],
+ {
+ "author": "newsbubbles",
+ "description": "This single node uses an LLM to generate a functionality based on your request. You can make the node do anything.",
+ "nickname": "AnyNode",
+ "title": "AnyNode v0.1.1",
+ "title_aux": "ComfyUI AnyNode: Any Node you ask for"
+ }
+ ],
+ "https://github.com/lldacing/ComfyUI_BEN_ll": [
+ [
+ "BlurFusionForegroundEstimationForBen",
+ "GetMaskByBen",
+ "LoadRembgByBenModel",
+ "RembgByBen",
+ "RembgByBenAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI_BEN_ll"
+ }
+ ],
+ "https://github.com/lldacing/ComfyUI_BiRefNet_ll": [
+ [
+ "AutoDownloadBiRefNetModel",
+ "BlurFusionForegroundEstimation",
+ "GetMaskByBiRefNet",
+ "LoadRembgByBiRefNetModel",
+ "RembgByBiRefNet",
+ "RembgByBiRefNetAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI_BiRefNet_ll"
+ }
+ ],
+ "https://github.com/lldacing/ComfyUI_Patches_ll": [
+ [
+ "ApplyFirstBlockCachePatch",
+ "ApplyFirstBlockCachePatchAdvanced",
+ "ApplyTeaCachePatch",
+ "ApplyTeaCachePatchAdvanced",
+ "DitForwardOverrider",
+ "FluxForwardOverrider",
+ "VideoForwardOverrider"
+ ],
+ {
+ "title_aux": "ComfyUI_Patches_ll"
+ }
+ ],
+ "https://github.com/lldacing/ComfyUI_PuLID_Flux_ll": [
+ [
+ "ApplyPulidFlux",
+ "FixPulidFluxPatch",
+ "PulidFluxEvaClipLoader",
+ "PulidFluxFaceDetector",
+ "PulidFluxFaceNetLoader",
+ "PulidFluxInsightFaceLoader",
+ "PulidFluxModelLoader",
+ "PulidFluxOptions"
+ ],
+ {
+ "title_aux": "ComfyUI_PuLID_Flux_ll"
+ }
+ ],
+ "https://github.com/lldacing/ComfyUI_StableDelight_ll": [
+ [
+ "ApplyStableDelight",
+ "LoadStableDelightModel"
+ ],
+ {
+ "title_aux": "ComfyUI_StableDelight_ll"
+ }
+ ],
+ "https://github.com/lldacing/ComfyUI_StableHair_ll": [
+ [
+ "ApplyHairRemover",
+ "ApplyHairTransfer",
+ "LoadStableHairRemoverModel",
+ "LoadStableHairTransferModel"
+ ],
+ {
+ "title_aux": "ComfyUI_StableHair_ll"
+ }
+ ],
+ "https://github.com/lldacing/comfyui-easyapi-nodes": [
+ [
+ "Base64ToImage",
+ "Base64ToMask",
+ "BboxToBbox",
+ "BboxToCropData",
+ "BboxesToBboxes",
+ "ColorPicker",
+ "ConvertToJsonStr",
+ "ConvertTypeToAny",
+ "CopyAndRenameFiles",
+ "CropImageByBbox",
+ "CropTargetSizeImageByBbox",
+ "EmptyOutputNode",
+ "FilterSortDependSubGraphs",
+ "FilterValueForList",
+ "ForEachClose",
+ "ForEachOpen",
+ "GetImageBatchSize",
+ "GetValueFromJsonObj",
+ "IfElseForEmptyObject",
+ "ImageEqual",
+ "ImageSizeGetter",
+ "ImageToBase64",
+ "ImageToBase64Advanced",
+ "IndexOfList",
+ "IndexesOfList",
+ "InnerIntCompare",
+ "InnerIntMathOperation",
+ "InnerLoopClose",
+ "InsightFaceBBOXDetect",
+ "IntToList",
+ "IntToNumber",
+ "IsNoneOrEmpty",
+ "IsNoneOrEmptyOptional",
+ "JoinList",
+ "ListMerge",
+ "ListUnWrapper",
+ "ListWrapper",
+ "LoadImageFromLocalPath",
+ "LoadImageFromURL",
+ "LoadImageToBase64",
+ "LoadJsonStrToList",
+ "LoadLocalFilePath",
+ "LoadMaskFromLocalPath",
+ "LoadMaskFromURL",
+ "MaskByBboxes",
+ "MaskImageToBase64",
+ "MaskToBase64Image",
+ "MaskToRle",
+ "NodeListMerge",
+ "NodeListToList",
+ "NodeListToListMerge",
+ "NoneNode",
+ "ReadTextFromLocalFile",
+ "RleToMask",
+ "SDBaseVerNumber",
+ "SamAutoMaskSEGS",
+ "SamAutoMaskSEGSAdvanced",
+ "SaveImagesWithoutOutput",
+ "SaveSingleImageWithoutOutput",
+ "SaveTextToFileByImagePath",
+ "SaveTextToLocalFile",
+ "SelectBbox",
+ "SelectBboxes",
+ "ShowBoolean",
+ "ShowFloat",
+ "ShowInt",
+ "ShowNumber",
+ "ShowString",
+ "SliceList",
+ "SortDependSubGraphs",
+ "SplitStringToList",
+ "StringArea",
+ "StringToList",
+ "TryFreeMemory"
+ ],
+ {
+ "title_aux": "comfyui-easyapi-nodes"
+ }
+ ],
+ "https://github.com/llikethat/ComfyUI-faceExtractor": [
+ [
+ "FaceExtractor",
+ "FaceMatcher",
+ "FaceReferenceEmbedding"
+ ],
+ {
+ "title_aux": "faceExtractor for ComfyUI"
+ }
+ ],
+ "https://github.com/llikethat/ComfyUI-iseebetter": [
+ [
+ "BasicVSRModelLoader",
+ "BasicVSRUpscale",
+ "GolfBallArtifactRemover",
+ "ISeeBetterCleanUpscale",
+ "ISeeBetterDebugTest",
+ "ISeeBetterFrameBuffer",
+ "ISeeBetterModelLoader",
+ "ISeeBetterSimpleUpscale",
+ "ISeeBetterUpscale",
+ "ImageSharpener",
+ "PerceptualQualityScore",
+ "SRGANDiscriminatorLoader",
+ "WaterDetailEnhance",
+ "WaterEnhancerModelLoader",
+ "WaterPostProcess"
+ ],
+ {
+ "title_aux": "iSeeBetter Node for ComfyUI"
+ }
+ ],
+ "https://github.com/lo-th/Comfyui_three_js": [
+ [
+ "ThreeView"
+ ],
+ {
+ "title_aux": "Comfyui_three_js"
+ }
+ ],
+ "https://github.com/logicalor/comfyui_friendly_pipe": [
+ [
+ "FriendlyPipeEdit",
+ "FriendlyPipeIn",
+ "FriendlyPipeOut"
+ ],
+ {
+ "title_aux": "comfyui_friendly_pipe"
+ }
+ ],
+ "https://github.com/logicalor/comfyui_multi_replace": [
+ [
+ "FindReplacePairs",
+ "TextReplacer"
+ ],
+ {
+ "title_aux": "comfyui_multi_replace"
+ }
+ ],
+ "https://github.com/logicalor/comfyui_path_sanitizer": [
+ [
+ "PathSanitizer"
+ ],
+ {
+ "title_aux": "comfyui_path_sanitizer"
+ }
+ ],
+ "https://github.com/logicalor/comfyui_text_to_pose": [
+ [
+ "ApplyT2IPoseAdapter",
+ "T2IPoseAdapterLoader",
+ "T2PModelLoader",
+ "TextToPose",
+ "TextToPoseBatch"
+ ],
+ {
+ "title_aux": "comfyui_text_to_pose"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-4DHumans": [
+ [
+ "LoadDetectron",
+ "LoadHMR",
+ "ProcessHumans"
+ ],
+ {
+ "title_aux": "ComfyUI-4DHumans"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-APGScaling": [
+ [
+ "APGFunction"
+ ],
+ {
+ "title_aux": "ComfyUI-APGScaling"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-DiLightNet": [
+ [
+ "LoadDiLightControlNet",
+ "PrepareDiLightCond"
+ ],
+ {
+ "title_aux": "ComfyUI-DiLightNet"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-FLATTEN": [
+ [
+ "ApplyFlattenAttentionNode",
+ "CreateFlowNoiseNode",
+ "FlattenCheckpointLoaderNode",
+ "KSamplerFlattenNode",
+ "TrajectoryNode",
+ "UnsamplerFlattenNode"
+ ],
+ {
+ "title_aux": "ComfyUI-FLATTEN"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-Fluxtapoz": [
+ [
+ "ApplyRegionalConds",
+ "ConfigureModifiedFlux",
+ "CreateRegionalCond",
+ "FlowEditForwardSampler",
+ "FlowEditGuider",
+ "FlowEditReverseSampler",
+ "FlowEditSampler",
+ "FluxAttnOverride",
+ "FluxDeGuidance",
+ "FluxForwardODESampler",
+ "FluxInverseSampler",
+ "FluxNoiseMixer",
+ "FluxReverseODESampler",
+ "InFluxFlipSigmas",
+ "InFluxModelSamplingPred",
+ "OutFluxModelSamplingPred",
+ "PAGAttention",
+ "PrepareAttnBank",
+ "RFDoubleBlocksOverride",
+ "RFSingleBlocksOverride",
+ "RegionalStyleModelApply",
+ "SEGAttention"
+ ],
+ {
+ "title_aux": "ComfyUI-Fluxtapoz"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-InstanceDiffusion": [
+ [
+ "ApplyScaleUModelNode",
+ "DownloadInstanceDiffusionModels",
+ "InstanceDiffusionTrackingPrompt",
+ "LoadInstanceFusersNode",
+ "LoadInstancePositionNetModel",
+ "LoadInstanceScaleUModel",
+ "LoadInstanceScaleUNode"
+ ],
+ {
+ "title_aux": "InstanceDiffusion Nodes"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-InversedNoise": [
+ [
+ "CombineNoiseLatentNode",
+ "MixNoiseNode",
+ "SamplerInversedEulerNode"
+ ],
+ {
+ "title_aux": "ComfyUI-InversedNoise"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-MochiEdit": [
+ [
+ "MochiPrepareSigmas",
+ "MochiResampler",
+ "MochiUnsampler",
+ "MochiWrapperSamplerCustom"
+ ],
+ {
+ "title_aux": "ComfyUI-MochiEdit"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-MotionThiefExperiment": [
+ [
+ "ApplyRefMotionNode",
+ "MotionRefSettingsCustomNode",
+ "MotionRefSettingsDefaultNode"
+ ],
+ {
+ "title_aux": "ComfyUI-MotionThiefExperiment"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-RAVE_ATTN": [
+ [
+ "ApplyRaveAttentionNode",
+ "AttentionOverrideSD15Node",
+ "AttentionOverrideSDXLNode"
+ ],
+ {
+ "title_aux": "ComfyUI-RAVE Attention"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-ReNoise": [
+ [
+ "ReNoiseModelSamplingPred",
+ "ReNoiseSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-ReNoise"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-RefSampling": [
+ [
+ "ApplyRefContentNode",
+ "ApplyRefStyleNode",
+ "ApplyRefUNetNode"
+ ],
+ {
+ "title_aux": "ComfyUI-RefSampling"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-RefUNet": [
+ [
+ "ConfigRefMapAdv",
+ "ConfigureRefNet",
+ "CreateRefBank",
+ "CustomRefMapSD1",
+ "PrepareRefLatents",
+ "ReadSampler",
+ "RefModelSamplingPred",
+ "VisionClipEncode",
+ "WriteSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-RefUNet"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-SEGAttention": [
+ [
+ "SEGAttention"
+ ],
+ {
+ "title_aux": "ComfyUI-SEGAttention"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-SSREncoder": [
+ [
+ "ApplySSR",
+ "EncodeSSRQuery",
+ "LoadSSRAligner",
+ "LoadSSRAttention"
+ ],
+ {
+ "title_aux": "ComfyUI-SSREncoder"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-SeeCoder": [
+ [
+ "LoadSeeCoder",
+ "LoadSeeCoderUncond",
+ "SeecoderEncode"
+ ],
+ {
+ "title_aux": "ComfyUI-SeeCoder"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-TrackingNodes": [
+ [
+ "OpenPoseTrackerNode",
+ "YOLOTrackerNode"
+ ],
+ {
+ "title_aux": "Tracking Nodes for Videos"
+ }
+ ],
+ "https://github.com/logtd/ComfyUI-ViewCrafter": [
+ [
+ "ApplyViewCrafter",
+ "LoadViewCrafter"
+ ],
+ {
+ "title_aux": "ComfyUI-ViewCrafter"
+ }
+ ],
+ "https://github.com/lokinou/comfyui-better-flow": [
+ [
+ "AnyToHash",
+ "AnyToHashMulti",
+ "CacheAny",
+ "OffloadModelv2",
+ "RecallModelv2",
+ "RerouteTriggerable",
+ "Wait",
+ "WaitMulti"
+ ],
+ {
+ "title_aux": "ComfyUI-Better-Flow"
+ }
+ ],
+ "https://github.com/lokinou/comfyui-offload-models": [
+ [
+ "OffloadModel",
+ "RecallModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Offload-Models"
+ }
+ ],
+ "https://github.com/lonelyowl13/artist_randomizer": [
+ [
+ "AddRandomArtists",
+ "LoadArtists",
+ "TextInput"
+ ],
+ {
+ "title_aux": "Artist tag randomizer for comfyui"
+ }
+ ],
+ "https://github.com/longgui0318/comfyui-common-util": [
+ [
+ "Added Layer Info To Array",
+ "Enhanced Random Light Source",
+ "Float Relay",
+ "Hex to Color",
+ "Image Add Alpha",
+ "Image Relay",
+ "Image Remove Alpha",
+ "Image Resize With Padding",
+ "Init Layer Info Array",
+ "Int Relay",
+ "Layer Image Seleted",
+ "Layer Images IPAdapter Advanced",
+ "Layer Info Array Fuse",
+ "Mask Relay",
+ "String Relay"
+ ],
+ {
+ "title_aux": "comfyui-common-util"
+ }
+ ],
+ "https://github.com/longgui0318/comfyui-llm-assistant": [
+ [
+ "Chat With LLM",
+ "Generate Stable Diffsution Prompt With LLM",
+ "Translate Text With LLM"
+ ],
+ {
+ "title_aux": "comfyui-llm-assistant"
+ }
+ ],
+ "https://github.com/longgui0318/comfyui-magic-clothing": [
+ [
+ "Add Magic Clothing Attention",
+ "Change Pipeline Dtype And Device",
+ "Change Pixel Value Normalization",
+ "Diffusers Model Makeup &MC",
+ "Diffusers Scheduler Loader &MC",
+ "Load Magic Clothing Adapter",
+ "Load Magic Clothing Model",
+ "Load Magic Clothing Pipeline",
+ "Load Magic Clothing Pipeline With Path",
+ "RUN Magic Clothing Adapter",
+ "RUN Magic Clothing Diffusers Model"
+ ],
+ {
+ "title_aux": "comfyui-magic-clothing"
+ }
+ ],
+ "https://github.com/longgui0318/comfyui-mask-util": [
+ [
+ "Image Adaptive Crop M&R",
+ "Image Adaptive Crop With Mask",
+ "Image Change DType",
+ "Image Change Device",
+ "Image Resolution Adaptive With X",
+ "Image Resolution Limit With 8K",
+ "Load Image With Name",
+ "Mask Change DType",
+ "Mask Change Device",
+ "Mask Selection Of Masks",
+ "Model Change Device",
+ "Model Change Device Repeaters",
+ "Output Image To Input",
+ "Split Masks"
+ ],
+ {
+ "title_aux": "comfyui-mask-util"
+ }
+ ],
+ "https://github.com/loockluo/comfyui-whisperx-pro": [
+ [
+ "WhisperX SRT Generator"
+ ],
+ {
+ "title_aux": "ComfyUI WhisperX Pro"
+ }
+ ],
+ "https://github.com/lord-lethris/ComfyUI-RPG-Characters": [
+ [
+ "ModelLikenessSwitch",
+ "PromptConcatenatorNode",
+ "PromptConditioningConverter",
+ "PromptSelectorNode",
+ "RPGArtStyleSelector",
+ "RPGCharacterSelector",
+ "prompt_selector_node"
+ ],
+ {
+ "title_aux": "ComfyUI-RPG-Characters"
+ }
+ ],
+ "https://github.com/lordgasmic/comfyui_save_image_with_options": [
+ [
+ "SaveImageWithOptions"
+ ],
+ {
+ "title_aux": "comfyui_save_image_with_options"
+ }
+ ],
+ "https://github.com/lordgasmic/comfyui_wildcards": [
+ [
+ "CLIPTextEncodeWithWildcards"
+ ],
+ {
+ "title_aux": "comfyui_wildcards"
+ }
+ ],
+ "https://github.com/lovelybbq/comfyui-custom-node-color": [
+ [
+ "ConvertHEXToRGB",
+ "HexColorInput"
+ ],
+ {
+ "title_aux": "ComfyUI Custom Node Color"
+ }
+ ],
+ "https://github.com/lovisdotio/ComfyUI-Replace-First-Frame-Last-Frame": [
+ [
+ "ReplaceFirstLastFrames"
+ ],
+ {
+ "title_aux": "ComfyUI-Replace-First-Frame-Last-Frame"
+ }
+ ],
+ "https://github.com/loz2754/AUN-ComfyUI-Nodes": [
+ [
+ "AUNAddToPrompt",
+ "AUNAny",
+ "AUNBookmark",
+ "AUNBoolean",
+ "AUNCFG",
+ "AUNCheckpointLoaderWithClipSkip",
+ "AUNEmptyLatent",
+ "AUNExtractModelName",
+ "AUNExtractPowerLoras",
+ "AUNExtractWidgetValue",
+ "AUNGetActiveNodeTitle",
+ "AUNGetConnectedNodeTitles",
+ "AUNGraphScraper",
+ "AUNImageLoadResize",
+ "AUNImageResize",
+ "AUNImageSingleBatch3",
+ "AUNImg2Img",
+ "AUNImgLoader",
+ "AUNInputs",
+ "AUNInputsHybrid",
+ "AUNKSamplerPlusv3",
+ "AUNModelNamePass",
+ "AUNModelShorten",
+ "AUNMultiBypassIndex",
+ "AUNMultiGroupUniversal",
+ "AUNMultiMuteIndex",
+ "AUNMultiNegPrompt",
+ "AUNMultiUniversal",
+ "AUNNameCrop",
+ "AUNNodeStateController",
+ "AUNPathFilename",
+ "AUNPathFilenameVideo",
+ "AUNPathFilenameVideoResolved",
+ "AUNRandomAnySwitch",
+ "AUNRandomIndexSwitch",
+ "AUNRandomNumber",
+ "AUNRandomTextIndexSwitch",
+ "AUNSaveImage",
+ "AUNSaveVideo",
+ "AUNSetBypassByTitle",
+ "AUNSetBypassStateGroup",
+ "AUNSetCollapseAndBypassStateAdvanced",
+ "AUNSetMuteByTitle",
+ "AUNSetMuteStateGroup",
+ "AUNShowTextWithTitle",
+ "AUNSingleLabelSwitch",
+ "AUNStrip",
+ "AUNSwitchFloat",
+ "AUNTextIndexSwitch",
+ "AUNTextIndexSwitch3",
+ "AUNTitleImagePreview",
+ "AnyType(str)",
+ "AudioInputOptions",
+ "JNodes_AnyToString",
+ "JNodes_ConditioningInOut",
+ "JNodes_FloatLiteral",
+ "JNodes_GetCleanFilename",
+ "JNodes_GetComfyDirectory",
+ "JNodes_GetLeafDirectory",
+ "JNodes_GetOutputDirectory",
+ "JNodes_GetTempDirectory",
+ "JNodes_IntLiteral",
+ "JNodes_ModelInOut",
+ "JNodes_StringLiteral",
+ "JNodes_SubdirectorySelector",
+ "JoinVideosInDirectory",
+ "KSamplerInputs",
+ "MainFolderManualName",
+ "TextSwitch2InputWithTextOutput"
+ ],
+ {
+ "title_aux": "AUN ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/lquesada/ComfyUI-Inpaint-CropAndStitch": [
+ [
+ "InpaintCropImproved",
+ "InpaintStitchImproved"
+ ],
+ {
+ "title_aux": "ComfyUI-Inpaint-CropAndStitch"
+ }
+ ],
+ "https://github.com/lquesada/ComfyUI-Interactive": [
+ [
+ "InteractiveFloat",
+ "InteractiveInteger",
+ "InteractiveReset",
+ "InteractiveSave",
+ "InteractiveSeed",
+ "InteractiveSelector",
+ "InteractiveSelectorWithParameters",
+ "InteractiveString",
+ "InteractiveStringAppend",
+ "InteractiveStringMultiline",
+ "InteractiveSwitch",
+ "InteractiveSwitchWithParameters"
+ ],
+ {
+ "title_aux": "ComfyUI-Interactive"
+ }
+ ],
+ "https://github.com/lquesada/ComfyUI-Prompt-Combinator": [
+ [
+ "PromptCombinator",
+ "PromptCombinatorExportGallery",
+ "PromptCombinatorMerger",
+ "PromptCombinatorRandomPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Combinator"
+ }
+ ],
+ "https://github.com/lrzjason/ComfyUI-Watermark-Detection": [
+ [
+ "WatermarkDetector",
+ "WatermarkDetectorLoader"
+ ],
+ {
+ "title_aux": "ComfyUI Watermark Detection Node"
+ }
+ ],
+ "https://github.com/lrzjason/Comfyui-In-Context-Lora-Utils": [
+ [
+ "AddMaskForICLora",
+ "AutoPatch",
+ "ConcatContextWindow",
+ "CreateContextWindow"
+ ],
+ {
+ "title_aux": "Comfyui-In-Context-Lora-Utils"
+ }
+ ],
+ "https://github.com/lrzjason/Comfyui-Kolors-Utils": [
+ [
+ "SaveKolors",
+ "SaveWeightAsKolorsUnet"
+ ],
+ {
+ "title_aux": "Comfyui Kolors Utils"
+ }
+ ],
+ "https://github.com/lrzjason/Comfyui-LatentUtils": [
+ [
+ "HFEPostProcessor (lrzjason)",
+ "LatentFrequencyEnhancer_lrzjason"
+ ],
+ {
+ "title_aux": "Comfyui-LatentUtils"
+ }
+ ],
+ "https://github.com/lrzjason/Comfyui-LoraUtils": [
+ [
+ "ConvertLoraKeys",
+ "CreateLoraMappingJson",
+ "LoadLoraOnly",
+ "LoraAdd",
+ "LoraLayersOperation",
+ "LoraSimpleAdd",
+ "LoraStatViewer",
+ "MergeLoraToModel",
+ "SaveLora"
+ ],
+ {
+ "title_aux": "Comfyui-LoraUtils"
+ }
+ ],
+ "https://github.com/lrzjason/Comfyui-QwenEditUtils": [
+ [
+ "CropWithPadInfo",
+ "LoadImageReturnFilename",
+ "QwenEditAdaptiveLongestEdge",
+ "QwenEditAny2Image",
+ "QwenEditAny2Latent",
+ "QwenEditConfigJsonParser",
+ "QwenEditConfigPreparer",
+ "QwenEditListExtractor",
+ "QwenEditOutputExtractor",
+ "TextEncodeQwenImageEditPlusAdvance_lrzjason",
+ "TextEncodeQwenImageEditPlusCustom_lrzjason",
+ "TextEncodeQwenImageEditPlusPro_lrzjason",
+ "TextEncodeQwenImageEditPlus_lrzjason",
+ "TextEncodeQwenImageEdit_lrzjason"
+ ],
+ {
+ "title_aux": "Comfyui-QwenEditUtils"
+ }
+ ],
+ "https://github.com/lrzjason/Comfyui-ThinkRemover": [
+ [
+ "ThinkRemover"
+ ],
+ {
+ "title_aux": "Comfyui-ThinkRemover"
+ }
+ ],
+ "https://github.com/ltdrdata/ComfyUI-Impact-Pack": [
+ [
+ "AddMask",
+ "AnyPipeToBasic",
+ "BasicPipeToDetailerPipe",
+ "BasicPipeToDetailerPipeSDXL",
+ "BboxDetectorCombined_v2",
+ "BboxDetectorSEGS",
+ "BitwiseAndMask",
+ "BitwiseAndMaskForEach",
+ "BlackPatchRetryHookProvider",
+ "CLIPSegDetectorProvider",
+ "CfgScheduleHookProvider",
+ "CombineRegionalPrompts",
+ "CoreMLDetailerHookProvider",
+ "CustomSamplerDetailerHookProvider",
+ "DenoiseScheduleHookProvider",
+ "DenoiseSchedulerDetailerHookProvider",
+ "DetailerForEach",
+ "DetailerForEachAutoRetry",
+ "DetailerForEachDebug",
+ "DetailerForEachDebugPipe",
+ "DetailerForEachPipe",
+ "DetailerForEachPipeForAnimateDiff",
+ "DetailerHookCombine",
+ "DetailerPipeToBasicPipe",
+ "EditBasicPipe",
+ "EditDetailerPipe",
+ "EditDetailerPipeSDXL",
+ "EmptySegs",
+ "FaceDetailer",
+ "FaceDetailerPipe",
+ "FromBasicPipe",
+ "FromBasicPipe_v2",
+ "FromDetailerPipe",
+ "FromDetailerPipeSDXL",
+ "FromDetailerPipe_v2",
+ "GITSSchedulerFuncProvider",
+ "ImageListToImageBatch",
+ "ImageMaskSwitch",
+ "ImageReceiver",
+ "ImageSender",
+ "ImpactAssembleSEGS",
+ "ImpactBoolean",
+ "ImpactCombineConditionings",
+ "ImpactCompare",
+ "ImpactConcatConditionings",
+ "ImpactConditionalBranch",
+ "ImpactConditionalBranchSelMode",
+ "ImpactConditionalStopIteration",
+ "ImpactControlBridge",
+ "ImpactControlNetApplyAdvancedSEGS",
+ "ImpactControlNetApplySEGS",
+ "ImpactControlNetClearSEGS",
+ "ImpactConvertDataType",
+ "ImpactCount_Elts_in_SEGS",
+ "ImpactDecomposeSEGS",
+ "ImpactDilateMask",
+ "ImpactDilateMaskInSEGS",
+ "ImpactDilate_Mask_SEG_ELT",
+ "ImpactDummyInput",
+ "ImpactEdit_SEG_ELT",
+ "ImpactExecutionOrderController",
+ "ImpactFlattenMask",
+ "ImpactFloat",
+ "ImpactFrom_SEG_ELT",
+ "ImpactFrom_SEG_ELT_bbox",
+ "ImpactFrom_SEG_ELT_crop_region",
+ "ImpactGaussianBlurMask",
+ "ImpactGaussianBlurMaskInSEGS",
+ "ImpactHFTransformersClassifierProvider",
+ "ImpactIPAdapterApplySEGS",
+ "ImpactIfNone",
+ "ImpactImageBatchToImageList",
+ "ImpactImageInfo",
+ "ImpactInt",
+ "ImpactInversedSwitch",
+ "ImpactIsNotEmptySEGS",
+ "ImpactKSamplerAdvancedBasicPipe",
+ "ImpactKSamplerBasicPipe",
+ "ImpactLatentInfo",
+ "ImpactListBridge",
+ "ImpactLogger",
+ "ImpactLogicalOperators",
+ "ImpactMakeAnyList",
+ "ImpactMakeImageBatch",
+ "ImpactMakeImageList",
+ "ImpactMakeMaskBatch",
+ "ImpactMakeMaskList",
+ "ImpactMakeTileSEGS",
+ "ImpactMinMax",
+ "ImpactNeg",
+ "ImpactNegativeConditioningPlaceholder",
+ "ImpactNodeSetMuteState",
+ "ImpactQueueTrigger",
+ "ImpactQueueTriggerCountdown",
+ "ImpactRemoteBoolean",
+ "ImpactRemoteInt",
+ "ImpactSAM2VideoDetectorSEGS",
+ "ImpactSEGSClassify",
+ "ImpactSEGSConcat",
+ "ImpactSEGSIntersectionFilter",
+ "ImpactSEGSLabelAssign",
+ "ImpactSEGSLabelFilter",
+ "ImpactSEGSMerge",
+ "ImpactSEGSNMSFilter",
+ "ImpactSEGSOrderedFilter",
+ "ImpactSEGSPicker",
+ "ImpactSEGSRangeFilter",
+ "ImpactSEGSToMaskBatch",
+ "ImpactSEGSToMaskList",
+ "ImpactScaleBy_BBOX_SEG_ELT",
+ "ImpactSchedulerAdapter",
+ "ImpactSegsAndMask",
+ "ImpactSegsAndMaskForEach",
+ "ImpactSelectNthItemOfAnyList",
+ "ImpactSetWidgetValue",
+ "ImpactSimpleDetectorSEGS",
+ "ImpactSimpleDetectorSEGSPipe",
+ "ImpactSimpleDetectorSEGS_for_AD",
+ "ImpactSleep",
+ "ImpactStringSelector",
+ "ImpactSwitch",
+ "ImpactValueReceiver",
+ "ImpactValueSender",
+ "ImpactWildcardEncode",
+ "ImpactWildcardProcessor",
+ "IterativeImageUpscale",
+ "IterativeLatentUpscale",
+ "KSamplerAdvancedProvider",
+ "KSamplerProvider",
+ "LamaRemoverDetailerHookProvider",
+ "LatentPixelScale",
+ "LatentReceiver",
+ "LatentSender",
+ "LatentSwitch",
+ "MaskDetailerPipe",
+ "MaskListToMaskBatch",
+ "MaskRectArea",
+ "MaskRectAreaAdvanced",
+ "MaskToSEGS",
+ "MaskToSEGS_for_AnimateDiff",
+ "MasksToMaskList",
+ "MediaPipeFaceMeshToSEGS",
+ "NoiseInjectionDetailerHookProvider",
+ "NoiseInjectionHookProvider",
+ "ONNXDetectorProvider",
+ "ONNXDetectorSEGS",
+ "PixelKSampleHookCombine",
+ "PixelKSampleUpscalerProvider",
+ "PixelKSampleUpscalerProviderPipe",
+ "PixelTiledKSampleUpscalerProvider",
+ "PixelTiledKSampleUpscalerProviderPipe",
+ "PreviewBridge",
+ "PreviewBridgeLatent",
+ "PreviewDetailerHookProvider",
+ "ReencodeLatent",
+ "ReencodeLatentPipe",
+ "RegionalPrompt",
+ "RegionalSampler",
+ "RegionalSamplerAdvanced",
+ "RemoveImageFromSEGS",
+ "RemoveNoiseMask",
+ "SAMDetectorCombined",
+ "SAMDetectorSegmented",
+ "SAMLoader",
+ "SEGSDetailer",
+ "SEGSDetailerForAnimateDiff",
+ "SEGSLabelFilterDetailerHookProvider",
+ "SEGSOrderedFilterDetailerHookProvider",
+ "SEGSPaste",
+ "SEGSPreview",
+ "SEGSPreviewCNet",
+ "SEGSRangeFilterDetailerHookProvider",
+ "SEGSSwitch",
+ "SEGSToImageList",
+ "SEGSUpscaler",
+ "SEGSUpscalerPipe",
+ "SegmDetectorCombined_v2",
+ "SegmDetectorSEGS",
+ "Segs Mask",
+ "Segs Mask ForEach",
+ "SegsToCombinedMask",
+ "SetDefaultImageForSEGS",
+ "StepsScheduleHookProvider",
+ "StringListToString",
+ "SubtractMask",
+ "SubtractMaskForEach",
+ "TiledKSamplerProvider",
+ "ToBasicPipe",
+ "ToBinaryMask",
+ "ToDetailerPipe",
+ "ToDetailerPipeSDXL",
+ "TwoAdvancedSamplersForMask",
+ "TwoSamplersForMask",
+ "TwoSamplersForMaskUpscalerProvider",
+ "TwoSamplersForMaskUpscalerProviderPipe",
+ "UnsamplerDetailerHookProvider",
+ "UnsamplerHookProvider",
+ "VariationNoiseDetailerHookProvider",
+ "WildcardPromptFromString"
+ ],
+ {
+ "author": "Dr.Lt.Data",
+ "description": "This extension offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler.",
+ "nickname": "Impact Pack",
+ "preemptions": [
+ "SAMLoader"
+ ],
+ "title": "Impact Pack",
+ "title_aux": "ComfyUI Impact Pack"
+ }
+ ],
+ "https://github.com/ltdrdata/ComfyUI-Impact-Subpack": [
+ [
+ "UltralyticsDetectorProvider"
+ ],
+ {
+ "author": "Dr.Lt.Data",
+ "description": "This extension provides UltralyticsDetectorProvider node",
+ "nickname": "Impact Subpack",
+ "title": "Impact Subpack",
+ "title_aux": "ComfyUI Impact Subpack"
+ }
+ ],
+ "https://github.com/ltdrdata/ComfyUI-Inspire-Pack": [
+ [
+ "AnimeLineArt_Preprocessor_Provider_for_SEGS //Inspire",
+ "ApplyLBW //Inspire",
+ "ApplyRegionalIPAdapters //Inspire",
+ "BindImageListPromptList //Inspire",
+ "CLIPTextEncodeWithWeight //Inspire",
+ "CacheBackendData //Inspire",
+ "CacheBackendDataList //Inspire",
+ "CacheBackendDataNumberKey //Inspire",
+ "CacheBackendDataNumberKeyList //Inspire",
+ "Canny_Preprocessor_Provider_for_SEGS //Inspire",
+ "ChangeImageBatchSize //Inspire",
+ "ChangeLatentBatchSize //Inspire",
+ "CheckpointLoaderSimpleShared //Inspire",
+ "ColorMapToMasks //Inspire",
+ "ColorMaskToDepthMask //Inspire",
+ "Color_Preprocessor_Provider_for_SEGS //Inspire",
+ "CompositeNoise //Inspire",
+ "ConcatConditioningsWithMultiplier //Inspire",
+ "ConditioningStretch //Inspire",
+ "ConditioningUpscale //Inspire",
+ "DWPreprocessor_Provider_for_SEGS //Inspire",
+ "DropItems //Inspire",
+ "FakeScribblePreprocessor_Provider_for_SEGS //Inspire",
+ "FloatRange //Inspire",
+ "ForeachListBegin //Inspire",
+ "ForeachListEnd //Inspire",
+ "FromIPAdapterPipe //Inspire",
+ "GlobalSampler //Inspire",
+ "GlobalSeed //Inspire",
+ "HEDPreprocessor_Provider_for_SEGS //Inspire",
+ "HyperTile //Inspire",
+ "IPAdapterModelHelper //Inspire",
+ "ImageBatchSplitter //Inspire",
+ "InpaintPreprocessor_Provider_for_SEGS //Inspire",
+ "IsCached //Inspire",
+ "KSampler //Inspire",
+ "KSamplerAdvanced //Inspire",
+ "KSamplerAdvancedPipe //Inspire",
+ "KSamplerAdvancedProgress //Inspire",
+ "KSamplerPipe //Inspire",
+ "KSamplerProgress //Inspire",
+ "LatentBatchSplitter //Inspire",
+ "LeRes_DepthMap_Preprocessor_Provider_for_SEGS //Inspire",
+ "LineArt_Preprocessor_Provider_for_SEGS //Inspire",
+ "ListCounter //Inspire",
+ "LoadDiffusionModelShared //Inspire",
+ "LoadImage //Inspire",
+ "LoadImageListFromDir //Inspire",
+ "LoadImagesFromDir //Inspire",
+ "LoadLBW //Inspire",
+ "LoadPromptsFromDir //Inspire",
+ "LoadPromptsFromFile //Inspire",
+ "LoadSinglePromptFromFile //Inspire",
+ "LoadTextEncoderShared //Inspire",
+ "LoraBlockInfo //Inspire",
+ "LoraLoaderBlockWeight //Inspire",
+ "MakeBasicPipe //Inspire",
+ "MakeLBW //Inspire",
+ "Manga2Anime_LineArt_Preprocessor_Provider_for_SEGS //Inspire",
+ "MediaPipeFaceMeshDetectorProvider //Inspire",
+ "MediaPipe_FaceMesh_Preprocessor_Provider_for_SEGS //Inspire",
+ "MeshGraphormerDepthMapPreprocessorProvider_for_SEGS //Inspire",
+ "MiDaS_DepthMap_Preprocessor_Provider_for_SEGS //Inspire",
+ "OpenPose_Preprocessor_Provider_for_SEGS //Inspire",
+ "PromptBuilder //Inspire",
+ "PromptExtractor //Inspire",
+ "RGB_HexToHSV //Inspire",
+ "RandomGeneratorForList //Inspire",
+ "RandomNoise //Inspire",
+ "RegionalCFG //Inspire",
+ "RegionalConditioningColorMask //Inspire",
+ "RegionalConditioningSimple //Inspire",
+ "RegionalIPAdapterColorMask //Inspire",
+ "RegionalIPAdapterEncodedColorMask //Inspire",
+ "RegionalIPAdapterEncodedMask //Inspire",
+ "RegionalIPAdapterMask //Inspire",
+ "RegionalPromptColorMask //Inspire",
+ "RegionalPromptSimple //Inspire",
+ "RegionalSeedExplorerColorMask //Inspire",
+ "RegionalSeedExplorerMask //Inspire",
+ "RemoveBackendData //Inspire",
+ "RemoveBackendDataNumberKey //Inspire",
+ "RemoveControlNet //Inspire",
+ "RemoveControlNetFromRegionalPrompts //Inspire",
+ "RetrieveBackendData //Inspire",
+ "RetrieveBackendDataNumberKey //Inspire",
+ "SaveLBW //Inspire",
+ "ScheduledCFGGuider //Inspire",
+ "ScheduledPerpNegCFGGuider //Inspire",
+ "SeedExplorer //Inspire",
+ "SeedLogger //Inspire",
+ "SelectNthMask //Inspire",
+ "ShowCachedInfo //Inspire",
+ "StableCascade_CheckpointLoader //Inspire",
+ "TilePreprocessor_Provider_for_SEGS //Inspire",
+ "ToIPAdapterPipe //Inspire",
+ "UnzipPrompt //Inspire",
+ "WildcardEncode //Inspire",
+ "WorklistToItemList //Inspire",
+ "XY Input: Lora Block Weight //Inspire",
+ "ZipPrompt //Inspire"
+ ],
+ {
+ "author": "Dr.Lt.Data",
+ "description": "This extension provides various nodes to support Lora Block Weight, Regional Nodes, Backend Cache, Prompt Utils, List Utils and the Impact Pack.",
+ "nickname": "Inspire Pack",
+ "nodename_pattern": "Inspire$",
+ "title": "Inspire Pack",
+ "title_aux": "ComfyUI Inspire Pack"
+ }
+ ],
+ "https://github.com/ltdrdata/comfyui-connection-helper": [
+ [],
+ {
+ "author": "Dr.Lt.Data",
+ "description": "Helper",
+ "nickname": "Connection Helper",
+ "nodename_pattern": "Inspire$",
+ "title": "ComfyUI Connection Helper",
+ "title_aux": "ComfyUI Connection Helper"
+ }
+ ],
+ "https://github.com/ltdrdata/was-node-suite-comfyui": [
+ [
+ "BLIP Analyze Image",
+ "BLIP Model Loader",
+ "Blend Latents",
+ "Boolean To Text",
+ "Bounded Image Blend",
+ "Bounded Image Blend with Mask",
+ "Bounded Image Crop",
+ "Bounded Image Crop with Mask",
+ "Bus Node",
+ "CLIP Input Switch",
+ "CLIP Vision Input Switch",
+ "CLIPSEG2",
+ "CLIPSeg Batch Masking",
+ "CLIPSeg Masking",
+ "CLIPSeg Model Loader",
+ "CLIPTextEncode (BlenderNeko Advanced + NSP)",
+ "CLIPTextEncode (NSP)",
+ "Cache Node",
+ "Checkpoint Loader",
+ "Checkpoint Loader (Simple)",
+ "Conditioning Input Switch",
+ "Constant Number",
+ "Control Net Model Input Switch",
+ "Convert Masks to Images",
+ "Create Grid Image",
+ "Create Grid Image from Batch",
+ "Create Morph Image",
+ "Create Morph Image from Path",
+ "Create Video from Path",
+ "Debug Number to Console",
+ "Dictionary to Console",
+ "Diffusers Hub Model Down-Loader",
+ "Diffusers Model Loader",
+ "Export API",
+ "HSL to Hex",
+ "Hex to HSL",
+ "Image Analyze",
+ "Image Aspect Ratio",
+ "Image Batch",
+ "Image Blank",
+ "Image Blend",
+ "Image Blend by Mask",
+ "Image Blending Mode",
+ "Image Bloom Filter",
+ "Image Bounds",
+ "Image Bounds to Console",
+ "Image Canny Filter",
+ "Image Chromatic Aberration",
+ "Image Color Palette",
+ "Image Crop Face",
+ "Image Crop Location",
+ "Image Crop Square Location",
+ "Image Displacement Warp",
+ "Image Dragan Photography Filter",
+ "Image Edge Detection Filter",
+ "Image Film Grain",
+ "Image Filter Adjustments",
+ "Image Flip",
+ "Image Generate Gradient",
+ "Image Gradient Map",
+ "Image High Pass Filter",
+ "Image History Loader",
+ "Image Input Switch",
+ "Image Levels Adjustment",
+ "Image Load",
+ "Image Lucy Sharpen",
+ "Image Median Filter",
+ "Image Mix RGB Channels",
+ "Image Monitor Effects Filter",
+ "Image Nova Filter",
+ "Image Padding",
+ "Image Paste Crop",
+ "Image Paste Crop by Location",
+ "Image Paste Face",
+ "Image Perlin Noise",
+ "Image Perlin Power Fractal",
+ "Image Pixelate",
+ "Image Power Noise",
+ "Image Rembg (Remove Background)",
+ "Image Remove Background (Alpha)",
+ "Image Remove Color",
+ "Image Resize",
+ "Image Rotate",
+ "Image Rotate Hue",
+ "Image SSAO (Ambient Occlusion)",
+ "Image SSDO (Direct Occlusion)",
+ "Image Save",
+ "Image Seamless Texture",
+ "Image Select Channel",
+ "Image Select Color",
+ "Image Send HTTP",
+ "Image Shadows and Highlights",
+ "Image Size to Number",
+ "Image Stitch",
+ "Image Style Filter",
+ "Image Threshold",
+ "Image Tiled",
+ "Image Transpose",
+ "Image Voronoi Noise Filter",
+ "Image fDOF Filter",
+ "Image to Latent Mask",
+ "Image to Noise",
+ "Image to Seed",
+ "Images to Linear",
+ "Images to RGB",
+ "Inset Image Bounds",
+ "Integer place counter",
+ "KSampler (WAS)",
+ "KSampler Cycle",
+ "Latent Batch",
+ "Latent Input Switch",
+ "Latent Noise Injection",
+ "Latent Size to Number",
+ "Latent Upscale by Factor (WAS)",
+ "Load Cache",
+ "Load Image Batch",
+ "Load Lora",
+ "Load Text File",
+ "Logic Boolean",
+ "Logic Boolean Primitive",
+ "Logic Comparison AND",
+ "Logic Comparison OR",
+ "Logic Comparison XOR",
+ "Logic NOT",
+ "Lora Input Switch",
+ "Lora Loader",
+ "Mask Arbitrary Region",
+ "Mask Batch",
+ "Mask Batch to Mask",
+ "Mask Ceiling Region",
+ "Mask Crop Dominant Region",
+ "Mask Crop Minority Region",
+ "Mask Crop Region",
+ "Mask Dilate Region",
+ "Mask Dominant Region",
+ "Mask Erode Region",
+ "Mask Fill Holes",
+ "Mask Floor Region",
+ "Mask Gaussian Region",
+ "Mask Invert",
+ "Mask Minority Region",
+ "Mask Paste Region",
+ "Mask Rect Area",
+ "Mask Rect Area (Advanced)",
+ "Mask Smooth Region",
+ "Mask Threshold Region",
+ "Masks Add",
+ "Masks Combine Batch",
+ "Masks Combine Regions",
+ "Masks Subtract",
+ "MiDaS Depth Approximation",
+ "MiDaS Mask Image",
+ "MiDaS Model Loader",
+ "Model Input Switch",
+ "Number Counter",
+ "Number Input Condition",
+ "Number Input Switch",
+ "Number Multiple Of",
+ "Number Operation",
+ "Number PI",
+ "Number to Float",
+ "Number to Int",
+ "Number to Seed",
+ "Number to String",
+ "Number to Text",
+ "Prompt Multiple Styles Selector",
+ "Prompt Styles Selector",
+ "Random Number",
+ "SAM Image Mask",
+ "SAM Model Loader",
+ "SAM Parameters",
+ "SAM Parameters Combine",
+ "Samples Passthrough (Stat System)",
+ "Save Text File",
+ "Seed",
+ "String to Text",
+ "Tensor Batch to Image",
+ "Text Add Token by Input",
+ "Text Add Tokens",
+ "Text Compare",
+ "Text Concatenate",
+ "Text Contains",
+ "Text Dictionary Convert",
+ "Text Dictionary Get",
+ "Text Dictionary Keys",
+ "Text Dictionary New",
+ "Text Dictionary To Text",
+ "Text Dictionary Update",
+ "Text File History Loader",
+ "Text Find",
+ "Text Find and Replace",
+ "Text Find and Replace Input",
+ "Text Find and Replace by Dictionary",
+ "Text Input Switch",
+ "Text List",
+ "Text List Concatenate",
+ "Text List to Text",
+ "Text Load Line From File",
+ "Text Multiline",
+ "Text Multiline (Code Compatible)",
+ "Text Parse A1111 Embeddings",
+ "Text Parse Noodle Soup Prompts",
+ "Text Parse Tokens",
+ "Text Random Line",
+ "Text Random Prompt",
+ "Text Shuffle",
+ "Text Sort",
+ "Text String",
+ "Text String Truncate",
+ "Text to Conditioning",
+ "Text to Console",
+ "Text to Number",
+ "Text to String",
+ "True Random.org Number Generator",
+ "Upscale Model Loader",
+ "Upscale Model Switch",
+ "VAE Input Switch",
+ "Video Dump Frames",
+ "Write to GIF",
+ "Write to Video",
+ "unCLIP Checkpoint Loader"
+ ],
+ {
+ "title_aux": "WAS Node Suite (Revised)"
+ }
+ ],
+ "https://github.com/lthero-big/ComfyUI-GaussianShadingWatermark": [
+ [
+ "DPR_Extractor",
+ "DPR_GS_Latent",
+ "DPR_KSamplerAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-GaussianShadingWatermark"
+ }
+ ],
+ "https://github.com/luandev/ComfyUI-CrewAI": [
+ [
+ "DisplayText",
+ "\ud83d\udcceCrewAI Agent",
+ "\ud83d\udcceCrewAI Agent List",
+ "\ud83d\udcceCrewAI Crew",
+ "\ud83d\udcceCrewAI LLM Chat GPT",
+ "\ud83d\udcceCrewAI LLM Hugging Face",
+ "\ud83d\udcceCrewAI LLM Ollama",
+ "\ud83d\udcceCrewAI LLM OpenAI",
+ "\ud83d\udcceCrewAI Task",
+ "\ud83d\udcceCrewAI Task List",
+ "\ud83d\udcceCrewAI Text"
+ ],
+ {
+ "title_aux": "ComfyUI CrewAI"
+ }
+ ],
+ "https://github.com/lucasgattas/ComfyUI-Egregora-Audio-Super-Resolution": [
+ [
+ "ABX Judge",
+ "ABX Prepare",
+ "Audio Align (XCorr)",
+ "Audio Gain Match",
+ "Audio Gain Match (1770)",
+ "Audio Null Test",
+ "Audio Plotter",
+ "EgregoraAudioUpscaler",
+ "EgregoraFatLlamaCPU",
+ "EgregoraFatLlamaGPU",
+ "Egregora_DAC_Decode",
+ "Egregora_DAC_Encode",
+ "Egregora_DeepFilterNet_Denoise",
+ "Egregora_RNNoise_Denoise",
+ "Egregora_WPE_Dereverb",
+ "Loudness Meter (BS1770)",
+ "Metrics (LSD + SI-SDR)",
+ "Null Test (Full)",
+ "Resample Audio (HQ)"
+ ],
+ {
+ "title_aux": "ComfyUI \u00b7 Egregora Audio Super\u2011Resolution"
+ }
+ ],
+ "https://github.com/lucasgattas/ComfyUI-Egregora-Frames-Animation-Nodes": [
+ [
+ "AdvancedBatchLoader",
+ "BatchAnimationProcessor",
+ "BatchMultiFolderProcessor",
+ "MultiFormatAnimationEncoder",
+ "VideoFrameExtractor"
+ ],
+ {
+ "title_aux": "Egregora Frames Animation Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/lucasgattas/comfyui-egregora-divide-and-enhance": [
+ [
+ "Egregora Algorithm",
+ "Egregora Analyze Content",
+ "Egregora Combine",
+ "Egregora Divide and Select",
+ "Egregora Preview",
+ "Egregora Turbo Prompt"
+ ],
+ {
+ "title_aux": "ComfyUI \u00b7 Egregora: Divide & Enhance"
+ }
+ ],
+ "https://github.com/lujiazho/ComfyUI-CatvtonFluxWrapper": [
+ [
+ "CatvtonFluxSampler",
+ "LoadCatvtonFlux",
+ "LoadCatvtonFluxLoRA",
+ "ModelPrinter"
+ ],
+ {
+ "title_aux": "ComfyUI-CatvtonFluxWrapper"
+ }
+ ],
+ "https://github.com/luke-mino-altherr/ComfyUI-LatentReverb": [
+ [
+ "LatentReverb"
+ ],
+ {
+ "title_aux": "ComfyUI-Latent-Reverb"
+ }
+ ],
+ "https://github.com/lum3on/ComfyUI-FrameUtilitys": [
+ [
+ "FrameClipper",
+ "FrameExtender",
+ "FrameExtenderAdvanced",
+ "FrameRepeater",
+ "FrameReplacer",
+ "GitInstaller"
+ ],
+ {
+ "title_aux": "ComfyUI-FrameUtilitys"
+ }
+ ],
+ "https://github.com/lum3on/ComfyUI-ModelQuantizer": [
+ [
+ "ControlNetFP8QuantizeNode",
+ "ControlNetMetadataViewerNode",
+ "GGUFQuantizerNode",
+ "ModelToStateDict",
+ "QuantizeFP8Format",
+ "QuantizeModel",
+ "SaveAsSafeTensor"
+ ],
+ {
+ "title_aux": "ComfyUI-ModelQuantizer"
+ }
+ ],
+ "https://github.com/lum3on/ComfyUI-StableAudioX": [
+ [
+ "AudioXAdvancedVolumeControl",
+ "AudioXAudioProcessor",
+ "AudioXEnhancedTextToAudio",
+ "AudioXEnhancedTextToMusic",
+ "AudioXEnhancedVideoToAudio",
+ "AudioXModelLoader",
+ "AudioXMultiModalGeneration",
+ "AudioXPromptHelper",
+ "AudioXTextToAudio",
+ "AudioXTextToMusic",
+ "AudioXVideoAudioCombiner",
+ "AudioXVideoMuter",
+ "AudioXVideoToAudio",
+ "AudioXVideoToMusic",
+ "AudioXVolumeControl"
+ ],
+ {
+ "title_aux": "ComfyUI-AudioX"
+ }
+ ],
+ "https://github.com/lum3on/ComfyUI_MJ-Scraper": [
+ [
+ "MJScraper"
+ ],
+ {
+ "title_aux": "ComfyUI Midjourney Scraper Node"
+ }
+ ],
+ "https://github.com/lum3on/ComfyUI_NativeBlockSwap": [
+ [
+ "wanBlockSwap"
+ ],
+ {
+ "title_aux": "ComfyUI_NativeBlockSwap"
+ }
+ ],
+ "https://github.com/lum3on/ComfyUI_Reve-API": [
+ [
+ "ReveAPI"
+ ],
+ {
+ "title_aux": "ComfyUI Reve API Integration Node"
+ }
+ ],
+ "https://github.com/lum3on/comfyui_EdgeTAM": [
+ [
+ "EdgeTAMVideoTracker",
+ "InteractiveMaskEditor"
+ ],
+ {
+ "title_aux": "comfyui_EdgeTAM"
+ }
+ ],
+ "https://github.com/lum3on/comfyui_HiDream-Sampler": [
+ [
+ "HiDreamImg2Img",
+ "HiDreamSampler",
+ "HiDreamSamplerAdvanced"
+ ],
+ {
+ "title_aux": "HiDream Sampler"
+ }
+ ],
+ "https://github.com/lum3on/comfyui_LLM_Polymath": [
+ [
+ "ConceptEraserNode",
+ "flux_context_preset",
+ "polymath_SaveAbsolute",
+ "polymath_StringListPicker",
+ "polymath_TextSplitter",
+ "polymath_chat",
+ "polymath_helper",
+ "polymath_scraper",
+ "polymath_settings",
+ "polymath_text_mask"
+ ],
+ {
+ "title_aux": "comfyui_LLM_Polymath"
+ }
+ ],
+ "https://github.com/lumalabs/ComfyUI-LumaAI-API": [
+ [
+ "CharacterReference",
+ "ConcatReferences",
+ "ImgBBUpload",
+ "LumaAIClient",
+ "LumaAddAudio2Video",
+ "LumaCharacterReference",
+ "LumaConcatReferences",
+ "LumaExtendGeneration",
+ "LumaImage2Video",
+ "LumaImageGeneration",
+ "LumaInterpolateGenerations",
+ "LumaModifyImage",
+ "LumaPreviewVideo",
+ "LumaReference",
+ "LumaText2Video",
+ "LumaUpscaleGeneration",
+ "Reference"
+ ],
+ {
+ "title_aux": "ComfyUI-LumaAI-API"
+ }
+ ],
+ "https://github.com/lunarring/bitalino_comfy": [
+ [
+ "LR BitalinoReceiver"
+ ],
+ {
+ "title_aux": "bitalino_comfy"
+ }
+ ],
+ "https://github.com/luoq24/ydem_nodes": [
+ [
+ "YDemExampleNode",
+ "YDemFaceDirection",
+ "YDemImageProcessor"
+ ],
+ {
+ "title_aux": "ydem_nodes"
+ }
+ ],
+ "https://github.com/luxdelux7/ComfyUI-Forbidden-Vision": [
+ [
+ "ForbiddenVisionFaceEditMerge",
+ "ForbiddenVisionFaceEditPrep",
+ "ForbiddenVisionFaceFixerMaskOnly",
+ "ForbiddenVisionFaceProcessorIntegrated",
+ "ForbiddenVisionInpaintLite",
+ "ForbiddenVisionRebuilder",
+ "LatentBuilder",
+ "LatentRefiner",
+ "SamplerSchedulerSettings"
+ ],
+ {
+ "nodename_pattern": "ForbiddenVision",
+ "title_aux": "Forbidden Vision"
+ }
+ ],
+ "https://github.com/lxe/ComfyUI-OpenAI-Compat-LLM-Node": [
+ [
+ "OpenAILLMNode"
+ ],
+ {
+ "title_aux": "ComfyUI OpenAI Compatible LLM Node"
+ }
+ ],
+ "https://github.com/m-sokes/ComfyUI-Sokes-Nodes": [
+ [
+ "ComfyUI Folder Paths | sokes \ud83e\uddac",
+ "Current Date and Time | sokes \ud83e\uddac",
+ "Generate Random Background | sokes \ud83e\uddac",
+ "Get Files in Folder with Extension | sokes \ud83e\uddac",
+ "Hex Color Swatch | sokes \ud83e\uddac",
+ "Hex to Color Name | sokes \ud83e\uddac",
+ "Image Picker | sokes \ud83e\uddac",
+ "Latent Switch x9 | sokes \ud83e\uddac",
+ "Load Random Image | sokes \ud83e\uddac",
+ "Random Hex Color | sokes \ud83e\uddac",
+ "Random Number | sokes \ud83e\uddac",
+ "Replace Text with RegEx | sokes \ud83e\uddac",
+ "Runpod Serverless | sokes \ud83e\uddac",
+ "Street View Loader | sokes \ud83e\uddac"
+ ],
+ {
+ "title_aux": "ComfyUI Sokes Nodes \ud83e\uddac"
+ }
+ ],
+ "https://github.com/m3rr/h4_ToolKit": [
+ [
+ "h4AxisDriver",
+ "h4DebugATron3000",
+ "h4DebugATron3000Console",
+ "h4DebugATronRouter",
+ "h4ExecutionLogger",
+ "h4PlotXY",
+ "h4SeedBroadcaster",
+ "h4Varianator"
+ ],
+ {
+ "title_aux": "h4 ToolKit"
+ }
+ ],
+ "https://github.com/maepopi/Diffusers-in-ComfyUI": [
+ [
+ "BLoRALoader",
+ "GenerateImg2Image",
+ "GenerateInpaintImage",
+ "GenerateTxt2Image",
+ "Img2ImgStableDiffusionPipeline",
+ "InpaintingStableDiffusionPipeline",
+ "LoRALoader",
+ "MakeCanny",
+ "Text2ImgStableDiffusionPipeline"
+ ],
+ {
+ "title_aux": "Diffusers-in-ComfyUI"
+ }
+ ],
+ "https://github.com/magekinnarus/ComfyUI-V-Prediction-Node": [
+ [
+ "AddParam"
+ ],
+ {
+ "title_aux": "ComfyUI-V-Prediction-Node"
+ }
+ ],
+ "https://github.com/magic-eraser-org/ComfyUI-Unwatermark": [
+ [
+ "Remove Watermark"
+ ],
+ {
+ "title_aux": "ComfyUI-Unwatermark"
+ }
+ ],
+ "https://github.com/maikgreubel/comfyui-loaddds": [
+ [
+ "Load DDS File"
+ ],
+ {
+ "title_aux": "Load DDS File Node"
+ }
+ ],
+ "https://github.com/malkuthro/ComfyUI-Koolook": [
+ [
+ "EasyAIPipeline",
+ "EasyResize",
+ "EasyWan22Prompt",
+ "Easy_Version",
+ "KoolookLoadCameraPosesAbsolute",
+ "WanVideoFunCameraEmbeds",
+ "easy_ImageBatch"
+ ],
+ {
+ "title_aux": "ComfyUI-Koolook"
+ }
+ ],
+ "https://github.com/mamorett/ComfyUI-Flux2proReplicate": [
+ [
+ "Flux2ProGenerator",
+ "ReplicateAuthNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Flux2proReplicate"
+ }
+ ],
+ "https://github.com/mamorett/ComfyUI_minicpmv4": [
+ [
+ "GenCheckerImage",
+ "MiniCPMV4GGUFLoader",
+ "MiniCPMV4VisionInfer",
+ "VisionPromptBuilder"
+ ],
+ {
+ "title_aux": "MiniCPM\u2011V\u20114 (GGUF) for ComfyUI"
+ }
+ ],
+ "https://github.com/mang01010/MangoNodePack": [
+ [
+ "CompositeMangoLoader",
+ "FluxGuidanceMango",
+ "FluxSamplerMango",
+ "ImageSaverMango",
+ "KSamplerMango",
+ "LatentImageMango",
+ "LoraStackMango",
+ "MangoImageLoader",
+ "MangoLoader",
+ "MangoLoader10Loras",
+ "MangoModelData",
+ "MangoPromptLoad",
+ "MangoTriggerExporter",
+ "PromptEmbedMango",
+ "PromptMango",
+ "PromptSave"
+ ],
+ {
+ "title_aux": "Mango Node Pack"
+ }
+ ],
+ "https://github.com/mango-rgb/ComfyUI-Mango-Random-node": [
+ [
+ "RandomFilePathNode",
+ "RandomImageNode",
+ "RandomImagePathNode",
+ "RandomTextNode",
+ "RandomVideoPathNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Mango-Random"
+ }
+ ],
+ "https://github.com/mangobyed/ComfyUI_Detection_List": [
+ [
+ "YOLOv8ObjectDetectionNode"
+ ],
+ {
+ "title_aux": "ComfyUI YOLOv8 Object Detection Node"
+ }
+ ],
+ "https://github.com/manifestations/comfyui-globetrotter": [
+ [
+ "LoRATrainerNode",
+ "OllamaLLMNode",
+ "OllamaVisionNode",
+ "TextCombinerNode"
+ ],
+ {
+ "title_aux": "ComfyUI Globetrotter Nodes"
+ }
+ ],
+ "https://github.com/mape/ComfyUI-mape-Helpers": [
+ [
+ "mape Variable"
+ ],
+ {
+ "author": "mape",
+ "description": "Various QoL improvements like prompt tweaking, variable assignment, image preview, fuzzy search, error reporting, organizing and node navigation.",
+ "nickname": "\ud83d\udfe1 mape's helpers",
+ "title": "mape's helpers",
+ "title_aux": "mape's helpers"
+ }
+ ],
+ "https://github.com/maracman/ComfyUI-SubjectStyle-CSV": [
+ [
+ "CSVPromptProcessor"
+ ],
+ {
+ "title_aux": "ComfyUI-SubjectStyle-CSV"
+ }
+ ],
+ "https://github.com/marawan206/ComfyUI-FaceCropper": [
+ [
+ "NodoFaceCropping"
+ ],
+ {
+ "title_aux": "Face Cropper Node (2:3 Ratio)"
+ }
+ ],
+ "https://github.com/marco-zanella/ComfyUI-BooleanExpression": [
+ [
+ "BooleanExpression.And",
+ "BooleanExpression.ArithmenticComparison.BinaryComparison",
+ "BooleanExpression.ArithmenticComparison.EqualTo",
+ "BooleanExpression.ArithmenticComparison.GreaterThan",
+ "BooleanExpression.ArithmenticComparison.GreaterThanOrEqualTo",
+ "BooleanExpression.ArithmenticComparison.LessThan",
+ "BooleanExpression.ArithmenticComparison.LessThanOrEqualTo",
+ "BooleanExpression.ArithmenticComparison.NotEqualTo",
+ "BooleanExpression.BinaryExpression",
+ "BooleanExpression.ConditionalBranch",
+ "BooleanExpression.False",
+ "BooleanExpression.Nand",
+ "BooleanExpression.Nor",
+ "BooleanExpression.Not",
+ "BooleanExpression.Or",
+ "BooleanExpression.StringComparison.AlphabeticalEqualTo",
+ "BooleanExpression.StringComparison.AlphabeticalGreaterThan",
+ "BooleanExpression.StringComparison.AlphabeticalGreaterThanOrEqualTo",
+ "BooleanExpression.StringComparison.AlphabeticalLessThan",
+ "BooleanExpression.StringComparison.AlphabeticalLessThanOrEqualTo",
+ "BooleanExpression.StringComparison.AlphabeticalNotEqualTo",
+ "BooleanExpression.StringComparison.Contains",
+ "BooleanExpression.StringComparison.EndsWith",
+ "BooleanExpression.StringComparison.NotContains",
+ "BooleanExpression.StringComparison.NotEndsWith",
+ "BooleanExpression.StringComparison.NotStartsWith",
+ "BooleanExpression.StringComparison.StartsWith",
+ "BooleanExpression.StringComparison.StringComparison",
+ "BooleanExpression.True",
+ "BooleanExpression.Xor"
+ ],
+ {
+ "title_aux": "ComfyUI-BooleanExpression"
+ }
+ ],
+ "https://github.com/marcoc2/ComfyUI-AnotherUtils": [
+ [
+ "AdaptiveNoise",
+ "CIELChNoiseGEGLLike",
+ "CharacterConstructor",
+ "CharacterRandomizer",
+ "CustomCrop",
+ "FightingGameCharacter",
+ "ImageTypeDetector",
+ "LastImage",
+ "LoadImageRemoveAlpha",
+ "LoadImagesOriginal",
+ "MeanCurvatureBlurGEGLLike",
+ "NearestUpscale",
+ "PixelArtConverter",
+ "PixelArtConverterParallel",
+ "PixelArtNormalizer",
+ "RGBNoiseGEGLLike",
+ "RemoveAlpha",
+ "SmartResize",
+ "WalkingPoseGenerator"
+ ],
+ {
+ "title_aux": "Image Processing Suite for ComfyUI"
+ }
+ ],
+ "https://github.com/marcoc2/ComfyUI_CogView4-6B_diffusers": [
+ [
+ "CogView4Generator"
+ ],
+ {
+ "title_aux": "ComfyUI-Cog"
+ }
+ ],
+ "https://github.com/marduk191/ComfyUI-Fluxpromptenhancer": [
+ [
+ "FluxPromptEnhance"
+ ],
+ {
+ "title_aux": "Flux Prompt Enhance Node for ComfyUI"
+ }
+ ],
+ "https://github.com/marduk191/ComfyUI_LFM2-350M": [
+ [
+ "LFM2Generator",
+ "LFM2Loader"
+ ],
+ {
+ "title_aux": "ComfyUI_LFM2-350M"
+ }
+ ],
+ "https://github.com/marduk191/comfyui-marnodes": [
+ [
+ "ImageToDevice",
+ "marduk191_5_text_string",
+ "marduk191_5way_text_switch",
+ "marduk191_s_random_latent",
+ "marduk191_workflow_settings"
+ ],
+ {
+ "author": "\u02f6marduk191",
+ "description": "marduk191s nodes.",
+ "nickname": "marduk191 workflow settings",
+ "title": "marduk191 workflow settings",
+ "title_aux": "marduk191 workflow settings"
+ }
+ ],
+ "https://github.com/marduk191/comfyui_qwen_runninghub": [
+ [
+ "RunningHubImageEnhancer",
+ "RunningHubImageToImage",
+ "RunningHubImageToVideo",
+ "RunningHubLoadImage",
+ "RunningHubTextToImage"
+ ],
+ {
+ "title_aux": "comfyui_qwen_runninghub"
+ }
+ ],
+ "https://github.com/marhensa/sdxl-recommended-res-calc": [
+ [
+ "RecommendedResCalc"
+ ],
+ {
+ "title_aux": "Recommended Resolution Calculator"
+ }
+ ],
+ "https://github.com/marklieberman/ComfyUI-Liebs-Picker": [
+ [
+ "LiebsPicker",
+ "LiebsPickerSEGS"
+ ],
+ {
+ "title_aux": "ComfyUI-Liebs-Picker"
+ }
+ ],
+ "https://github.com/marklieberman/ComfyUI-Liebs-Title": [
+ [
+ "LiebsTitleVar"
+ ],
+ {
+ "title_aux": "ComfyUI-Liebs-Title"
+ }
+ ],
+ "https://github.com/marklieberman/ComfyUI-Liebs-Toast": [
+ [
+ "LiebsToast"
+ ],
+ {
+ "title_aux": "ComfyUI-Liebs-Toast"
+ }
+ ],
+ "https://github.com/markuryy/ComfyUI-Flux-Prompt-Saver": [
+ [
+ "FluxPromptSaver",
+ "FluxTextSampler",
+ "ModelName"
+ ],
+ {
+ "title_aux": "ComfyUI Flux Prompt Saver"
+ }
+ ],
+ "https://github.com/markuryy/ComfyUI-Simple-Video-XY-Plot": [
+ [
+ "VideoXYPlotSampler"
+ ],
+ {
+ "title_aux": "Video XY Plot"
+ }
+ ],
+ "https://github.com/markuryy/ComfyUI-SuperLoader": [
+ [
+ "Display String",
+ "Display String Multiline",
+ "LoRA Metadata"
+ ],
+ {
+ "title_aux": "Super Loader"
+ }
+ ],
+ "https://github.com/martijnat/comfyui-previewlatent": [
+ [
+ "LatentToRGB",
+ "PreviewLatent",
+ "PreviewLatentAdvanced",
+ "PreviewLatentFlux",
+ "PreviewLatentXL"
+ ],
+ {
+ "title_aux": "comfyui-previewlatent"
+ }
+ ],
+ "https://github.com/martin-rizzo/ComfyUI-ZImagePowerNodes": [
+ [
+ "EmptyZImageLatentImage",
+ "IllustrationStylePromptEncoder",
+ "MyTop10Styles",
+ "MyTop10StylesEditor",
+ "PhotoStylePromptEncoder",
+ "SaveImage",
+ "StylePromptEncoder",
+ "StyleStringInjector",
+ "ZSamplerTurbo"
+ ],
+ {
+ "title_aux": "ComfyUI-ZImagePowerNodes"
+ }
+ ],
+ "https://github.com/massao000/ComfyUI_aspect_ratios": [
+ [
+ "Aspect Ratios Node"
+ ],
+ {
+ "title_aux": "ComfyUI_aspect_ratios"
+ }
+ ],
+ "https://github.com/matan1905/ComfyUI-Serving-Toolkit": [
+ [
+ "AlwaysExecute",
+ "CommandPickerServing",
+ "DiscordServing",
+ "HTTPServing",
+ "ServingInputImage",
+ "ServingInputImageAsLatent",
+ "ServingInputNumber",
+ "ServingInputText",
+ "ServingInputTextImage",
+ "ServingMultiImageOutput",
+ "ServingOutput",
+ "ServingTextOutput",
+ "TelegramServing",
+ "WebSocketServing"
+ ],
+ {
+ "title_aux": "ComfyUI Serving toolkit"
+ }
+ ],
+ "https://github.com/matorzhin/milan-nodes-comfyui": [
+ [
+ "LoadMultipleImagesExtended",
+ "LoadOneImageExtended"
+ ],
+ {
+ "title_aux": "milan-nodes-comfyui"
+ }
+ ],
+ "https://github.com/matthewfriedrichs/ComfyUI-ThoughtBubble": [
+ [
+ "ThoughtBubbleNode"
+ ],
+ {
+ "title_aux": "Thought Bubble"
+ }
+ ],
+ "https://github.com/mattjohnpowell/comfyui-lmstudio-image-to-text-node": [
+ [
+ "Expo Lmstudio Image To Text",
+ "Expo Lmstudio Text Generation",
+ "Expo Lmstudio Unified",
+ "ExpoLmstudioImageToText",
+ "ExpoLmstudioTextGeneration",
+ "ExpoLmstudioUnified"
+ ],
+ {
+ "author": "Matt John Powell",
+ "description": "This extension provides three custom nodes for ComfyUI that integrate LM Studio's capabilities:",
+ "nickname": "LM Studio Nodes",
+ "title": "LM Studio Nodes for ComfyUI",
+ "title_aux": "LM Studio Image to Text Node for ComfyUI"
+ }
+ ],
+ "https://github.com/mav-rik/facerestore_cf": [
+ [
+ "CropFace",
+ "FaceRestoreCFWithModel",
+ "FaceRestoreModelLoader"
+ ],
+ {
+ "title_aux": "Facerestore CF (Code Former)"
+ }
+ ],
+ "https://github.com/max-dingsda/OllamaTools": [
+ [
+ "OllamaPicDescriber",
+ "OllamaPromptBooster",
+ "PromptStylist"
+ ],
+ {
+ "title_aux": "OllamaTools for ComfyUI"
+ }
+ ],
+ "https://github.com/maxczc/comfyui-sora-node": [
+ [
+ "SoraImageToVideo",
+ "SoraTextToVideo",
+ "SoraVideoToVideo"
+ ],
+ {
+ "title_aux": "comfyui-sora-node"
+ }
+ ],
+ "https://github.com/maximilianwicen/ComfyUI-MaxTools": [
+ [
+ "MaxQuickImageSize"
+ ],
+ {
+ "title_aux": "ComfyUI-MaxTools"
+ }
+ ],
+ "https://github.com/maxious/comfyui-dap": [
+ [
+ "DAP_ERP_to_Cubemap",
+ "DAP_Inference",
+ "DAP_Loader",
+ "DAP_Normal_Map",
+ "DAP_Panoramic_Mesh"
+ ],
+ {
+ "title_aux": "comfyui-dap"
+ }
+ ],
+ "https://github.com/maxmad62/ComfyUI-DiscordWebhookWithInput": [
+ [
+ "DiscordPostViaWebhook",
+ "DiscordPostViaWebhookWithInput",
+ "DiscordSetWebhook"
+ ],
+ {
+ "author": "Dayuppy",
+ "description": "A very simple Discord webhook integration node for ComfyUI that lets you post images and text.",
+ "nickname": "DiscordWebhook",
+ "title": "Discord Webhook",
+ "title_aux": "ComfyUI-DiscordWebhookWithInput"
+ }
+ ],
+ "https://github.com/mayunejie/ComfyUI-Allen-Yinpin": [
+ [
+ "AllenYinpin"
+ ],
+ {
+ "title_aux": "ComfyUI-Allen-Yinpin"
+ }
+ ],
+ "https://github.com/mbrostami/ComfyUI-HF": [
+ [
+ "GPT2Node"
+ ],
+ {
+ "title_aux": "ComfyUI-HF"
+ }
+ ],
+ "https://github.com/mbrostami/ComfyUI-TITrain": [
+ [
+ "TextualInversionTraining"
+ ],
+ {
+ "title_aux": "ComfyUI-TITrain"
+ }
+ ],
+ "https://github.com/mcDandy/more_math": [
+ [
+ "mrmth_AudioMathNode",
+ "mrmth_AudioToImageSpectrogram",
+ "mrmth_BoolToInt",
+ "mrmth_CLIPMathNode",
+ "mrmth_ConditioningMathNode",
+ "mrmth_FloatMathNode",
+ "mrmth_FloatToInt",
+ "mrmth_ImageMathNode",
+ "mrmth_ImageSpectrogramToAudio",
+ "mrmth_IntToBool",
+ "mrmth_IntToFloat",
+ "mrmth_LatentMathNode",
+ "mrmth_MaskMathNode",
+ "mrmth_ModelMathNode",
+ "mrmth_NoiseMathNode",
+ "mrmth_VAEMathNode",
+ "mrmth_VideoMathNode",
+ "mrmth_ag_AudioMathNode",
+ "mrmth_ag_CLIPMathNode",
+ "mrmth_ag_ConditioningMathNode",
+ "mrmth_ag_FloatMathNode",
+ "mrmth_ag_GuiderMathNode",
+ "mrmth_ag_ImageMathNode",
+ "mrmth_ag_LatentMathNode",
+ "mrmth_ag_MaskMathNode",
+ "mrmth_ag_ModelMathNode",
+ "mrmth_ag_NoiseMathNode",
+ "mrmth_ag_SigmasMathNode",
+ "mrmth_ag_VAEMathNode",
+ "mrmth_ag_VideoMathNode"
+ ],
+ {
+ "title_aux": "More Math"
+ }
+ ],
+ "https://github.com/mcmonkeyprojects/sd-dynamic-thresholding": [
+ [
+ "DynamicThresholdingFull",
+ "DynamicThresholdingSimple"
+ ],
+ {
+ "title_aux": "Dynamic Thresholding"
+ }
+ ],
+ "https://github.com/meanin2/comfyui-MGnodes": [
+ [
+ "FluxKontextDiffMerge",
+ "ImageWatermarkNode",
+ "TextExtractorNode"
+ ],
+ {
+ "title_aux": "comfyui-MGnodes"
+ }
+ ],
+ "https://github.com/meap158/ComfyUI-Background-Replacement": [
+ [
+ "BackgroundReplacement",
+ "ImageComposite"
+ ],
+ {
+ "title_aux": "ComfyUI-Background-Replacement"
+ }
+ ],
+ "https://github.com/meap158/ComfyUI-GPU-temperature-protection": [
+ [
+ "GPUTemperatureProtection"
+ ],
+ {
+ "title_aux": "GPU temperature protection"
+ }
+ ],
+ "https://github.com/meap158/ComfyUI-Prompt-Expansion": [
+ [
+ "PromptExpansion"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Expansion"
+ }
+ ],
+ "https://github.com/mech-tools/comfyui-checkpoint-automatic-config": [
+ [
+ "CheckpointAutomaticConfig",
+ "ConfigPipe"
+ ],
+ {
+ "title_aux": "ComfyUI Checkpoint Automatic Config"
+ }
+ ],
+ "https://github.com/mediocreatmybest/ComfyUI-Transformers-Pipeline": [
+ [
+ "BatchProcessorTpl",
+ "CaptionExportTpl",
+ "CaptionGeneratorTpl",
+ "DebugModelNodeTpl",
+ "DebugNodeTpl",
+ "ExifMetadataExtractorTpl",
+ "Florence2NodeTpl",
+ "ImageLoaderTpl",
+ "ModelLoaderTpl",
+ "PresetModelListTpl",
+ "TaskListTpl"
+ ],
+ {
+ "title_aux": "ComfyUI-Transformers-Pipeline"
+ }
+ ],
+ "https://github.com/melMass/comfy_mtb": [
+ [
+ "Animation Builder (mtb)",
+ "Any To String (mtb)",
+ "Batch Float (mtb)",
+ "Batch Float Assemble (mtb)",
+ "Batch Float Fill (mtb)",
+ "Batch Make (mtb)",
+ "Batch Merge (mtb)",
+ "Batch Shake (mtb)",
+ "Batch Shape (mtb)",
+ "Batch Transform (mtb)",
+ "Bbox (mtb)",
+ "Bbox From Mask (mtb)",
+ "Blur (mtb)",
+ "Color Correct (mtb)",
+ "Colored Image (mtb)",
+ "Concat Images (mtb)",
+ "Crop (mtb)",
+ "Debug (mtb)",
+ "Deep Bump (mtb)",
+ "Export With Ffmpeg (mtb)",
+ "Face Swap (mtb)",
+ "Film Interpolation (mtb)",
+ "Fit Number (mtb)",
+ "Float To Number (mtb)",
+ "Get Batch From History (mtb)",
+ "Image Compare (mtb)",
+ "Image Premultiply (mtb)",
+ "Image Remove Background Rembg (mtb)",
+ "Image Resize Factor (mtb)",
+ "Image Tile Offset (mtb)",
+ "Int To Bool (mtb)",
+ "Int To Number (mtb)",
+ "Interpolate Clip Sequential (mtb)",
+ "Latent Lerp (mtb)",
+ "Load Face Analysis Model (mtb)",
+ "Load Face Enhance Model (mtb)",
+ "Load Face Swap Model (mtb)",
+ "Load Film Model (mtb)",
+ "Load Image From Url (mtb)",
+ "Load Image Sequence (mtb)",
+ "Mask To Image (mtb)",
+ "Math Expression (mtb)",
+ "Model Patch Seamless (mtb)",
+ "Pick From Batch (mtb)",
+ "Qr Code (mtb)",
+ "Restore Face (mtb)",
+ "Save Gif (mtb)",
+ "Save Image Grid (mtb)",
+ "Save Image Sequence (mtb)",
+ "Save Tensors (mtb)",
+ "Sharpen (mtb)",
+ "Smart Step (mtb)",
+ "Stack Images (mtb)",
+ "String Replace (mtb)",
+ "Styles Loader (mtb)",
+ "Text To Image (mtb)",
+ "Transform Image (mtb)",
+ "Uncrop (mtb)",
+ "Unsplash Image (mtb)",
+ "Vae Decode (mtb)"
+ ],
+ {
+ "nodename_pattern": "\\(mtb\\)$",
+ "title_aux": "MTB Nodes"
+ }
+ ],
+ "https://github.com/melMass/comfy_oiio": [
+ [
+ "OIIO_ColorspaceConvert",
+ "OIIO_ColorspaceMatchFinder",
+ "OIIO_LoadImage",
+ "OIIO_SaveImage"
+ ],
+ {
+ "title_aux": "comfy-oiio"
+ }
+ ],
+ "https://github.com/mengqin/ComfyUI-TwinFlow": [
+ [
+ "TwinFlowKSampler",
+ "TwinFlowPatcher",
+ "TwinFlowSampler",
+ "TwinFlowScheduler"
+ ],
+ {
+ "title_aux": "Twinflow Node for ComfyUI"
+ }
+ ],
+ "https://github.com/mengqin/ComfyUI-UnetBnbModelLoader": [
+ [
+ "UnetBnbModelLoader"
+ ],
+ {
+ "title_aux": "Unet Bnb Model Loader"
+ }
+ ],
+ "https://github.com/mephisto83/petty-paint-comfyui-node": [
+ [
+ "ConvertWhiteToAlpha",
+ "PPGenerateRandomFloat",
+ "PPGenerateRandomNumber",
+ "PPKSamplerAdvanced",
+ "PPSelectRandomValue",
+ "PettyImageImageColorToMask",
+ "PettyPaintAppend",
+ "PettyPaintApplyLoRAStack",
+ "PettyPaintArguments",
+ "PettyPaintBlurs",
+ "PettyPaintCheckpointLoaderSimple",
+ "PettyPaintComponent",
+ "PettyPaintConditioningSetMaskAndCombine",
+ "PettyPaintControlNetToMasking",
+ "PettyPaintConvert",
+ "PettyPaintCountFiles",
+ "PettyPaintEnsureDirectory",
+ "PettyPaintExec",
+ "PettyPaintFakeConvert",
+ "PettyPaintFileExists",
+ "PettyPaintImageColorsToMasks",
+ "PettyPaintImageCompositeMasked",
+ "PettyPaintImageDims",
+ "PettyPaintImageMaskCropper",
+ "PettyPaintImagePlacement",
+ "PettyPaintImageSave",
+ "PettyPaintImageStore",
+ "PettyPaintImageToMask",
+ "PettyPaintImagesToMasks",
+ "PettyPaintJsonMap",
+ "PettyPaintJsonRead",
+ "PettyPaintJsonReadArray",
+ "PettyPaintKSampler",
+ "PettyPaintKSamplerAdvanced",
+ "PettyPaintLoRAStack",
+ "PettyPaintLoadImage",
+ "PettyPaintLoadImageMasks",
+ "PettyPaintLoadImages",
+ "PettyPaintMap",
+ "PettyPaintMasksToImages",
+ "PettyPaintNot",
+ "PettyPaintPassThroughNode",
+ "PettyPaintProcessor",
+ "PettyPaintRemoveAddText",
+ "PettyPaintSDTurboScheduler",
+ "PettyPaintStoryImage",
+ "PettyPaintText",
+ "PettyPaintTexts_to_Conditioning",
+ "PettyPaintToJson",
+ "PettyPaintVAEDecode",
+ "SkippableVAEEncode"
+ ],
+ {
+ "title_aux": "petty-paint-comfyui-node"
+ }
+ ],
+ "https://github.com/mercu-lore/-Multiple-Angle-Camera-Control": [
+ [
+ "CameraControlPromptNode",
+ "RelightingPromptNode"
+ ],
+ {
+ "title_aux": "Multiple-Angle-Camera-Control"
+ }
+ ],
+ "https://github.com/mercu-lore/BoxBox": [
+ [
+ "BoxCrop",
+ "BoxReinsert",
+ "BoxResize",
+ "BoxSelector"
+ ],
+ {
+ "title_aux": "BoxBox"
+ }
+ ],
+ "https://github.com/meshmesh-io/ComfyUI-MeshMesh": [
+ [
+ "ColorPicker",
+ "MasksToColoredMasks"
+ ],
+ {
+ "title_aux": "ComfyUI-MeshMesh"
+ }
+ ],
+ "https://github.com/meshmesh-io/mm-comfyui-loopback": [
+ [
+ "Loop",
+ "LoopEnd",
+ "LoopEnd_SEGIMAGE",
+ "LoopStart",
+ "LoopStart_SEGIMAGE"
+ ],
+ {
+ "title_aux": "mm-comfyui-loopback"
+ }
+ ],
+ "https://github.com/meshmesh-io/mm-comfyui-megamask": [
+ [
+ "ColorListMaskToImage",
+ "FlattenAndCombineMaskImages"
+ ],
+ {
+ "title_aux": "mm-comfyui-megamask"
+ }
+ ],
+ "https://github.com/metal3d/ComfyUI_Human_Parts": [
+ [
+ "HumanParts"
+ ],
+ {
+ "title_aux": "Human Parts Detector"
+ }
+ ],
+ "https://github.com/metal3d/ComfyUI_M3D_photo_effects": [
+ [
+ "Bleach Bypass",
+ "RGB Curve"
+ ],
+ {
+ "title_aux": "M3D photo effects"
+ }
+ ],
+ "https://github.com/metncelik/comfyui_met_suite": [
+ [
+ "BBOXPadding",
+ "BBOXResize",
+ "ImageResizeKeepRatio",
+ "PrimitiveBBOX"
+ ],
+ {
+ "title_aux": "comfyui_met_suite"
+ }
+ ],
+ "https://github.com/mfg637/ComfyUI-ScheduledGuider-Ext": [
+ [
+ "ArctanScheduler",
+ "ConcatSigmas",
+ "CosineScheduler",
+ "CustomBaseLogarithm",
+ "CustomExponent",
+ "GaussianScheduler",
+ "InvertSigmas",
+ "LogNormal Scheduler",
+ "OffsetSigmas",
+ "Parametric Peak #1",
+ "PerpNegScheduledCFGGuider",
+ "PredefinedExponent",
+ "PredefinedLogarithm",
+ "ScaleToRange",
+ "ScheduledCFGGuider",
+ "SigmasToPower",
+ "SplitSigmasByValue",
+ "k/x scheduler"
+ ],
+ {
+ "title_aux": "ComfyUI-ScheduledGuider-Ext"
+ }
+ ],
+ "https://github.com/mgfxer/ComfyUI-FrameFX": [
+ [
+ "DynamicAnimatedWeightsHelper",
+ "EdgeFXSourceImages",
+ "FlorencePromptTravelHelper",
+ "LivePromptInterpolation",
+ "MaskSequenceHelper",
+ "PromptStackManager",
+ "PromptTravelHelper"
+ ],
+ {
+ "author": "mgfxer",
+ "description": "This extension provides various frame and mask sequence manipulation tools for animation workflows.",
+ "nickname": "FrameFX \ud83d\udcab",
+ "title": "FrameFX",
+ "title_aux": "ComfyUI-FrameFX"
+ }
+ ],
+ "https://github.com/miaoshouai/ComfyUI-Miaoshouai-Tagger": [
+ [
+ "Miaoshouai_Caption_Analyzer",
+ "Miaoshouai_Flux_CLIPTextEncode",
+ "Miaoshouai_SaveTags",
+ "Miaoshouai_Tagger"
+ ],
+ {
+ "title_aux": "ComfyUI-Miaoshouai-Tagger"
+ }
+ ],
+ "https://github.com/miaoshouai/ComfyUI-Video-Segmentation": [
+ [
+ "DownloadAndLoadTransNetModel",
+ "SelectVideo",
+ "TransNetV2_Run",
+ "ZipCompress"
+ ],
+ {
+ "title_aux": "ComfyUI Video Segmentation Node"
+ }
+ ],
+ "https://github.com/michaelgold/ComfyUI-HF-Model-Downloader": [
+ [
+ "DownloadModel",
+ "ModelDownloader"
+ ],
+ {
+ "title_aux": "ComfyUI-HF-Model-Downloader"
+ }
+ ],
+ "https://github.com/mickmumpitz/ComfyUI-Mickmumpitz-Nodes": [
+ [
+ "BatchColorCorrector",
+ "PreviewBridge"
+ ],
+ {
+ "title_aux": "Mickmumpitz-Nodes"
+ }
+ ],
+ "https://github.com/microbote/ComfyUI-StyledCLIPTextEncode": [
+ [
+ "StyledCLIPTextEncode"
+ ],
+ {
+ "title_aux": "StyledCLIPTextEncode"
+ }
+ ],
+ "https://github.com/migero/ComfyUI-Equirectangular-Strip": [
+ [
+ "EquirectToStrip90",
+ "Strip90ToEquirect"
+ ],
+ {
+ "title_aux": "ComfyUI-Equirectangular-Strip"
+ }
+ ],
+ "https://github.com/mihaiiancu/ComfyUI_Inpaint": [
+ [
+ "InpaintMediapipe"
+ ],
+ {
+ "title_aux": "mihaiiancu/Inpaint"
+ }
+ ],
+ "https://github.com/mikebilly/Transparent-background-comfyUI": [
+ [
+ "Transparentbackground RemBg"
+ ],
+ {
+ "title_aux": "Transparent-background-comfyUI"
+ }
+ ],
+ "https://github.com/mikecaronna/comfyui_c2pa_signer": [
+ [
+ "C2PASigner",
+ "C2PAVerifier"
+ ],
+ {
+ "title_aux": "C2PA Image Signer - ComfyUI Custom Node"
+ }
+ ],
+ "https://github.com/mikemojen/ComfyUI-HappNodeSet": [
+ [
+ "AutoCrop",
+ "CSVValueExtractor",
+ "ColorQuantizer",
+ "DashedToSolidLine",
+ "ExtractBlack",
+ "ExtractBlackAdvanced",
+ "ExtractRed",
+ "LineDetector",
+ "NonWhiteToBlack",
+ "RasterToUniformSVG",
+ "RoundDownNode",
+ "RoundUpNode",
+ "SVGDimensions",
+ "SVGPathLength",
+ "SVGPathLengthDetailed"
+ ],
+ {
+ "title_aux": "ComfyUI-HappNodeSet"
+ }
+ ],
+ "https://github.com/mikeshuangyan/ComfyUI_MqUtils": [
+ [
+ "MqCheckFP4Support",
+ "MqIntSwitch",
+ "MqIntToString",
+ "MqTextSplitter"
+ ],
+ {
+ "title_aux": "ComfyUI_MqUtils"
+ }
+ ],
+ "https://github.com/mikheys/comfyui-gemini-mikheys": [
+ [
+ "Nano_Banana"
+ ],
+ {
+ "title_aux": "ComfyUI Nano Banana Node"
+ }
+ ],
+ "https://github.com/mikkel/ComfyUI-text-overlay": [
+ [
+ "Image Text Overlay"
+ ],
+ {
+ "title_aux": "ComfyUI - Text Overlay Plugin"
+ }
+ ],
+ "https://github.com/mikkel/comfyui-mask-boundingbox": [
+ [
+ "Mask Bounding Box"
+ ],
+ {
+ "title_aux": "ComfyUI - Mask Bounding Box"
+ }
+ ],
+ "https://github.com/mingchoi/ComfyUI-Prompt-Iterator": [
+ [
+ "PromptIterator",
+ "PromptTemplateIterator"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Iterator"
+ }
+ ],
+ "https://github.com/mingsky-ai/ComfyUI-MingNodes": [
+ [
+ "AddWaterMarkNode",
+ "AdjustBrightnessContrastSaturationNode",
+ "BaiduTranslateNode",
+ "ColorBalanceNode",
+ "ConvertGrayChannelNode",
+ "HSLColorNode",
+ "HighlightShadowBrightnessNode",
+ "ImitationHueNode",
+ "LightShapeNode",
+ "RemoveWatermarkNode"
+ ],
+ {
+ "title_aux": "ComfyUI-MingNodes"
+ }
+ ],
+ "https://github.com/mingyi456/ComfyUI-DFloat11-Extended": [
+ [
+ "CheckpointLoaderWithDFloat11",
+ "DFloat11CheckpointCompressor",
+ "DFloat11Decompressor",
+ "DFloat11DiffusersModelLoader",
+ "DFloat11LoadingPatch",
+ "DFloat11ModelCompressor",
+ "DFloat11ModelLoader",
+ "DFloat11ModelLoaderAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI DFloat11 Extended"
+ }
+ ],
+ "https://github.com/mira-6/comfyui-sasolver": [
+ [
+ "SamplerSASolver",
+ "SamplerSASolverExperimental"
+ ],
+ {
+ "title_aux": "comfyui-sasolver"
+ }
+ ],
+ "https://github.com/mirabarukaso/ComfyUI_Mira": [
+ [
+ "BooleanListInterpreter1",
+ "BooleanListInterpreter4",
+ "BooleanListInterpreter8",
+ "CanvasCreatorAdvanced",
+ "CanvasCreatorBasic",
+ "CanvasCreatorSimple",
+ "CheckpointLoaderSimpleMira",
+ "CreateMaskWithCanvas",
+ "CreateNestedPNGMask",
+ "CreateSimpleMask",
+ "CreateTillingPNGMask",
+ "CreateWatermarkRemovalMask",
+ "EightBooleanTrigger",
+ "EightFloats",
+ "EvenOrOdd",
+ "EvenOrOddList",
+ "FlatColorQuantization",
+ "FloatListInterpreter1",
+ "FloatListInterpreter4",
+ "FloatListInterpreter8",
+ "FloatMultiplication",
+ "FourBooleanTrigger",
+ "FourFloats",
+ "FunctionSelectAuto",
+ "FunctionSwap",
+ "GzippedBase64ToImage",
+ "ImageBrightness",
+ "ImageColorTransferMira",
+ "ImageContrast",
+ "ImageGamma",
+ "ImageGrayscale",
+ "ImageHUE",
+ "ImageRGBChannel",
+ "ImageSaturation",
+ "ImageSaverMira",
+ "ImageSharpness",
+ "ImageToGzippedBase64",
+ "ImageToneCurve",
+ "IntMultiplication",
+ "IntSubtraction",
+ "IntToFloatMultiplication",
+ "LoRALoaderWithNameStacker",
+ "LoRAfromText",
+ "LogicNot",
+ "NoneToZero",
+ "NumeralToString",
+ "OneFloat",
+ "PngColorMasksToMaskList",
+ "PngColorMasksToRGB",
+ "PngColorMasksToString",
+ "PngColorMasksToStringList",
+ "PngRectanglesToMask",
+ "PngRectanglesToMaskList",
+ "RandomNestedLayouts",
+ "RandomTillingLayouts",
+ "ReverseImageAndAllImages",
+ "SN74HC1G86",
+ "SN74HC86",
+ "SN74LVC1G125",
+ "SeedGeneratorMira",
+ "SingleBooleanTrigger",
+ "SixBooleanTrigger",
+ "StackImages",
+ "StepsAndCfg",
+ "TextBoxMira",
+ "TextCombinerSix",
+ "TextCombinerTwo",
+ "TextLoopCombiner",
+ "TextSwitcherThreeWays",
+ "TextSwitcherTwoWays",
+ "TextWildcardSeprator",
+ "TextWithBooleanSwitchAndCommonTextInput",
+ "TwoBooleanTrigger",
+ "TwoFloats",
+ "UpscaleImageByModelThenResize",
+ "camie_tagger_mira",
+ "cl_tagger_mira",
+ "illustrious_character_select",
+ "illustrious_character_select_en",
+ "llm_prompt_gen_node",
+ "local_llm_prompt_gen",
+ "wd_tagger_mira"
+ ],
+ {
+ "title_aux": "ComfyUI_Mira"
+ }
+ ],
+ "https://github.com/mirabarukaso/ComfyUI_MiraSubPack": [
+ [
+ "ImageCropTiles_MiraSubPack",
+ "ImageMergeByPixelAlign_MiraSubPack",
+ "ImageTiledKSamplerWithTagger_MiraSubPack",
+ "JoyCaptionBetaOneSimple_MiraSubPack",
+ "JoyCaptionNodeBetaOne_MiraSubPack",
+ "LatentUpscaleAndCropTiles_MiraSubPack",
+ "LatentUpscaleSimple_MiraSubPack",
+ "MiraITUPipelineCombine_MiraSubPack",
+ "MiraITUPipelineExtract_MiraSubPack",
+ "OverlappedImageMerge_MiraSubPack",
+ "OverlappedLatentMerge_MiraSubPack",
+ "TextEncodeQwenImageEditPlus_MiraSubPack",
+ "TextEncodeQwenImageEdit_MiraSubPack"
+ ],
+ {
+ "title_aux": "ComfyUI_MiraSubPack"
+ }
+ ],
+ "https://github.com/misterjoessef/MLTask_ComfyUI": [
+ [
+ "FacebookPosterData",
+ "InstagramPosterData",
+ "LinkedinPosterData",
+ "MLTaskUtilsTextImageGenerator",
+ "PinterestPosterData",
+ "SocialManMediaToPoster",
+ "SocialManPostData",
+ "SocialManPoster",
+ "TiktokPosterData",
+ "TwitterPosterData",
+ "YoutubePosterData"
+ ],
+ {
+ "title_aux": "MLTask_ComfyUI"
+ }
+ ],
+ "https://github.com/mittimi/ComfyUI_mittimiDaisyChainText": [
+ [
+ "DaisyChainTextMittimi"
+ ],
+ {
+ "author": "mittimi",
+ "description": "It has the ability to concatenate text.",
+ "nickname": "mittimiDaisyChainText",
+ "title": "mittimiDaisyChainText",
+ "title_aux": "ComfyUI_mittimiDaisyChainText"
+ }
+ ],
+ "https://github.com/mittimi/ComfyUI_mittimiLoadPreset2": [
+ [
+ "CombineParamDataMittimi",
+ "LoadImageParamMittimi",
+ "LoadSetParamMittimi",
+ "SaveImageParamMittimi",
+ "SaveParamToPresetMittimi"
+ ],
+ {
+ "author": "mittimi",
+ "description": "This node can easily switch between models and prompts by saving presets.",
+ "nickname": "mittimiLoadPreset2",
+ "title": "mittimiLoadPreset2",
+ "title_aux": "ComfyUI_mittimiLoadPreset2"
+ }
+ ],
+ "https://github.com/mittimi/ComfyUI_mittimiRecalculateSize": [
+ [
+ "RecalculateSizeMittimi01"
+ ],
+ {
+ "author": "mittimi",
+ "description": "Switch between vertical and horizontal values with a single button.",
+ "nickname": "mittimiWidthHeight",
+ "title": "mittimiWidthHeight",
+ "title_aux": "ComfyUI_mittimiRecalculateSize"
+ }
+ ],
+ "https://github.com/mittimi/ComfyUI_mittimiWidthHeight": [
+ [
+ "GoStopAnythingMittimi01",
+ "OutputLongLengthMittimi01",
+ "WidthHeightMittimi01"
+ ],
+ {
+ "author": "mittimi",
+ "description": "Switch between vertical and horizontal values with a single button.",
+ "nickname": "mittimiWidthHeight",
+ "title": "mittimiWidthHeight",
+ "title_aux": "ComfyUI_mittimiWidthHeight"
+ }
+ ],
+ "https://github.com/mo230761/InsertAnything-ComfyUI-official": [
+ [
+ "CropBack",
+ "CropBackNoScaling",
+ "FillProcess",
+ "FillProcessNoScaling",
+ "MaskOption",
+ "ReduxProcess"
+ ],
+ {
+ "title_aux": "InsertAnything-ComfyUI-official"
+ }
+ ],
+ "https://github.com/mobcat40/ComfyUI-PromptChain": [
+ [
+ "PromptChain",
+ "PromptChainDebug",
+ "SyntaxTest"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptChain"
+ }
+ ],
+ "https://github.com/mobilehacker/ComfyUI_format-lora-stack": [
+ [
+ "FormatLoraStack"
+ ],
+ {
+ "title_aux": "ComfyUI_format-lora-stack"
+ }
+ ],
+ "https://github.com/modelscope/comfyscope": [
+ [
+ "DashScopeFLUXAPI"
+ ],
+ {
+ "title_aux": "Dashscope FLUX API for ComfyUI"
+ }
+ ],
+ "https://github.com/modusCell/ComfyUI-dimension-node-modusCell": [
+ [
+ "DimensionProviderFree modusCell",
+ "DimensionProviderRatio modusCell",
+ "Free",
+ "Ratio",
+ "String Concat modusCell"
+ ],
+ {
+ "title_aux": "Preset Dimensions"
+ }
+ ],
+ "https://github.com/mohseni-mr/ComfyUI-Mohseni-Kit": [
+ [
+ "FloatPreview"
+ ],
+ {
+ "title_aux": "ComfyUI Mohseni Kit"
+ }
+ ],
+ "https://github.com/mohsensd1373/comfyui_wordpress": [
+ [
+ "SaveToWordPressNode"
+ ],
+ {
+ "title_aux": "comfyui_wordpress"
+ }
+ ],
+ "https://github.com/molbal/ComfyUI-LLM-CLIP": [
+ [
+ "LLMClipLoader",
+ "LLMClipTextEncode"
+ ],
+ {
+ "title_aux": "ComfyUI-LLM-CLIP"
+ }
+ ],
+ "https://github.com/monkeyWie/ComfyUI-FormInput": [
+ [
+ "BooleanInput_FormInput",
+ "DisplayText_FormInput",
+ "TextInput_FormInput"
+ ],
+ {
+ "title_aux": "ComfyUI-FormInput"
+ }
+ ],
+ "https://github.com/moon7star9/ComfyUI_BiRefNet_Universal": [
+ [
+ "BiRefNet_Loader",
+ "BiRefNet_Remove_Background"
+ ],
+ {
+ "title_aux": "ComfyUI_BiRefNet_Universal"
+ }
+ ],
+ "https://github.com/moonwhaler/comfyui-moonpack": [
+ [
+ "DynamicLoraStack",
+ "DynamicStringConcat",
+ "FastNodeBypasser",
+ "ProportionalDimension",
+ "RegexStringReplace",
+ "SimpleStringReplace",
+ "VACELooperFrameMaskCreator"
+ ],
+ {
+ "title_aux": "comfyui-moonpack"
+ }
+ ],
+ "https://github.com/moonwhaler/comfyui-seedvr2-tilingupscaler": [
+ [
+ "SeedVR2TilingUpscaler"
+ ],
+ {
+ "title_aux": "SeedVR2 Tiling Upscaler"
+ }
+ ],
+ "https://github.com/morino-kumasan/comfyui-toml-prompt": [
+ [
+ "CheckPointLoaderSimpleFromString",
+ "DropFirstImage",
+ "IntSelector",
+ "JsonExtractFloat",
+ "JsonExtractInt",
+ "JsonExtractString",
+ "KSamplerFromJsonInfo",
+ "LatentSelector",
+ "LoadLoraFromLoraList",
+ "MultipartCLIPTextEncode",
+ "MultipleLoraTagLoader",
+ "PromptDecode",
+ "PromptLoader",
+ "SeedGenerator",
+ "SplitLoraList",
+ "StringConcat",
+ "StringConcatInt",
+ "StringPicker",
+ "StringSelector",
+ "StringViewer",
+ "SummaryReader",
+ "TomlPromptDecode",
+ "UNETLoaderFromString"
+ ],
+ {
+ "title_aux": "comfyui-toml-prompt"
+ }
+ ],
+ "https://github.com/moustafa-nasr/ComfyUI-SimpleLogger": [
+ [
+ "Log Image",
+ "LogImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI-SimpleLogger"
+ }
+ ],
+ "https://github.com/moyi7712/ComfyUI_Seamless_Patten": [
+ [
+ "SeamlessApply",
+ "SeamlessKSampler",
+ "SeamlessKSamplerAdvanced",
+ "SeamlessVae"
+ ],
+ {
+ "title_aux": "ComfyUI_Seamless_Patten"
+ }
+ ],
+ "https://github.com/mr7thing/circle_pattern_processor": [
+ [
+ "CirclePatternProcessor",
+ "CirclePatternSVGExporter",
+ "ImageBinarizer"
+ ],
+ {
+ "title_aux": "Circle Pattern Processor for ComfyUI"
+ }
+ ],
+ "https://github.com/mrchipset/ComfyUI-SaveImageS3": [
+ [
+ "SaveImageS3"
+ ],
+ {
+ "author": "Mr.Chip",
+ "description": "This extension offers a custom node to save image to S3-compatible oss.",
+ "nickname": "SaveImageS3",
+ "title": "SaveImageS3",
+ "title_aux": "ComfyUI-SaveImageS3"
+ }
+ ],
+ "https://github.com/mrf/ComfyPoe": [
+ [
+ "PoeImageEdit",
+ "PoeImageGenerate",
+ "PoeImageVariation",
+ "PoeMultiImageEdit"
+ ],
+ {
+ "title_aux": "ComfyPoe"
+ }
+ ],
+ "https://github.com/mrhan1993/ComfyUI-Fooocus": [
+ [
+ "AlignYourStepsScheduler",
+ "BasicScheduler",
+ "CLIPLoader",
+ "CLIPMergeSimple",
+ "CLIPSave",
+ "CLIPSetLastLayer",
+ "CLIPTextEncode",
+ "CLIPTextEncodeSDXL",
+ "CLIPTextEncodeSDXLRefiner",
+ "CLIPVisionEncode",
+ "CLIPVisionLoader",
+ "Canny",
+ "CheckpointLoader",
+ "CheckpointLoaderSimple",
+ "CheckpointSave",
+ "ClearVram",
+ "ConditioningAverage",
+ "ConditioningCombine",
+ "ConditioningConcat",
+ "ConditioningSetArea",
+ "ConditioningSetAreaPercentage",
+ "ConditioningSetMask",
+ "ConditioningSetTimestepRange",
+ "ConditioningZeroOut",
+ "ControlNetApply",
+ "ControlNetApplyAdvanced",
+ "ControlNetLoader",
+ "CropMask",
+ "DiffControlNetLoader",
+ "DiffusersLoader",
+ "DualCLIPLoader",
+ "EmptyImage",
+ "EmptyLatentImage",
+ "EnhanceControl",
+ "EnhanceControls",
+ "ExponentialScheduler",
+ "FeatherMask",
+ "FlipSigmas",
+ "FooocusSampler",
+ "FooocusSettings",
+ "FreeU",
+ "FreeU_V2",
+ "GLIGENLoader",
+ "GLIGENTextBoxApply",
+ "GrowMask",
+ "HyperTile",
+ "HypernetworkLoader",
+ "ImageBatch",
+ "ImageBlend",
+ "ImageBlur",
+ "ImageColorToMask",
+ "ImageCompositeMasked",
+ "ImageCrop",
+ "ImageInvert",
+ "ImageOnlyCheckpointLoader",
+ "ImageOnlyCheckpointSave",
+ "ImagePadForOutpaint",
+ "ImagePrompts",
+ "ImageQuantize",
+ "ImageScale",
+ "ImageScaleBy",
+ "ImageScaleToTotalPixels",
+ "ImageSharpen",
+ "ImageToMask",
+ "ImageUpscaleWithModel",
+ "InpaintModelConditioning",
+ "InpaintOutpaint",
+ "InvertMask",
+ "JoinImageWithAlpha",
+ "KSampler",
+ "KSamplerAdvanced",
+ "KSamplerSelect",
+ "KarrasScheduler",
+ "LatentAdd",
+ "LatentBatch",
+ "LatentBatchSeedBehavior",
+ "LatentBlend",
+ "LatentComposite",
+ "LatentCompositeMasked",
+ "LatentCrop",
+ "LatentFlip",
+ "LatentFromBatch",
+ "LatentInterpolate",
+ "LatentMultiply",
+ "LatentRotate",
+ "LatentSubtract",
+ "LatentUpscale",
+ "LatentUpscaleBy",
+ "LoadImage",
+ "LoadImageMask",
+ "LoadLatent",
+ "LoraLoader",
+ "LoraLoaderModelOnly",
+ "LoraStacks",
+ "MaskComposite",
+ "MaskToImage",
+ "ModelMergeAdd",
+ "ModelMergeBlocks",
+ "ModelMergeSimple",
+ "ModelMergeSubtract",
+ "ModelSamplingContinuousEDM",
+ "ModelSamplingDiscrete",
+ "PatchModelAddDownscale",
+ "PerpNeg",
+ "PhotoMakerEncode",
+ "PhotoMakerLoader",
+ "PolyexponentialScheduler",
+ "PorterDuffImageComposite",
+ "PreviewImage",
+ "RebatchImages",
+ "RebatchLatents",
+ "RepeatImageBatch",
+ "RepeatLatentBatch",
+ "RescaleCFG",
+ "SDTurboScheduler",
+ "SD_4XUpscale_Conditioning",
+ "SVD_img2vid_Conditioning",
+ "SamplerCustom",
+ "SamplerDPMPP_2M_SDE",
+ "SamplerDPMPP_SDE",
+ "SamplerTCD",
+ "SaveAnimatedPNG",
+ "SaveAnimatedWEBP",
+ "SaveImage",
+ "SaveLatent",
+ "SelfAttentionGuidance",
+ "SetLatentNoiseMask",
+ "SolidMask",
+ "SplitImageWithAlpha",
+ "SplitSigmas",
+ "StableZero123_Conditioning",
+ "StableZero123_Conditioning_Batched",
+ "StyleModelApply",
+ "StyleModelLoader",
+ "TomePatchModel",
+ "UNETLoader",
+ "UpscaleModelLoader",
+ "UpscaleVary",
+ "VAEDecode",
+ "VAEDecodeTiled",
+ "VAEEncode",
+ "VAEEncodeForInpaint",
+ "VAEEncodeTiled",
+ "VAELoader",
+ "VAESave",
+ "VPScheduler",
+ "VideoLinearCFGGuidance",
+ "unCLIPCheckpointLoader",
+ "unCLIPConditioning"
+ ],
+ {
+ "author": "Konie",
+ "title_aux": "ComfyUI-Fooocus"
+ }
+ ],
+ "https://github.com/mrm987/ComfyUI_Multi_Prompt_Generator": [
+ [
+ "MultiPromptGenerator",
+ "NAIMultiPromptGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-Multi-Prompt-Generator"
+ }
+ ],
+ "https://github.com/mudknight/comfyui-mudknight-utils": [
+ [
+ "AutoLevelNode",
+ "BBoxInsetAndCrop",
+ "BaseNode",
+ "CharacterPresetNode",
+ "CharacterReplacementNode",
+ "CombinedUpscaleNode",
+ "ConditionalLoraFullPipe",
+ "CustomResolutionPipe",
+ "DetailerNode",
+ "DetailerPipeNode",
+ "FullPipeIn",
+ "FullPipeLoader",
+ "FullPipeOut",
+ "ImageDifference",
+ "LoaderFullPipe",
+ "MaskDetailerNode",
+ "MaskDetailerPipeNode",
+ "ModelPresetNode",
+ "MultiStringConditioning",
+ "NestedDetailerNode",
+ "NestedDetailerPipeNode",
+ "OpenCVDenoise",
+ "PromptConditioningNode",
+ "ResolutionSelector",
+ "SaveFullPipe",
+ "SeedWithOverride",
+ "SplitLoaderFullPipe",
+ "StylePresetNode",
+ "TagPresetNode",
+ "UpscaleNode",
+ "WildcardNode"
+ ],
+ {
+ "title_aux": "comfyui-mudknight-utils"
+ }
+ ],
+ "https://github.com/muhammederem/blip-comfyui": [
+ [
+ "Blip Processor Node",
+ "List to Text Node"
+ ],
+ {
+ "title_aux": "BLIP Vision-Language Model Integration"
+ }
+ ],
+ "https://github.com/mullakhmetov/comfyui_dynamic_util_nodes": [
+ [
+ "ConcatStrings",
+ "FormatString",
+ "GetFiles",
+ "LoadImageByPath",
+ "StringOutput"
+ ],
+ {
+ "title_aux": "comfyui_dynamic_util_nodes"
+ }
+ ],
+ "https://github.com/muxueChen/ComfyUI_NTCosyVoice": [
+ [
+ "NTCosyVoiceCrossLingualSampler",
+ "NTCosyVoiceInstruct2Sampler",
+ "NTCosyVoiceZeroShotSampler"
+ ],
+ {
+ "title_aux": "CosyVoice2 for ComfyUI"
+ }
+ ],
+ "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask": [
+ [
+ "Image Brightness",
+ "Openpose Keypoint Mask"
+ ],
+ {
+ "title_aux": "PoseKeypoint Mask"
+ }
+ ],
+ "https://github.com/my-opencode/ComfyUI_IndustrialMagick": [
+ [
+ "IndustrialMagick",
+ "IndustrialMagickImageIngest"
+ ],
+ {
+ "title_aux": "ComfyUI_IndustrialMagick"
+ }
+ ],
+ "https://github.com/my-opencode/ComfyUI_KSamplerTimer": [
+ [
+ "KSamplerTimer"
+ ],
+ {
+ "author": "Ludovic Anterieur",
+ "description": "This extension provides a wrapper of the native KSampler which outputs generation time.",
+ "nickname": "\u23f1",
+ "title": "KSampler (timer)",
+ "title_aux": "ComfyUI_KSamplerTimer"
+ }
+ ],
+ "https://github.com/myonmu0/ComfyUI-Jumper": [
+ [
+ "Receive Audio",
+ "Receive Images",
+ "Receive String",
+ "Send Audio",
+ "Send Images",
+ "Send String"
+ ],
+ {
+ "title_aux": "ComfyUI-Jumper"
+ }
+ ],
+ "https://github.com/myshell-ai/ComfyUI-ShellAgent-Plugin": [
+ [
+ "High444H264Encode",
+ "ShellAgentPluginInputAudio",
+ "ShellAgentPluginInputBoolean",
+ "ShellAgentPluginInputFloat",
+ "ShellAgentPluginInputImage",
+ "ShellAgentPluginInputInteger",
+ "ShellAgentPluginInputText",
+ "ShellAgentPluginInputVideo",
+ "ShellAgentPluginOutputBoolean",
+ "ShellAgentPluginOutputFloat",
+ "ShellAgentPluginOutputInteger",
+ "ShellAgentPluginOutputText",
+ "ShellAgentPluginSaveAudio",
+ "ShellAgentPluginSaveAudios",
+ "ShellAgentPluginSaveImage",
+ "ShellAgentPluginSaveImages",
+ "ShellAgentPluginSaveVideoVHS",
+ "ShellAgentPluginVideoCombineEncrypt"
+ ],
+ {
+ "author": "MyShell",
+ "description": "",
+ "title": "comfyui-shellagent-plugin",
+ "title_aux": "ComfyUI-ShellAgent-Plugin"
+ }
+ ],
+ "https://github.com/n0neye/A3D-comfyui-integration": [
+ [
+ "A3DListener"
+ ],
+ {
+ "title_aux": "A3D ComfyUI Integration"
+ }
+ ],
+ "https://github.com/nagolinc/ComfyUI_FastVAEDecorder_SDXL": [
+ [
+ "FastLatentToImage"
+ ],
+ {
+ "title_aux": "ComfyUI_FastVAEDecorder_SDXL"
+ }
+ ],
+ "https://github.com/nagolinc/comfyui_openai_node": [
+ [
+ "OpenAINode"
+ ],
+ {
+ "title_aux": "comfyui_openai_node"
+ }
+ ],
+ "https://github.com/nakagawadev/comfyui_nakagawa": [
+ [
+ "SaveVideoWebsocket",
+ "SaveWEBMWebsocket"
+ ],
+ {
+ "title_aux": "comfyui_nakagawa"
+ }
+ ],
+ "https://github.com/nako-nakoko/ComfyUI_Mel_Nodes": [
+ [
+ "AddFileNameonly",
+ "ResolutionSwitcher",
+ "Split Image Batch",
+ "Unet Selector_gguf",
+ "mel_RandomIntNode",
+ "mel_TextFilterNode",
+ "mel_TextSplitNode",
+ "mel_TextSplitNode2"
+ ],
+ {
+ "title_aux": "ComfyUI_Mel_Nodes"
+ }
+ ],
+ "https://github.com/naku-yh/ComfyUI_Flux2ImageReference": [
+ [
+ "NakuNode_Flux2"
+ ],
+ {
+ "title_aux": "ComfyUI_Flux2ImageReference"
+ }
+ ],
+ "https://github.com/namtb96/OmniGen2-Simple-Node": [
+ [
+ "OmniGen2ModelLoader",
+ "OmniGen2Sampler"
+ ],
+ {
+ "title_aux": "OmniGen2 Simple Node"
+ }
+ ],
+ "https://github.com/narusas/Comfyui-Logic-Support": [
+ [
+ "BooleanIndexAdder",
+ "NumberConditionChecker",
+ "NumberRangeIndex",
+ "NumberSequenceGenerator",
+ "StringConcatenator",
+ "StringSwitchByNumber"
+ ],
+ {
+ "title_aux": "ComfyUI Logic Support"
+ }
+ ],
+ "https://github.com/natto-maki/ComfyUI-NegiTools": [
+ [
+ "NegiTools_CompositeImages",
+ "NegiTools_DepthEstimationByMarigold",
+ "NegiTools_DetectFaceRotationForInpainting",
+ "NegiTools_ImageProperties",
+ "NegiTools_LatentProperties",
+ "NegiTools_NoiseImageGenerator",
+ "NegiTools_OpenAiDalle3",
+ "NegiTools_OpenAiGpt",
+ "NegiTools_OpenAiGpt4v",
+ "NegiTools_OpenAiTranslate",
+ "NegiTools_OpenPoseToPointList",
+ "NegiTools_PointListToMask",
+ "NegiTools_RandomImageLoader",
+ "NegiTools_SaveImageToDirectory",
+ "NegiTools_SeedGenerator",
+ "NegiTools_StereoImageGenerator",
+ "NegiTools_StringFunction"
+ ],
+ {
+ "title_aux": "ComfyUI-NegiTools"
+ }
+ ],
+ "https://github.com/nawka12/ComfyUI-Adept-Sampler": [
+ [
+ "AdeptAncestralSampler",
+ "AdeptSchedulerAOS_E",
+ "AdeptSchedulerAOS_V",
+ "AdeptSchedulerAYS",
+ "AdeptSchedulerAdvanced",
+ "AdeptSchedulerAkashicAOS",
+ "AdeptSchedulerEntropic",
+ "AdeptSchedulerJYS",
+ "AdeptSchedulerStochastic",
+ "AdeptSolverSampler",
+ "AkashicSolverSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-Adept-Sampler"
+ }
+ ],
+ "https://github.com/naxci1/ComfyUI-FlashVSR_Stable": [
+ [
+ "FlashVSRInitPipe",
+ "FlashVSRNode",
+ "FlashVSRNodeAdv"
+ ],
+ {
+ "title_aux": "ComfyUI-FlashVSR_Stable"
+ }
+ ],
+ "https://github.com/nchenevey1/comfyui-gimp-nodes": [
+ [
+ "NC_LoadImageGIMP",
+ "NC_LoadMaskGIMP",
+ "NC_SendImageDimsWebSocketGIMP",
+ "NC_SendImageWebSocketGIMP"
+ ],
+ {
+ "title_aux": "comfyui-gimp-nodes"
+ }
+ ],
+ "https://github.com/negaga53/comfyui-imgloader": [
+ [
+ "ImageLoader"
+ ],
+ {
+ "title_aux": "ComfyUI Universal Image Loader"
+ }
+ ],
+ "https://github.com/neggo/comfyui-sambanova": [
+ [
+ "SambaNova API Node",
+ "SambaNovaNode"
+ ],
+ {
+ "title_aux": "comfyui-sambanova"
+ }
+ ],
+ "https://github.com/neo-editer/ComfyUI-Better-Dimensions-wan-v2": [
+ [
+ "BetterImageDimensions_v2",
+ "PureRatio",
+ "SDXLDimensions_simple",
+ "WANDimensions_480",
+ "WANDimensions_720"
+ ],
+ {
+ "title_aux": "ComfyUI-Better-Dimensions-wan-v2"
+ }
+ ],
+ "https://github.com/neocrz/comfyui-usetaesd": [
+ [
+ "DecodeTAESD",
+ "DecodeTAESDTiled",
+ "EncodeTAESD",
+ "EncodeTAESDTiled"
+ ],
+ {
+ "title_aux": "comfyui-usetaesd"
+ }
+ ],
+ "https://github.com/neonr-0/ComfyUI-PixelConstrainedScaler": [
+ [
+ "PixelConstrainedScaler"
+ ],
+ {
+ "title_aux": "ComfyUI-PixelConstrainedScaler"
+ }
+ ],
+ "https://github.com/neph1/comfyui-smooth-step-lora-loader": [
+ [
+ "Smooth_Step_Lora_Loader"
+ ],
+ {
+ "title_aux": "comfyui-smooth-step-lora-loader"
+ }
+ ],
+ "https://github.com/neurodanzelus-cmd/ComfyUI-TeleStyle": [
+ [
+ "TeleStyleLoader",
+ "TeleStyleVideoInference"
+ ],
+ {
+ "title_aux": "ComfyUI-TeleStyle"
+ }
+ ],
+ "https://github.com/neverbiasu/ComfyUI-BAGEL": [
+ [
+ "BagelImageEdit",
+ "BagelImageUnderstanding",
+ "BagelModelLoader",
+ "BagelMultiImageEdit",
+ "BagelTextToImage"
+ ],
+ {
+ "title_aux": "ComfyUI-BAGEL"
+ }
+ ],
+ "https://github.com/neverbiasu/ComfyUI-ChatTTS": [
+ [
+ "ChatTTSLoader",
+ "ChatTTS_ExtractSpeaker",
+ "ChatTTS_LoadSpeakerProfile",
+ "ChatTTS_Sampler",
+ "ChatTTS_SaveSpeakerProfile",
+ "ChatTTS_SeedBasedSpeaker",
+ "ChatTTS_TextNormalizer",
+ "ChatTTS_TextSplitter"
+ ],
+ {
+ "title_aux": "ComfyUI-ChatTTS"
+ }
+ ],
+ "https://github.com/neverbiasu/ComfyUI-Dashscope": [
+ [
+ "DashscopeEmoCaller",
+ "DashscopeLLMLoader",
+ "DashscopeModelCaller",
+ "DashscopeOCRCaller",
+ "DashscopeVLMLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Dashscope"
+ }
+ ],
+ "https://github.com/neverbiasu/ComfyUI-Image-Captioner": [
+ [
+ "ImageCaptioner"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Captioner"
+ }
+ ],
+ "https://github.com/neverbiasu/ComfyUI-ModelScope": [
+ [
+ "ModelScopeImageGenerator",
+ "ModelScopeLLM",
+ "ModelScopeVLM"
+ ],
+ {
+ "title_aux": "ComfyUI-ModelScope"
+ }
+ ],
+ "https://github.com/neverbiasu/ComfyUI-Ovis-U1": [
+ [
+ "OvisU1ImageEdit",
+ "OvisU1ImageToText",
+ "OvisU1ModelLoader",
+ "OvisU1TextToImage"
+ ],
+ {
+ "title_aux": "ComfyUI-Ovis-U1"
+ }
+ ],
+ "https://github.com/neverbiasu/ComfyUI-SAM2": [
+ [
+ "GroundingDinoModelLoader",
+ "GroundingDinoModelLoader (segment anything2)",
+ "GroundingDinoSAM2Segment",
+ "GroundingDinoSAM2Segment (segment anything2)",
+ "InvertMask",
+ "InvertMask (segment anything)",
+ "IsMaskEmpty",
+ "SAM2ModelLoader",
+ "SAM2ModelLoader (segment anything2)"
+ ],
+ {
+ "title_aux": "ComfyUI SAM2(Segment Anything 2)"
+ }
+ ],
+ "https://github.com/neverbiasu/ComfyUI-StyleShot": [
+ [
+ "StyleShotApply"
+ ],
+ {
+ "title_aux": "ComfyUI-StyleShot"
+ }
+ ],
+ "https://github.com/ngosset/ComfyUI-ImageSimilarity": [
+ [
+ "Image Similarity"
+ ],
+ {
+ "title_aux": "ImageSimilarity"
+ }
+ ],
+ "https://github.com/nicehero/comfyui-SegGPT": [
+ [
+ "SegGPT"
+ ],
+ {
+ "title_aux": "comfyui-SegGPT"
+ }
+ ],
+ "https://github.com/nickve28/ComfyUI-Nich-Utils": [
+ [
+ "Image from Dir Selector (Nich)",
+ "Select Text with Regular Expression (Nich)"
+ ],
+ {
+ "title_aux": "ComfyUI Nich Utils"
+ }
+ ],
+ "https://github.com/nicofdga/DZ-FaceDetailer": [
+ [
+ "DZ_Face_Detailer"
+ ],
+ {
+ "title_aux": "DZ-FaceDetailer"
+ }
+ ],
+ "https://github.com/niknah/ComfyUI-F5-TTS": [
+ [
+ "F5TTSAudio",
+ "F5TTSAudioAdvanced",
+ "F5TTSAudioInputs"
+ ],
+ {
+ "title_aux": "ComfyUI F5-TTS"
+ }
+ ],
+ "https://github.com/niknah/ComfyUI-Hunyuan-3D-2": [
+ [
+ "Hunyuan3D2ImageTo3D"
+ ],
+ {
+ "title_aux": "ComfyUI Hunyuan-3D-2"
+ }
+ ],
+ "https://github.com/niknah/ComfyUI-InfiniteYou": [
+ [
+ "InfiniteYouSample",
+ "InfiniteYouSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-InfiniteYou"
+ }
+ ],
+ "https://github.com/niknah/audio-general-ComfyUI": [
+ [
+ "AudioBassTreble",
+ "AudioConcat",
+ "AudioInfo",
+ "AudioMix",
+ "AudioPitch",
+ "AudioSampleRate",
+ "AudioSpeed",
+ "AudioTrimSilenceRosa",
+ "AudioTrimSilenceVAD"
+ ],
+ {
+ "title_aux": "Audio General"
+ }
+ ],
+ "https://github.com/niknah/presentation-ComfyUI": [
+ [
+ "PresentationAddQueue",
+ "PresentationAdvancedSection",
+ "PresentationAudio",
+ "PresentationComponent",
+ "PresentationDropDown",
+ "PresentationFile",
+ "PresentationHistory",
+ "PresentationImage",
+ "PresentationProgress",
+ "PresentationSeed",
+ "PresentationTab",
+ "PresentationVideo"
+ ],
+ {
+ "title_aux": "Presentation ComfyUI"
+ }
+ ],
+ "https://github.com/nilor-corp/nilor-nodes": [
+ [
+ "MediaStreamInput",
+ "MediaStreamOutput",
+ "Nilor Blur Analysis",
+ "Nilor Categorize String",
+ "Nilor Count Images In Directory",
+ "Nilor Extract Filename from Path",
+ "Nilor Image Resize v2",
+ "Nilor Int To List Of Bools",
+ "Nilor Interpolated Float List",
+ "Nilor Inverse Map Float List",
+ "Nilor List of Ints",
+ "Nilor Load Image By Index",
+ "Nilor One Minus Float List",
+ "Nilor Output Filename String",
+ "Nilor Random String",
+ "Nilor Remap Float List",
+ "Nilor Remap Float List Auto Input",
+ "Nilor Repeat & Trim Image Batch",
+ "Nilor Repeat, Shuffle, & Trim Image Batch",
+ "Nilor Save EXR Arbitrary",
+ "Nilor Save Image To HF Dataset",
+ "Nilor Save Video To HF Dataset",
+ "Nilor Select Index From List",
+ "Nilor Shuffle Image Batch",
+ "Nilor To Sparse Index Method",
+ "Nilor Wan Frame Trim",
+ "Nilor Wan Tile Resolution",
+ "Nilor n Fractions of Int",
+ "NilorGroup",
+ "NilorPreset",
+ "NilorUserInput_Boolean",
+ "NilorUserInput_Float",
+ "NilorUserInput_Int",
+ "NilorUserInput_String"
+ ],
+ {
+ "title_aux": "Nilor Nodes by Nilor Corp"
+ }
+ ],
+ "https://github.com/ningxiaoxiao/comfyui-NDI": [
+ [
+ "NDI_LoadImage",
+ "NDI_SendImage"
+ ],
+ {
+ "title_aux": "comfyui-NDI"
+ }
+ ],
+ "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI": [
+ [
+ "ImageConcat",
+ "ImageCropMultEight",
+ "ImageCut",
+ "LightingPreprocessor"
+ ],
+ {
+ "title_aux": "ImgProcessing_ComfyUI"
+ }
+ ],
+ "https://github.com/nirex0/ComfyUI_pytorch_openpose": [
+ [
+ "pytorch_openpose"
+ ],
+ {
+ "title_aux": "ComfyUI_pytorch_openpose"
+ }
+ ],
+ "https://github.com/nisaruj/comfyui-daam": [
+ [
+ "CLIPTextEncodeWithTokens",
+ "DAAMAnalyzer",
+ "DAAMPreviewImage",
+ "KSamplerDAAM"
+ ],
+ {
+ "title_aux": "ComfyUI-DAAM"
+ }
+ ],
+ "https://github.com/nisimjoseph/ComfyUI_OpenAI-Prompter": [
+ [
+ "OpenAI Prompt Generator"
+ ],
+ {
+ "title_aux": "ComfyUI OpenAI Prompter"
+ }
+ ],
+ "https://github.com/nitingrg/comfyui-ntools": [
+ [
+ "ImageMegapixels"
+ ],
+ {
+ "title_aux": "comfyui-ntools"
+ }
+ ],
+ "https://github.com/njlent/ComfyUI_performance-report": [
+ [
+ "ExecutionTimeReporter"
+ ],
+ {
+ "title_aux": "ComfyUI Execution Time Reporter"
+ }
+ ],
+ "https://github.com/njlent/ComfyUI_wavelet-colorfix": [
+ [
+ "WaveletColorFix"
+ ],
+ {
+ "title_aux": "ComfyUI Wavelet Color Fix"
+ }
+ ],
+ "https://github.com/nkchocoai/ComfyUI-DanbooruPromptQuiz": [
+ [
+ "DanbooruPromptComparison",
+ "DanbooruPromptQuiz"
+ ],
+ {
+ "title_aux": "ComfyUI-DanbooruPromptQuiz"
+ }
+ ],
+ "https://github.com/nkchocoai/ComfyUI-Dart": [
+ [
+ "DanbooruTagsTransformerBanTagsFromRegex",
+ "DanbooruTagsTransformerComposePrompt",
+ "DanbooruTagsTransformerComposePromptV2",
+ "DanbooruTagsTransformerDecode",
+ "DanbooruTagsTransformerDecodeBySplitedParts",
+ "DanbooruTagsTransformerGenerate",
+ "DanbooruTagsTransformerGenerateAdvanced",
+ "DanbooruTagsTransformerGenerationConfig",
+ "DanbooruTagsTransformerGetAspectRatio",
+ "DanbooruTagsTransformerLoader",
+ "DanbooruTagsTransformerRearrangedByAnimagine",
+ "DanbooruTagsTransformerRemoveTagToken"
+ ],
+ {
+ "title_aux": "ComfyUI-Dart"
+ }
+ ],
+ "https://github.com/nkchocoai/ComfyUI-PromptUtilities": [
+ [
+ "PromptUtilitiesConstString",
+ "PromptUtilitiesConstStringMultiLine",
+ "PromptUtilitiesFormatString",
+ "PromptUtilitiesJoinStringList",
+ "PromptUtilitiesLoadPreset",
+ "PromptUtilitiesLoadPresetAdvanced",
+ "PromptUtilitiesPromptWeight",
+ "PromptUtilitiesRandomPreset",
+ "PromptUtilitiesRandomPresetAdvanced",
+ "PromptUtilitiesReplaceOrInsertTag",
+ "PromptUtilitiesRoundPromptWeight",
+ "PromptUtilitiesSampleTags",
+ "PromptUtilitiesSampleTagsWithWeight"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptUtilities"
+ }
+ ],
+ "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData": [
+ [
+ "CreateExtraMetaData",
+ "SaveImageWithMetaData"
+ ],
+ {
+ "title_aux": "ComfyUI-SaveImageWithMetaData"
+ }
+ ],
+ "https://github.com/nkchocoai/ComfyUI-SizeFromPresets": [
+ [
+ "EmptyLatentImageFromPresetsSD15",
+ "EmptyLatentImageFromPresetsSDXL",
+ "GetSimilarResolution",
+ "GetSimilarResolutionEmptyLatent",
+ "RandomEmptyLatentImageFromPresetsSD15",
+ "RandomEmptyLatentImageFromPresetsSDXL",
+ "RandomSizeFromPresetsSD15",
+ "RandomSizeFromPresetsSDXL",
+ "SizeFromPresetsSD15",
+ "SizeFromPresetsSDXL"
+ ],
+ {
+ "title_aux": "ComfyUI-SizeFromPresets"
+ }
+ ],
+ "https://github.com/nkchocoai/ComfyUI-TextOnSegs": [
+ [
+ "CalcMaxFontSize",
+ "ExtractDominantColor",
+ "GetComplementaryColor",
+ "SegsToRegion",
+ "TextOnSegsFloodFill"
+ ],
+ {
+ "title_aux": "ComfyUI-TextOnSegs"
+ }
+ ],
+ "https://github.com/nobandegani/comfyui_ino_nodes": [
+ [
+ "InoBoolToSwitch",
+ "InoBooleanEqual",
+ "InoCropImageByBox",
+ "InoGetDateTimeAsBase64",
+ "InoLoadImagesFromFolder",
+ "InoNotBoolean",
+ "InoOnImageListCompleted"
+ ],
+ {
+ "title_aux": "ComfyUI Ino Nodes"
+ }
+ ],
+ "https://github.com/nobrainX2/comfyUI-customDia": [
+ [
+ "Audio retimer",
+ "Dia text to speech"
+ ],
+ {
+ "title_aux": "ComfyUI Custom Dia"
+ }
+ ],
+ "https://github.com/noelkim12/ComfyUI-NoelTextUtil": [
+ [
+ "NoelLoRATriggerInjector",
+ "NoelUnifiedPrefix"
+ ],
+ {
+ "title_aux": "ComfyUI-ComfyUI-NoelTextUtil"
+ }
+ ],
+ "https://github.com/noembryo/ComfyUI-noEmbryo": [
+ [
+ "PromptTermList1",
+ "PromptTermList2",
+ "PromptTermList3",
+ "PromptTermList4",
+ "PromptTermList5",
+ "PromptTermList6"
+ ],
+ {
+ "author": "noEmbryo",
+ "description": "Some useful nodes for ComfyUI",
+ "nickname": "noEmbryo",
+ "title": "noEmbryo nodes",
+ "title_aux": "noEmbryo nodes"
+ }
+ ],
+ "https://github.com/nofunstudio/Node_Fun_ComfyUI": [
+ [
+ "DynamicQueueCounter",
+ "FalAPI_Flux2KleinEdit",
+ "FalAPI_Flux2LoraEdit",
+ "FalAPI_Flux2TurboEdit",
+ "FalAPI_NanoBananaPro",
+ "FalAPI_QwenEditPlus",
+ "FalAPI_kling_video",
+ "FalAPI_ltx2_video",
+ "FalAPI_recraft_upscale",
+ "FalAPI_seedance_video",
+ "FluxKontextInpaintingConditioning",
+ "Fun KSampler",
+ "IframeView",
+ "IndexedStringSelector",
+ "Kontext Inpainting Conditioning",
+ "LayeredInfiniteZoom",
+ "LoadImageBatchFun",
+ "MultiAlphaComposite",
+ "Replicate flux 1.1 pro ultra",
+ "ReplicateAPI_flux_1_1_pro_ultra",
+ "ReplicateAPI_flux_fill_pro",
+ "StringLower",
+ "WaveSpeedAI_Flux2LoraEdit",
+ "WaveSpeedAI_Image"
+ ],
+ {
+ "title_aux": "Node_Fun_ComfyUI"
+ }
+ ],
+ "https://github.com/nomadoor/ComfyUI-Temporal-Mask-Tools": [
+ [
+ "TemporalMaskRemoveShortObjects",
+ "TemporalMaskUnion"
+ ],
+ {
+ "title_aux": "ComfyUI Temporal Mask Tools"
+ }
+ ],
+ "https://github.com/northumber/ComfyUI-northTools": [
+ [
+ "BooleanIndexesToString",
+ "ConcatHistoryString",
+ "ExtractMetadataByKey",
+ "ImageToTrue",
+ "LoadImagesFromDirByIndexBatch",
+ "LoadImagesFromDirByIndexList",
+ "LoadImagesFromDirList",
+ "SumIntegers"
+ ],
+ {
+ "title_aux": "ComfyUI-northTools"
+ }
+ ],
+ "https://github.com/nosiu/comfyui-instantId-faceswap": [
+ [
+ "AngleFromFace",
+ "AngleFromKps",
+ "ComposeRotated",
+ "ControlNetInstantIdApply",
+ "FaceEmbed",
+ "FaceEmbedCombine",
+ "InstantIdAdapterApply",
+ "InstantIdAndControlnetApply",
+ "Kps2dRandomizer",
+ "Kps2dScale",
+ "Kps2dScaleBy",
+ "Kps3dFromImage",
+ "Kps3dRandomizer",
+ "KpsCrop",
+ "KpsDraw",
+ "KpsMaker",
+ "KpsRotate",
+ "KpsScale",
+ "KpsScaleBy",
+ "LoadInsightface",
+ "LoadInstantIdAdapter",
+ "MaskFromKps",
+ "PreprocessImagAdvancese",
+ "PreprocessImage",
+ "PreprocessImageAdvanced",
+ "RotateImage"
+ ],
+ {
+ "title_aux": "comfyui-instantId-faceswap"
+ }
+ ],
+ "https://github.com/nosiu/comfyui-text-randomizer": [
+ [
+ "ConcatText",
+ "RandomTextChoice",
+ "RandomizeText",
+ "RandomizeTextWithCheck",
+ "ShowText"
+ ],
+ {
+ "title_aux": "comfyui-text-randomizer"
+ }
+ ],
+ "https://github.com/noxinias/ComfyUI_NoxinNodes": [
+ [
+ "NoxinChime",
+ "NoxinPromptLoad",
+ "NoxinPromptSave",
+ "NoxinScaledResolution",
+ "NoxinSimpleMath",
+ "NoxinSplitPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI_NoxinNodes"
+ }
+ ],
+ "https://github.com/nsdtcloud3d/ComfyUI-3D-Convert": [
+ [
+ "ConvertTo3DFormat",
+ "Load3DConvertAPIKEY",
+ "Load3DFile"
+ ],
+ {
+ "title_aux": "ComfyUI-3D-Convert"
+ }
+ ],
+ "https://github.com/ntc-ai/ComfyUI-DARE-LoRA-Merge": [
+ [
+ "Apply LoRA",
+ "DARE Merge LoRA Stack",
+ "Save LoRA"
+ ],
+ {
+ "title_aux": "ComfyUI - Apply LoRA Stacker with DARE"
+ }
+ ],
+ "https://github.com/nuanarchy/ComfyUI-NuA-BIRD": [
+ [
+ "Bird_Deblurring_NuA",
+ "Bird_Denoising_NuA",
+ "Bird_Inpainting_NuA",
+ "Bird_Loader_NuA",
+ "Bird_Non_Uniform_Deblurring_NuA",
+ "Bird_Super_Resolution_NuA"
+ ],
+ {
+ "title_aux": "ComfyUI-NuA-BIRD"
+ }
+ ],
+ "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace": [
+ [
+ "FlashFace_Loader_NuA",
+ "FlashFace_Sampler_NuA"
+ ],
+ {
+ "title_aux": "ComfyUI-NuA-FlashFace"
+ }
+ ],
+ "https://github.com/nullquant/ComfyUI-BrushNet": [
+ [
+ "BlendInpaint",
+ "BrushNet",
+ "BrushNetLoader",
+ "CutForInpaint",
+ "PowerPaint",
+ "PowerPaintCLIPLoader",
+ "RAUNet"
+ ],
+ {
+ "author": "nullquant",
+ "description": "These are custom nodes for ComfyUI native implementation of BrushNet, PowerPaint and RAUNet models",
+ "nickname": "BrushName nodes",
+ "title": "BrushNet",
+ "title_aux": "BrushNet"
+ }
+ ],
+ "https://github.com/numz/ComfyUI-FlowChain": [
+ [
+ "WorkflowLipSync"
+ ],
+ {
+ "title_aux": "ComfyUI-FlowChain"
+ }
+ ],
+ "https://github.com/numz/ComfyUI-SeedVR2_VideoUpscaler": [
+ [
+ "SeedVR2LoadDiTModel",
+ "SeedVR2LoadVAEModel",
+ "SeedVR2TorchCompileSettings",
+ "SeedVR2VideoUpscaler"
+ ],
+ {
+ "title_aux": "ComfyUI-SeedVR2_VideoUpscaler"
+ }
+ ],
+ "https://github.com/numz/Comfyui-Orpheus": [
+ [
+ "orpheus",
+ "orpheusAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-Orpheus"
+ }
+ ],
+ "https://github.com/nunchaku-tech/ComfyUI-nunchaku": [
+ [
+ "NunchakuDepthPreprocessor",
+ "NunchakuFluxDiTLoader",
+ "NunchakuFluxIPAdapterApply",
+ "NunchakuFluxLoraLoader",
+ "NunchakuFluxLoraStack",
+ "NunchakuFluxPuLIDApplyV2",
+ "NunchakuIPAdapterLoader",
+ "NunchakuModelMerger",
+ "NunchakuPuLIDLoaderV2",
+ "NunchakuPulidApply",
+ "NunchakuPulidLoader",
+ "NunchakuQwenImageDiTLoader",
+ "NunchakuTextEncoderLoader",
+ "NunchakuTextEncoderLoaderV2",
+ "NunchakuWheelInstaller",
+ "NunchakuZImageDiTLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-nunchaku"
+ }
+ ],
+ "https://github.com/nux1111/ComfyUI_NetDist_Plus": [
+ [
+ "CombineImageBatch",
+ "ConditioningFromBase64(Nux)",
+ "ConditioningToBase64(Nux)",
+ "ExtractBase64FromImage(Nux)",
+ "ExtractBase64FromImageUpload(Nux)",
+ "FetchRemote",
+ "FetchRemoteWithExtras(Nux)",
+ "LatentToBase64(Nux)",
+ "LoadCurrentWorkflowJSON",
+ "LoadDiskWorkflowJSON",
+ "LoadImageUrl",
+ "LoadLatentFromBase64(Nux)",
+ "LoadLatentNumpy",
+ "LoadLatentUrl",
+ "LoadWorkflowJSON",
+ "RemoteApplyValues(Nux)",
+ "RemoteApplyValuesMulti(Nux)",
+ "RemoteChainEnd",
+ "RemoteChainStart",
+ "RemoteChainStart(Nux)",
+ "RemoteQueueSimple",
+ "RemoteQueueSimple(Nux)",
+ "RemoteQueueWorker",
+ "SaveDiskWorkflowJSON",
+ "SaveImageUrl",
+ "SaveImageWithBase64(Nux)",
+ "SaveLatentNumpy"
+ ],
+ {
+ "title_aux": "ComfyUI_NetDist_Plus"
+ }
+ ],
+ "https://github.com/nyueki/ComfyUI-RemoteCLIPLoader": [
+ [
+ "RemoteCLIPLoader",
+ "RemoteCLIPWorker"
+ ],
+ {
+ "title_aux": "ComfyUI-RemoteCLIPLoader"
+ }
+ ],
+ "https://github.com/o-l-l-i/ComfyUI-Olm-ChannelMixer": [
+ [
+ "OlmChannelMixer"
+ ],
+ {
+ "title_aux": "Olm Channel Mixer for ComfyUI"
+ }
+ ],
+ "https://github.com/o-l-l-i/ComfyUI-Olm-ColorBalance": [
+ [
+ "OlmColorBalance"
+ ],
+ {
+ "title_aux": "Olm Color Balance for ComfyUI"
+ }
+ ],
+ "https://github.com/o-l-l-i/ComfyUI-Olm-CurveEditor": [
+ [
+ "OlmCurveEditor"
+ ],
+ {
+ "title_aux": "Olm Curve Editor for ComfyUI"
+ }
+ ],
+ "https://github.com/o-l-l-i/ComfyUI-Olm-DragCrop": [
+ [
+ "OlmCropInfoInterpreter",
+ "OlmDragCrop"
+ ],
+ {
+ "title_aux": "Olm DragCrop for ComfyUI"
+ }
+ ],
+ "https://github.com/o-l-l-i/ComfyUI-Olm-Histogram": [
+ [
+ "OlmHistogram"
+ ],
+ {
+ "title_aux": "Olm Histogram for ComfyUI"
+ }
+ ],
+ "https://github.com/o-l-l-i/ComfyUI-Olm-ImageAdjust": [
+ [
+ "OlmImageAdjust"
+ ],
+ {
+ "title_aux": "Olm Image Adjust for ComfyUI"
+ }
+ ],
+ "https://github.com/o-l-l-i/ComfyUI-Olm-LGG": [
+ [
+ "OlmLGG"
+ ],
+ {
+ "title_aux": "Olm LGG (Lift, Gamma, Gain) for ComfyUI"
+ }
+ ],
+ "https://github.com/o-l-l-i/ComfyUI-Olm-Resolution-Picker": [
+ [
+ "OlmResolutionPicker"
+ ],
+ {
+ "title_aux": "Olm Resolution Picker for ComfyUI"
+ }
+ ],
+ "https://github.com/o-l-l-i/ComfyUI-Olm-Sketch": [
+ [
+ "OlmSketch"
+ ],
+ {
+ "title_aux": "Olm Sketch for ComfyUI"
+ }
+ ],
+ "https://github.com/o-l-l-i/ComfyUI-OlmLUT": [
+ [
+ "OlmLUT"
+ ],
+ {
+ "title_aux": "Olm LUT Node for ComfyUI"
+ }
+ ],
+ "https://github.com/obisin/ComfyUI-DGLS": [
+ [
+ "DGLSCleanup",
+ "DGLSModelLoader",
+ "DynamicSwappingLoader"
+ ],
+ {
+ "title_aux": "ComfyUI - DGLS (Dynamic GPU Layer Swapping)"
+ }
+ ],
+ "https://github.com/obvirm/ComfyUI-WhisperXX": [
+ [
+ "WhisperXNode"
+ ],
+ {
+ "title_aux": "ComfyUI-WhisperXX"
+ }
+ ],
+ "https://github.com/ohmygoobness/ComfyUI-ImageResolutionFixer": [
+ [
+ "ImageResolutionFixer"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageResolutionFixer"
+ }
+ ],
+ "https://github.com/okdalto/ComfyUI-FlashPortrait": [
+ [
+ "FlashPortraitFeatureExtractor",
+ "FlashPortraitLoader",
+ "FlashPortraitSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-FlashPortrait"
+ }
+ ],
+ "https://github.com/okdalto/ComfyUI-PersonaLive": [
+ [
+ "PersonaLiveCheckpointLoader",
+ "PersonaLivePhotoSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-PersonaLive"
+ }
+ ],
+ "https://github.com/okdalto/ComfyUI-WithAnyone": [
+ [
+ "WithAnyoneArcFaceExtractorNode",
+ "WithAnyoneBBoxNode",
+ "WithAnyoneModelLoaderNode",
+ "WithAnyoneSamplerNode",
+ "WithAnyoneSigLIPExtractorNode",
+ "WithAnyoneSinglePersonConditioningNode"
+ ],
+ {
+ "title_aux": "ComfyUI-WithAnyone"
+ }
+ ],
+ "https://github.com/okgo4/ComfyUI-Mosaic-Mask": [
+ [
+ "MosaicMask"
+ ],
+ {
+ "title_aux": "ComfyUI-Mosaic-Mask"
+ }
+ ],
+ "https://github.com/olafrv/comfyui_olafrv": [
+ [
+ "ORVImageSizeBestFitResolution",
+ "ORvEmbeddingsHeatmap",
+ "ORvEmbeddingsSpectrogram",
+ "ORvStringConsoleDebug",
+ "ORvTextEncoderGoogleEmbeddingGemma3",
+ "ORvTextStripNonLatin"
+ ],
+ {
+ "title_aux": "Olaf's Nodes"
+ }
+ ],
+ "https://github.com/olduvai-jp/ComfyUI-HfLoader": [
+ [
+ "ControlNet Loader From HF",
+ "Lora Loader From HF"
+ ],
+ {
+ "title_aux": "ComfyUI-HfLoader"
+ }
+ ],
+ "https://github.com/olduvai-jp/ComfyUI-S3-IO": [
+ [
+ "LoadImageS3",
+ "LoadVideoUploadS3",
+ "SaveImageS3",
+ "VHS_AudioToVHSAudio",
+ "VHS_BatchManager",
+ "VHS_DuplicateImages",
+ "VHS_DuplicateLatents",
+ "VHS_DuplicateMasks",
+ "VHS_GetImageCount",
+ "VHS_GetLatentCount",
+ "VHS_GetMaskCount",
+ "VHS_LoadAudio",
+ "VHS_LoadAudioUpload",
+ "VHS_LoadImagePath",
+ "VHS_LoadImages",
+ "VHS_LoadImagesPath",
+ "VHS_LoadVideo",
+ "VHS_LoadVideoFFmpeg",
+ "VHS_LoadVideoFFmpegPath",
+ "VHS_LoadVideoPath",
+ "VHS_MergeImages",
+ "VHS_MergeLatents",
+ "VHS_MergeMasks",
+ "VHS_PruneOutputs",
+ "VHS_SelectEveryNthImage",
+ "VHS_SelectEveryNthLatent",
+ "VHS_SelectEveryNthMask",
+ "VHS_SelectFilename",
+ "VHS_SelectImages",
+ "VHS_SelectLatents",
+ "VHS_SelectLatest",
+ "VHS_SelectMasks",
+ "VHS_SplitImages",
+ "VHS_SplitLatents",
+ "VHS_SplitMasks",
+ "VHS_Unbatch",
+ "VHS_VAEDecodeBatched",
+ "VHS_VAEEncodeBatched",
+ "VHS_VHSAudioToAudio",
+ "VHS_VideoCombine",
+ "VHS_VideoInfo",
+ "VHS_VideoInfoLoaded",
+ "VHS_VideoInfoSource",
+ "VideoCombineS3"
+ ],
+ {
+ "title_aux": "ComfyUI-S3-IO"
+ }
+ ],
+ "https://github.com/oleksandr612/ComfyUI-Counter": [
+ [
+ "Simple Counter"
+ ],
+ {
+ "title_aux": "ComfyUI-Counter"
+ }
+ ],
+ "https://github.com/oliverswitzer/ComfyUI-Lora-Visualizer": [
+ [
+ "LoRAVisualizer",
+ "PromptComposer",
+ "PromptSplitter",
+ "WANLoRAHighLowSplitter"
+ ],
+ {
+ "title_aux": "LoRA Visualizer"
+ }
+ ],
+ "https://github.com/olivv-cs/ComfyUI-FunPack": [
+ [
+ "FunPackContinueVideo",
+ "FunPackCreativeTemplate",
+ "FunPackImg2LatentInterpolation",
+ "FunPackLorebookEnhancer",
+ "FunPackPromptEnhancer",
+ "FunPackStoryMemJSONConverter",
+ "FunPackStoryMemKeyframeExtractor",
+ "FunPackStoryMemLastFrameExtractor",
+ "FunPackStoryWriter",
+ "FunPackVideoStitch"
+ ],
+ {
+ "title_aux": "ComfyUI-FunPack"
+ }
+ ],
+ "https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92": [
+ [
+ "CLIPStringEncode _O",
+ "Chat completion _O",
+ "ChatGPT Simple _O",
+ "ChatGPT _O",
+ "ChatGPT compact _O",
+ "Chat_Completion _O",
+ "Chat_Message _O",
+ "Chat_Message_fromString _O",
+ "Concat Text _O",
+ "ConcatRandomNSP_O",
+ "Debug String _O",
+ "Debug Text _O",
+ "Debug Text route _O",
+ "Equation1param _O",
+ "Equation2params _O",
+ "GetImage_(Width&Height) _O",
+ "GetLatent_(Width&Height) _O",
+ "ImageScaleFactor _O",
+ "ImageScaleFactorSimple _O",
+ "LatentUpscaleFactor _O",
+ "LatentUpscaleFactorSimple _O",
+ "LatentUpscaleMultiply",
+ "Note _O",
+ "QOL Split String",
+ "RandomNSP _O",
+ "Replace Text _O",
+ "String _O",
+ "Text _O",
+ "Text2Image _O",
+ "Trim Text _O",
+ "combine_chat_messages _O",
+ "compine_chat_messages _O",
+ "concat Strings _O",
+ "create image _O",
+ "create_image _O",
+ "debug Completeion _O",
+ "debug messages_O",
+ "float _O",
+ "floatToInt _O",
+ "floatToText _O",
+ "int _O",
+ "intToFloat _O",
+ "load_openAI _O",
+ "replace String _O",
+ "replace String advanced _O",
+ "saveTextToFile _O",
+ "seed _O",
+ "selectLatentFromBatch _O",
+ "string2Image _O",
+ "trim String _O",
+ "variation_image _O"
+ ],
+ {
+ "title_aux": "Quality of life Suit:V2"
+ }
+ ],
+ "https://github.com/omixmaxdimo/OmiXDev": [
+ [
+ "OmixChatPro",
+ "OmixGeminiPro",
+ "ResolutionPresets"
+ ],
+ {
+ "title_aux": "OmiXdev Custom Nodes"
+ }
+ ],
+ "https://github.com/openvino-dev-samples/comfyui_openvino": [
+ [
+ "TorchCompileDiffusionOpenVINO",
+ "TorchCompileVAEOpenVINO"
+ ],
+ {
+ "title_aux": "ComfyUI-OpenVINO"
+ }
+ ],
+ "https://github.com/opparco/ComfyUI-WanLightx2vScheduler": [
+ [
+ "KSamplerAdvancedPartialSigmas",
+ "WanLightx2vSchedulerBasic",
+ "WanLightx2vSchedulerBasicFromModel"
+ ],
+ {
+ "title_aux": "Wan2.2 Lightx2v Scheduler for ComfyUI"
+ }
+ ],
+ "https://github.com/opvelll/ComfyUI_TextListProduct": [
+ [
+ "ProductedString",
+ "PromptPairConcat",
+ "TextListProduct",
+ "TextListProductWithSingleA",
+ "TextListProductWithSingleB",
+ "TextListProductWithSingleBoth"
+ ],
+ {
+ "title_aux": "Comfy UI Text List Product"
+ }
+ ],
+ "https://github.com/orange90/ComfyUI-Regex-Runner": [
+ [
+ "RegexNode"
+ ],
+ {
+ "title_aux": " ComfyUI-Regex-Runner"
+ }
+ ],
+ "https://github.com/orex2121/comfyui-OreX": [
+ [
+ "IoNetVision",
+ "KontextPresetsOrex",
+ "OreX Image Load Batch",
+ "OreX Image Save",
+ "PollinationsTextGenOrex",
+ "flux-kontext-orexnodes",
+ "orex IoNet Chat",
+ "orex IoNet Vision",
+ "orex IoNet Vision Url",
+ "orex Kontext Presets",
+ "orex Load Image",
+ "orex Load Image Batch",
+ "orex Load Image Batch Size",
+ "orex Polination Text Gen",
+ "orex Save Image"
+ ],
+ {
+ "title_aux": "comfyui-OreX"
+ }
+ ],
+ "https://github.com/orion4d/Calculator_Pro": [
+ [
+ "DataConverter",
+ "LengthConverter",
+ "ManualRateConverter",
+ "MassConverter",
+ "ScientificCalculatorTri",
+ "TimeConverter",
+ "UniversalConverter",
+ "VolumeConverter"
+ ],
+ {
+ "title_aux": "CalculatorPro - Node Suite for ComfyUI"
+ }
+ ],
+ "https://github.com/orion4d/ComfyUI-Image-Effects": [
+ [
+ "AsciiArtNode",
+ "AsciiTextNode",
+ "AuroraNode",
+ "BarrelDistortionNode",
+ "CSSFiltersNode",
+ "ChannelMixerNode",
+ "ColorBalanceNode",
+ "CrystallizeNode",
+ "CurvesNode",
+ "FilmGrainNode",
+ "FisheyeNode",
+ "GodRaysNode",
+ "HexagonalPixelateNode",
+ "HolographicNode",
+ "KaleidoscopeAdvancedNode",
+ "KaleidoscopeNode",
+ "LensFlareNode",
+ "LevelsNode",
+ "LightLeaksNode",
+ "NeonGlowNode",
+ "PinchNode",
+ "PolaroidNode",
+ "PolygonNode",
+ "RippleNode",
+ "SaverPlusNode",
+ "ShadowHighlightNode",
+ "SpherizeNode",
+ "TriangulateNode",
+ "VHSGlitchNode",
+ "VibranceNode",
+ "VintageTVNode",
+ "VoronoiNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Effects"
+ }
+ ],
+ "https://github.com/orion4d/ComfyUI_DAO_master": [
+ [
+ "ConvertIMGtoSVG",
+ "ConvertSVGtoIMG",
+ "DAO Blur",
+ "DAO Clone Circular",
+ "DAO Clone Circular Path",
+ "DAO Clone Grid",
+ "DAO Clone Grid Path",
+ "DAO Move",
+ "DAO RVB Color Picker",
+ "DAO Text Maker",
+ "DXF Add Circle",
+ "DXF Add Ellipse",
+ "DXF Add Line",
+ "DXF Add Polygon",
+ "DXF Add Rectangle",
+ "DXF Add Rounded Rectangle",
+ "DXF Add Star",
+ "DXF Add Triangle",
+ "DXF Import",
+ "DXF New",
+ "DXF Preview",
+ "DXF Save",
+ "DXF Stats",
+ "DXF Transform",
+ "DXF to SVG",
+ "Folder File Pro",
+ "Load Image Pro",
+ "MosaicAssembleFromFolder",
+ "MosaicTileAssemble",
+ "MosaicTileExport",
+ "Path To Image",
+ "SVG Boolean",
+ "SVG Load",
+ "SVG Passthrough",
+ "SVG Preview",
+ "SVG Save",
+ "SVG Style"
+ ],
+ {
+ "title_aux": "ComfyUI_DAO_master"
+ }
+ ],
+ "https://github.com/orion4d/ComfyUI_SharpnessPro": [
+ [
+ "Clarity",
+ "HighPassSharpen",
+ "SmartSharpen",
+ "Texture",
+ "UnsharpMaskSharpen"
+ ],
+ {
+ "title_aux": "SharpnessPro pour ComfyUI"
+ }
+ ],
+ "https://github.com/orion4d/ComfyUI_colormaster": [
+ [
+ "AnnotateHexLines",
+ "ColorPaletteExtractor",
+ "HexColorToImage",
+ "ImageCollageNode",
+ "SelectHexLine"
+ ],
+ {
+ "title_aux": "ComfyUI Colormaster Nodes"
+ }
+ ],
+ "https://github.com/orion4d/ComfyUI_extract_imag": [
+ [
+ "ExtractAndSaveImagesFromDocument"
+ ],
+ {
+ "title_aux": "ComfyUI_extract_imag"
+ }
+ ],
+ "https://github.com/orion4d/ComfyUI_image-display": [
+ [
+ "DisplayImageWithMask"
+ ],
+ {
+ "title_aux": "Display Image with Mask for ComfyUI"
+ }
+ ],
+ "https://github.com/orion4d/ComfyUI_pdf_nodes": [
+ [
+ "PDFExtractTextFromPages",
+ "PDFGetPageCount",
+ "PDFLoad",
+ "PDFMerge",
+ "PDFPagesToImages",
+ "PDFPreviewPage",
+ "PDFRotatePages",
+ "PDFSave",
+ "PDFSelectPageAndExtractText"
+ ],
+ {
+ "title_aux": "ComfyUI PDF Nodes"
+ }
+ ],
+ "https://github.com/orion4d/Comfyui_EncryptMaster": [
+ [
+ "Generate Passphrase",
+ "GeneratePassphrase",
+ "Image Cipher To Noise",
+ "Image Decipher From Noise",
+ "Stego Capacity Estimator",
+ "Stego Embed Image",
+ "Stego Embed Text",
+ "Stego Extract Image",
+ "Stego Extract Text",
+ "Text Cipher"
+ ],
+ {
+ "title_aux": "ComfyUI EncryptMaster"
+ }
+ ],
+ "https://github.com/orion4d/Gemini_Banana_by_orion4d": [
+ [
+ "GeminiNanoStudio"
+ ],
+ {
+ "title_aux": "Gemini Nano Banana for ComfyUI"
+ }
+ ],
+ "https://github.com/orion4d/Orion4D_pixelshift": [
+ [
+ "EnsembleSuperRes_Orion4D",
+ "SaveImageAdvanced_Orion4D"
+ ],
+ {
+ "title_aux": "Orion4D Pixel-Shift Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/orion4d/illusion_node": [
+ [
+ "AdvancedAutostereogramNode",
+ "CheckerboardNode",
+ "ColorImageNode",
+ "OpticalGeometricNode",
+ "OpticalIllusionNode",
+ "PatternGeneratorNode",
+ "TessellationNode",
+ "TileImageRepeaterNode"
+ ],
+ {
+ "title_aux": "ComfyUI Illusion & Pattern Nodes"
+ }
+ ],
+ "https://github.com/orpheus-gaze/comfyui-s2-guidance-test": [
+ [
+ "\u2728 S2Guidance_DIT"
+ ],
+ {
+ "title_aux": "comfyui-s2-guidance-test"
+ }
+ ],
+ "https://github.com/orssorbit/ComfyUI-wanBlockswap": [
+ [
+ "wanBlockSwap"
+ ],
+ {
+ "title_aux": "ComfyUI-wanBlockswap"
+ }
+ ],
+ "https://github.com/oshtz/ComfyUI-oshtz-nodes": [
+ [
+ "EasyAspectRatioNode",
+ "GPTImage1",
+ "LLMAIONode",
+ "LoraSwitcherDynamic",
+ "StringSplitterNode"
+ ],
+ {
+ "title_aux": "oshtz Nodes"
+ }
+ ],
+ "https://github.com/osi1880vr/prompt_quill_comfyui": [
+ [
+ "PromptQuillGenerate",
+ "PromptQuillGenerateConditioning",
+ "PromptQuillSail",
+ "PromptQuillSailConditioning"
+ ],
+ {
+ "title_aux": "ComfyUI_Prompt-Quill"
+ }
+ ],
+ "https://github.com/ostris/ComfyUI-FlexTools": [
+ [
+ "Flex2Conditioner",
+ "FlexGuidance",
+ "FlexLoraLoader",
+ "FlexLoraLoaderModelOnly"
+ ],
+ {
+ "nodename_pattern": "- Ostris$",
+ "title_aux": "Flex.1 tools"
+ }
+ ],
+ "https://github.com/ostris/ostris_nodes_comfyui": [
+ [
+ "Batch Image Loader - Ostris",
+ "LLM Pipe Loader - Ostris",
+ "LLM Prompt Upsampling - Ostris",
+ "One Seed - Ostris",
+ "Save Image Direct - Ostris",
+ "Text Box - Ostris"
+ ],
+ {
+ "nodename_pattern": "- Ostris$",
+ "title_aux": "Ostris Nodes ComfyUI"
+ }
+ ],
+ "https://github.com/otavanopisto/ComfyUI-aihub-workflow-exposer": [
+ [
+ "AIHubActionNewAudio",
+ "AIHubActionNewAudioSegment",
+ "AIHubActionNewFrames",
+ "AIHubActionNewImage",
+ "AIHubActionNewImageBatch",
+ "AIHubActionNewLatent",
+ "AIHubActionNewLayer",
+ "AIHubActionNewText",
+ "AIHubActionNewVideo",
+ "AIHubActionNewVideoSegment",
+ "AIHubActionSetProjectConfigBoolean",
+ "AIHubActionSetProjectConfigFloat",
+ "AIHubActionSetProjectConfigInteger",
+ "AIHubActionSetProjectConfigString",
+ "AIHubAddRunCondition",
+ "AIHubExposeAudio",
+ "AIHubExposeBoolean",
+ "AIHubExposeCfg",
+ "AIHubExposeExtendableScheduler",
+ "AIHubExposeFloat",
+ "AIHubExposeFrame",
+ "AIHubExposeImage",
+ "AIHubExposeImageBatch",
+ "AIHubExposeImageInfoOnly",
+ "AIHubExposeInteger",
+ "AIHubExposeLatent",
+ "AIHubExposeModel",
+ "AIHubExposeModelSimple",
+ "AIHubExposeProjectAudio",
+ "AIHubExposeProjectConfigBoolean",
+ "AIHubExposeProjectConfigFloat",
+ "AIHubExposeProjectConfigInteger",
+ "AIHubExposeProjectConfigString",
+ "AIHubExposeProjectImage",
+ "AIHubExposeProjectImageBatch",
+ "AIHubExposeProjectLatent",
+ "AIHubExposeProjectText",
+ "AIHubExposeProjectVideo",
+ "AIHubExposeSampler",
+ "AIHubExposeScheduler",
+ "AIHubExposeSeed",
+ "AIHubExposeSteps",
+ "AIHubExposeString",
+ "AIHubExposeStringSelection",
+ "AIHubExposeVideo",
+ "AIHubMetaExportLora",
+ "AIHubMetaExportModel",
+ "AIHubMetaSetExportedLoraImage",
+ "AIHubMetaSetExportedModelImage",
+ "AIHubMetaSetExportedWorkflowImage",
+ "AIHubUtilsCropMergedImageToLayerSize",
+ "AIHubUtilsFitLayerToMergedImage",
+ "AIHubUtilsFloatToInt",
+ "AIHubUtilsLoadCLIP",
+ "AIHubUtilsLoadLora",
+ "AIHubUtilsLoadModel",
+ "AIHubUtilsLoadVAE",
+ "AIHubUtilsMetadataMap",
+ "AIHubUtilsNewNormalizer",
+ "AIHubUtilsScaleImageAndMasks",
+ "AIHubUtilsStrToFloat",
+ "AIHubUtilsStrToVector",
+ "AIHubWorkflowController"
+ ],
+ {
+ "title_aux": "ComfyUI-aihub-workflow-exposer"
+ }
+ ],
+ "https://github.com/ownimage/ComfyUI-ownimage": [
+ [
+ "Caching Image Loader"
+ ],
+ {
+ "title_aux": "ComfyUI-ownimage"
+ }
+ ],
+ "https://github.com/oxysoft/ComfyUI-gowiththeflow": [
+ [
+ "KSamplerNoiseless",
+ "NoiseWarperNode"
+ ],
+ {
+ "title_aux": "ComfyUI-gowiththeflow"
+ }
+ ],
+ "https://github.com/oyvindg/ComfyUI-TrollSuite": [
+ [
+ "BinaryImageMask",
+ "ImagePadding",
+ "LoadLastImage",
+ "RandomMask",
+ "TransparentImage"
+ ],
+ {
+ "title_aux": "ComfyUI-TrollSuite"
+ }
+ ],
+ "https://github.com/oztrkoguz/ComfyUI_StoryCreator": [
+ [
+ "Kosmos2SamplerSimple2",
+ "KosmosLoader2",
+ "StoryLoader",
+ "StorySamplerSimple",
+ "Write2"
+ ],
+ {
+ "title_aux": "ComfyUI StoryCreater"
+ }
+ ],
+ "https://github.com/p1atdev/comfyui-timm-backbone": [
+ [
+ "TimmBackboneImageEncode",
+ "TimmBackboneImageNormalize",
+ "TimmBackboneLoader",
+ "TimmBackboneRGB2BGR",
+ "TimmEmbedsPrint"
+ ],
+ {
+ "title_aux": "comfyui-timm-backbone"
+ }
+ ],
+ "https://github.com/p1atdev/comfyui-tkg-chroma-key": [
+ [
+ "ApplyTKGChromaKeyAdvanced",
+ "ApplyTKGChromaKeySDXL"
+ ],
+ {
+ "title_aux": "TKG-DM (Training-free Chroma Key Content Generation Diffusion Model) for ComfyUI"
+ }
+ ],
+ "https://github.com/pacchikAI/comfyui_pacchik_ImagePromptBatch": [
+ [
+ "LoadImageandPrompt"
+ ],
+ {
+ "title_aux": "ImagePromptBatch"
+ }
+ ],
+ "https://github.com/palant/image-resize-comfyui": [
+ [
+ "ImageResize"
+ ],
+ {
+ "title_aux": "Image Resize for ComfyUI"
+ }
+ ],
+ "https://github.com/pamparamm/ComfyUI-ppm": [
+ [
+ "AttentionCouplePPM",
+ "CFGLimiterGuider",
+ "CFGPPSamplerSelect",
+ "CLIPAttentionSelector",
+ "CLIPMicroConditioning",
+ "CLIPNegPip",
+ "CLIPTextEncodeBREAK",
+ "CLIPTextEncodeInvertWeights",
+ "CLIPTokenCounter",
+ "ConditioningZeroOutCombine",
+ "ConvertTimestepToSigma",
+ "DynSamplerSelect",
+ "DynamicThresholdingPost",
+ "DynamicThresholdingSimplePost",
+ "EmptyLatentImageAR",
+ "EpsilonScalingPPM",
+ "FreeU2PPM",
+ "Guidance Limiter",
+ "LatentOperationTonemapLuminance",
+ "LatentToMaskBB",
+ "LatentToWidthHeight",
+ "MaskCompositePPM",
+ "ModelAttentionSelector",
+ "PPMSamplerSelect",
+ "RenormCFGPost",
+ "RescaleCFGPost",
+ "SamplerGradientEstimation",
+ "SkipFirstStepCFG",
+ "TCFGAdvanced",
+ "TilePreprocessorPPM"
+ ],
+ {
+ "title_aux": "ComfyUI-ppm"
+ }
+ ],
+ "https://github.com/pamparamm/ComfyUI-vectorscope-cc": [
+ [
+ "DiffusionCG",
+ "NormalizeLatent",
+ "VectorscopeCC"
+ ],
+ {
+ "title_aux": "ComfyUI Vectorscope CC"
+ }
+ ],
+ "https://github.com/pamparamm/sd-perturbed-attention": [
+ [
+ "NormalizedAttentionGuidance",
+ "PLADIS",
+ "PerturbedAttention",
+ "SlidingWindowGuidanceAdvanced",
+ "SmoothedEnergyGuidanceAdvanced",
+ "TRTAttachPag",
+ "TRTPerturbedAttention",
+ "TokenPerturbationGuidance"
+ ],
+ {
+ "title_aux": "sd-perturbed-attention"
+ }
+ ],
+ "https://github.com/pantaleone-ai/Comfy-Firefly": [
+ [
+ "AdobeFireflyTextToImage"
+ ],
+ {
+ "title_aux": "Comfy-Firefly"
+ }
+ ],
+ "https://github.com/pants007/comfy-pants": [
+ [
+ "CLIPTextEncodeAIO",
+ "CLIPTextEncodeStylePile Node",
+ "Image Make Square",
+ "Image Make Square Node"
+ ],
+ {
+ "title_aux": "pants"
+ }
+ ],
+ "https://github.com/papcorns/ComfyUI-Papcorns-Node-LoadImageFromUrl": [
+ [
+ "LoadImageFromUrlOrPath"
+ ],
+ {
+ "title_aux": "ComfyUI Load Image From URL"
+ }
+ ],
+ "https://github.com/papcorns/Papcorns-Comfyui-Custom-Nodes": [
+ [
+ "PapcornsAspectResize",
+ "PapcornsAudioTrimAndSave",
+ "PapcornsAudioTrimmer",
+ "PapcornsFpsCalculator",
+ "PapcornsMemoryManager",
+ "PapcornsSimpleMemoryManager",
+ "UploadImageToGCS"
+ ],
+ {
+ "title_aux": "Papcorns ComfyUI Custom Nodes"
+ }
+ ],
+ "https://github.com/pathway8-sudo/ComfyUI-Pathway-CutPNG-Node": [
+ [
+ "CutPNGNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Pathway-CutPNG-Node"
+ }
+ ],
+ "https://github.com/patriciogonzalezvivo/comfyui_glslnodes": [
+ [
+ "float",
+ "glslBuffers",
+ "glslEditor",
+ "glslEditorPro",
+ "glslUniforms",
+ "glslViewer",
+ "int",
+ "vec2",
+ "vec2 (pos)",
+ "vec3",
+ "vec3 (pos)",
+ "vec4",
+ "vec4 (color)"
+ ],
+ {
+ "author": "Patricio Gonzalez Vivo",
+ "description": "A set of nodes to work with GLSL shaders",
+ "nickname": "GLSL Nodes",
+ "title": "GLSL Nodes",
+ "title_aux": "GLSL Nodes"
+ }
+ ],
+ "https://github.com/paulh4x/ComfyUI_PHRenderFormerWrapper": [
+ [
+ "RenderFormerCamera",
+ "RenderFormerCameraTarget",
+ "RenderFormerExampleScene",
+ "RenderFormerFromJSON",
+ "RenderFormerGenerator",
+ "RenderFormerLighting",
+ "RenderFormerLightingCombine",
+ "RenderFormerLightingTarget",
+ "RenderFormerLoadMesh",
+ "RenderFormerMeshCombine",
+ "RenderFormerMeshTarget",
+ "RenderFormerModelLoader",
+ "RenderFormerRandomizeColors",
+ "RenderFormerRemeshMesh",
+ "RenderFormerSceneBuilder"
+ ],
+ {
+ "title_aux": "ComfyUI_PHRenderFormerWrapper"
+ }
+ ],
+ "https://github.com/paulo-coronado/comfy_clip_blip_node": [
+ [
+ "CLIPTextEncodeBLIP",
+ "CLIPTextEncodeBLIP-2",
+ "Example"
+ ],
+ {
+ "title_aux": "comfy_clip_blip_node"
+ }
+ ],
+ "https://github.com/pawelmal0101/ComfyUI-Webhook": [
+ [
+ "Webhook"
+ ],
+ {
+ "title_aux": "ComfyUI Webhook Notifier"
+ }
+ ],
+ "https://github.com/pbpbpb2705/ComfyUI-LyraVSIH": [
+ [
+ "MultiObjectMask"
+ ],
+ {
+ "title_aux": "ComfyUI-LyraVSIH"
+ }
+ ],
+ "https://github.com/pdale-boop/Comfyui-Network-Guardian": [
+ [
+ "Example",
+ "NetworkGuardianStatus"
+ ],
+ {
+ "title_aux": "Network Guardian"
+ }
+ ],
+ "https://github.com/penposs/ComfyUI_Gemini_Pro": [
+ [
+ "Gemini File Processing",
+ "Gemini File Upload",
+ "Gemini Pro"
+ ],
+ {
+ "title_aux": "ComfyUI Gemini Pro Node"
+ }
+ ],
+ "https://github.com/penposs/Comfyui-banana2": [
+ [
+ "BananaNode",
+ "TransparentImageNode"
+ ],
+ {
+ "title_aux": "Comfyui-banana2"
+ }
+ ],
+ "https://github.com/penposs/Comfyui_wan_api": [
+ [
+ "WanAPIImageToVideo",
+ "WanAPIImageUploader",
+ "WanAPI_Image2Video",
+ "WanAPI_ImageUploader"
+ ],
+ {
+ "title_aux": "Comfyui_wan_api"
+ }
+ ],
+ "https://github.com/pentarab/ComfyUI-For-ChatterBox": [
+ [
+ "ChatterboxTTS"
+ ],
+ {
+ "title_aux": "ComfyUI-For-ChatterBox"
+ }
+ ],
+ "https://github.com/perckle/comfyui_dpir": [
+ [
+ "ImageDenoiseWithDPIR"
+ ],
+ {
+ "title_aux": "ComfyUI-DPIR"
+ }
+ ],
+ "https://github.com/perezjoan/ComfyUI-QwenEdit-Urbanism-by-UGA": [
+ [
+ "RandomImageSelector",
+ "SequentialImageSelector",
+ "StatefulImageCollector"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenEdit-Urbanism-by-UGA"
+ }
+ ],
+ "https://github.com/peter119lee/ComfyUI-BananaForge": [
+ [
+ "BananaForgeBatch",
+ "BananaForgeImg2Img",
+ "BananaForgeText2Img"
+ ],
+ {
+ "title_aux": "ComfyUI-BananaForge"
+ }
+ ],
+ "https://github.com/petmycat/ComfyUI-gen2": [
+ [
+ "Gen2_ApplyQwenControlNetFun",
+ "Gen2_DwposeThreshold",
+ "Gen2_LoadQwenControlNetFun",
+ "Gen2_LoadQwenLora",
+ "Gen2_LoadQwenVAE",
+ "Gen2_QwenClipTextEncode",
+ "Gen2_QwenImageControlSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-gen2"
+ }
+ ],
+ "https://github.com/petr-pr/ComfyUI-TranslationNode": [
+ [
+ "TranslationNode"
+ ],
+ {
+ "title_aux": "ComfyUI-TranslationNode"
+ }
+ ],
+ "https://github.com/pharmapsychotic/comfy-cliption": [
+ [
+ "CLIPtionBeamSearch",
+ "CLIPtionGenerate",
+ "CLIPtionLoader"
+ ],
+ {
+ "title_aux": "comfy-cliption"
+ }
+ ],
+ "https://github.com/phaserblast/ComfyUI-DGXSparkSafetensorsLoader": [
+ [
+ "DGXSparkSafetensorsLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-DGXSparkSafetensorsLoader"
+ }
+ ],
+ "https://github.com/phazei/ComfyUI-OrpheusTTS-LMStudio": [
+ [
+ "OrpheusTTSLMStudio"
+ ],
+ {
+ "title_aux": "ComfyUI-OrpheusTTS-LMStudio"
+ }
+ ],
+ "https://github.com/phazei/ComfyUI-Prompt-Stash": [
+ [
+ "PromptStashManager",
+ "PromptStashPassthrough",
+ "PromptStashSaver"
+ ],
+ {
+ "title_aux": "Prompt Stash"
+ }
+ ],
+ "https://github.com/philiprodriguez/ComfyUI-HunyuanImageLatentToVideoLatent": [
+ [
+ "HunyuanImageLatentToVideoLatent"
+ ],
+ {
+ "title_aux": "ComfyUI-HunyuanImageLatentToVideoLatent"
+ }
+ ],
+ "https://github.com/philipy1219/ComfyUI-CloudStorage": [
+ [
+ "LoadImageFromCloud",
+ "LoadMaskFromCloud",
+ "LoadVideoFromCloud",
+ "SaveImageToCloud",
+ "UploadFileToCloud"
+ ],
+ {
+ "title_aux": "ComfyUI-CloudStorage"
+ }
+ ],
+ "https://github.com/philipy1219/ComfyUI-TaylorSeer": [
+ [
+ "FluxBlockSwap",
+ "HidreamBlockSwap",
+ "QwenimageBlockSwap",
+ "TaylorSeer",
+ "TaylorSeerLite",
+ "WanvideoBlockSwap"
+ ],
+ {
+ "title_aux": "ComfyUI-TaylorSeer"
+ }
+ ],
+ "https://github.com/philz1337x/ComfyUI-ClarityAI": [
+ [
+ "Clarity AI Upscaler"
+ ],
+ {
+ "title_aux": "\u2728 Clarity AI - Creative Image Upscaler and Enhancer for ComfyUI"
+ }
+ ],
+ "https://github.com/phuvinh010701/ComfyUI-Nudenet": [
+ [
+ "ApplyNudenet",
+ "FilterdLabel",
+ "NudenetModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Nudenet"
+ }
+ ],
+ "https://github.com/phyblas/nsfw-shorier_comfyui": [
+ [
+ "CensorNsfwPart",
+ "FilterNsfw",
+ "FilterNsfwWithText",
+ "FindNsfwPart",
+ "FindNudenetPart",
+ "GetNsfwScore",
+ "IsNsfw",
+ "ReplaceIfNsfw",
+ "SaveImageSfw"
+ ],
+ {
+ "title_aux": "nsfw-shorier_comfyui"
+ }
+ ],
+ "https://github.com/phyblas/paint-by-example_comfyui": [
+ [
+ "PaintbyExampleAdvanced",
+ "PaintbyExampleGen",
+ "PaintbyExampleSimple",
+ "PaintbyIchimatsu",
+ "PaintbySingleColor"
+ ],
+ {
+ "title_aux": "paint-by-example @ ComfyUI"
+ }
+ ],
+ "https://github.com/pictorialink/ComfyUI-Custom-Node-Config": [
+ [
+ "FormSubmitNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Custom-Node-Config"
+ }
+ ],
+ "https://github.com/pictorialink/ComfyUI-Qwen3-llama.cpp": [
+ [
+ "Comfyui_Qwen_CUDA/Qwen25_VL",
+ "Comfyui_Qwen_CUDA/Qwen3",
+ "Qwen25_VL",
+ "Qwen3"
+ ],
+ {
+ "title_aux": "ComfyUI-Qwen3-llama.cpp"
+ }
+ ],
+ "https://github.com/pictorialink/ComfyUI-Text-Translation": [
+ [
+ "Text",
+ "Text_Concatenate",
+ "Text_Switch",
+ "Text_Translation",
+ "Text_Translation_V2",
+ "Text_Translation_V2_Full"
+ ],
+ {
+ "title_aux": "ComfyUI-Text-Translation"
+ }
+ ],
+ "https://github.com/picturesonpictures/comfy_PoP": [
+ [
+ "AdaptiveCannyDetector_PoP",
+ "AnyAspectRatio",
+ "ConditioningMultiplier_PoP",
+ "ConditioningNormalizer_PoP",
+ "DallE3_PoP",
+ "EfficientAttention",
+ "LoadImageResizer_PoP",
+ "LoraStackLoader10",
+ "LoraStackLoader10_PoP",
+ "LoraStackLoader_PoP",
+ "VAEDecoderPoP",
+ "VAEEncoderPoP"
+ ],
+ {
+ "title_aux": "comfy_PoP"
+ }
+ ],
+ "https://github.com/pierreb-mf/ComfyUI-MF-PipoNodes": [
+ [
+ "MF_CustomDropdownMenu",
+ "MF_DiceRoller",
+ "MF_GraphPlotter",
+ "MF_LineCounter",
+ "MF_LineSelect",
+ "MF_LogFile",
+ "MF_LogReader",
+ "MF_Modulo",
+ "MF_ModuloAdvanced",
+ "MF_ReadData",
+ "MF_SaveData",
+ "MF_ShotHelper",
+ "MF_ShowData",
+ "MF_StoryDriver"
+ ],
+ {
+ "title_aux": "MF PipoNodes"
+ }
+ ],
+ "https://github.com/pikenrover/ComfyUI_PRNodes": [
+ [
+ "CheckpointLoaderSimpleExtended",
+ "EmptyLatentImageScaleBy",
+ "ImageScaleTo",
+ "LoadRandomImage",
+ "LoraLoaderExtended",
+ "RandomPrompt",
+ "RandomPromptMixed",
+ "Save Image w/Metadata"
+ ],
+ {
+ "title_aux": "ComfyUI_PRNodes"
+ }
+ ],
+ "https://github.com/piscesbody/ComfyUI-Upscale-CUDAspeed": [
+ [
+ "ImageUpscaleWithModelCUDAspeedFixed",
+ "UpscaleModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Upscale-CUDAspeed"
+ }
+ ],
+ "https://github.com/pixelpainter/UI-Decorators": [
+ [
+ "DividerNode",
+ "NoteNode",
+ "SpacerNode",
+ "TitleNode"
+ ],
+ {
+ "title_aux": "UI-Decorators [SubGraph]"
+ }
+ ],
+ "https://github.com/pixelpainter/comfyui-mute-bypass-by-ID": [
+ [
+ "RemoteControl",
+ "RemoteControlMulti",
+ "RemoteSwitch",
+ "RemoteSwitchMulti"
+ ],
+ {
+ "title_aux": "mute-bypass by node ID"
+ }
+ ],
+ "https://github.com/pixelworldai/ComfyUI-AlphaFlatten": [
+ [
+ "FlattenByAlpha"
+ ],
+ {
+ "title_aux": "ComfyUI-AlphaFlatten"
+ }
+ ],
+ "https://github.com/pizurny/ComfyUI-AV-Handles": [
+ [
+ "AVHandlesAdd",
+ "AVHandlesTrim"
+ ],
+ {
+ "title_aux": "ComfyUI-AV-Handles"
+ }
+ ],
+ "https://github.com/pizurny/Comfyui-Latent-Transform-Sampler": [
+ [
+ "LatentTransformSampler",
+ "NTransformSampler"
+ ],
+ {
+ "title_aux": "ComfyUI Latent Transform Sampler"
+ }
+ ],
+ "https://github.com/pkpkTech/ComfyUI-SaveAVIF": [
+ [
+ "SaveAvif"
+ ],
+ {
+ "title_aux": "ComfyUI-SaveAVIF"
+ }
+ ],
+ "https://github.com/pkpkTech/ComfyUI-TemporaryLoader": [
+ [
+ "LoadTempCheckpoint",
+ "LoadTempLoRA",
+ "LoadTempMultiLoRA"
+ ],
+ {
+ "title_aux": "ComfyUI-TemporaryLoader"
+ }
+ ],
+ "https://github.com/playbook3d/playbook3d-comfyui-nodes": [
+ [
+ "Beauty Pass Sequence",
+ "Depth Pass Sequence",
+ "Mask Pass Sequence",
+ "Outline Pass Sequence",
+ "Playbook Aspect Ratio Select",
+ "Playbook Beauty",
+ "Playbook Beauty Sequence",
+ "Playbook Boolean",
+ "Playbook Depth",
+ "Playbook Depth Sequence",
+ "Playbook Float",
+ "Playbook Image",
+ "Playbook LoRA Select",
+ "Playbook LoRA Selection",
+ "Playbook Mask",
+ "Playbook Mask Sequence",
+ "Playbook Number",
+ "Playbook Outline",
+ "Playbook Outline Sequence",
+ "Playbook Render Result",
+ "Playbook Seed",
+ "Playbook Text",
+ "Playbook Video"
+ ],
+ {
+ "title_aux": "Playbook Nodes"
+ }
+ ],
+ "https://github.com/plugcrypt/CRT-Nodes": [
+ [
+ "AdvancedBloomFX",
+ "AdvancedStringReplace",
+ "AnyTrigger",
+ "ArcaneBloomFX",
+ "AudioCompressor",
+ "AudioFrameAdjuster",
+ "AudioLoaderCrawl",
+ "AudioOrManualFrameCount",
+ "AudioPreviewer",
+ "AutopromptProcessor",
+ "BatchBrightnessCurve",
+ "Boolean Transform",
+ "BooleanInvert",
+ "CLIPTextEncodeFluxMerged",
+ "CRT Post-Process Suite",
+ "CRTChromaKeyOverlay",
+ "CRTFirstLastFrameSelector",
+ "CRTLoadLastMedia",
+ "CRTLoadLastVideo",
+ "CRTPctCropCalculator",
+ "CRTPostProcess",
+ "CRT_AddSettingsAndPrompt",
+ "CRT_DynamicPromptScheduler",
+ "CRT_FileBatchPromptScheduler",
+ "CRT_KSamplerBatch",
+ "CRT_QuantizeAndCropImage",
+ "CRT_RemoveLines",
+ "CRT_StringBatcher",
+ "CRT_StringLineCounter",
+ "CRT_StringSplitter",
+ "CRT_UpscaleModelAdv",
+ "CRT_WAN_BatchSampler",
+ "ClarityFX",
+ "ClearStyleModelDualCache",
+ "ColorIsolationFX",
+ "ColourfulnessFX",
+ "ContourFX",
+ "DepthAnythingTensorrtFormat",
+ "EmptyContext",
+ "EnableLatent",
+ "FaceEnhancementPipelineWithInjection",
+ "FancyNoteNode",
+ "FancyTimerNode",
+ "FileLoaderCrawl",
+ "FileLoaderCrawlBatch",
+ "FilmGrainFX",
+ "FluxAIO_CRT",
+ "FluxControlnetSampler",
+ "FluxControlnetSamplerWithInjection",
+ "FluxLoraBlocksPatcher",
+ "FluxSemanticEncoder",
+ "FluxTiledSamplerCustomAdvanced",
+ "ImageDimensionsFromMegaPixels",
+ "ImageDimensionsFromMegaPixelsAlt",
+ "ImageLoaderCrawl",
+ "LTXVAutoGuideSpacing",
+ "LatentNoiseInjectionSampler",
+ "LensDistortFX",
+ "LensFX",
+ "LoadImageResize",
+ "LoadLastLatent",
+ "LoadVideoForVCaptioning",
+ "Lora Loader Str",
+ "MaskEmptyFloatNode",
+ "MaskPassOrPlaceholder",
+ "MonoToStereoConverter",
+ "ParametricEQNode",
+ "PonyFaceEnhancementPipelineWithInjection",
+ "PonyUpscaleSamplerWithInjection",
+ "Remove Trailing Comma",
+ "Resolution",
+ "SamplerSchedulerCrawler",
+ "SamplerSchedulerSelector",
+ "SaveAudioWithPath",
+ "SaveImageWithPath",
+ "SaveLatentWithPath",
+ "SaveTextWithPath",
+ "SaveVideoWithPath",
+ "SeamlessLoopBlender",
+ "SimpleFluxShiftNode",
+ "SimpleKnobNode",
+ "SimpleToggleNode",
+ "SmartControlNetApply",
+ "SmartDeNoiseFX",
+ "SmartPreprocessor",
+ "SmartStyleModelApplyDual",
+ "Strength To Steps",
+ "Technicolor2FX",
+ "Text Box line spot",
+ "Toggle Lora Unet Blocks L1",
+ "Toggle Lora Unet Blocks L2",
+ "Video Duration Calculator",
+ "VideoLoaderCrawl",
+ "WAN2.2 LoRA Compare Sampler",
+ "WanVideoLoraSelectMultiImproved"
+ ],
+ {
+ "author": "chflame",
+ "description": "A set of nodes for ComfyUI that can composite layer and mask to achieve Photoshop like functionality.",
+ "nickname": "LayerStyle",
+ "title": "LayerStyle",
+ "title_aux": "CRT-Nodes"
+ }
+ ],
+ "https://github.com/pmarmotte2/ComfyUI-Speaker-Isolation": [
+ [
+ "SpeakerDiarizer",
+ "SpeakerDiarizerChronoNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Speaker-Isolation"
+ }
+ ],
+ "https://github.com/pnikolic-amd/ComfyUI_MIGraphX": [
+ [
+ "CompileDiffusersMIGraphX"
+ ],
+ {
+ "title_aux": "MIGraphX Node for ComfyUI"
+ }
+ ],
+ "https://github.com/pollockjj/ComfyUI-MultiGPU": [
+ [
+ "CLIPLoaderDisTorch2MultiGPU",
+ "CLIPLoaderMultiGPU",
+ "CLIPVisionLoaderDisTorch2MultiGPU",
+ "CLIPVisionLoaderMultiGPU",
+ "CheckpointLoaderAdvancedDisTorch2MultiGPU",
+ "CheckpointLoaderAdvancedMultiGPU",
+ "CheckpointLoaderSimpleDisTorch2MultiGPU",
+ "CheckpointLoaderSimpleMultiGPU",
+ "ControlNetLoaderDisTorch2MultiGPU",
+ "ControlNetLoaderMultiGPU",
+ "DiffControlNetLoaderDisTorch2MultiGPU",
+ "DiffControlNetLoaderMultiGPU",
+ "DiffusersLoaderDisTorch2MultiGPU",
+ "DiffusersLoaderMultiGPU",
+ "DualCLIPLoaderDisTorch2MultiGPU",
+ "DualCLIPLoaderMultiGPU",
+ "QuadrupleCLIPLoaderDisTorch2MultiGPU",
+ "QuadrupleCLIPLoaderMultiGPU",
+ "TripleCLIPLoaderDisTorch2MultiGPU",
+ "TripleCLIPLoaderMultiGPU",
+ "UNETLoaderDisTorch2MultiGPU",
+ "UNETLoaderMultiGPU",
+ "UNetLoaderLP",
+ "VAELoaderDisTorch2MultiGPU",
+ "VAELoaderMultiGPU"
+ ],
+ {
+ "title_aux": "ComfyUI-MultiGPU"
+ }
+ ],
+ "https://github.com/polym/ComfyUI-musubi": [
+ [
+ "MusubiUNETJitLoader",
+ "MusubiUNETLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-musubi"
+ }
+ ],
+ "https://github.com/polymath-wtf/ComfyUI-Polymath-Vibenodes": [
+ [
+ "PM_JsonPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-Polymath-Vibenodes"
+ }
+ ],
+ "https://github.com/popoimm/comfyui-popo-utility": [
+ [
+ "PopoImageAspectRatioNode",
+ "PopoImageDimensionsNode",
+ "PopoImageSizeNode",
+ "PopoMathExpressionNode"
+ ],
+ {
+ "title_aux": "ComfyUI Popo Utility"
+ }
+ ],
+ "https://github.com/portu-sim/comfyui_bmab": [
+ [
+ "BMAB Alpha Composit",
+ "BMAB Base64 Image",
+ "BMAB Basic",
+ "BMAB Black And White",
+ "BMAB Blend",
+ "BMAB Clip Text Encoder SDXL",
+ "BMAB Conditioning To Bind",
+ "BMAB Context",
+ "BMAB Control Net",
+ "BMAB ControlNet",
+ "BMAB ControlNet IPAdapter",
+ "BMAB ControlNet Openpose",
+ "BMAB Crop",
+ "BMAB Detail Anything",
+ "BMAB Detect And Mask",
+ "BMAB Detect And Paste",
+ "BMAB Detection Crop",
+ "BMAB Detector",
+ "BMAB DinoSam",
+ "BMAB Dummy",
+ "BMAB Edge",
+ "BMAB Extractor",
+ "BMAB Face Detailer",
+ "BMAB Flux ControlNet",
+ "BMAB Flux Integrator",
+ "BMAB Google Gemini Prompt",
+ "BMAB Image Storage",
+ "BMAB Import Integrator",
+ "BMAB Inpaint",
+ "BMAB Integrator",
+ "BMAB KSampler",
+ "BMAB KSamplerHiresFix",
+ "BMAB KSamplerHiresFixWithUpscaler",
+ "BMAB KSamplerKohyaDeepShrink",
+ "BMAB Lama Inpaint",
+ "BMAB LoRA Loader",
+ "BMAB Load Image",
+ "BMAB Load Output Image",
+ "BMAB Masks To Images",
+ "BMAB Model To Bind",
+ "BMAB Noise Generator",
+ "BMAB Normalize Size",
+ "BMAB Openpose Hand Detailer",
+ "BMAB Outpaint By Ratio",
+ "BMAB Person Detailer",
+ "BMAB Preview Text",
+ "BMAB Prompt",
+ "BMAB Reframe",
+ "BMAB Remote Access And Save",
+ "BMAB Remove Background",
+ "BMAB Resize By Person",
+ "BMAB Resize By Ratio",
+ "BMAB Resize and Fill",
+ "BMAB SD-WebUI API BMAB Extension",
+ "BMAB SD-WebUI API ControlNet",
+ "BMAB SD-WebUI API I2I",
+ "BMAB SD-WebUI API Server",
+ "BMAB SD-WebUI API T2I",
+ "BMAB SD-WebUI API T2I Hires.Fix",
+ "BMAB Save Image",
+ "BMAB SeedGenerator",
+ "BMAB Segment Anything",
+ "BMAB Simple Hand Detailer",
+ "BMAB Square",
+ "BMAB Subframe Hand Detailer",
+ "BMAB Text",
+ "BMAB ToBind",
+ "BMAB Upscale With Model",
+ "BMAB Upscaler",
+ "BMAB Watermark",
+ "BMAB Zoom Out"
+ ],
+ {
+ "title_aux": "comfyui_bmab"
+ }
+ ],
+ "https://github.com/power88/ComfyUI-PDiD-LLM-Nodes": [
+ [
+ "APILLMLoader",
+ "CaptionViaAPI",
+ "ChatViaAPI",
+ "ExtraParameters",
+ "GenerateBBOXViaAPI"
+ ],
+ {
+ "title_aux": "ComfyUI-PDiD-LLM-Nodes"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterAI2V": [
+ [
+ "PainterAI2V",
+ "PainterAV2V"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterAI2V"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterFrameCount": [
+ [
+ "PainterFrameMath"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterFrameCount"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterI2V": [
+ [
+ "PainterI2V"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterI2V"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterI2Vadvanced": [
+ [
+ "PainterI2VAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterI2Vadvanced"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterI2VforKJ": [
+ [
+ "PainterI2VforKJ"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterI2VforKJ"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterImageFromBatch": [
+ [
+ "PainterImageFromBatch"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterImageFromBatch"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterImageLoad": [
+ [
+ "PainterImageLoad"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterImageLoad"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterLTXV2": [
+ [
+ "PainterLTX2V",
+ "PainterLTX2VPlus",
+ "PainterSamplerLTXV"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterLTXV2"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterLongVideo": [
+ [
+ "PainterLongVideo"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterLongVideo"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterMultiF2V": [
+ [
+ "PainterCombineFromBatch",
+ "PainterMultiF2V",
+ "PainterPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterMultiF2V"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterQwenImageEdit": [
+ [
+ "PainterQwenImageEditPlus"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterQwenImageEdit"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterVideoCombine": [
+ [
+ "PainterVideoCombine"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterVideoCombine"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterVideoInfo": [
+ [
+ "VideoInfoLoaded",
+ "VideoInfoSource"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterVideoInfo"
+ }
+ ],
+ "https://github.com/princepainter/ComfyUI-PainterVideoUpscale": [
+ [
+ "PainterVideoUpscale"
+ ],
+ {
+ "title_aux": "ComfyUI-PainterVideoUpscale"
+ }
+ ],
+ "https://github.com/princepainter/Comfyui-PainterAudioCut": [
+ [
+ "PainterAudioCut"
+ ],
+ {
+ "title_aux": "Comfyui-PainterAudioCut"
+ }
+ ],
+ "https://github.com/princepainter/Comfyui-PainterAudioLength": [
+ [
+ "PainterAudioLength"
+ ],
+ {
+ "title_aux": "Comfyui-PainterAudioLength"
+ }
+ ],
+ "https://github.com/princepainter/Comfyui-PainterFLF2V": [
+ [
+ "PainterFLF2V"
+ ],
+ {
+ "title_aux": "PainterFLF2V - First/Last Frame Video Enhancer"
+ }
+ ],
+ "https://github.com/princepainter/Comfyui-PainterFluxImageEdit": [
+ [
+ "PainterFluxImageEdit"
+ ],
+ {
+ "title_aux": "Comfyui-PainterFluxImageEdit"
+ }
+ ],
+ "https://github.com/princepainter/Comfyui-PainterSampler": [
+ [
+ "PainterSampler"
+ ],
+ {
+ "title_aux": "Comfyui-PainterSampler"
+ }
+ ],
+ "https://github.com/princepainter/Comfyui-PainterVRAM": [
+ [
+ "PainterVRAM"
+ ],
+ {
+ "title_aux": "Comfyui-PainterVRAM"
+ }
+ ],
+ "https://github.com/prodogape/ComfyUI-EasyOCR": [
+ [
+ "Apply EasyOCR"
+ ],
+ {
+ "title_aux": "ComfyUI-EasyOCR"
+ }
+ ],
+ "https://github.com/prodogape/ComfyUI-Minio": [
+ [
+ "Load Image From Minio",
+ "Save Image To Minio",
+ "Set Minio Config"
+ ],
+ {
+ "title_aux": "Comfyui-Minio"
+ }
+ ],
+ "https://github.com/prodogape/ComfyUI-OmDet": [
+ [
+ "Apply OmDet"
+ ],
+ {
+ "title_aux": "ComfyUI-OmDet"
+ }
+ ],
+ "https://github.com/prodogape/Comfyui-Yolov8-JSON": [
+ [
+ "Apply Yolov8 Model",
+ "Apply Yolov8 Model Seg",
+ "Draw Labelme Json",
+ "Load Yolov8 Model",
+ "Load Yolov8 Model From Path",
+ "Load Yolov8 Model Upload",
+ "Save Labelme Json"
+ ],
+ {
+ "title_aux": "Comfyui-Yolov8-JSON"
+ }
+ ],
+ "https://github.com/pschroedl/ComfyUI-SAM2-Realtime": [
+ [
+ "DownloadAndLoadSAM2RealtimeModel",
+ "Sam2RealtimeSegmentation"
+ ],
+ {
+ "title_aux": "ComfyUI-SAM2-Realtime"
+ }
+ ],
+ "https://github.com/psdwizzard/Comfyui-XYZ-stitch": [
+ [
+ "XYZAutoCollector",
+ "XYZGridInput",
+ "XYZGridInputBatch",
+ "XYZGridIterator",
+ "XYZGridStitch",
+ "XYZImageCollector",
+ "XYZStringToNumber"
+ ],
+ {
+ "title_aux": "Comfyui-XYZ-stitch"
+ }
+ ],
+ "https://github.com/ptmaster/ComfyUI-Load-Diffusion-Model-to-Muti-GPUs/raw/refs/heads/main/Load%20Diffusion%20Model%20into%20Muti%20GPUs.py": [
+ [
+ "OverrideLoadedDiffusionDevice"
+ ],
+ {
+ "title_aux": "ComfyUI-Load-Diffusion-Model-to-Muti-GPUs"
+ }
+ ],
+ "https://github.com/ptmaster/Comfyui-PT-Keyframe-Camera": [
+ [
+ "PT_KeyframeCamera"
+ ],
+ {
+ "title_aux": "Comfyui-PT-Keyframe-Camera"
+ }
+ ],
+ "https://github.com/ptmaster/comfyui-audio-speed": [
+ [
+ "PT48KHZ",
+ "PTAudioSpeed",
+ "PTEnsureStereo"
+ ],
+ {
+ "title_aux": "ComfyUI-audio-speed"
+ }
+ ],
+ "https://github.com/pupba/Comfy_ForEach": [
+ [
+ "EventBridgeTriggerNode",
+ "FolderImageLoaderNode",
+ "IndexedImageSelectorNode",
+ "IndexedNameSelectorNode",
+ "IsLastIndexNode",
+ "LoadPreCheckpointModel",
+ "LoadPreControlNetModel",
+ "SaveExactNameImageNode",
+ "StringViewer",
+ "TaskIDStorageNode"
+ ],
+ {
+ "title_aux": "ComfyForEach"
+ }
+ ],
+ "https://github.com/purewater2011/comfyui_color_detection": [
+ [
+ "IsYellowish",
+ "YellowHeatmap"
+ ],
+ {
+ "title_aux": "comfyui_color_detection"
+ }
+ ],
+ "https://github.com/purpen/ComfyUI-AIRedoon": [
+ [
+ "AIRedoonApplyLoRAStack",
+ "AIRedoonCheckLoraFile",
+ "AIRedoonCheckModelFile",
+ "AIRedoonConcatText",
+ "AIRedoonImageCaptioning",
+ "AIRedoonImageRGBA2RGB",
+ "AIRedoonLoRAStack",
+ "AIRedoonPreviewText",
+ "AIRedoonQwenModelLoader",
+ "AIRedoonSaveText",
+ "AIRedoonTranslator"
+ ],
+ {
+ "title_aux": "AIRedoon"
+ }
+ ],
+ "https://github.com/purpen/ComfyUI-ImageTagger": [
+ [
+ "AIRedoonImageCaptioning"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageTagger"
+ }
+ ],
+ "https://github.com/purzbeats/ComfyUI-Purz": [
+ [
+ "PurzAnimatedCheckerboard",
+ "PurzAnimatedNoise",
+ "PurzAnimatedPolkaDots",
+ "PurzAnimatedStripes",
+ "PurzCheckerboardPattern",
+ "PurzColorAdjust",
+ "PurzEdgeDetect",
+ "PurzGradientPattern",
+ "PurzGridPattern",
+ "PurzHexagonPattern",
+ "PurzImageBlur",
+ "PurzImageFlip",
+ "PurzImageRotate",
+ "PurzImageToBlackWhite",
+ "PurzInteractiveFilter",
+ "PurzPixelate",
+ "PurzPolkaDotPattern",
+ "PurzSimpleNoisePattern",
+ "PurzStripesPattern"
+ ],
+ {
+ "title_aux": "ComfyUI-Purz"
+ }
+ ],
+ "https://github.com/pvlprk/comfyui-pvl-api-nodes": [
+ [
+ "PVL Call OpenAI Assistant",
+ "PVL ComfyDeploy API Caller",
+ "PVL Compare",
+ "PVLCheckIfConnected",
+ "PVL_Any2String",
+ "PVL_BatchAny",
+ "PVL_BooleanLogic",
+ "PVL_Color_Match",
+ "PVL_ComfyDeploy_LoraPrep",
+ "PVL_ComfyDeploy_Universal",
+ "PVL_Comfydeploy_Avatar_PulID_API",
+ "PVL_Crop2AR",
+ "PVL_CropToMask",
+ "PVL_EdgeExtend",
+ "PVL_GeminiSegmentation",
+ "PVL_Gemini_API",
+ "PVL_Gemini_API_Multi",
+ "PVL_Gemini_API_avatar_special",
+ "PVL_Gemini_with_fallback_API",
+ "PVL_Gemini_with_fallback_API_Multi",
+ "PVL_Get_Image_Size",
+ "PVL_Google_NanoBanana_API",
+ "PVL_Google_NanoBanana_API_mandatory_IMG",
+ "PVL_Google_NanoBanana_Multi_API",
+ "PVL_Google_NanoBanana_PRO_Multi_API",
+ "PVL_ImageBatchToImageList",
+ "PVL_ImageComposite",
+ "PVL_ImageListToImageBatch",
+ "PVL_ImageResize",
+ "PVL_ImageStitch",
+ "PVL_Image_Translation_Offset",
+ "PVL_Math",
+ "PVL_MathCondition",
+ "PVL_NoneOutputNode",
+ "PVL_Padding",
+ "PVL_Qwen_Img_Edit_Inpaint",
+ "PVL_Qwen_Img_Edit_Plus",
+ "PVL_SaveOrNot",
+ "PVL_Seg_Florence2_API",
+ "PVL_SplitString",
+ "PVL_Stitch2Size",
+ "PVL_StringConcatX3",
+ "PVL_StringConcatX8",
+ "PVL_StringListToString",
+ "PVL_StringToNumber",
+ "PVL_StringToStringList",
+ "PVL_StylePicker",
+ "PVL_Switch",
+ "PVL_Switch_Huge",
+ "PVL_Switch_x10",
+ "PVL_Switch_x15",
+ "PVL_Switch_x5",
+ "PVL_Text_Overlay",
+ "PVL_Txt",
+ "PVL_fal_DepthAnythingV2_API",
+ "PVL_fal_EvfSam_API",
+ "PVL_fal_EvfSam_X5_API",
+ "PVL_fal_Flux2_Camera_Ctrl_API",
+ "PVL_fal_Flux2_Dev_API",
+ "PVL_fal_Flux2_Flex_API",
+ "PVL_fal_Flux2_Pro_API",
+ "PVL_fal_FluxDevPulidAvatar_API",
+ "PVL_fal_FluxDev_API",
+ "PVL_fal_FluxGeneral_API",
+ "PVL_fal_FluxPro_Fill_API",
+ "PVL_fal_FluxPro_v1_1_Ultra_API",
+ "PVL_fal_FluxPulid",
+ "PVL_fal_FluxWithLoraPulID_API",
+ "PVL_fal_FluxWithLora_API",
+ "PVL_fal_Flux_Dev_Inpaint_API",
+ "PVL_fal_KontextDevInpaint_API",
+ "PVL_fal_KontextDevLora_API",
+ "PVL_fal_KontextMaxMulti_API",
+ "PVL_fal_KontextMaxSingle_API",
+ "PVL_fal_KontextPro_API",
+ "PVL_fal_Kontext_Dev_API",
+ "PVL_fal_LumaPhoton_FlashReframe_API",
+ "PVL_fal_LumaPhoton_Reframe_API",
+ "PVL_fal_Moondream3_Segment_API",
+ "PVL_fal_NanoBanana_API",
+ "PVL_fal_QwenImage_API",
+ "PVL_fal_RemoveBackground_API",
+ "PVL_fal_Sam3_Segmentation_API",
+ "PVL_fal_SeeDream4_API",
+ "PVL_fal_SeeDream_45_API"
+ ],
+ {
+ "title_aux": "ComfyUI Assistant Node"
+ }
+ ],
+ "https://github.com/pxl-pshr/GlitchNodes": [
+ [
+ "ASCII",
+ "Corruptor",
+ "DataBend",
+ "DitherMe",
+ "FrequencyModulation",
+ "GlitchIT",
+ "LineScreen",
+ "LuminousFlow",
+ "OrderedDithering",
+ "Pixel8Bit",
+ "PixelFloat",
+ "PixelRedistribution",
+ "Rekked",
+ "Scanz",
+ "TvGlitch",
+ "VHSonAcid",
+ "VaporWave",
+ "VideoModulation",
+ "interference"
+ ],
+ {
+ "title_aux": "GlitchNodes"
+ }
+ ],
+ "https://github.com/pythongosssss/ComfyUI-Custom-Scripts": [
+ [
+ "CheckpointLoader|pysssss",
+ "ConstrainImageforVideo|pysssss",
+ "ConstrainImage|pysssss",
+ "LoadText|pysssss",
+ "LoraLoader|pysssss",
+ "MathExpression|pysssss",
+ "PlaySound|pysssss",
+ "Repeater|pysssss",
+ "ReroutePrimitive|pysssss",
+ "SaveText|pysssss",
+ "ShowText|pysssss",
+ "StringFunction|pysssss",
+ "SystemNotification|pysssss"
+ ],
+ {
+ "title_aux": "ComfyUI-Custom-Scripts"
+ }
+ ],
+ "https://github.com/pythongosssss/ComfyUI-WD14-Tagger": [
+ [
+ "WD14Tagger|pysssss"
+ ],
+ {
+ "title_aux": "ComfyUI WD 1.4 Tagger"
+ }
+ ],
+ "https://github.com/pzc163/Comfyui-CatVTON": [
+ [
+ "AutoMasker",
+ "CatVTON",
+ "LoadAutoMasker",
+ "LoadCatVTONPipeline"
+ ],
+ {
+ "title_aux": "Comfyui-CatVTON"
+ }
+ ],
+ "https://github.com/pzc163/Comfyui_MiniCPMv2_6-prompt-generator": [
+ [
+ "Prompt_Generator",
+ "Save_Prompts"
+ ],
+ {
+ "title_aux": "Comfyui_MiniCPMv2_6-prompt-generator"
+ }
+ ],
+ "https://github.com/quank123wip/ComfyUI-Step1X-Edit": [
+ [
+ "Step-1XEditNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Step1X-Edit"
+ }
+ ],
+ "https://github.com/quasiblob/ComfyUI-EsesCompositionGuides": [
+ [
+ "EsesCompositionGuides"
+ ],
+ {
+ "title_aux": "ComfyUI-EsesCompositionGuides"
+ }
+ ],
+ "https://github.com/quasiblob/ComfyUI-EsesImageAdjustments": [
+ [
+ "EsesImageAdjustments2"
+ ],
+ {
+ "title_aux": "ComfyUI-EsesImageAdjustments"
+ }
+ ],
+ "https://github.com/quasiblob/ComfyUI-EsesImageCompare": [
+ [
+ "EsesImageCompare"
+ ],
+ {
+ "title_aux": "ComfyUI-EsesImageCompare"
+ }
+ ],
+ "https://github.com/quasiblob/ComfyUI-EsesImageEffectBloom": [
+ [
+ "EsesImageEffectBloom"
+ ],
+ {
+ "title_aux": "ComfyUI-EsesImageEffectBloom"
+ }
+ ],
+ "https://github.com/quasiblob/ComfyUI-EsesImageEffectCurves": [
+ [
+ "EsesImageEffectCurves"
+ ],
+ {
+ "title_aux": "ComfyUI-EsesImageEffectCurves"
+ }
+ ],
+ "https://github.com/quasiblob/ComfyUI-EsesImageEffectLevels": [
+ [
+ "EsesImageEffectLevels"
+ ],
+ {
+ "title_aux": "ComfyUI-EsesImageEffectLevels"
+ }
+ ],
+ "https://github.com/quasiblob/ComfyUI-EsesImageLensEffects": [
+ [
+ "EsesImageLensEffects"
+ ],
+ {
+ "title_aux": "ComfyUI-EsesImageLensEffects"
+ }
+ ],
+ "https://github.com/quasiblob/ComfyUI-EsesImageOffset": [
+ [
+ "EsesImageOffset"
+ ],
+ {
+ "title_aux": "ComfyUI-EsesImageOffset"
+ }
+ ],
+ "https://github.com/quasiblob/ComfyUI-EsesImageResize": [
+ [
+ "EsesImageResize"
+ ],
+ {
+ "title_aux": "EsesImageResize"
+ }
+ ],
+ "https://github.com/quasiblob/ComfyUI-EsesImageTransform": [
+ [
+ "EsesImageTransform"
+ ],
+ {
+ "title_aux": "ComfyUI-EsesImageTransform"
+ }
+ ],
+ "https://github.com/quasiblob/EsesCompositionGoldenRatio": [
+ [
+ "EsesCompositionGoldenRatio"
+ ],
+ {
+ "title_aux": "EsesCompositionGoldenRatio"
+ }
+ ],
+ "https://github.com/qwixiwp/queuetools": [
+ [
+ "load images (queue tools)"
+ ],
+ {
+ "title_aux": "queuetools"
+ }
+ ],
+ "https://github.com/r3dsd/comfyui-template-loader": [
+ [
+ "TemplateLoader"
+ ],
+ {
+ "title_aux": "Comfyui-Template-Loader"
+ }
+ ],
+ "https://github.com/rafacost/rafacost-comfy": [
+ [
+ "DreamOmni2-VLM",
+ "DreamOmni2_Output_Node"
+ ],
+ {
+ "author": "rafacost",
+ "description": "Nodes to use the DreamOmni2 GGUF models in ComfyUI.",
+ "title": "rafacostComfy Nodes",
+ "title_aux": "rafacostComfy"
+ }
+ ],
+ "https://github.com/railep/ComfyUI-HunyuanVideo-Foley": [
+ [
+ "HunyuanFoleyNode"
+ ],
+ {
+ "title_aux": "ComfyUI-HunyuanVideo-Foley"
+ }
+ ],
+ "https://github.com/raindrop313/ComfyUI-WanVideoStartEndFrames": [
+ [
+ "WanVideoSEDecode",
+ "WanVideoSEImageClipEncode",
+ "WanVideoSEModelLoader",
+ "WanVideoSESampler",
+ "WanVideoSEVAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-WanVideoStartEndFrames"
+ }
+ ],
+ "https://github.com/raindrop313/ComfyUI_SD3_Flowedit": [
+ [
+ "FlowEditCFGGuider",
+ "FlowEditSampler",
+ "OutSD3ModelSamplingPred"
+ ],
+ {
+ "title_aux": "ComfyUI_SD3_Flowedit"
+ }
+ ],
+ "https://github.com/rainlizard/ComfyUI-Raffle": [
+ [
+ "CurvedRescaleCFG",
+ "PreviewHistory",
+ "Raffle",
+ "TagCategoryStrength"
+ ],
+ {
+ "title_aux": "Raffle"
+ }
+ ],
+ "https://github.com/rainlizard/ComfyUI-WhirlpoolUpscaler": [
+ [
+ "WhirlpoolUpscaler"
+ ],
+ {
+ "title_aux": "Whirlpool Upscaler"
+ }
+ ],
+ "https://github.com/rakkarage/ComfyRage": [
+ [
+ "Debug",
+ "Notify",
+ "Pre",
+ "Show"
+ ],
+ {
+ "title_aux": "ComfyRage"
+ }
+ ],
+ "https://github.com/ramesh-x90/ComfyUI_pyannote": [
+ [
+ "Speaker Diarization",
+ "Whisper Segments to Speaker"
+ ],
+ {
+ "title_aux": "ComfyUI_pyannote"
+ }
+ ],
+ "https://github.com/ramyma/A8R8_ComfyUI_nodes": [
+ [
+ "AttentionCouple",
+ "AttentionCoupleRegion",
+ "AttentionCoupleRegions",
+ "Base64ImageInput",
+ "Base64ImageOutput"
+ ],
+ {
+ "title_aux": "A8R8 ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/randjtw/advance-aesthetic-score": [
+ [
+ "Adv_Scoring"
+ ],
+ {
+ "title_aux": "advance-aesthetic-score"
+ }
+ ],
+ "https://github.com/randomnoner11/ComfyUI-MistralAI-API": [
+ [
+ "InvokeMistralEndpoint",
+ "LoadFewShotPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-MistralAI-API"
+ }
+ ],
+ "https://github.com/ranska/pixel_palette_art": [
+ [
+ "ColorFormatterNode",
+ "ColorPreviewNode",
+ "CreateColorFromRGBNode",
+ "GimpPaletteLoader",
+ "PaletteFormatter",
+ "PixelPaletteExtractor"
+ ],
+ {
+ "title_aux": "Pixel Palette Art"
+ }
+ ],
+ "https://github.com/ratulrafsan/Comfyui-SAL-VTON": [
+ [
+ "SALVTON_Apply",
+ "SV_random"
+ ],
+ {
+ "title_aux": "Comfyui-SAL-VTON"
+ }
+ ],
+ "https://github.com/raykindle/ComfyUI_Step1X-Edit": [
+ [
+ "Step1XEditGenerate",
+ "Step1XEditModelLoader",
+ "Step1XEditTeaCacheGenerate",
+ "Step1XEditTeaCacheModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_Step1X-Edit"
+ }
+ ],
+ "https://github.com/raysers/Mflux-ComfyUI": [
+ [
+ "MfluxControlNetLoader",
+ "MfluxCustomModels",
+ "MfluxImg2Img",
+ "MfluxLorasLoader",
+ "MfluxModelsDownloader",
+ "MfluxModelsLoader",
+ "QuickMfluxNode"
+ ],
+ {
+ "title_aux": "Mflux-ComfyUI"
+ }
+ ],
+ "https://github.com/razvanmatei-sf/comfyui-stillfront": [
+ [
+ "SFLLMChat",
+ "SFPromptList",
+ "SFQwenResolution",
+ "SFVertexAIImagen3TextToImage",
+ "SFVertexAIImagen4TextToImage",
+ "SFVertexAIImagen4Upscale",
+ "SFVertexAINanaBananaPro",
+ "SFVertexAINanaBananaProEdit",
+ "SFVertexAIVeo31ImageToVideo",
+ "SFVertexAIVeo31TextToVideo",
+ "SFWaveSpeedClient",
+ "SFWaveSpeedFluxControlNetUnionPro2",
+ "SFWaveSpeedFluxKontextDev",
+ "SFWaveSpeedFluxKontextMax",
+ "SFWaveSpeedFluxKontextPro",
+ "SFWaveSpeedImageUpscaler",
+ "SFWaveSpeedInfiniteTalk",
+ "SFWaveSpeedInfiniteTalkMulti",
+ "SFWaveSpeedNanoBananaEdit",
+ "SFWaveSpeedNanoBananaProEdit",
+ "SFWaveSpeedNanoBananaProEditMulti",
+ "SFWaveSpeedNanoBananaProEditUltra",
+ "SFWaveSpeedNanoBananaProTextToImage",
+ "SFWaveSpeedNanoBananaProTextToImageMulti",
+ "SFWaveSpeedNanoBananaProTextToImageUltra",
+ "SFWaveSpeedNanoBananaTextToImage",
+ "SFWaveSpeedQwenEdit",
+ "SFWaveSpeedQwenEditLora",
+ "SFWaveSpeedQwenEditPlus",
+ "SFWaveSpeedQwenEditPlusLora",
+ "SFWaveSpeedQwenTextToImage",
+ "SFWaveSpeedQwenTextToImageLora",
+ "SFWaveSpeedRunwayUpscale",
+ "SFWaveSpeedSeedreamV4",
+ "SFWaveSpeedSeedreamV4Edit",
+ "SFWaveSpeedSeedreamV4EditSequential",
+ "SFWaveSpeedSeedreamV4Sequential",
+ "SFWaveSpeedSora2ImageToVideo",
+ "SFWaveSpeedSora2ImageToVideoPro",
+ "SFWaveSpeedSora2TextToVideo",
+ "SFWaveSpeedSora2TextToVideoPro",
+ "SFWaveSpeedVeo31FastImageToVideo",
+ "SFWaveSpeedVeo31FastTextToVideo",
+ "SFWaveSpeedVeo31ImageToVideo",
+ "SFWaveSpeedVeo31ReferenceToVideo",
+ "SFWaveSpeedVeo31TextToVideo",
+ "SFWaveSpeedWan22Animate",
+ "SFWaveSpeedWan22I2V720p",
+ "SFWaveSpeedWan25ImageEdit",
+ "SFWaveSpeedWan25ImageToVideo",
+ "SFWaveSpeedWan25ImageToVideoFast",
+ "SFWaveSpeedWan25TextToImage",
+ "SFWaveSpeedWan25TextToVideo",
+ "SFWaveSpeedWan25TextToVideoFast",
+ "WaveSpeedAI Qwen Image Text to Image",
+ "WaveSpeedAI Qwen Image Text to Image LoRA",
+ "WaveSpeedAI_RunwaymlUpscaleV1Node",
+ "WaveSpeedAI_Wan22I2V720pNode"
+ ],
+ {
+ "title_aux": "comfyui-stillfront"
+ }
+ ],
+ "https://github.com/razvanmatei-sf/razv-llm": [
+ [
+ "RazvLLMChat"
+ ],
+ {
+ "title_aux": "ComfyUI Razv LLM Node"
+ }
+ ],
+ "https://github.com/razvanmatei-sf/razv-wavespeed": [
+ [
+ "WaveSpeedAI Alibaba Wan 2.5 Image Edit",
+ "WaveSpeedAI ByteDance Seedream V4",
+ "WaveSpeedAI ByteDance Seedream V4 Sequential",
+ "WaveSpeedAI Bytedance Seedream V4 Edit",
+ "WaveSpeedAI Bytedance Seedream V4 Edit Sequential",
+ "WaveSpeedAI Client",
+ "WaveSpeedAI Flux ControlNet Union Pro 2.0",
+ "WaveSpeedAI Flux Kontext Dev",
+ "WaveSpeedAI Flux Kontext Max",
+ "WaveSpeedAI Flux Kontext Pro",
+ "WaveSpeedAI Google Nano Banana Edit",
+ "WaveSpeedAI Google Nano Banana Pro Edit",
+ "WaveSpeedAI Google Nano Banana Pro Edit Multi",
+ "WaveSpeedAI Google Nano Banana Pro Edit Ultra",
+ "WaveSpeedAI Google Nano Banana Pro Text to Image",
+ "WaveSpeedAI Google Nano Banana Pro Text to Image Multi",
+ "WaveSpeedAI Google Nano Banana Pro Text to Image Ultra",
+ "WaveSpeedAI Google Nano Banana Text to Image",
+ "WaveSpeedAI Google VEO 3.1 Fast Image-to-Video",
+ "WaveSpeedAI Google VEO 3.1 Fast Text-to-Video",
+ "WaveSpeedAI Google VEO 3.1 Image-to-Video",
+ "WaveSpeedAI Google VEO 3.1 Reference-to-Video",
+ "WaveSpeedAI Google VEO 3.1 Text-to-Video",
+ "WaveSpeedAI Image Upscaler",
+ "WaveSpeedAI InfiniteTalk",
+ "WaveSpeedAI InfiniteTalk Multi",
+ "WaveSpeedAI OpenAI Sora 2 Image-to-Video",
+ "WaveSpeedAI OpenAI Sora 2 Image-to-Video Pro",
+ "WaveSpeedAI OpenAI Sora 2 Text-to-Video",
+ "WaveSpeedAI OpenAI Sora 2 Text-to-Video Pro",
+ "WaveSpeedAI Qwen Image Edit",
+ "WaveSpeedAI Qwen Image Edit LoRA",
+ "WaveSpeedAI Qwen Image Edit Plus",
+ "WaveSpeedAI Qwen Image Edit Plus LoRA",
+ "WaveSpeedAI Qwen Image Text to Image",
+ "WaveSpeedAI Qwen Image Text to Image LoRA",
+ "WaveSpeedAI WAN 2.2 Animate",
+ "WaveSpeedAI WAN 2.5 Image-to-Video",
+ "WaveSpeedAI WAN 2.5 Image-to-Video Fast",
+ "WaveSpeedAI WAN 2.5 Text-to-Image",
+ "WaveSpeedAI WAN 2.5 Text-to-Video",
+ "WaveSpeedAI WAN 2.5 Text-to-Video Fast",
+ "WaveSpeedAI_RunwaymlUpscaleV1Node",
+ "WaveSpeedAI_Wan22I2V720pNode"
+ ],
+ {
+ "title_aux": "ComfyUI Razv WaveSpeed Nodes"
+ }
+ ],
+ "https://github.com/razvanmatei-sf/serhii-prompt-list": [
+ [
+ "Dynamic Prompt List"
+ ],
+ {
+ "title_aux": "Dynamic Prompt List Node for ComfyUI"
+ }
+ ],
+ "https://github.com/rcfcu2000/zhihuige-nodes-comfyui": [
+ [
+ "Combine ZHGMasks",
+ "Cover ZHGMasks",
+ "From ZHG pip",
+ "GroundingDinoModelLoader (zhihuige)",
+ "GroundingDinoPIPESegment (zhihuige)",
+ "GroundingDinoSAMSegment (zhihuige)",
+ "InvertMask (zhihuige)",
+ "SAMModelLoader (zhihuige)",
+ "To ZHG pip",
+ "ZHG FaceIndex",
+ "ZHG GetMaskArea",
+ "ZHG Image Levels",
+ "ZHG SaveImage",
+ "ZHG SmoothEdge",
+ "ZHG UltimateSDUpscale"
+ ],
+ {
+ "title_aux": "zhihuige-nodes-comfyui"
+ }
+ ],
+ "https://github.com/rcsaquino/comfyui-custom-nodes": [
+ [
+ "BackgroundRemover | rcsaquino",
+ "VAELoader | rcsaquino",
+ "VAEProcessor | rcsaquino"
+ ],
+ {
+ "title_aux": "rcsaquino/comfyui-custom-nodes"
+ }
+ ],
+ "https://github.com/rdanalex/ComfyUI-ClownSampler": [
+ [
+ "Clown Sampler Loader JK"
+ ],
+ {
+ "title_aux": "ComfyUI-ClownSampler"
+ }
+ ],
+ "https://github.com/rdancer/ComfyUI_Florence2SAM2": [
+ [
+ "RdancerFlorence2SAM2GenerateMask"
+ ],
+ {
+ "title_aux": "ComfyUI_Florence2SAM2"
+ }
+ ],
+ "https://github.com/rdawgemfl/rdawg_3D_pack": [
+ [
+ "RDAWG3DAnalyzeMesh",
+ "RDAWG3DBoundingBox",
+ "RDAWG3DComputeCurvature",
+ "RDAWG3DComputeDistance",
+ "RDAWG3DCreateMesh",
+ "RDAWG3DDownsamplePointCloud",
+ "RDAWG3DExtractFeatures",
+ "RDAWG3DLoadModel",
+ "RDAWG3DLoadPointCloud",
+ "RDAWG3DMeshToImage",
+ "RDAWG3DMeshToPointCloud",
+ "RDAWG3DPointCloudToMesh",
+ "RDAWG3DRemeshUniform",
+ "RDAWG3DRemoveOutliers",
+ "RDAWG3DSimplifyMesh",
+ "RDAWG3DSmoothMesh",
+ "RDAWG3DSubdivideMesh",
+ "RDAWG3DTransform",
+ "RDAWG3DTransformPointCloud"
+ ],
+ {
+ "title_aux": "RDAWG 3D Pack (CUDA 12.8 + PyTorch 2.9.0)"
+ }
+ ],
+ "https://github.com/rdomunky/comfyui-subfolderimageloader": [
+ [
+ "SubfolderImageLoader"
+ ],
+ {
+ "title_aux": "comfyui-subfolderimageloader"
+ }
+ ],
+ "https://github.com/reallusion/ComfyUI-Reallusion": [
+ [
+ "additional_image",
+ "control_net",
+ "core",
+ "upscale_data"
+ ],
+ {
+ "title_aux": "Reallusion ComfyUI Custom Nodes"
+ }
+ ],
+ "https://github.com/receyuki/comfyui-prompt-reader-node": [
+ [
+ "SDAnyConverter",
+ "SDBatchLoader",
+ "SDLoraLoader",
+ "SDLoraSelector",
+ "SDParameterExtractor",
+ "SDParameterGenerator",
+ "SDPromptMerger",
+ "SDPromptReader",
+ "SDPromptSaver",
+ "SDTypeConverter"
+ ],
+ {
+ "author": "receyuki",
+ "description": "The ultimate solution for managing image metadata and multi-tool compatibility. ComfyUI node version of the SD Prompt Reader",
+ "nickname": "SD Prompt Reader",
+ "title": "SD Prompt Reader",
+ "title_aux": "SD Prompt Reader"
+ }
+ ],
+ "https://github.com/recraft-ai/ComfyUI-RecraftAI": [
+ [
+ "RecraftBackgroundRemover",
+ "RecraftBackgroundReplacer",
+ "RecraftClarityUpscaler",
+ "RecraftClient",
+ "RecraftGenerativeUpscaler",
+ "RecraftImageGenerator",
+ "RecraftImageToImageTransformer",
+ "RecraftInpainter"
+ ],
+ {
+ "title_aux": "ComfyUI-RecraftAI"
+ }
+ ],
+ "https://github.com/red-polo/ComfyUI-WanViTPoseRetargeter": [
+ [
+ "WanViTPoseEstimator",
+ "WanViTPoseRetargeter",
+ "WanViTPoseRetargeterToSrc"
+ ],
+ {
+ "title_aux": "ComfyUI-WanViTPoseRetargeter"
+ }
+ ],
+ "https://github.com/redhottensors/ComfyUI-Prediction": [
+ [
+ "AvoidErasePrediction",
+ "CFGPrediction",
+ "CharacteristicGuidancePrediction",
+ "CombinePredictions",
+ "ConditionedPrediction",
+ "EarlyMiddleLatePrediction",
+ "InterpolatePredictions",
+ "LogSigmas",
+ "PerpNegPrediction",
+ "SamplerCustomPrediction",
+ "ScalePrediction",
+ "ScaledGuidancePrediction",
+ "SelectSigmas",
+ "SplitAtSigma",
+ "SwitchPredictions"
+ ],
+ {
+ "author": "RedHotTensors",
+ "description": "Fully customizable Classifer Free Guidance for ComfyUI",
+ "nickname": "ComfyUI-Prediction",
+ "title": "ComfyUI-Prediction",
+ "title_aux": "ComfyUI-Prediction"
+ }
+ ],
+ "https://github.com/reeoi/ComfyUI-WebROI": [
+ [
+ "WebROICapture"
+ ],
+ {
+ "title_aux": "ComfyUI-WebROI"
+ }
+ ],
+ "https://github.com/regiellis/ComfyUI-EasyColorCorrector": [
+ [
+ "BatchColorCorrection",
+ "ColorCorrectionViewer",
+ "ColorPaletteExtractor",
+ "EasyColorCorrection",
+ "FilmEmulation",
+ "RawImageProcessor",
+ "VAEColorCorrector"
+ ],
+ {
+ "title_aux": "Easy Color Correction"
+ }
+ ],
+ "https://github.com/regiellis/ComfyUI-EasyIllustrious": [
+ [
+ "IllustriousAppendRegion",
+ "IllustriousArtists",
+ "IllustriousAttentionCouple",
+ "IllustriousAutoOutpaint",
+ "IllustriousCLIPTextEncoder",
+ "IllustriousCharacters",
+ "IllustriousClothing",
+ "IllustriousColorSuite",
+ "IllustriousE621Artists",
+ "IllustriousE621Characters",
+ "IllustriousEmotions",
+ "IllustriousEmptyLatentImage",
+ "IllustriousEmptyRegions",
+ "IllustriousHairstyles",
+ "IllustriousKSamplerPresets",
+ "IllustriousKSamplerPro",
+ "IllustriousLatentUpscale",
+ "IllustriousMakeRegion",
+ "IllustriousMasterModel",
+ "IllustriousMultiPassSampler",
+ "IllustriousNegativeCLIPEncoder",
+ "IllustriousPonyTokens",
+ "IllustriousPoses",
+ "IllustriousPrompt",
+ "IllustriousRegionalConditioning",
+ "IllustriousScenesPlus",
+ "IllustriousScheduler",
+ "IllustriousSmartSceneGenerator",
+ "IllustriousTriplePassSampler",
+ "IllustriousVAEDecode",
+ "IllustriousVAEEncode",
+ "TIPOPromptOptimizer"
+ ],
+ {
+ "title_aux": "Comfyui-EasyIllustrious"
+ }
+ ],
+ "https://github.com/regiellis/ComfyUI-EasyNoobai": [
+ [
+ "EasyNoobai",
+ "EasyNoobaiMasterModel",
+ "NoobaiArtists",
+ "NoobaiCharacters",
+ "NoobaiClothing",
+ "NoobaiE621Artists",
+ "NoobaiE621Characters",
+ "NoobaiHairstyles",
+ "NoobaiPony",
+ "NoobaiPoses"
+ ],
+ {
+ "title_aux": "ComfyUI-EasyNoobai"
+ }
+ ],
+ "https://github.com/regiellis/ComfyUI-EasyPony": [
+ [
+ "EasyPony"
+ ],
+ {
+ "title_aux": "ComfyUI-EasyPony"
+ }
+ ],
+ "https://github.com/regiellis/ComfyUI-SDXL-Adherence": [
+ [
+ "AlignHintsToLatent",
+ "AutoSize64",
+ "CropByBBox",
+ "NegativePromptHelper",
+ "PostPolish",
+ "SDXLDualClipEncode",
+ "SDXLPromptStyler",
+ "SmartLatent"
+ ],
+ {
+ "title_aux": "SDXL Adherence"
+ }
+ ],
+ "https://github.com/relhamdi/ComfyUI-RE-CustomUtils": [
+ [
+ "PromptPresetSelector"
+ ],
+ {
+ "title_aux": "ComfyUI-RE-CustomUtils"
+ }
+ ],
+ "https://github.com/remingtonspaz/ComfyUI-ReferenceChain": [
+ [
+ "ReferenceChainConditioning",
+ "ReferenceChainConditioningBase64"
+ ],
+ {
+ "title_aux": "Reference Chain Conditioning"
+ }
+ ],
+ "https://github.com/revirevy/Comfyui_saveimage_imgbb": [
+ [
+ "ImgBBUploader",
+ "LLM_prompt_generator"
+ ],
+ {
+ "author": "N.RHEVI",
+ "description": "This custom node allow save image to imgbb.",
+ "nickname": "save image to imgbb",
+ "title": "save image to imgbb",
+ "title_aux": "Comfyui_saveimage_imgbb"
+ }
+ ],
+ "https://github.com/revisionhiep-create/Comfyui-Prompt-Sorter": [
+ [
+ "IllustriousPromptSorter"
+ ],
+ {
+ "title_aux": "Comfyui-Prompt-Sorter"
+ }
+ ],
+ "https://github.com/revisionhiep-create/comfyui-standard-trigger-words": [
+ [
+ "StandardTriggerWordsLoader"
+ ],
+ {
+ "title_aux": "comfyui-standard-trigger-words"
+ }
+ ],
+ "https://github.com/revisionhiep-create/comfyui-universal-trigger-toggle": [
+ [
+ "UniversalTriggerToggle"
+ ],
+ {
+ "title_aux": "comfyui-universal-trigger-toggle"
+ }
+ ],
+ "https://github.com/revisiontony/LoraMangerWebFrame": [
+ [
+ "LoraWebFrame"
+ ],
+ {
+ "title_aux": "ComfyUI Lora Manager Web Frame"
+ }
+ ],
+ "https://github.com/rgamevfx/ComfyUI-RGnodes": [
+ [
+ "MaskRangeDoctor",
+ "VACEClipDoctor",
+ "VACEInpaintKeyframeInsert",
+ "VACEVideoSplice"
+ ],
+ {
+ "title_aux": "ComfyUI-RGnodes"
+ }
+ ],
+ "https://github.com/rgthree/rgthree-comfy": [
+ [
+ "RgthreeAnySwitch",
+ "RgthreeBigContext",
+ "RgthreeContext",
+ "RgthreeContextMerge",
+ "RgthreeContextMergeBig",
+ "RgthreeContextSwitch",
+ "RgthreeContextSwitchBig",
+ "RgthreeDisplayAny",
+ "RgthreeDisplayInt",
+ "RgthreeImageComparer",
+ "RgthreeImageInsetCrop",
+ "RgthreeImageOrLatentSize",
+ "RgthreeImageResize",
+ "RgthreeKSamplerConfig",
+ "RgthreeLoraLoaderStack",
+ "RgthreePowerLoraLoader",
+ "RgthreePowerPrimitive",
+ "RgthreePowerPrompt",
+ "RgthreePowerPromptSimple",
+ "RgthreePowerPuter",
+ "RgthreeSDXLEmptyLatentImage",
+ "RgthreeSDXLPowerPromptPositive",
+ "RgthreeSDXLPowerPromptSimple",
+ "RgthreeSeed"
+ ],
+ {
+ "author": "rgthree",
+ "description": "A bunch of nodes I created that I also find useful.",
+ "nickname": "rgthree",
+ "nodename_pattern": " \\(rgthree\\)$",
+ "title": "Comfy Nodes",
+ "title_aux": "rgthree's ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/rhdunn/comfyui-audio-processing": [
+ [
+ "ComfyAudio.ApplyFilterBank",
+ "ComfyAudio.GriffinLim",
+ "ComfyAudio.InverseSpectrogram",
+ "ComfyAudio.LinearFilterBank",
+ "ComfyAudio.LoadAudio",
+ "ComfyAudio.MelScaleFilterBank",
+ "ComfyAudio.PlotFilterBank",
+ "ComfyAudio.PlotSpectrogram",
+ "ComfyAudio.PlotWaveform",
+ "ComfyAudio.Spectrogram"
+ ],
+ {
+ "title_aux": "comfyui-audio-processing"
+ }
+ ],
+ "https://github.com/rhdunn/comfyui-bus-plugin": [
+ [
+ "ComfyBus.CLIPConditioningBusNode",
+ "ComfyBus.CLIPEncodedPromptBusNode",
+ "ComfyBus.CheckpointBusNode",
+ "ComfyBus.ImageBusNode",
+ "ComfyBus.ImageParameterBusNode",
+ "ComfyBus.ImageScaleToSideParameterBusNode",
+ "ComfyBus.ImageSizeBusNode",
+ "ComfyBus.LatentImageBusNode",
+ "ComfyBus.LatentImageParameterBusNode",
+ "ComfyBus.PromptBusNode",
+ "ComfyBus.PromptSDXLBusNode"
+ ],
+ {
+ "title_aux": "comfyui-bus-plugin"
+ }
+ ],
+ "https://github.com/rholdorf/comfyui_imgtools": [
+ [
+ "ImageDimensionFitter"
+ ],
+ {
+ "title_aux": "comfyui_imgtools"
+ }
+ ],
+ "https://github.com/rhplus0831/ComfyMepi": [
+ [
+ "MepiCheckpoint",
+ "MepiImageSize",
+ "MepiNegativePrompt",
+ "MepiPositivePrompt",
+ "MepiSaveImage",
+ "MepiStepsAndCfg"
+ ],
+ {
+ "title_aux": "ComfyMepi"
+ }
+ ],
+ "https://github.com/richinsley/Comfy-LFO": [
+ [
+ "LFO_Pulse",
+ "LFO_Sawtooth",
+ "LFO_Sine",
+ "LFO_Square",
+ "LFO_Triangle"
+ ],
+ {
+ "title_aux": "Comfy-LFO"
+ }
+ ],
+ "https://github.com/ricklove/comfyui-ricklove": [
+ [
+ "RL_BBox",
+ "RL_CacheImageSequence",
+ "RL_CacheMaskSequence",
+ "RL_CivitaiTopImagePrompts",
+ "RL_Crop_Resize",
+ "RL_Finetune_Analyze",
+ "RL_Finetune_Analyze_Batch",
+ "RL_Finetune_Variable",
+ "RL_ForceDependencyOrder",
+ "RL_ForceDependencyOrder_ImageString",
+ "RL_ForceDependencyOrder_Images",
+ "RL_ForceDependencyOrder_Latents",
+ "RL_ForceDependencyOrder_String",
+ "RL_ForceDependencyOrder_Strings",
+ "RL_IfFileExists",
+ "RL_Image_Shadow",
+ "RL_Image_Threshold_Channels",
+ "RL_Internet_Search",
+ "RL_LoadImageSequence",
+ "RL_Load_Flow",
+ "RL_LoraTextExtractTags",
+ "RL_Optical_Flow_Dip",
+ "RL_RebootComfyIfLeaky",
+ "RL_SaveImageSequence",
+ "RL_Save_Flow",
+ "RL_SequenceContext",
+ "RL_Sequence_ToFilePathList",
+ "RL_StopIfBlack",
+ "RL_Uncrop",
+ "RL_Warp_Image",
+ "RL_Zoe_Depth_Map_Preprocessor",
+ "RL_Zoe_Depth_Map_Preprocessor_Raw_Infer",
+ "RL_Zoe_Depth_Map_Preprocessor_Raw_Process"
+ ],
+ {
+ "title_aux": "comfyui-ricklove"
+ }
+ ],
+ "https://github.com/rickrender/ComfyUI-Vectorizer-API": [
+ [
+ "BackgroundRemoverNode",
+ "BackgroundRemoverSVGNode",
+ "VectorizerAINode"
+ ],
+ {
+ "title_aux": "Vectorizer API"
+ }
+ ],
+ "https://github.com/rickyars/comfyui-llm-tile": [
+ [
+ "TiledImageGenerator",
+ "TiledImageGeneratorAdvanced"
+ ],
+ {
+ "title_aux": "Tiled Image Generator for ComfyUI"
+ }
+ ],
+ "https://github.com/risunobushi/ComfyUI-Similarity-Score": [
+ [
+ "ImageSimilarityScores"
+ ],
+ {
+ "title_aux": "ComfyUI-Similarity-Score"
+ }
+ ],
+ "https://github.com/risunobushi/ComfyUI_DisplacementMapTools": [
+ [
+ "DisplaceLogo",
+ "ExtractDisplacementMap"
+ ],
+ {
+ "title_aux": "ComfyUI_DisplacementMapTools"
+ }
+ ],
+ "https://github.com/risunobushi/ComfyUI_sm4ll-Wrapper": [
+ [
+ "VTONAPINode",
+ "VTONAPIPaidNode",
+ "VTONLookbookNode"
+ ],
+ {
+ "title_aux": "ComfyUI_sm4ll-Wrapper"
+ }
+ ],
+ "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV": [
+ [
+ "FrequencyCombination",
+ "FrequencyCombinationHSV",
+ "FrequencySeparation",
+ "FrequencySeparationHSV"
+ ],
+ {
+ "title_aux": "comfyUI_FrequencySeparation_RGB-HSV"
+ }
+ ],
+ "https://github.com/ritik-devsecops/ComfyUI-Floyo-Flux2-API-node": [
+ [
+ "Flux2FlexImageEdit",
+ "Flux2FlexTextToImage",
+ "Flux2ProImageEdit",
+ "Flux2ProTextToImage"
+ ],
+ {
+ "title_aux": "ComfyUI-Floyo-Flux2-API-node"
+ }
+ ],
+ "https://github.com/rjgoif/ComfyUI-Img-Label-Tools": [
+ [
+ "ImageArray",
+ "ImageEqualizer",
+ "RandomSubset"
+ ],
+ {
+ "title_aux": "Img Label Tools"
+ }
+ ],
+ "https://github.com/rkfg/ComfyUI-Dia_tts": [
+ [
+ "DiaModelLoader",
+ "DiaSampler"
+ ],
+ {
+ "title_aux": "Dia realistic TTS"
+ }
+ ],
+ "https://github.com/rnbwdsh/ComfyUI-LatentWalk": [
+ [
+ "LatentWalkConditional",
+ "LatentWalkConditionalRandom",
+ "LatentWalkNoise",
+ "LatentWalkVae"
+ ],
+ {
+ "title_aux": "Latent Walk"
+ }
+ ],
+ "https://github.com/rndnanthu/ComfyUI-RndNanthu": [
+ [
+ "AutoGradePro",
+ "ColorAnalysisPlotNode",
+ "ColorSpaceSim",
+ "FilmGrain",
+ "LogReconstructionNode",
+ "ProColorGrading",
+ "PromptGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-RndNanthu"
+ }
+ ],
+ "https://github.com/robertvoy/ComfyUI-Distributed": [
+ [
+ "AudioBatchDivider",
+ "DistributedCollector",
+ "DistributedEmptyImage",
+ "DistributedModelName",
+ "DistributedQueue",
+ "DistributedSeed",
+ "ImageBatchDivider",
+ "UltimateSDUpscaleDistributed"
+ ],
+ {
+ "title_aux": "ComfyUI-Distributed"
+ }
+ ],
+ "https://github.com/robertvoy/ComfyUI-Flux-Continuum": [
+ [
+ "BatchSlider",
+ "BooleanToEnabled",
+ "CannySlider",
+ "ConfigurableDrawText",
+ "ConfigurableModelRouter",
+ "ControlNetSlider",
+ "DenoiseSlider",
+ "DrawTextConfig",
+ "FluxContinuumModelRouter",
+ "GPUSlider",
+ "GuidanceSlider",
+ "IPAdapterSlider",
+ "ImageBatchBoolean",
+ "ImpactControlBridgeFix",
+ "IntPass",
+ "LatentPass",
+ "MaxShiftSlider",
+ "OutputGetString",
+ "PipePass",
+ "ResolutionMultiplySlider",
+ "ResolutionPicker",
+ "SEGSPass",
+ "SamplerParameterPacker",
+ "SamplerParameterUnpacker",
+ "SelectFromBatch",
+ "SimpleTextTruncate",
+ "SplitVec2",
+ "SplitVec3",
+ "StepSlider",
+ "TextVersions"
+ ],
+ {
+ "title_aux": "ComfyUI Flux Continuum: Modular Interface"
+ }
+ ],
+ "https://github.com/robomello/comfyui-prompt-saver": [
+ [
+ "PromptSaverNode"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Saver"
+ }
+ ],
+ "https://github.com/robtl2/ComfyUI-ComfyBridge": [
+ [
+ "CB_ImageReceiver",
+ "CB_ImageSender"
+ ],
+ {
+ "title_aux": "ComfyUI-ComfyBridge"
+ }
+ ],
+ "https://github.com/rockerBOO/pixel-sorting": [
+ [
+ "PixelSortAnalyze",
+ "PixelSorting"
+ ],
+ {
+ "title_aux": "pixel-sorting"
+ }
+ ],
+ "https://github.com/rohitsainier/ComfyUI-InstagramDownloader": [
+ [
+ "InstagramDownloader",
+ "MediaOrganizer"
+ ],
+ {
+ "title_aux": "ComfyUI-InstagramDownloader"
+ }
+ ],
+ "https://github.com/romeobuilderotti/ComfyUI-PNG-Metadata": [
+ [
+ "SetMetadataAll",
+ "SetMetadataString"
+ ],
+ {
+ "title_aux": "ComfyUI PNG Metadata"
+ }
+ ],
+ "https://github.com/ronaldzgithub/ComfyUI_Appstore": [
+ [
+ "ComfyUIAppstoreHost",
+ "ComfyUIAppstoreParam",
+ "ComfyUIAppstoreSaveImage",
+ "sdAppstore_saveImage"
+ ],
+ {
+ "title_aux": "ComfyUI_Appstore"
+ }
+ ],
+ "https://github.com/ronniebasak/ComfyUI-Tara-LLM-Integration": [
+ [
+ "TaraAdvancedComposition",
+ "TaraApiKeyLoader",
+ "TaraApiKeySaver",
+ "TaraDaisyChainNode",
+ "TaraLLMConfig",
+ "TaraPresetLLMConfig",
+ "TaraPrompter",
+ "TaraPrompterAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-Tara-LLM-Integration"
+ }
+ ],
+ "https://github.com/ronsantash/Comfyui-flexi-lora-loader": [
+ [
+ "ComfyUIFlexiLoRALoader"
+ ],
+ {
+ "title_aux": "ComfyUIFlexiLoRALoader"
+ }
+ ],
+ "https://github.com/rookiepsi/comfypsi_blur_mask": [
+ [
+ "comfypsi_blur_mask"
+ ],
+ {
+ "title_aux": "Blur Mask"
+ }
+ ],
+ "https://github.com/rookiepsi/comfyui-extended": [
+ [
+ "ImageLiquify",
+ "ImageSwitch",
+ "MaskSwitch",
+ "PreviewBoolean",
+ "PreviewFloat",
+ "PreviewInteger",
+ "PreviewMask",
+ "PreviewText",
+ "PrimitiveBoolean",
+ "PrimitiveDimensions",
+ "PrimitiveFloat",
+ "PrimitiveInteger",
+ "PrimitiveText",
+ "UtilityExpression",
+ "UtilityImageDimensions",
+ "UtilitySwitch",
+ "rookiepsi_BlurMask",
+ "rookiepsi_ConstructMask",
+ "rookiepsi_CropImageToMask",
+ "rookiepsi_ResizeMask"
+ ],
+ {
+ "title_aux": "ComfyUI Extended"
+ }
+ ],
+ "https://github.com/rookiestar28/ComfyUI-Danbooru-Tags-Upsampler": [
+ [
+ "DanbooruTagsUpsamplerNodeRay"
+ ],
+ {
+ "title_aux": "Danbooru Tags Upsampler for ComfyUI"
+ }
+ ],
+ "https://github.com/rookiestar28/ComfyUI-Doctor": [
+ [
+ "DebugPrintNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Doctor"
+ }
+ ],
+ "https://github.com/rookiestar28/ComfyUI-TranslateGemma": [
+ [
+ "TranslateGemma"
+ ],
+ {
+ "title_aux": "ComfyUI-TranslateGemma"
+ }
+ ],
+ "https://github.com/rookiestar28/ComfyUI_Text_Processor": [
+ [
+ "AddTextToImage",
+ "AdvancedImageSaver",
+ "AdvancedTextFilter",
+ "EvaluateFloats",
+ "EvaluateInts",
+ "EvaluateStrs",
+ "ImageCropper",
+ "TP_LoadMask",
+ "TP_SaveMask",
+ "TextInput",
+ "TextScraper",
+ "TextStorageReader",
+ "TextStorageWriter",
+ "WildcardsNode",
+ "image_concat_advanced"
+ ],
+ {
+ "title_aux": "ComfyUI Text Processor"
+ }
+ ],
+ "https://github.com/room3dev/ComfyUI-FrameIO": [
+ [
+ "BatchLoadImageList",
+ "BatchLoadImageSequence",
+ "BatchLoadImageSequenceWithTrigger",
+ "BatchSaveImageSequenceWebP",
+ "ListVideoFiles"
+ ],
+ {
+ "title_aux": "ComfyUI-FrameIO"
+ }
+ ],
+ "https://github.com/room3dev/ComfyUI-I2VChainHelper": [
+ [
+ "I2VChainHelper"
+ ],
+ {
+ "title_aux": "ComfyUI-I2VChainHelper"
+ }
+ ],
+ "https://github.com/room3dev/ComfyUI-PixelForge": [
+ [
+ "PixelForge",
+ "PixelForgeResizeImage"
+ ],
+ {
+ "title_aux": "ComfyUI-PixelForge"
+ }
+ ],
+ "https://github.com/roundyyy/ComfyUI-mesh-simplifier": [
+ [
+ "MeshSimplifierNode"
+ ],
+ {
+ "title_aux": "Mesh Simplifier for ComfyUI"
+ }
+ ],
+ "https://github.com/routhakash/AkkiNodes-LLM-Suite-for-ComfyUI": [
+ [
+ "AICharacterLookdevBible-Akki",
+ "AICinematographer_Akki",
+ "AIQCSupervisor-Akki",
+ "AISceneChoreographerBible-Akki",
+ "AIScriptCrafter01FoundationBible-Akki",
+ "AIScriptCrafter02BeatSheetBible-Akki",
+ "AIScriptCrafter03ScreenplayBible-Akki",
+ "AISetLookdevBible-Akki",
+ "AIShotDurationCalculator-Akki",
+ "AIVideoPromptEngineerPro-Akki",
+ "AssetSelector-Akki",
+ "GenericFileLoader-Akki",
+ "GenericFileSaver-Akki",
+ "GenericImageLoader-Akki",
+ "GenericImageNamer-Akki",
+ "KeywordLoader-Akki",
+ "LLMLoader-Akki",
+ "LLMLoaderLMStudio-Akki",
+ "LoadTextFileAdvanced-Akki",
+ "LoadTextFileSimple-Akki",
+ "LookdevBibleLoader-Akki",
+ "ProShotListParser-Akki",
+ "ProjectDirector-Akki",
+ "SaveTextFile-Akki",
+ "SceneChoreographyLoader-Akki",
+ "ShotAssetLoader-Akki",
+ "ShotSelector-Akki",
+ "StoryWriter-Akki",
+ "VideoPromptLoader-Akki"
+ ],
+ {
+ "title_aux": "AkkiNodes LLM Suite: Your Personal AI Film Studio"
+ }
+ ],
+ "https://github.com/royceschultz/ComfyUI-Notifications": [
+ [
+ "Notif-PlaySound",
+ "Notif-SystemNotification",
+ "Notif-UnifiedNotification",
+ "Notif-Webhook"
+ ],
+ {
+ "title_aux": "ComfyUI-Notifications"
+ }
+ ],
+ "https://github.com/royceschultz/ComfyUI-TranscriptionTools": [
+ [
+ "TT-AudioSink",
+ "TT-ConvertVhsAudioToAudio",
+ "TT-LoadAudio",
+ "TT-LoadBatch",
+ "TT-LoadVideoAudio",
+ "TT-LoadWhisperModel",
+ "TT-WhisperTranscription",
+ "TT-WhisperTranscriptionBatch"
+ ],
+ {
+ "title_aux": "ComfyUI-TranscriptionTools"
+ }
+ ],
+ "https://github.com/rslosch/comfyui-nodesweet": [
+ [
+ "AudioReactiveTransform",
+ "AudioWeightsRemap",
+ "BboxDetectorBatch",
+ "BboxDetectorBatchChunked",
+ "BboxDetectorBatchForEach",
+ "LoadImageSetFromFolderSortedNode",
+ "MultilineStringRepeater",
+ "SortImageSetFromFolderSortedNode"
+ ],
+ {
+ "title_aux": "ComfyUI Batch BBox Detector"
+ }
+ ],
+ "https://github.com/rsxdalv/ComfyUI-TTS-Webui": [
+ [
+ "TTSWebUI_OpenAI_TTS",
+ "TTS_ChatterboxNode",
+ "TTS_F5TTSNode",
+ "TTS_FireRedTTS2Node",
+ "TTS_GlobalPresetNode",
+ "TTS_HiggsV2Node",
+ "TTS_KittenTTSNode",
+ "TTS_KokoroNode",
+ "TTS_MMSNode",
+ "TTS_MegaTTS3Node",
+ "TTS_ParlerTTSNode",
+ "TTS_PiperTTSNode",
+ "TTS_StyleTTS2Node",
+ "TTS_VallEXNode"
+ ],
+ {
+ "title_aux": "TTS WebUI API nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/ru4ls/ComfyUI_Google-Fonts": [
+ [
+ "GoogleFontTextNode"
+ ],
+ {
+ "title_aux": "Google Font Text Image Node for ComfyUI"
+ }
+ ],
+ "https://github.com/ru4ls/ComfyUI_Imagen": [
+ [
+ "ImagenNode"
+ ],
+ {
+ "title_aux": "ComfyUI_Imagen"
+ }
+ ],
+ "https://github.com/ru4ls/ComfyUI_Nano_Banana": [
+ [
+ "NanoBananaAIO",
+ "NanoBananaMultiTurnChat"
+ ],
+ {
+ "title_aux": "ComfyUI_Nano_Banana"
+ }
+ ],
+ "https://github.com/ru4ls/ComfyUI_StreetView-Loader": [
+ [
+ "StreetViewAnimator",
+ "StreetViewCubemapLoader",
+ "StreetViewEquirectangularLoader",
+ "StreetViewLoader",
+ "StreetViewPanoLoader",
+ "StreetViewURLParser"
+ ],
+ {
+ "title_aux": "ComfyUI Street View Loader Node"
+ }
+ ],
+ "https://github.com/ru4ls/ComfyUI_Wan": [
+ [
+ "WanI2IGenerator",
+ "WanI2VEffectGenerator",
+ "WanI2VGenerator",
+ "WanII2VGenerator",
+ "WanT2IGenerator",
+ "WanT2VGenerator",
+ "WanVACEImageReference",
+ "WanVACEVideoEdit",
+ "WanVACEVideoExtension",
+ "WanVACEVideoOutpainting",
+ "WanVACEVideoRepainting"
+ ],
+ {
+ "title_aux": "ComfyUI_Wan"
+ }
+ ],
+ "https://github.com/ruanjianlun/comfyui_maya1_tts_alun": [
+ [
+ "MayaTTSNode",
+ "custom_nodes"
+ ],
+ {
+ "title_aux": "comfyui-maya1-tts"
+ }
+ ],
+ "https://github.com/rubenvillarreal/ComfyUI_PoseAlign": [
+ [
+ "PoseAlignTwoToOne",
+ "PoseViewer",
+ "SimpleTestNode"
+ ],
+ {
+ "title_aux": "ComfyUI_PoseAlign"
+ }
+ ],
+ "https://github.com/rubi-du/ComfyUI-BiRefNet-Super": [
+ [
+ "BiRefNet_Lite",
+ "BiRefNet_Super",
+ "BiRefNet_onnx"
+ ],
+ {
+ "title_aux": "ComfyUI-BiRefNet-lite"
+ }
+ ],
+ "https://github.com/rubi-du/ComfyUI-Flux-Inpainting": [
+ [
+ "Flux Inpainting",
+ "FluxGuffInpainting",
+ "FluxInpainting",
+ "FluxSimpleInpainting",
+ "FluxTransformerInpainting",
+ "FluxVAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Flux-Inpainting"
+ }
+ ],
+ "https://github.com/rubi-du/ComfyUI-ICC-nodes": [
+ [
+ "LoadImageICC",
+ "PreviewImageICC",
+ "SaveImageICC"
+ ],
+ {
+ "title_aux": "ComfyUI-ICC-nodes"
+ }
+ ],
+ "https://github.com/rui40000/RUI-Nodes": [
+ [
+ "ABCondition",
+ "CharacterCount"
+ ],
+ {
+ "title_aux": "RUI-Nodes"
+ }
+ ],
+ "https://github.com/ruiqutech/ComfyUI-RuiquNodes": [
+ [
+ "EvaluateListMultiple1",
+ "EvaluateListMultiple3",
+ "EvaluateListMultiple6",
+ "EvaluateListMultiple9",
+ "EvaluateMultiple1",
+ "EvaluateMultiple3",
+ "EvaluateMultiple6",
+ "EvaluateMultiple9",
+ "ImageDilate",
+ "ImageErode",
+ "ListPath",
+ "MaskDilate",
+ "MaskErode",
+ "PreviewMask",
+ "RangeSplit",
+ "SaveMask",
+ "StringAsAny",
+ "StringConcat1",
+ "StringConcat3",
+ "StringConcat6",
+ "StringConcat9",
+ "StringPathStem",
+ "TermsToList",
+ "VAEDecodeSave"
+ ],
+ {
+ "title_aux": "RuiquNodes for ComfyUI"
+ }
+ ],
+ "https://github.com/runtime44/comfyui_r44_nodes": [
+ [
+ "Runtime44ColorMatch",
+ "Runtime44DynamicKSampler",
+ "Runtime44FilmGrain",
+ "Runtime44ImageEnhance",
+ "Runtime44ImageOverlay",
+ "Runtime44ImageResizer",
+ "Runtime44ImageToNoise",
+ "Runtime44IterativeUpscaleFactor",
+ "Runtime44MaskSampler",
+ "Runtime44TiledMaskSampler",
+ "Runtime44Upscaler"
+ ],
+ {
+ "title_aux": "Runtime44 ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/ruucm/ruucm-comfy": [
+ [
+ "BatchAverageImage",
+ "LoadExternalLoraModelOnly",
+ "RuucmShareScreen"
+ ],
+ {
+ "nodename_pattern": " \\(ruucm\\)$",
+ "title_aux": "Ruucm's ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/ryan-seungyong-lee/ComfyUI-PromptEnhancer": [
+ [
+ "PromptEnhancerI2I",
+ "PromptEnhancerT2I"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptEnhancer"
+ }
+ ],
+ "https://github.com/ryanontheinside/ComfyUI-DeepLiveCam": [
+ [
+ "DeepLiveCamNode"
+ ],
+ {
+ "title_aux": "Deep Live Cam for ComfyUI"
+ }
+ ],
+ "https://github.com/ryanontheinside/ComfyUI_ControlFreak": [
+ [
+ "ControlFreak"
+ ],
+ {
+ "title_aux": "Control Freak for ComfyUI"
+ }
+ ],
+ "https://github.com/ryanontheinside/ComfyUI_Doom": [
+ [
+ "Doom"
+ ],
+ {
+ "title_aux": "Doom"
+ }
+ ],
+ "https://github.com/ryanontheinside/ComfyUI_EfficientTAM": [
+ [
+ "EfficientTAMLoader",
+ "EfficientTAMPredictor"
+ ],
+ {
+ "title_aux": "ComfyUI-EfficientTAM"
+ }
+ ],
+ "https://github.com/ryanontheinside/ComfyUI_ProfilerX": [
+ [
+ "ExecutionTracker"
+ ],
+ {
+ "title_aux": "ComfyUI_ProfilerX"
+ }
+ ],
+ "https://github.com/ryanontheinside/ComfyUI_RealtimeNodes": [
+ [
+ "BlendshapeControlFloat",
+ "BlendshapeControlInt",
+ "BlendshapeTrigger",
+ "CompareMediaPipeEmbeddings",
+ "CoordinateConverter",
+ "FaceDetectionToMask",
+ "FaceLandmarkPosition",
+ "FaceTextureWarp",
+ "HandLandmarkPosition",
+ "HeadPoseControlFloat",
+ "HeadPoseControlInt",
+ "HeadPoseTrigger",
+ "MaskFromFaceLandmarks",
+ "MaskFromHandLandmarks",
+ "MaskFromPoseLandmarks",
+ "MediaPipeFaceDetector",
+ "MediaPipeFaceDetectorModelLoader",
+ "MediaPipeFaceLandmarker",
+ "MediaPipeFaceLandmarkerModelLoader",
+ "MediaPipeFaceStylizer",
+ "MediaPipeFaceStylizerModelLoader",
+ "MediaPipeGestureRecognizer",
+ "MediaPipeGestureRecognizerModelLoader",
+ "MediaPipeHandLandmarker",
+ "MediaPipeHandLandmarkerModelLoader",
+ "MediaPipeHolisticLandmarker",
+ "MediaPipeHolisticVisualizer",
+ "MediaPipeImageEmbedder",
+ "MediaPipeImageEmbedderModelLoader",
+ "MediaPipeImageSegmenter",
+ "MediaPipeImageSegmenterModelLoader",
+ "MediaPipeInteractiveSegmenter",
+ "MediaPipeInteractiveSegmenterModelLoader",
+ "MediaPipeObjectDetector",
+ "MediaPipeObjectDetectorModelLoader",
+ "MediaPipePoseLandmarker",
+ "MediaPipePoseLandmarkerModelLoader",
+ "Point2D",
+ "PointList",
+ "PoseLandmarkPosition",
+ "RTCoordinateConverter",
+ "RTDrawLines",
+ "RTDrawPoints",
+ "RTDrawPolygon",
+ "ReshapeMediaPipeEmbedding",
+ "SelectMediaPipeSegment",
+ "VisualizeFaceDetections",
+ "VisualizeFaceLandmarks",
+ "VisualizeGestureRecognitions",
+ "VisualizeHandLandmarks",
+ "VisualizeObjectDetections",
+ "VisualizePoseLandmarks"
+ ],
+ {
+ "title_aux": "Nodes for use with real-time applications of ComfyUI"
+ }
+ ],
+ "https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside": [
+ [
+ "ACEStep15NativeCoverGuider",
+ "ACEStep15NativeEditGuider",
+ "ACEStep15NativeExtractGuider",
+ "ACEStep15NativeLegoGuider",
+ "ACEStep15SemanticExtractor",
+ "ACEStep15SemanticHintsBlend",
+ "ACEStep15TaskTextEncode",
+ "ACEStepAnalyzeLatent",
+ "ACEStepAudioPostProcessor",
+ "ACEStepExtendGuider",
+ "ACEStepHybridGuider",
+ "ACEStepMaskVisualizer",
+ "ACEStepRepaintGuider",
+ "ACEStepTimeRange",
+ "AdvancedLuminanceMask",
+ "AnimatedFeaturePreview",
+ "AreaFeatureNode",
+ "AudioChannelMerge",
+ "AudioChannelSplit",
+ "AudioDither",
+ "AudioFade",
+ "AudioFeatureExtractor",
+ "AudioFeatureVisualizer",
+ "AudioFilter",
+ "AudioGain",
+ "AudioInfo",
+ "AudioLatentBlend",
+ "AudioLatentInfo",
+ "AudioMaskAnalyzer",
+ "AudioPad",
+ "AudioPitchShift",
+ "AudioRegionMask",
+ "AudioRegionMask15",
+ "AudioResample",
+ "AudioSeparatorSimple",
+ "AudioSubtract",
+ "AudioTemporalMask",
+ "AudioTemporalMask15",
+ "AudioTimeStretch",
+ "AudioTrim",
+ "AudioVolumeNormalization",
+ "Audio_Combine",
+ "Audio_Concatenate",
+ "BrightnessFeatureNode",
+ "ColorFeatureNode",
+ "Color_Picker",
+ "ContextModifier",
+ "DepthBlender",
+ "DepthFeatureNode",
+ "DepthInjection",
+ "DepthRippleEffect",
+ "DepthShapeModifier",
+ "DepthShapeModifierPrecise",
+ "Doom_",
+ "DownloadOpenUnmixModel",
+ "DrawableFeatureNode",
+ "DyeImage",
+ "EffectVisualizer",
+ "EmbeddingGuidedLatentInterpolate",
+ "EmitterEmissionRateModulation",
+ "EmitterMovement",
+ "EmptyImageAndMaskFromAudio",
+ "EmptyImageFromAudio",
+ "EmptyMaskFromAudio",
+ "FeatureAccumulate",
+ "FeatureCombine",
+ "FeatureContiguousInterpolate",
+ "FeatureFade",
+ "FeatureInfoNode",
+ "FeatureInterpolateMulti",
+ "FeatureInterpolator",
+ "FeatureMath",
+ "FeatureMixer",
+ "FeatureOscillator",
+ "FeaturePeakDetector",
+ "FeatureRebase",
+ "FeatureRenormalize",
+ "FeatureScaler",
+ "FeatureSmoothing",
+ "FeatureToFilteredList",
+ "FeatureToFlexFloatParam",
+ "FeatureToFlexIntParam",
+ "FeatureToFloat",
+ "FeatureToLatentKeyframe",
+ "FeatureToMask",
+ "FeatureToSplineData",
+ "FeatureToTimestepKeyframe",
+ "FeatureToWeightsStrategy",
+ "FeatureTruncateOrExtend",
+ "FlexAudioPitchShift",
+ "FlexAudioTimeStretch",
+ "FlexAudioVisualizerCircular",
+ "FlexAudioVisualizerContour",
+ "FlexAudioVisualizerLine",
+ "FlexImageBloom",
+ "FlexImageChromaticAberration",
+ "FlexImageColorGrade",
+ "FlexImageContrast",
+ "FlexImageDepthWarp",
+ "FlexImageEdgeDetect",
+ "FlexImageGlitch",
+ "FlexImageHorizontalToVertical",
+ "FlexImageHueShift",
+ "FlexImageKaleidoscope",
+ "FlexImageParallax",
+ "FlexImagePixelate",
+ "FlexImagePosterize",
+ "FlexImageTiltShift",
+ "FlexImageTransform",
+ "FlexImageVignette",
+ "FlexImageWarp",
+ "FlexLatentBlend",
+ "FlexLatentInterpolate",
+ "FlexLatentNoise",
+ "FlexMaskBinary",
+ "FlexMaskDepthChamber",
+ "FlexMaskEmanatingRings",
+ "FlexMaskInterpolate",
+ "FlexMaskMath",
+ "FlexMaskMorph",
+ "FlexMaskOpacity",
+ "FlexMaskRandomShapes",
+ "FlexMaskTransform",
+ "FlexMaskVoronoiScheduled",
+ "FlexMaskWarp",
+ "FlexMaskWavePropagation",
+ "FlexVideoDirection",
+ "FlexVideoFrameBlend",
+ "FlexVideoSeek",
+ "FlexVideoSpeed",
+ "FlexlatentAudioBlend",
+ "FloatFeatureNode",
+ "FrequencyFilterCustom",
+ "FrequencyFilterPreset",
+ "FrequencyRange",
+ "GravityWell",
+ "ImageCASBatch",
+ "ImageChunk",
+ "ImageDifference",
+ "ImageIndexSelect",
+ "ImageInterval",
+ "ImageIntervalSelectPercentage",
+ "ImageScaleToTarget",
+ "Image_Shuffle",
+ "Knob",
+ "LatentFrequencyBlender",
+ "LocationFromMask",
+ "LocationFromPoint",
+ "LocationTransform",
+ "MIDIFeatureExtractor",
+ "MIDILoadAndExtract",
+ "MIDILoader",
+ "MIDIToAudio",
+ "ManualFeatureFromPipe",
+ "ManualFeatureNode",
+ "ManualFeaturePipe",
+ "ManualWhisperAlignmentData",
+ "MaskMath",
+ "MaskMorph",
+ "MaskRings",
+ "MaskToAudioMask",
+ "MaskToAudioMask15",
+ "MaskTransform",
+ "MaskWarp",
+ "ModelSamplingACEStep",
+ "MotionFeatureNode",
+ "MovingShape",
+ "OpticalFlowDirectionMask",
+ "OpticalFlowMaskModulation",
+ "OpticalFlowParticleSystem",
+ "ParticleColorModulation",
+ "ParticleEmissionMask",
+ "ParticleEmitter",
+ "ParticleSizeModulation",
+ "ParticleSpeedModulation",
+ "PitchFeatureExtractor",
+ "PitchRange",
+ "PitchRangeByNoteNode",
+ "PitchRangePreset",
+ "PitchVisualizer",
+ "PreviewAudioCompare",
+ "PreviewFeature",
+ "ProximityFeatureNode",
+ "ProximityVisualizer",
+ "ROTIDisplayAny",
+ "RhythmFeatureExtractor",
+ "SplineFeatureModulator",
+ "SplineRhythmModulator",
+ "SpringJointSetting",
+ "StaticBody",
+ "SwapDevice",
+ "TextMaskNode",
+ "TimeFeatureNode",
+ "TranslucentComposite",
+ "TriggerBuilder",
+ "VideoChunk",
+ "Vortex",
+ "WhisperAutoAdjust",
+ "WhisperFeature",
+ "WhisperTextRenderer",
+ "WhisperTimeAdjuster",
+ "WhisperToPromptTravel",
+ "_mfc"
+ ],
+ {
+ "title_aux": "RyanOnTheInside"
+ }
+ ],
+ "https://github.com/ryanontheinside/ComfyUI_SuperResolution": [
+ [
+ "SuperResolutionModelLoader",
+ "SuperResolutionUpscale"
+ ],
+ {
+ "title_aux": "ComfyUI_SuperResolution"
+ }
+ ],
+ "https://github.com/rzgarespo/ComfyUI-diffusiondb": [
+ [
+ "SDPromptNode"
+ ],
+ {
+ "title_aux": "ComfyUI-diffusiondb"
+ }
+ ],
+ "https://github.com/rzgarespo/ComfyUI-qwen-image-size-picker": [
+ [
+ "QwenImageSize"
+ ],
+ {
+ "title_aux": "ComfyUI Qwen Image Size Picker"
+ }
+ ],
+ "https://github.com/s9roll7/comfyui_cotracker_node": [
+ [
+ "CoTrackerNode",
+ "GridPointGeneratorNode",
+ "PerlinCoordinateRandomizerNode",
+ "XYMotionAmplifierNode"
+ ],
+ {
+ "title_aux": "Comfyui CoTracker Node"
+ }
+ ],
+ "https://github.com/saftle/uber_comfy_nodes": [
+ [
+ "AdaptiveImageScaler",
+ "ControlNet Selector",
+ "ControlNetOptionalLoader",
+ "DiffusersSelector",
+ "ModelSimilarityNode",
+ "ModelWeightDumperNode",
+ "MultiInputVariableRewrite",
+ "RunwareResolutionCalculator",
+ "SaveImageJPGNoMeta",
+ "TextRegexOperations",
+ "VideoSegmentCalculator"
+ ],
+ {
+ "title_aux": "Suplex Misc ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/sakura1bgx/ComfyUI_FlipStreamViewer": [
+ [
+ "FlipStreamAllowIp",
+ "FlipStreamAnd",
+ "FlipStreamBatchPrompt",
+ "FlipStreamButton",
+ "FlipStreamChat",
+ "FlipStreamChatJson",
+ "FlipStreamCurrent",
+ "FlipStreamFileSelect_AnimateDiffModel",
+ "FlipStreamFileSelect_Checkpoints",
+ "FlipStreamFileSelect_ControlNetModel",
+ "FlipStreamFileSelect_Input",
+ "FlipStreamFileSelect_LLM",
+ "FlipStreamFileSelect_Loras",
+ "FlipStreamFileSelect_Output",
+ "FlipStreamFileSelect_TensorRT",
+ "FlipStreamFileSelect_VAE",
+ "FlipStreamFilmVfi",
+ "FlipStreamFree",
+ "FlipStreamGate",
+ "FlipStreamGet",
+ "FlipStreamGetFrame",
+ "FlipStreamGetParam",
+ "FlipStreamGetPreviewRoi",
+ "FlipStreamGetSize",
+ "FlipStreamGetState",
+ "FlipStreamImageSize",
+ "FlipStreamInputBox",
+ "FlipStreamLoadLora",
+ "FlipStreamLogBox",
+ "FlipStreamLoraMode",
+ "FlipStreamOr",
+ "FlipStreamParseJson",
+ "FlipStreamPasteBox",
+ "FlipStreamPreviewBox",
+ "FlipStreamRembg",
+ "FlipStreamRunApiWorkflow",
+ "FlipStreamRunOnce",
+ "FlipStreamSaveApiWorkflow",
+ "FlipStreamScreenGrabber",
+ "FlipStreamSection",
+ "FlipStreamSegMask",
+ "FlipStreamSelectBox_Samplers",
+ "FlipStreamSelectBox_Scheduler",
+ "FlipStreamSetMessage",
+ "FlipStreamSetParam",
+ "FlipStreamSetState",
+ "FlipStreamShutdown",
+ "FlipStreamSizeSelect",
+ "FlipStreamSlider",
+ "FlipStreamSource",
+ "FlipStreamSwitch",
+ "FlipStreamSwitchImage",
+ "FlipStreamSwitchLatent",
+ "FlipStreamTextBox",
+ "FlipStreamTextConcat",
+ "FlipStreamTextReplace",
+ "FlipStreamVideoInput",
+ "FlipStreamViewer",
+ "FlipStreamViewerSimple"
+ ],
+ {
+ "title_aux": "ComfyUI_FlipStreamViewer"
+ }
+ ],
+ "https://github.com/sammykumar/ComfyUI-SwissArmyKnife": [
+ [
+ "AzureStorageUpload",
+ "CivitMetadataHelper",
+ "ControlPanelOverview",
+ "ControlPanelPromptBreakdown",
+ "FilenameGenerator",
+ "FrameExtractor",
+ "GeminiUtilOptions",
+ "LLMStudioOptions",
+ "LLMStudioPictureDescribe",
+ "LLMStudioStructuredDescribe",
+ "LLMStudioStructuredVideoDescribe",
+ "LLMStudioVideoDescribe",
+ "LoRAInfoExtractor",
+ "MediaDescribe",
+ "MediaDescribeOverrides",
+ "MediaSelection",
+ "MultiCaptionCombiner",
+ "ShowText",
+ "VACEDepthAnnotator",
+ "VACEFlowAnnotator",
+ "VACEScribbleAnnotator",
+ "VideoMetadataNode",
+ "VideoPreview",
+ "VideoPreviewNative"
+ ],
+ {
+ "title_aux": "ComfyUI-SwissArmyKnife"
+ }
+ ],
+ "https://github.com/sanbuphy/ComfyUI-AudioLDM": [
+ [
+ "AudioLDM",
+ "PreviewAudioLDM",
+ "SaveAudioLDM"
+ ],
+ {
+ "title_aux": "ComfyUI-AudioLDM"
+ }
+ ],
+ "https://github.com/santiagosamuel3455/ComfyUI-GeminiImageToPrompt": [
+ [
+ "DeepseekR1KlingAINode",
+ "GeminiImageToPromptNode",
+ "GeminiTextToCinematicPromptNode",
+ "ShowGeneratedText",
+ "ShowTextNode"
+ ],
+ {
+ "title_aux": "ComfyUI-GeminiImageToPrompt"
+ }
+ ],
+ "https://github.com/scofano/ComfyUI-Advanced-TextOverlay": [
+ [
+ "Advanced Text Overlay",
+ "Advanced Text Overlay - Video"
+ ],
+ {
+ "title_aux": "Advanced Text Overlay"
+ }
+ ],
+ "https://github.com/scofano/ComfyUI-Simple-video-effects": [
+ [
+ "AdvancedFolderVideoCombiner",
+ "CameraMoveNode",
+ "CameraMoveVideoNode",
+ "CameraShakeNode",
+ "CameraShakeVideoNode",
+ "CloseUpImageNode",
+ "CloseUpNode",
+ "ComfyAddSoundtrack",
+ "ComfyImageAudioCSV",
+ "ImageSequenceOverlay",
+ "ImageTransitionNode",
+ "MergeVideoAudioNode",
+ "SimpleFolderVideoCombiner",
+ "VideoImageOverlay",
+ "VideoLoopExtenderNode",
+ "VideoOverlay",
+ "VideoOverlayBatch",
+ "VideoOverlayFromFile",
+ "VideoSplitterNode",
+ "ZoomSequenceBatchNode",
+ "ZoomSequenceNode",
+ "ZoomSequenceVideoNode"
+ ],
+ {
+ "title_aux": "Simple Video Effects"
+ }
+ ],
+ "https://github.com/scofano/comfy-audio-duration": [
+ [
+ "Audio Duration"
+ ],
+ {
+ "title_aux": "Audio Duration"
+ }
+ ],
+ "https://github.com/scofano/comfy-text-stats": [
+ [
+ "TextStats"
+ ],
+ {
+ "title_aux": "Comfy Text Stats"
+ }
+ ],
+ "https://github.com/scraed/LanPaint": [
+ [
+ "LanPaint_KSampler",
+ "LanPaint_KSamplerAdvanced",
+ "LanPaint_MaskBlend",
+ "LanPaint_SamplerCustom",
+ "LanPaint_SamplerCustomAdvanced"
+ ],
+ {
+ "title_aux": "LanPaint"
+ }
+ ],
+ "https://github.com/sdfxai/SDFXBridgeForComfyUI": [
+ [
+ "SDFXClipTextEncode"
+ ],
+ {
+ "title_aux": "SDFXBridgeForComfyUI - ComfyUI Custom Node for SDFX Integration"
+ }
+ ],
+ "https://github.com/sdtana/ComfyUI-FDG": [
+ [
+ "FDGNode"
+ ],
+ {
+ "title_aux": "ComfyUI-FDG"
+ }
+ ],
+ "https://github.com/seanjang990/comfyui-document-auto-crop": [
+ [
+ "CropRotateNode"
+ ],
+ {
+ "title_aux": "ComfyUI Document Auto Crop Node"
+ }
+ ],
+ "https://github.com/seanlynch/comfyui-optical-flow": [
+ [
+ "Apply optical flow",
+ "ApplyOpticalFlow",
+ "Compute optical flow",
+ "ComputeOpticalFlow",
+ "Visualize optical flow",
+ "VisualizeOpticalFlow"
+ ],
+ {
+ "title_aux": "ComfyUI Optical Flow"
+ }
+ ],
+ "https://github.com/seanlynch/srl-nodes": [
+ [
+ "SRL Conditional Interrrupt",
+ "SRL Eval",
+ "SRL Filter Image List",
+ "SRL Format String",
+ "SrlConditionalInterrupt",
+ "SrlEval",
+ "SrlFilterImageList",
+ "SrlFormatString"
+ ],
+ {
+ "title_aux": "SRL's nodes"
+ }
+ ],
+ "https://github.com/sebagallo/comfyui-sg-llama-cpp": [
+ [
+ "LlamaCPPEngine",
+ "LlamaCPPMemoryCleanup",
+ "LlamaCPPModelLoader",
+ "LlamaCPPOptions"
+ ],
+ {
+ "title_aux": "comfyui-sg-llama-cpp"
+ }
+ ],
+ "https://github.com/sebagallo/comfyui-sg-openai-client": [
+ [
+ "OpenAIChatCompletion",
+ "OpenAIClient"
+ ],
+ {
+ "title_aux": "comfyui-sg-openai-client"
+ }
+ ],
+ "https://github.com/sebagallo/comfyui-sg-text-encode-reference-images": [
+ [
+ "TextEncodeReferenceImages"
+ ],
+ {
+ "title_aux": "comfyui-sg-text-encode-reference-images"
+ }
+ ],
+ "https://github.com/sebord/ComfyUI-LMCQ": [
+ [
+ "LmcqCodeDecryptionLoader",
+ "LmcqCodeEncryption",
+ "LmcqDeepGen",
+ "LmcqDeepLoader",
+ "LmcqGetMachineCode",
+ "LmcqImageSaver",
+ "LmcqImageSaverTransit",
+ "LmcqImageSaverWeb",
+ "LmcqInputValidator",
+ "LmcqLoadFluxNF4Checkpoint",
+ "LmcqRuntimeLoraDecryption",
+ "LmcqRuntimeLoraEncryption",
+ "LmcqRuntimeModelDecryption",
+ "LmcqRuntimeModelEncryption",
+ "LmcqRuntimeWorkflowDecryption",
+ "LmcqRuntimeWorkflowEncryption"
+ ],
+ {
+ "title_aux": "ComfyUI-LMCQ"
+ }
+ ],
+ "https://github.com/senhaicc/Comfyui-WL-MainImageDesign": [
+ [
+ "WLMainImageGenerator",
+ "WLPromptBatchConverter"
+ ],
+ {
+ "title_aux": "Comfyui-WL-MainImageDesign"
+ }
+ ],
+ "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack": [
+ [
+ "AdjustAndRoundDimensions",
+ "AspectRatioMobileDevices",
+ "AutoLevelsNode",
+ "ImageCombineRect",
+ "ImageExtractRect",
+ "ImageResizeAndCropNode",
+ "ImageSquareAdapterNode",
+ "LoadImagesFromFolder",
+ "MathOperationNode",
+ "NumberRangeNode",
+ "PopularScreenResolutions",
+ "SliderComparisonNode"
+ ],
+ {
+ "title_aux": "ComfyUI_Nimbus-Pack"
+ }
+ ],
+ "https://github.com/sfinktah/comfy-ovum": [
+ [
+ "ImageExContextListOvum",
+ "ImageExContextOvum",
+ "LoadImageFromOutputSubdirectoryWithWorkflowOvum",
+ "LoadImageFromOutputWithWorkflowOvum",
+ "LoadImageWithWorkflowOvum"
+ ],
+ {
+ "title_aux": "comfy-ovum"
+ }
+ ],
+ "https://github.com/sgyyao/ComfyUI_LLM_Prompt_Optimizer": [
+ [
+ "PromptOptimizer"
+ ],
+ {
+ "title_aux": "ComfyUI_LLM_Prompt_Optimizer"
+ }
+ ],
+ "https://github.com/sh570655308/ComfyUI-GigapixelAI": [
+ [
+ "GigapixelAI",
+ "GigapixelModelSettings",
+ "GigapixelUpscaleSettings"
+ ],
+ {
+ "title_aux": "ComfyUI-GigapixelAI"
+ }
+ ],
+ "https://github.com/sh570655308/ComfyUI-TopazVideoAI": [
+ [
+ "TopazUpscaleParams",
+ "TopazVideoAI"
+ ],
+ {
+ "title_aux": "ComfyUI-TopazVideoAI"
+ }
+ ],
+ "https://github.com/shabri-arrahim/ComfyUI-Safety-Checker": [
+ [
+ "CompVisSafetyChecker",
+ "FalconsAISafetyChecker",
+ "loadImageBase64"
+ ],
+ {
+ "title_aux": "ComfyUI Safety Checker"
+ }
+ ],
+ "https://github.com/shadowcz007/comfyui-Image-reward": [
+ [
+ "ImageBatchToList_",
+ "ImageRewardScore_"
+ ],
+ {
+ "title_aux": "comfyui-Image-reward"
+ }
+ ],
+ "https://github.com/shadowcz007/comfyui-consistency-decoder": [
+ [
+ "VAEDecodeConsistencyDecoder",
+ "VAELoaderConsistencyDecoder"
+ ],
+ {
+ "title_aux": "Consistency Decoder"
+ }
+ ],
+ "https://github.com/shadowcz007/comfyui-edit-mask": [
+ [
+ "EditMask"
+ ],
+ {
+ "title_aux": "comfyui-edit-mask"
+ }
+ ],
+ "https://github.com/shadowcz007/comfyui-liveportrait": [
+ [
+ "ExpressionEditor_",
+ "ExpressionVideo2VideoNode",
+ "ExpressionVideoNode",
+ "FaceCropInfo",
+ "LivePortraitNode",
+ "LivePortraitVideoNode",
+ "Retargeting"
+ ],
+ {
+ "title_aux": "comfyui-liveportrait"
+ }
+ ],
+ "https://github.com/shadowcz007/comfyui-mixlab-nodes": [
+ [
+ "3DImage",
+ "AnalyzeAudio",
+ "AppInfo",
+ "ApplyVisualStylePrompting_",
+ "AreaToMask",
+ "AudioPlay",
+ "AudioToPrompt",
+ "CenterImage",
+ "ChinesePrompt_Mix",
+ "CkptNames_",
+ "ClipInterrogator",
+ "Color",
+ "ComparingTwoFrames_",
+ "CompositeImages_",
+ "CreateJsonNode",
+ "DepthViewer",
+ "DynamicDelayProcessor",
+ "EditMask",
+ "EmbeddingPrompt",
+ "EnhanceImage",
+ "FaceToMask",
+ "FeatheredMask",
+ "FloatSlider",
+ "FloatingVideo",
+ "Font",
+ "GLIGENTextBoxApply_Advanced",
+ "GetImageSize_",
+ "GradientImage",
+ "GridDisplayAndSave",
+ "GridInput",
+ "GridOutput",
+ "ImageBatchToList_",
+ "ImageColorTransfer",
+ "ImageCropByAlpha",
+ "ImageListReplace_",
+ "ImageListToBatch_",
+ "ImagesPrompt_",
+ "IncrementingListNode_",
+ "IntNumber",
+ "JoinWithDelimiter",
+ "KeyInput",
+ "LaMaInpainting",
+ "LimitNumber",
+ "ListSplit_",
+ "LoadImagesFromPath",
+ "LoadImagesFromURL",
+ "LoadImagesToBatch",
+ "LoadTripoSRModel_",
+ "LoadVQGAN",
+ "LoadVideoAndSegment_",
+ "LoadVideoFromURL",
+ "LoadWhisperModel_",
+ "LoraNames_",
+ "MaskListMerge_",
+ "MaskListReplace_",
+ "MergeLayers",
+ "MiniCPM_VQA_Simple",
+ "MirroredImage",
+ "MultiplicationNode",
+ "NewLayer",
+ "NoiseImage",
+ "OutlineMask",
+ "P5Input",
+ "PreviewMask_",
+ "Prompt2Semantic",
+ "PromptGenerate_Mix",
+ "PromptImage",
+ "PromptSimplification",
+ "PromptSlide",
+ "RandomPrompt",
+ "RembgNode_Mix",
+ "ResizeImageMixlab",
+ "SamplerNames_",
+ "SaveImageAndMetadata_",
+ "SaveImageToLocal",
+ "SaveTripoSRMesh",
+ "SceneInfoNode",
+ "ScenedetectNode_",
+ "ScreenShare",
+ "Seed_",
+ "Semantic2Audio",
+ "SenseVoiceNode",
+ "ShowLayer",
+ "SmoothMask",
+ "SpeechRecognition",
+ "SpeechSynthesis",
+ "SplitImage",
+ "SplitLongMask",
+ "StyleAlignedBatchAlign_",
+ "StyleAlignedReferenceSampler_",
+ "StyleAlignedSampleReferenceLatents_",
+ "SvgImage",
+ "SwitchByIndex",
+ "TESTNODE_",
+ "TESTNODE_TOKEN",
+ "TextImage",
+ "TextInput_",
+ "TextToNumber",
+ "TransparentImage",
+ "TripoSRSampler_",
+ "VideoCombine_Adv",
+ "VideoGenKlingNode",
+ "VideoGenLumaDreamMachineNode",
+ "VideoGenRunwayGen3Node",
+ "WhisperTranscribe_"
+ ],
+ {
+ "title_aux": "comfyui-mixlab-nodes"
+ }
+ ],
+ "https://github.com/shadowcz007/comfyui-sound-lab": [
+ [
+ "AudioPlay",
+ "Musicgen_",
+ "StableAudio_"
+ ],
+ {
+ "title_aux": "comfyui-sound-lab"
+ }
+ ],
+ "https://github.com/shadowcz007/comfyui-try-on": [
+ [
+ "CatVTONNode",
+ "FashionClothMask",
+ "FashionClothMask2"
+ ],
+ {
+ "author": "chflame",
+ "description": "CatVTON warpper for ComfyUI",
+ "nickname": "CatVTON_Wrapper",
+ "title": "CatVTON_Wrapper",
+ "title_aux": "comfyui-try-on"
+ }
+ ],
+ "https://github.com/shadowcz007/comfyui-ultralytics-yolo": [
+ [
+ "DetectByLabel"
+ ],
+ {
+ "title_aux": "comfyui-ultralytics-yolo"
+ }
+ ],
+ "https://github.com/shahkoorosh/ComfyUI-KGnodes": [
+ [
+ "CustomResolutionLatentNode",
+ "FaceDetectorAndCropper",
+ "ImageScaleToSide",
+ "OverlayRGBAonRGB",
+ "StyleSelector",
+ "TextBehindImage"
+ ],
+ {
+ "author": "ShahKoorosh",
+ "description": "This Custom node pack offers various nodes to make it easier to use ComfyUI.",
+ "nickname": "KGnodes",
+ "title": "ComfyUI-KGnodes",
+ "title_aux": "ComfyUI-KGnodes"
+ }
+ ],
+ "https://github.com/shahkoorosh/ComfyUI-PersianText": [
+ [
+ "PersianText"
+ ],
+ {
+ "author": "shahkoorosh",
+ "description": "A powerful ComfyUI node for rendering text with advanced styling options, including full support for Persian/Farsi and Arabic scripts.",
+ "nickname": "PersianText",
+ "title": "ComfyUI-PersianText",
+ "title_aux": "ComfyUI-PersianText"
+ }
+ ],
+ "https://github.com/shenduldh/ComfyUI-Lightning": [
+ [
+ "ApplyFBCacheAndSkipBlocks",
+ "ApplyMBCacheAndSkipBlocks",
+ "ApplyMBCacheAndSkipBlocksForSana",
+ "ApplySageAttention",
+ "ApplySpargeAttn",
+ "ApplyTeaCacheAndSkipBlocks",
+ "ApplyToCa",
+ "ApplyTokenMerging",
+ "CompileAndQuantizeModel",
+ "SanaCLIPLoader",
+ "SanaDiffusionLoader",
+ "SanaEmptyLatentImage",
+ "SanaTextEncode",
+ "SanaVAELoader",
+ "SaveSpargeAttnHyperparams"
+ ],
+ {
+ "title_aux": "ComfyUI-Lightning"
+ }
+ ],
+ "https://github.com/shi3z/ComfyUI_Memeplex_DALLE": [
+ [
+ "DallERender",
+ "GPT",
+ "MemeplexCustomSDXLRender",
+ "MemeplexRender",
+ "TextInput",
+ "TextSend"
+ ],
+ {
+ "title_aux": "ComfyUI_Memeplex_DALLE"
+ }
+ ],
+ "https://github.com/shiertier/ComfyUI-TeaCache-lumina2": [
+ [
+ "TeaCacheForLumina2",
+ "TeaCacheForLuminaAuto",
+ "TeaCacheForLuminaNext"
+ ],
+ {
+ "title_aux": "ComfyUI-TeaCache-Lumina"
+ }
+ ],
+ "https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus": [
+ [
+ "PhotoMakerEncodePlus",
+ "PhotoMakerInsightFaceLoader",
+ "PhotoMakerLoaderPlus",
+ "PhotoMakerLoraLoaderPlus",
+ "PhotoMakerStyles",
+ "PrepImagesForClipVisionFromPath"
+ ],
+ {
+ "title_aux": "ComfyUI PhotoMaker Plus"
+ }
+ ],
+ "https://github.com/shiimizu/ComfyUI-TiledDiffusion": [
+ [
+ "SpotDiffusionParams_TiledDiffusion",
+ "TiledDiffusion",
+ "VAEDecodeTiled_TiledDiffusion",
+ "VAEEncodeTiled_TiledDiffusion"
+ ],
+ {
+ "title_aux": "Tiled Diffusion & VAE for ComfyUI"
+ }
+ ],
+ "https://github.com/shiimizu/ComfyUI-semantic-aware-guidance": [
+ [
+ "SemanticAwareGuidance"
+ ],
+ {
+ "title_aux": "Semantic-aware Guidance (S-CFG)"
+ }
+ ],
+ "https://github.com/shiimizu/ComfyUI_smZNodes": [
+ [
+ "smZ CLIPTextEncode",
+ "smZ Settings"
+ ],
+ {
+ "title_aux": "smZNodes"
+ }
+ ],
+ "https://github.com/shin131002/RandomLoRALoader": [
+ [
+ "FilteredRandomLoRALoader",
+ "FilteredRandomLoRALoaderLBW",
+ "RandomLoRALoader"
+ ],
+ {
+ "title_aux": "RandomLoRALoader"
+ }
+ ],
+ "https://github.com/shinich39/comfyui-break-workflow": [
+ [
+ "BreakWorkflow"
+ ],
+ {
+ "author": "shinich39",
+ "description": "Break the execution, save the incompleted image then continue later.",
+ "nickname": "comfyui-break-workflow",
+ "title": "comfyui-break-workflow",
+ "title_aux": "comfyui-break-workflow"
+ }
+ ],
+ "https://github.com/shinich39/comfyui-dynamic-routes": [
+ [
+ "DynamicRoutes"
+ ],
+ {
+ "author": "shinich39",
+ "description": "Shuffle nodes after queue execution.",
+ "nickname": "comfyui-dynamic-routes",
+ "title": "comfyui-dynamic-routes",
+ "title_aux": "comfyui-dynamic-routes"
+ }
+ ],
+ "https://github.com/shinich39/comfyui-get-meta": [
+ [
+ "GetBooleanFromImage",
+ "GetComboFromImage",
+ "GetFloatFromImage",
+ "GetIntFromImage",
+ "GetPromptFromImage",
+ "GetStringFromImage",
+ "GetValuesFromImage",
+ "GetWorkflowFromImage"
+ ],
+ {
+ "author": "shinich39",
+ "description": "Get metadata from image.",
+ "nickname": "comfyui-get-meta",
+ "title": "comfyui-get-meta",
+ "title_aux": "comfyui-get-meta"
+ }
+ ],
+ "https://github.com/shinyakidoguchi301/comfyui-lora-tag-loader": [
+ [
+ "LoRA_TagLoader"
+ ],
+ {
+ "title_aux": "shinyakidoguchi301/LoRA Tag Loader for ComfyUI"
+ }
+ ],
+ "https://github.com/shmbatom/Comfyui-Image-Concat": [
+ [
+ "ImageConcatNode"
+ ],
+ {
+ "title_aux": "Comfyui-Image-Concat"
+ }
+ ],
+ "https://github.com/shmbatom/Comfyui-ImageAB-Compare": [
+ [
+ "ImageABCompare"
+ ],
+ {
+ "title_aux": "Comfyui-ImageAB-Compare"
+ }
+ ],
+ "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip": [
+ [
+ "PlusMinusTextClip"
+ ],
+ {
+ "title_aux": "PlusMinusTextClip - Single node for Positive and Negative Prompts"
+ }
+ ],
+ "https://github.com/shockz0rz/comfy-easy-grids": [
+ [
+ "FloatToText",
+ "GridFloatList",
+ "GridFloats",
+ "GridIntList",
+ "GridInts",
+ "GridLoras",
+ "GridStringList",
+ "GridStrings",
+ "ImageGridCommander",
+ "IntToText",
+ "SaveImageGrid",
+ "TextConcatenator"
+ ],
+ {
+ "title_aux": "comfy-easy-grids"
+ }
+ ],
+ "https://github.com/shootthesound/comfyUI-LongLook": [
+ [
+ "WanContinuationConditioning",
+ "WanFreeLong",
+ "WanFreeLongEnforcer",
+ "WanMotionScale",
+ "WanMotionScaleAdvanced"
+ ],
+ {
+ "title_aux": "comfyUI-LongLook"
+ }
+ ],
+ "https://github.com/shootthesound/comfyui-wan-i2v-control": [
+ [
+ "DropFirstFrames",
+ "WanI2VConditioningMaskPro"
+ ],
+ {
+ "title_aux": "comfyui-wan-i2v-control"
+ }
+ ],
+ "https://github.com/shumoLR/Comfyui_SynVow_MultiangleCamera": [
+ [
+ "SynvowMultiangleCameraNode"
+ ],
+ {
+ "title_aux": "Comfyui_SynVow_MultiangleCamera"
+ }
+ ],
+ "https://github.com/shumoLR/Comfyui_SynVow_TeleStyle": [
+ [
+ "TeleStyleVideo",
+ "TeleStyleVideoLoader"
+ ],
+ {
+ "title_aux": "Comfyui_SynVow_TeleStyle"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI-ModelUtils": [
+ [
+ "CheckpointMetaKeys",
+ "CheckpointPruneKeys",
+ "CheckpointRenameKeys",
+ "CheckpointThreeMerger",
+ "CheckpointTwoMerger",
+ "EmbeddingMetaKeys",
+ "EmbeddingPruneKeys",
+ "EmbeddingRenameKeys",
+ "EmbeddingThreeMerger",
+ "EmbeddingTwoMerger",
+ "LoRAExtractFixed",
+ "LoRAExtractFrobenius",
+ "LoRAExtractKnee",
+ "LoRAExtractQuantile",
+ "LoRAExtractRatio",
+ "LoRAMergeToModel",
+ "LoRAMetaKeys",
+ "LoRAMultiMerge",
+ "LoRAPruneKeys",
+ "LoRARenameKeys",
+ "LoRAResizeCumulative",
+ "LoRAResizeFixed",
+ "LoRAResizeFrobenius",
+ "LoRAResizeRatio",
+ "LoRAResizeViaBaseCumulative",
+ "LoRAResizeViaBaseFixed",
+ "LoRAResizeViaBaseFrobenius",
+ "LoRAResizeViaBaseRatio",
+ "LoRAThreeMerger",
+ "LoRATwoMerger",
+ "ModelMetaKeys",
+ "ModelPruneKeys",
+ "ModelRenameKeys",
+ "ModelThreeMerger",
+ "ModelTwoMerger",
+ "TextEncoderMetaKeys",
+ "TextEncoderPruneKeys",
+ "TextEncoderRenameKeys",
+ "TextEncoderThreeMerger",
+ "TextEncoderTwoMerger"
+ ],
+ {
+ "title_aux": "Model Utility Toolkit"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI-PokeIndex": [
+ [
+ "PokeIndex"
+ ],
+ {
+ "title_aux": "ComfyUI-PokeIndex"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI-RR-JointTagger": [
+ [
+ "Jtp3HydraTagger|redrocket",
+ "RRJointTagger|redrocket"
+ ],
+ {
+ "title_aux": "ComfyUI-RR-JointTagger"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_EmbeddingToolkit": [
+ [
+ "InspectEmbeddingForClip",
+ "PromptEmbeddingFixer",
+ "SaveA1111WeightedEmbeddings",
+ "SaveTokenEmbeddings",
+ "SaveWeightedEmbeddings",
+ "SliceExistingEmbedding"
+ ],
+ {
+ "title_aux": "ComfyUI_EmbeddingToolkit"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_FDGuidance": [
+ [
+ "FDG_APG_Patcher",
+ "FDG_APG_PatcherAnimation",
+ "FrequencyDecoupledGuidance",
+ "FrequencyDecoupledGuidanceAnimation"
+ ],
+ {
+ "title_aux": "ComfyUI_FDGuidance"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_Gemini_Expanded_API": [
+ [
+ "GetKeyAPI",
+ "SSL_GeminiAPIKeyConfig",
+ "SSL_GeminiTextPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI Gemini Expanded API"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_Hybrid-Scaled_fp8-Loader": [
+ [
+ "HybridConfigNode",
+ "ScaledFP8HybridCheckpointLoader",
+ "ScaledFP8HybridUNetLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_Hybrid-Scaled_fp8-Loader"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_PowerShiftScheduler": [
+ [
+ "PowerShiftScheduler",
+ "RadianceShiftScheduler"
+ ],
+ {
+ "title_aux": "ComfyUI Power Shift Scheduler"
+ }
+ ],
+ "https://github.com/silveroxides/ComfyUI_SigmoidOffsetScheduler": [
+ [
+ "SigmoidOffsetScheduler"
+ ],
+ {
+ "title_aux": "ComfyUI Sigmoid Offset Scheduler"
+ }
+ ],
+ "https://github.com/sinanzoo2nd/ComfyUI-Seed-Wildcard-Pack": [
+ [
+ "DynamicTextConcatenate",
+ "ResizeByScale",
+ "SeedBasedWildcardImpact",
+ "SeedBasedWildcardLora",
+ "SeedGeneratorWithMin"
+ ],
+ {
+ "title_aux": "ComfyUI Seed Wildcard Pack"
+ }
+ ],
+ "https://github.com/sipherxyz/comfyui-art-venture": [
+ [
+ "AV_AwsBedrockClaudeApi",
+ "AV_AwsBedrockMistralApi",
+ "AV_CheckpointLoader",
+ "AV_CheckpointMerge",
+ "AV_CheckpointModelsToParametersPipe",
+ "AV_CheckpointSave",
+ "AV_ClaudeApi",
+ "AV_ControlNetEfficientLoader",
+ "AV_ControlNetEfficientLoaderAdvanced",
+ "AV_ControlNetEfficientStacker",
+ "AV_ControlNetEfficientStackerSimple",
+ "AV_ControlNetLoader",
+ "AV_ControlNetPreprocessor",
+ "AV_FaceDetailer",
+ "AV_FaceDetailerPipe",
+ "AV_GeminiApi",
+ "AV_IPAdapter",
+ "AV_IPAdapterPipe",
+ "AV_LLMApiConfig",
+ "AV_LLMChat",
+ "AV_LLMCompletion",
+ "AV_LLMMessage",
+ "AV_LoraListLoader",
+ "AV_LoraListStacker",
+ "AV_LoraLoader",
+ "AV_NanoBananaApiConfig",
+ "AV_OpenAIApi",
+ "AV_OpenRouterApi",
+ "AV_ParametersPipeToCheckpointModels",
+ "AV_ParametersPipeToPrompts",
+ "AV_PromptsToParametersPipe",
+ "AV_SAMLoader",
+ "AV_VAELoader",
+ "AnimateDiffFrameCalculator",
+ "AspectRatioSelector",
+ "BLIPCaption",
+ "BLIPLoader",
+ "BooleanPrimitive",
+ "CheckpointNameSelector",
+ "ColorBlend",
+ "ColorCorrect",
+ "DeepDanbooruCaption",
+ "DependenciesEdit",
+ "DownloadAndLoadBlip",
+ "DownloadISNetModel",
+ "Fooocus_KSampler",
+ "Fooocus_KSamplerAdvanced",
+ "Fooocus_KSamplerEfficient",
+ "Fooocus_KSamplerEfficientAdvanced",
+ "GetBoolFromJson",
+ "GetFloatFromJson",
+ "GetIntFromJson",
+ "GetObjectFromJson",
+ "GetSAMEmbedding",
+ "GetTextFromJson",
+ "ISNetLoader",
+ "ISNetSegment",
+ "ImageAlphaComposite",
+ "ImageApplyChannel",
+ "ImageExtractChannel",
+ "ImageGaussianBlur",
+ "ImageMuxer",
+ "ImageRepeat",
+ "ImageScaleDown",
+ "ImageScaleDownBy",
+ "ImageScaleDownToSize",
+ "ImageScaleToMegapixels",
+ "LaMaInpaint",
+ "LoadImageAsMaskFromUrl",
+ "LoadImageFromUrl",
+ "LoadJsonFromText",
+ "LoadJsonFromUrl",
+ "LoadLaMaModel",
+ "LoadVideoFromUrl",
+ "MergeModels",
+ "NumberScaler",
+ "OverlayInpaintedImage",
+ "OverlayInpaintedLatent",
+ "PrepareImageAndMaskForInpaint",
+ "QRCodeGenerator",
+ "RandomFloat",
+ "RandomInt",
+ "SAMEmbeddingToImage",
+ "SDXLAspectRatioSelector",
+ "SDXLPromptStyler",
+ "SeedSelector",
+ "StringToInt",
+ "StringToNumber",
+ "TextRandomMultiline",
+ "TextSwitchCase"
+ ],
+ {
+ "title_aux": "comfyui-art-venture"
+ }
+ ],
+ "https://github.com/sipie800/ComfyUI-PuLID-Flux-Enhanced": [
+ [
+ "ApplyPulidFlux",
+ "PulidFluxEvaClipLoader",
+ "PulidFluxInsightFaceLoader",
+ "PulidFluxModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-PuLID-Flux-Enhanced"
+ }
+ ],
+ "https://github.com/siraxe/ComfyUI-WanVideoWrapper_QQ": [
+ [
+ "CheckpointLoader_v2",
+ "CreateImageList",
+ "HolocineFrames",
+ "ImageBlend_GPU",
+ "ImageRadialZoomBlur_GPU",
+ "LoraExtractKJv2",
+ "LoraReduceRank",
+ "LoraRemapStrength",
+ "LoraSmartCombine",
+ "PowerLoraLoaderV2",
+ "VideoMergeABC",
+ "VideoTextEncodeCached_KJ",
+ "WanFMLF",
+ "WanScaleAB",
+ "WanVideoCacheSamples",
+ "WanVideoCacheVideos",
+ "WanVideoEmptyEmbeds_v2",
+ "WanVideoFlowmapDistortion",
+ "WanVideoImageToVideoEncode_v2",
+ "WanVideoMotionToFlowmap",
+ "WanVideoPowerLoraLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-WanVideoWrapper_QQ"
+ }
+ ],
+ "https://github.com/siray-ai/siray-comfyui": [
+ [
+ "Siray Client",
+ "Siray Video Player"
+ ],
+ {
+ "title_aux": "siray-comfyui"
+ }
+ ],
+ "https://github.com/sirouk/chutes-comfyui-node": [
+ [
+ "ChutesWanVideoFast"
+ ],
+ {
+ "title_aux": "chutes-comfyui-node"
+ }
+ ],
+ "https://github.com/sittere/ComfyUI-YK_Line-loading": [
+ [
+ "MultiTextLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-YK Line loading"
+ }
+ ],
+ "https://github.com/sjh00/ComfyUI-LoadImageWithInfo": [
+ [
+ "LoadImageWithInfo",
+ "SaveImageWithInfo"
+ ],
+ {
+ "title_aux": "ComfyUI LoadImageWithInfo"
+ }
+ ],
+ "https://github.com/sjhddh/ComfyUI-Cyber-Steganography": [
+ [
+ "StegoDecode",
+ "StegoEncode"
+ ],
+ {
+ "title_aux": "ComfyUI-Cyber-Steganography"
+ }
+ ],
+ "https://github.com/skatardude10/ComfyUI-Optical-Realism": [
+ [
+ "OpticalRealism",
+ "RemoveAlphaChannel"
+ ],
+ {
+ "title_aux": "ComfyUI-Optical-Realism"
+ }
+ ],
+ "https://github.com/skfoo/ComfyUI-Coziness": [
+ [
+ "LoraTextExtractor-b1f83aa2",
+ "MultiLoraLoader-70bf3d77"
+ ],
+ {
+ "title_aux": "ComfyUI-Coziness"
+ }
+ ],
+ "https://github.com/skycoder182/comfyui-filename-tools": [
+ [
+ "ExtractAndTrimFilename",
+ "LoadImageWithFilename"
+ ],
+ {
+ "title_aux": "Filename Tools"
+ }
+ ],
+ "https://github.com/skycoder182/comfyui-skycoder-tools": [
+ [
+ "Aspect_Ratio_and_Tile_size_calculator",
+ "BLIP2Captioning",
+ "BooleanToggle",
+ "ConcatenateAndTestIfEmpty",
+ "DirectoryImageInfo",
+ "DirectoryImageLoader",
+ "ImageBasicNode"
+ ],
+ {
+ "title_aux": "Skycoder Tools"
+ }
+ ],
+ "https://github.com/slahiri/ComfyUI-AI-Photography-Toolkit": [
+ [
+ "SID_LLM_API",
+ "SID_LLM_Local",
+ "SID_ZImagePromptGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-AI-Photography-Toolkit"
+ }
+ ],
+ "https://github.com/slvslvslv/ComfyUI-SmartHelperNodes": [
+ [
+ "SmartFormatString",
+ "SmartFormatString10",
+ "SmartHVLoraSelect",
+ "SmartHVLoraStack",
+ "SmartHWMonitor",
+ "SmartLoadLoRA",
+ "SmartModelOrLoraToString",
+ "SmartPrompt",
+ "SmartRemoveComments",
+ "SmartSaveAnimatedGIF",
+ "SmartSaveText",
+ "SmartShowAnything"
+ ],
+ {
+ "title_aux": "ComfyUI Smart Helper Nodes"
+ }
+ ],
+ "https://github.com/slvslvslv/ComfyUI-SmartImageTools": [
+ [
+ "SmartBackgroundFill",
+ "SmartBackgroundRemove",
+ "SmartColorFillMask",
+ "SmartColorMatch",
+ "SmartDrawPoints",
+ "SmartFillTransparentHoles",
+ "SmartGenerateImage",
+ "SmartGetMask",
+ "SmartGradientDeformation",
+ "SmartImageCrop",
+ "SmartImagePadding",
+ "SmartImagePaletteConvert",
+ "SmartImagePaletteCreate",
+ "SmartImagePaletteExtract",
+ "SmartImagePoint",
+ "SmartImagePreviewScaled",
+ "SmartImageRegion",
+ "SmartImagesProcessor",
+ "SmartLoadGIFImage",
+ "SmartPoint",
+ "SmartPointSet",
+ "SmartPointSetMerge",
+ "SmartPreviewPalette",
+ "SmartProgressiveScaleImage",
+ "SmartSaveAnimatedPNG",
+ "SmartSavePNG",
+ "SmartSemiTransparenceRemove",
+ "SmartVideoPreviewScaled",
+ "SmartVideoPreviewScaledMasked"
+ ],
+ {
+ "title_aux": "ComfyUI-SmartImageTools"
+ }
+ ],
+ "https://github.com/slyt/comfyui-ollama-nodes": [
+ [
+ "BooleanToString",
+ "DownloadHuggingfaceModel",
+ "FloatToString",
+ "GenerateOllama",
+ "IntToString",
+ "ListModels",
+ "ListToString",
+ "PullModel"
+ ],
+ {
+ "title_aux": "comfyui-ollama-nodes"
+ }
+ ],
+ "https://github.com/smagnetize/kb-comfyui-nodes": [
+ [
+ "SingleImageDataUrlLoader"
+ ],
+ {
+ "title_aux": "kb-comfyui-nodes"
+ }
+ ],
+ "https://github.com/smartvain/ComfyUI-FaceKeypointsFilter": [
+ [
+ "FaceKeypointsFilter"
+ ],
+ {
+ "title_aux": "ComfyUI-FaceKeypointsFilter"
+ }
+ ],
+ "https://github.com/smartvain/ComfyUI-PoseKeypointsToImage": [
+ [
+ "PoseKeypointsToImage"
+ ],
+ {
+ "title_aux": "ComfyUI-PoseKeypointsToImage"
+ }
+ ],
+ "https://github.com/smartvain/ComfyUI-PromptComment": [
+ [
+ "PromptComment",
+ "PromptCommentMultiMarker"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptComment"
+ }
+ ],
+ "https://github.com/smbdsbrain/ComfyUI-PK_load_image_paste": [
+ [
+ "PKLoadImagePaste"
+ ],
+ {
+ "title_aux": "ComfyUI PK Load Image Paste"
+ }
+ ],
+ "https://github.com/smlbiobot/ComfyUI-Flux-Replicate-API": [
+ [
+ "SML_FluxProUltra_Replicate_Standalone",
+ "SML_FluxPro_Replicate_Standalone"
+ ],
+ {
+ "title_aux": "ComfyUI-Flux-Replicate-API"
+ }
+ ],
+ "https://github.com/smlbiobot/sml-comfyui-prompt-expansion": [
+ [
+ "SML_Prompt_Generator"
+ ],
+ {
+ "title_aux": "sml-comfyui-prompt-expansion"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_AniCrafter": [
+ [
+ "AniCrafterLoader",
+ "AniCrafterPreImage",
+ "AniCrafterPreText",
+ "AniCrafterPreVideo",
+ "AniCrafterSampler"
+ ],
+ {
+ "title_aux": "ComfyUI_AniCrafter"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_AnyDoor": [
+ [
+ "AnyDoor_LoadModel",
+ "AnyDoor_img2img"
+ ],
+ {
+ "title_aux": "ComfyUI_AnyDoor"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_CSD_MT": [
+ [
+ "CSDMTLoader",
+ "CSDMTSampler"
+ ],
+ {
+ "title_aux": "ComfyUI_CSD_MT"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_CSGO_Wrapper": [
+ [
+ "Blip_Loader",
+ "CSGO_Loader",
+ "CSGO_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_CSGO_Wrapper"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_ChatGLM_API": [
+ [
+ "Glm_4_9b_Chat",
+ "Glm_4v_9b",
+ "Glm_Lcoal_Or_Repo",
+ "ZhipuaiApi_Character",
+ "ZhipuaiApi_Img",
+ "ZhipuaiApi_Txt",
+ "ZhipuaiApi_img"
+ ],
+ {
+ "title_aux": "ComfyUI_ChatGLM_API"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_ChronoEdit_SM": [
+ [
+ "ChronoEdit_SM_Enhance",
+ "ChronoEdit_SM_Enhance_Loader",
+ "ChronoEdit_SM_KSampler",
+ "ChronoEdit_SM_Latent",
+ "ChronoEdit_SM_LoadVAE",
+ "ChronoEdit_SM_Lora",
+ "ChronoEdit_SM_Model",
+ "ChronoEdit_SM_Vae"
+ ],
+ {
+ "title_aux": "ComfyUI_ChronoEdit_SM"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_CustomNet": [
+ [
+ "CustomNet_LoadModel",
+ "CustomNet_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_CustomNet"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_DICE_Talk": [
+ [
+ "Dice_Talk_Loader",
+ "Dice_Talk_PreData",
+ "Dice_Talk_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_DICE_Talk"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_DeepFakeDefenders": [
+ [
+ "DeepFakeDefender_Loader",
+ "DeepFakeDefender_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_DeepFakeDefenders"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Demucs": [
+ [
+ "Demucs_Loader",
+ "Demucs_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_Demucs"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Diffree": [
+ [
+ "Diffree_Model_Loader",
+ "Diffree_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_Diffree"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_DiffuEraser": [
+ [
+ "DiffuEraser_Loader",
+ "DiffuEraser_PreData",
+ "DiffuEraser_Sampler",
+ "Propainter_Loader",
+ "Propainter_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_DiffuEraser"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_DyPE": [
+ [
+ "DyPE_Condition",
+ "DyPE_Encoder",
+ "DyPE_KSampler",
+ "DyPE_Model"
+ ],
+ {
+ "title_aux": "ComfyUI_DyPE"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_EchoMimic": [
+ [
+ "Echo_LoadModel",
+ "Echo_Predata",
+ "Echo_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_EchoMimic"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Face_Anon_Simple": [
+ [
+ "Face_Anon_Simple_Align",
+ "Face_Anon_Simple_LoadModel",
+ "Face_Anon_Simple_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_Face_Anon_Simple"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_FlashVSR": [
+ [
+ "FlashVSR_SM_KSampler",
+ "FlashVSR_SM_Model",
+ "FlashVSR_SM_VideoPathLoop"
+ ],
+ {
+ "title_aux": "ComfyUI_FlashVSR"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_FoleyCrafter": [
+ [
+ "FoleyCrafter_LoadModel",
+ "FoleyCrafter_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_FoleyCrafter"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_FollowYourEmoji": [
+ [
+ "Emoji_Make_Temple",
+ "FollowYouEmoji_LoadModel",
+ "FollowYouEmoji_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_FollowYourEmoji"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_GRAG_Image_Editing": [
+ [
+ "Qwen_Edit_GRAG_SM_Encode",
+ "Qwen_Edit_GRAG_SM_KSampler",
+ "Qwen_Edit_GRAG_SM_Model"
+ ],
+ {
+ "title_aux": "ComfyUI_GRAG_Image_Editing"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Hallo2": [
+ [
+ "HalloLoader",
+ "HalloPreImgAndAudio",
+ "HalloSampler",
+ "HallosSampler",
+ "HallosUpscaleloader",
+ "HallosVideoUpscale"
+ ],
+ {
+ "title_aux": "ComfyUI_Hallo2"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_HiDiffusion_Pro": [
+ [
+ "HI_Diffusers_Model_Loader",
+ "Hi_Hi_Sampler",
+ "Hi_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_HiDiffusion_Pro"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_HunyuanAvatar_Sm": [
+ [
+ "HY_Avatar_Loader",
+ "HY_Avatar_PreData",
+ "HY_Avatar_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_HunyuanAvatar_Sm"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_ID_Animator": [
+ [
+ "ID_Animator",
+ "ID_Repo_Choice"
+ ],
+ {
+ "title_aux": "ComfyUI_ID_Animator"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_InstantIR_Wrapper": [
+ [
+ "InstantIR_Loader",
+ "InstantIR_Sampler"
+ ],
+ {
+ "author": "zhaoyafei",
+ "title_aux": "ComfyUI_InstantIR_Wrapper"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_InteractAvatar": [
+ [
+ "InteractAvatar_SM_Model",
+ "InteractAvatar_SM_Predata",
+ "InteractAvatar_SM_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_InteractAvatar"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_KV_Edit": [
+ [
+ "KV_Edit_Load",
+ "KV_Edit_Load_LoRA",
+ "KV_Edit_PreData",
+ "KV_Edit_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_KV_Edit"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Light_A_Video": [
+ [
+ "Light_A_Video_Loader",
+ "Light_A_Video_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_Light_A_Video"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Llama3_8B": [
+ [
+ "ChatQA_1p5_8b",
+ "Local_Or_Repo_Choice",
+ "Meta_Llama3_8B",
+ "MiniCPM_Llama3_V25"
+ ],
+ {
+ "title_aux": "ComfyUI_Llama3_8B"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_LucidFlux": [
+ [
+ "LucidFlux_SM_Cond",
+ "LucidFlux_SM_Diff_Model",
+ "LucidFlux_SM_Diffbir",
+ "LucidFlux_SM_Encode",
+ "LucidFlux_SM_KSampler",
+ "LucidFlux_SM_Model"
+ ],
+ {
+ "title_aux": "ComfyUI_LucidFlux"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_MS_Diffusion": [
+ [
+ "MS_Object_img_Batch",
+ "MSdiffusion_Model_Loader",
+ "MSdiffusion_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_MS_Diffusion"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_MangaNinjia": [
+ [
+ "MangaNinjiaLoader",
+ "MangaNinjiaSampler",
+ "MarkImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI_MangaNinjia"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_MooER": [
+ [
+ "MooER_LoadModel",
+ "MooER_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_MooER"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_ObjectClear": [
+ [
+ "ObjectClearBatch",
+ "ObjectClearLoader",
+ "ObjectClearSampler",
+ "ObjectClearVision"
+ ],
+ {
+ "title_aux": "ComfyUI_ObjectClear"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_OmniParser": [
+ [
+ "OmniParser_Loader",
+ "OmniParser_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_OmniParser"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_OmniPart": [
+ [
+ "OmniPart_SM_KSampler",
+ "OmniPart_SM_MergeImg",
+ "OmniPart_SM_Model",
+ "OmniPart_SM_PreImg",
+ "OmniPart_SM_PreModel",
+ "OmniPart_SM_Prebox"
+ ],
+ {
+ "title_aux": "ComfyUI_OmniPart"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_OmniSVG": [
+ [
+ "OmniSVG_Loader",
+ "OmniSVG_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_OmniSVG"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_PBR_Maker": [
+ [
+ "Load_MatForger",
+ "MatForger_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_PBR_Maker"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_ParlerTTS": [
+ [
+ "ParlerTTS_LoadModel",
+ "ParlerTTS_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_ParlerTTS"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_PartPacker": [
+ [
+ "PartPacker_Loader",
+ "PartPacker_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_PartPacker"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Personalize_Anything": [
+ [
+ "Personalize_Anything_Load",
+ "Personalize_Anything_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_Personalize_Anything"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_PhotoDoodle": [
+ [
+ "PhotoDoodle_Loader",
+ "PhotoDoodle_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_PhotoDoodle"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Pic2Story": [
+ [
+ "Pic2Story_Loader",
+ "Pic2Story_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_Pic2Story"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Pipeline_Tool": [
+ [
+ "Pipeline_Tool"
+ ],
+ {
+ "title_aux": "ComfyUI_Pipeline_Tool"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Pops": [
+ [
+ "Pops_Decoder",
+ "Pops_Repo_Loader",
+ "Pops_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_Pops"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_SVFR": [
+ [
+ "SVFR_LoadModel",
+ "SVFR_Sampler",
+ "SVFR_img2mask"
+ ],
+ {
+ "title_aux": "ComfyUI_SVFR"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Sapiens": [
+ [
+ "SapiensLoader",
+ "SapiensSampler"
+ ],
+ {
+ "title_aux": "ComfyUI_Sapiens"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_SongGeneration": [
+ [
+ "SongGeneration_Loader",
+ "SongGeneration_Sampler",
+ "SongGeneration_Stage1",
+ "SongGeneration_Stage2"
+ ],
+ {
+ "title_aux": "ComfyUI_SongGeneration"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Sonic": [
+ [
+ "SONICSampler",
+ "SONICTLoader",
+ "SONIC_PreData"
+ ],
+ {
+ "title_aux": "ComfyUI_Sonic"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_StableAudio_Open": [
+ [
+ "StableAudio_ModelLoader",
+ "StableAudio_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_StableAudio_Open"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_StableAvatar": [
+ [
+ "StableAvatar_LoadModel",
+ "StableAvatar_Predata",
+ "StableAvatar_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_StableAvatar"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Stable_Makeup": [
+ [
+ "StableMakeup_LoadModel",
+ "StableMakeup_Sampler"
+ ],
+ {
+ "author": "Sajjad Ayobbi",
+ "title_aux": "ComfyUI_Stable_Makeup"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Step_Audio_EditX_SM": [
+ [
+ "Step_Audio_EditX_SM_KSampler",
+ "Step_Audio_EditX_SM_Model"
+ ],
+ {
+ "title_aux": "ComfyUI_Step_Audio_EditX_SM"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_StoryDiffusion": [
+ [
+ "Comic_Type",
+ "EasyFunction_Lite",
+ "Pre_Translate_prompt",
+ "StoryDiffusion_Apply",
+ "StoryDiffusion_CLIPTextEncode",
+ "StoryDiffusion_KSampler"
+ ],
+ {
+ "title_aux": "ComfyUI_StoryDiffusion"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_Streamv2v_Plus": [
+ [
+ "Load_Stream",
+ "Stream_Lora_Loader",
+ "Stream_Model_Loader",
+ "Stream_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_Streamv2v_Plus"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_TRELLIS": [
+ [
+ "Trellis_LoadModel",
+ "Trellis_Sampler",
+ "Trellis_multiimage_loader"
+ ],
+ {
+ "title_aux": "ComfyUI_TRELLIS"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_UltraFlux": [
+ [
+ "UltraFlux_SM_KSampler",
+ "UltraFlux_SM_Model"
+ ],
+ {
+ "title_aux": "ComfyUI_UltraFlux"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_VisualCloze": [
+ [
+ "Img_Quadruple",
+ "MSdiffusion_Aplly",
+ "VisualCloze_Aplly",
+ "VisualCloze_CLIPText",
+ "VisualCloze_KSampler"
+ ],
+ {
+ "title_aux": "ComfyUI_VisualCloze"
+ }
+ ],
+ "https://github.com/smthemex/ComfyUI_YuE": [
+ [
+ "YUE_Stage_A_Loader",
+ "YUE_Stage_A_Sampler",
+ "YUE_Stage_B_Loader",
+ "YUE_Stage_B_Sampler"
+ ],
+ {
+ "title_aux": "ComfyUI_YuE"
+ }
+ ],
+ "https://github.com/sn0w12/ComfyUI-Sn0w-Scripts": [
+ [
+ "Character Selector",
+ "Copy/Paste Textbox",
+ "Filter Tags",
+ "Generate All Characters",
+ "Get Font Size",
+ "Load Lora Folder",
+ "Load Lora Sn0w",
+ "Lora Selector",
+ "Lora Tester",
+ "Prompt Combine",
+ "Prompt Selector",
+ "Sn0w KSampler",
+ "Sn0w Lora Stacker",
+ "TaggedTiledUpscaler",
+ "Upscale Image With Model By"
+ ],
+ {
+ "title_aux": "ComfyUI-Sn0w-Scripts"
+ }
+ ],
+ "https://github.com/sneccc/comfyui-snek-nodes": [
+ [
+ "Aesthetics",
+ "Aesthetics V2",
+ "Load AI Toolkit Latent Flux",
+ "Save_Image_And_Caption",
+ "Send_to_Eagle",
+ "Snek SQLite Prompt Logger",
+ "\ud83d\udc0d Random Prompt From JSON"
+ ],
+ {
+ "title_aux": "comfyui-snek-nodes"
+ }
+ ],
+ "https://github.com/snicolast/ComfyUI-IndexTTS2": [
+ [
+ "IndexTTS2Advanced",
+ "IndexTTS2EmotionFromText",
+ "IndexTTS2EmotionVector",
+ "IndexTTS2SaveAudio",
+ "IndexTTS2Simple"
+ ],
+ {
+ "title_aux": "ComfyUI-IndexTTS2"
+ }
+ ],
+ "https://github.com/snicolast/ComfyUI-Ovi": [
+ [
+ "OviAttentionSelector",
+ "OviEngineLoader",
+ "OviLatentDecoder",
+ "OviVideoGenerator",
+ "OviWanComponentLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Ovi"
+ }
+ ],
+ "https://github.com/snomiao/ComfyUI-Video-Crop": [
+ [
+ "VideoCropNode"
+ ],
+ {
+ "title_aux": "ComfyUI Video Crop"
+ }
+ ],
+ "https://github.com/solidlime/Comfyui-Random_Image_Picker": [
+ [
+ "RandomImagePicker"
+ ],
+ {
+ "nodename_pattern": "RandomImagePicker",
+ "title_aux": "Random Image Picker"
+ }
+ ],
+ "https://github.com/sonnybox/ComfyUI-SuperNodes": [
+ [
+ "FaceBBoxToMask",
+ "GetCommonAspectRatio",
+ "ImageMaskCrop",
+ "ImageSizeCalculator",
+ "RestoreMaskCrop",
+ "SetReserveVRAM",
+ "SigmaReplace",
+ "SigmaSmoother",
+ "SigmasGraph",
+ "SigmasRescale",
+ "SuperBrightnessContrast",
+ "SuperColorAdjustAllInOne",
+ "SuperCreateTiles",
+ "SuperHueSaturation",
+ "SuperLatentStats",
+ "SuperLevelsNormalize",
+ "SuperResizeImage",
+ "SuperSVRCalcTiles",
+ "SuperStitchTiles",
+ "SuperWhiteBalanceCAT"
+ ],
+ {
+ "title_aux": "ComfyUI-SuperNodes"
+ }
+ ],
+ "https://github.com/sooxt98/comfyui_longcat_image": [
+ [
+ "LongCatImageEdit",
+ "LongCatImageModelLoader",
+ "LongCatImageTextToImage"
+ ],
+ {
+ "title_aux": "comfyui_longcat_image"
+ }
+ ],
+ "https://github.com/souki202/ComfyUI-LoadImage-Advanced": [
+ [
+ "ColorAdjustment",
+ "LoadImageUpscale",
+ "LoadImageUpscaleBy"
+ ],
+ {
+ "title_aux": "ComfyUI-LoadImage-Advanced"
+ }
+ ],
+ "https://github.com/soulctcher/TetriNode": [
+ [
+ "TetriNode"
+ ],
+ {
+ "title_aux": "TetriNode"
+ }
+ ],
+ "https://github.com/sourceful-official/LoadLoraModelOnlyWithUrl": [
+ [
+ "LoadLoraModelOnlyWithUrl"
+ ],
+ {
+ "title_aux": "LoadLoraModelOnlyWithUrl"
+ }
+ ],
+ "https://github.com/sousakujikken/ComfyUI-PixydustQuantizer": [
+ [
+ "CRTLikeEffectNode",
+ "Quantizer",
+ "XYBlurNode"
+ ],
+ {
+ "title_aux": "ComfyUI-PixydustQuantizer"
+ }
+ ],
+ "https://github.com/space-nuko/ComfyUI-Disco-Diffusion": [
+ [
+ "DiscoDiffusion_DiscoDiffusion",
+ "DiscoDiffusion_DiscoDiffusionExtraSettings",
+ "DiscoDiffusion_GuidedDiffusionLoader",
+ "DiscoDiffusion_OpenAICLIPLoader"
+ ],
+ {
+ "title_aux": "Disco Diffusion"
+ }
+ ],
+ "https://github.com/space-nuko/ComfyUI-OpenPose-Editor": [
+ [
+ "Nui.OpenPoseEditor"
+ ],
+ {
+ "title_aux": "OpenPose Editor"
+ }
+ ],
+ "https://github.com/space-nuko/nui-suite": [
+ [
+ "Nui.DynamicPromptsTextEncode",
+ "Nui.DynamicPromptsTextGen",
+ "Nui.FeelingLuckyTextEncode",
+ "Nui.FeelingLuckyTextGen",
+ "Nui.OutputString"
+ ],
+ {
+ "title_aux": "nui suite"
+ }
+ ],
+ "https://github.com/spacepxl/ComfyUI-Depth-Pro": [
+ [
+ "DepthPro",
+ "FocalFromList",
+ "FocalMMtoPX",
+ "FocalPXtoMM",
+ "LoadDepthPro",
+ "MetricDepthToInverse",
+ "MetricDepthToRelative"
+ ],
+ {
+ "title_aux": "ComfyUI-Depth-Pro"
+ }
+ ],
+ "https://github.com/spacepxl/ComfyUI-HQ-Image-Save": [
+ [
+ "LoadEXR",
+ "LoadEXRFrames",
+ "LoadImageAndPrompt",
+ "LoadLatentEXR",
+ "SaveEXR",
+ "SaveEXRFrames",
+ "SaveImageAndPromptExact",
+ "SaveImageAndPromptIncremental",
+ "SaveLatentEXR",
+ "SaveTiff"
+ ],
+ {
+ "title_aux": "ComfyUI-HQ-Image-Save"
+ }
+ ],
+ "https://github.com/spacepxl/ComfyUI-LossTesting": [
+ [
+ "Measure Timestep Loss"
+ ],
+ {
+ "title_aux": "ComfyUI-LossTesting"
+ }
+ ],
+ "https://github.com/spacepxl/ComfyUI-RAVE": [
+ [
+ "ImageGridCompose",
+ "ImageGridDecompose",
+ "KSamplerRAVE",
+ "LatentGridCompose",
+ "LatentGridDecompose"
+ ],
+ {
+ "title_aux": "ComfyUI-RAVE"
+ }
+ ],
+ "https://github.com/spacepxl/ComfyUI-StyleGan": [
+ [
+ "BatchAverageStyleGANLatents",
+ "BlendStyleGANLatents",
+ "GenerateStyleGANLatent",
+ "LoadStyleGAN",
+ "StyleGANInversion",
+ "StyleGANLatentFromBatch",
+ "StyleGANSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-StyleGan"
+ }
+ ],
+ "https://github.com/spawner1145/CUI-Lumina2-TeaCache": [
+ [
+ "LPIPS_Model_Loader",
+ "Store_Baseline_Image",
+ "TeaCache_LPIPS_Evaluator",
+ "TeaCache_Lumina2",
+ "TeaCache_Patcher",
+ "TeaCache_Result_Collector"
+ ],
+ {
+ "title_aux": "CUI-Lumina2-TeaCache"
+ }
+ ],
+ "https://github.com/spawner1145/comfyui-aichat": [
+ [
+ "GeminiApiLoader",
+ "GeminiChat",
+ "GeminiContentConnector",
+ "GeminiFileUploader",
+ "GeminiImageEncoder",
+ "GeminiTextBlock",
+ "OpenAIApiLoader",
+ "OpenAIChat",
+ "OpenAIContentConnector",
+ "OpenAIFileUploader",
+ "OpenAIImageEncoder",
+ "OpenAITextBlock"
+ ],
+ {
+ "title_aux": "comfyui-aichat"
+ }
+ ],
+ "https://github.com/spawner1145/comfyui-lsnet": [
+ [
+ "LSNetArtistImageConnector",
+ "LSNetArtistInference",
+ "LSNetArtistSimilarity",
+ "LSNetClustering",
+ "LSNetCommonFeatures",
+ "LSNetFeatureComparison",
+ "LSNetModelLoader"
+ ],
+ {
+ "title_aux": "comfyui-lsnet"
+ }
+ ],
+ "https://github.com/speige/ComfyUI_Make-It-Animatable": [
+ [
+ "MakeItAnimatableRig",
+ "MakeItAnimatableRigGS"
+ ],
+ {
+ "title_aux": "ComfyUI_Make-It-Animatable"
+ }
+ ],
+ "https://github.com/spinagon/ComfyUI-seam-carving": [
+ [
+ "SeamCarving"
+ ],
+ {
+ "title_aux": "ComfyUI-seam-carving"
+ }
+ ],
+ "https://github.com/spinagon/ComfyUI-seamless-tiling": [
+ [
+ "CircularVAEDecode",
+ "MakeCircularVAE",
+ "OffsetImage",
+ "SeamlessTile"
+ ],
+ {
+ "title_aux": "Seamless tiling Node for ComfyUI"
+ }
+ ],
+ "https://github.com/spro/comfyui-mirror": [
+ [
+ "LatentMirror"
+ ],
+ {
+ "title_aux": "Latent Mirror node for ComfyUI"
+ }
+ ],
+ "https://github.com/sputnik57/comfyui-prompt-logger": [
+ [
+ "Prompt Logger Unified v2",
+ "PromptLoggerUnified",
+ "PromptLoggerUnified_v2"
+ ],
+ {
+ "title_aux": "comfyui-prompt-logger"
+ }
+ ],
+ "https://github.com/squirrel765/ComfyUI-LLM-VLM-Node": [
+ [
+ "UnifiedGenerator|LP"
+ ],
+ {
+ "title_aux": "ComfyUI-LLM-VLM-Node"
+ }
+ ],
+ "https://github.com/ssitu/ComfyUI_UltimateSDUpscale": [
+ [
+ "UltimateSDUpscale",
+ "UltimateSDUpscaleCustomSample",
+ "UltimateSDUpscaleNoUpscale"
+ ],
+ {
+ "title_aux": "UltimateSDUpscale"
+ }
+ ],
+ "https://github.com/ssitu/ComfyUI_fabric": [
+ [
+ "FABRICPatchModel",
+ "FABRICPatchModelAdv",
+ "KSamplerAdvFABRICAdv",
+ "KSamplerFABRIC",
+ "KSamplerFABRICAdv"
+ ],
+ {
+ "title_aux": "ComfyUI fabric"
+ }
+ ],
+ "https://github.com/ssitu/ComfyUI_restart_sampling": [
+ [
+ "KRestartSampler",
+ "KRestartSamplerAdv",
+ "KRestartSamplerCustom",
+ "KRestartSamplerSimple",
+ "RestartSampler",
+ "RestartScheduler",
+ "RestartSelfTest"
+ ],
+ {
+ "title_aux": "Restart Sampling"
+ }
+ ],
+ "https://github.com/ssitu/ComfyUI_roop": [
+ [
+ "RoopImproved",
+ "roop"
+ ],
+ {
+ "title_aux": "ComfyUI roop"
+ }
+ ],
+ "https://github.com/ssspace1/SSpack_ComfyUI": [
+ [
+ "SSCheckpointLoader",
+ "SSCheckpointSelector",
+ "SSCheckpointSelector12",
+ "SSCheckpointSelector6",
+ "SSFilter",
+ "SSImageNodeAnnotator",
+ "SSJsonOutput",
+ "SSLoRAStackApplier",
+ "SSLoraSelector",
+ "SSRandomLoraApplier",
+ "SSSavedImageLoader",
+ "SSTextWeight",
+ "SS_SDXL_AutoResize"
+ ],
+ {
+ "title_aux": "SSpack_ComfyUI"
+ }
+ ],
+ "https://github.com/stavsap/comfyui-downloader": [
+ [
+ "DownloadSummaryParser",
+ "DownloadTokenLoader",
+ "Downloader"
+ ],
+ {
+ "title_aux": "comfyui-downloader"
+ }
+ ],
+ "https://github.com/stavsap/comfyui-kokoro": [
+ [
+ "KokoroGenerator",
+ "KokoroSpeaker",
+ "KokoroSpeakerCombiner"
+ ],
+ {
+ "title_aux": "comfyui-kokoro"
+ }
+ ],
+ "https://github.com/stavsap/comfyui-ollama": [
+ [
+ "OllamaChat",
+ "OllamaConnectivityV2",
+ "OllamaGenerate",
+ "OllamaGenerateAdvance",
+ "OllamaGenerateV2",
+ "OllamaLoadContext",
+ "OllamaOptionsV2",
+ "OllamaSaveContext",
+ "OllamaVision"
+ ],
+ {
+ "title_aux": "ComfyUI Ollama"
+ }
+ ],
+ "https://github.com/stduhpf/ComfyUI--Wan22FirstLastFrameToVideoLatent": [
+ [
+ "Wan22FirstLastFrameToVideoLatent",
+ "Wan22FirstLastFrameToVideoLatentTiledVAE"
+ ],
+ {
+ "title_aux": "Wan22FirstLastFrameToVideoLatent for ComfyUI"
+ }
+ ],
+ "https://github.com/stduhpf/ComfyUI--WanImageToVideoTiled": [
+ [
+ "Wan22ImageToVideoLatentTiledVAE",
+ "WanCameraImageToVideoTiledVAE",
+ "WanFirstLastFrameToVideoTiledVAE",
+ "WanFunControlToVideoTiledVAE",
+ "WanFunInpaintToVideoTiledVAE",
+ "WanImageToVideoTiledVAE",
+ "WanPhantomSubjectToVideoTiledVAE",
+ "WanTrackToVideoTiledVAE",
+ "WanVaceToVideoTiledVAE"
+ ],
+ {
+ "title_aux": "WanImageToVideoTiledVAE for ComfyUI"
+ }
+ ],
+ "https://github.com/stduhpf/ComfyUI-WanMoeKSampler": [
+ [
+ "SplitSigmasAtT",
+ "WanMoeKSampler",
+ "WanMoeKSamplerAdvanced"
+ ],
+ {
+ "title_aux": "KSampler for Wan 2.2 MoE for ComfyUI"
+ }
+ ],
+ "https://github.com/stepfun-ai/ComfyUI-StepVideo": [
+ [
+ "TI2V",
+ "TI2V_API"
+ ],
+ {
+ "title_aux": "ComfyUI-StepVideo"
+ }
+ ],
+ "https://github.com/stevenwg/ComfyUI-VideoGrid": [
+ [
+ "VideosConcateHorizontal:",
+ "VideosConcateVertical"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoGrid"
+ }
+ ],
+ "https://github.com/stormcenter/ComfyUI-AutoSplitGridImage": [
+ [
+ "EvenImageResizer",
+ "GridImageSplitter"
+ ],
+ {
+ "title_aux": "ComfyUI-AutoSplitGridImage"
+ }
+ ],
+ "https://github.com/stormcenter/ComfyUI-LivePhotoCreator": [
+ [
+ "ImageCompareTransition",
+ "LivePhotoCreator",
+ "LivePhotoPreview"
+ ],
+ {
+ "title_aux": "ComfyUI LivePhoto Creator"
+ }
+ ],
+ "https://github.com/stormcenter/ComfyUI-SVGFullfill": [
+ [
+ "SVGEditor",
+ "SVGUploader"
+ ],
+ {
+ "title_aux": "ComfyUI-SVGFullfill"
+ }
+ ],
+ "https://github.com/storyicon/comfyui_musev_evolved": [
+ [
+ "AnimationZoom (comfyui_musev_evolved)",
+ "ImageSelector (comfyui_musev_evolved)",
+ "MuseVImg2Vid V1 (comfyui_musev_evolved)",
+ "MuseVPredictor V1 (comfyui_musev_evolved)"
+ ],
+ {
+ "author": "infguo",
+ "title_aux": "ComfyUI MuseV Evolved"
+ }
+ ],
+ "https://github.com/storyicon/comfyui_segment_anything": [
+ [
+ "GroundingDinoModelLoader (segment anything)",
+ "GroundingDinoSAMSegment (segment anything)",
+ "InvertMask (segment anything)",
+ "IsMaskEmpty",
+ "SAMModelLoader (segment anything)"
+ ],
+ {
+ "title_aux": "segment anything"
+ }
+ ],
+ "https://github.com/strand1/ComfyUI-Autogen": [
+ [
+ "AutogenAssistantAgent",
+ "AutogenCodeExecutor",
+ "AutogenGroupChat",
+ "AutogenModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Autogen"
+ }
+ ],
+ "https://github.com/strawberryPunch/vram_optimizer": [
+ [
+ "StrawberryGPUMonitor",
+ "StrawberryVramOptimizer",
+ "custom_nodes"
+ ],
+ {
+ "nodename_pattern": "StFist",
+ "title_aux": "StrawberryFist VRAM Optimizer"
+ }
+ ],
+ "https://github.com/strimmlarn/ComfyUI-Strimmlarns-Aesthetic-Score": [
+ [
+ "AesthetlcScoreSorter",
+ "CalculateAestheticScore",
+ "LoadAesteticModel",
+ "ScoreToNumber"
+ ],
+ {
+ "title_aux": "ComfyUI_Strimmlarns_aesthetic_score"
+ }
+ ],
+ "https://github.com/stuttlepress/ComfyUI-Wan-VACE-Prep": [
+ [
+ "LoadVideosFromFolderSimple",
+ "WanVACEBatchContext",
+ "WanVACEExtend",
+ "WanVACEPrep",
+ "WanVACEPrepBatch"
+ ],
+ {
+ "title_aux": "ComfyUI Wan VACE Prep"
+ }
+ ],
+ "https://github.com/styler00dollar/ComfyUI-deepcache": [
+ [
+ "DeepCache"
+ ],
+ {
+ "title_aux": "ComfyUI-deepcache"
+ }
+ ],
+ "https://github.com/styler00dollar/ComfyUI-sudo-latent-upscale": [
+ [
+ "SudoLatentUpscale"
+ ],
+ {
+ "title_aux": "ComfyUI-sudo-latent-upscale"
+ }
+ ],
+ "https://github.com/styletransfer/ComfyUI-TRELLIS2_Motion": [
+ [
+ "CameraTrajectory_T2",
+ "MergeMeshSequences",
+ "MeshRenderer",
+ "MeshSequenceRenderer",
+ "MultiAngleCamera",
+ "OnionSkinning",
+ "RenderingEffects",
+ "Trellis2Predict",
+ "Trellis2VideoAngleShift",
+ "VideoToMeshes"
+ ],
+ {
+ "title_aux": "ComfyUI-TRELLIS2_Motion"
+ }
+ ],
+ "https://github.com/subraoul/ComfyUI_Bit-Depth-Enhancer": [
+ [
+ "ABCD_BitDepthEnhancement",
+ "BitDepthEnhancementClassical",
+ "DeepDeband",
+ "Save16BitTIFF"
+ ],
+ {
+ "title_aux": "Bit Depth Enhancer"
+ }
+ ],
+ "https://github.com/sugarkwork/ComfyUI_AspectRatioToSize": [
+ [
+ "AspectRatio",
+ "AspectRatioToSize",
+ "CalcFactorWidthHeight",
+ "CalculateImagePadding",
+ "MatchImageToAspectRatio",
+ "SizeToWidthHeight"
+ ],
+ {
+ "title_aux": "ComfyUI_AspectRatioToSize"
+ }
+ ],
+ "https://github.com/sugarkwork/comfyui-trtupscaler": [
+ [
+ "TRTUpscaler"
+ ],
+ {
+ "title_aux": "comfyui-trtupscaler"
+ }
+ ],
+ "https://github.com/sugarkwork/comfyui_cohere": [
+ [
+ "SimpleCohereNode"
+ ],
+ {
+ "title_aux": "comfyui_cohere"
+ }
+ ],
+ "https://github.com/sugarkwork/comfyui_smart_character_detailer": [
+ [
+ "SmartCharacterDetailer"
+ ],
+ {
+ "title_aux": "comfyui_smart_character_detailer"
+ }
+ ],
+ "https://github.com/sugarkwork/comfyui_tag_fillter": [
+ [
+ "TagCategory",
+ "TagCategoryEnhance",
+ "TagComparator",
+ "TagDetector",
+ "TagEmpty",
+ "TagEnhance",
+ "TagFilter",
+ "TagFlag",
+ "TagFlagImage",
+ "TagIf",
+ "TagMerger",
+ "TagMerger4",
+ "TagMerger6",
+ "TagPipeIn",
+ "TagPipeOut",
+ "TagPipeOutOne",
+ "TagPipeUpdate",
+ "TagRandom",
+ "TagRandomCategory",
+ "TagRemover",
+ "TagReplace",
+ "TagSelector",
+ "TagSwitcher",
+ "TagWildcardFilter"
+ ],
+ {
+ "title_aux": "comfyui_tag_filter"
+ }
+ ],
+ "https://github.com/suhee19/comfyui-orpheus-loader": [
+ [
+ "OrpheusLoader"
+ ],
+ {
+ "title_aux": "comfyui-orpheus-loader"
+ }
+ ],
+ "https://github.com/sumitchatterjee13/Luminance-Stack-Processor": [
+ [
+ "HDRExportNode",
+ "LatentStackProcessor5Stops",
+ "LuminanceStackProcessor3Stops",
+ "LuminanceStackProcessor5Stops"
+ ],
+ {
+ "title_aux": "Luminance Stack Processor"
+ }
+ ],
+ "https://github.com/sumitchatterjee13/nuke-nodes-comfyui": [
+ [
+ "NukeBlur",
+ "NukeChannelShuffle",
+ "NukeColorBars",
+ "NukeColorCorrect",
+ "NukeConstant",
+ "NukeCornerPin",
+ "NukeCrop",
+ "NukeDefocus",
+ "NukeExposure",
+ "NukeExposureAdvanced",
+ "NukeGrade",
+ "NukeLevels",
+ "NukeMerge",
+ "NukeMix",
+ "NukeMotionBlur",
+ "NukeOCIOColorSpace",
+ "NukeOCIODisplay",
+ "NukeOCIOInfo",
+ "NukeRamp",
+ "NukeRead",
+ "NukeReadInfo",
+ "NukeTransform",
+ "NukeVectorfield",
+ "NukeVectorfieldInfo",
+ "NukeViewer",
+ "NukeWrite"
+ ],
+ {
+ "title_aux": "Nuke Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/supElement/ComfyUI_Element_easy": [
+ [
+ "EmptyImageRGB_Element",
+ "ImagePadBlur_Element",
+ "MaskNoiseInjection_Element",
+ "MaskStroke_Element",
+ "RandomCharacterGenerator",
+ "TextLineBreak_Element"
+ ],
+ {
+ "title_aux": "ComfyUI_Element_easy"
+ }
+ ],
+ "https://github.com/superyoman/comfyui_lumaAPI": [
+ [
+ "LUMA_API_YoC",
+ "LUMA_API_result_YoC"
+ ],
+ {
+ "title_aux": "comfyui_lumaAPI"
+ }
+ ],
+ "https://github.com/surinder83singh/ComfyUI-compare-videos": [
+ [
+ "CompareVideos"
+ ],
+ {
+ "title_aux": "Compare Videos"
+ }
+ ],
+ "https://github.com/svetozarov/AS_LLM_nodes": [
+ [
+ "AS_ComfyGPT",
+ "AS_GeminiCaptioning",
+ "AS_MultimodalGemini"
+ ],
+ {
+ "title_aux": "AS_LLM_nodes"
+ }
+ ],
+ "https://github.com/svntax/ComfyUI-RetroDiffusion-API-Node": [
+ [
+ "Retro Diffusion API Node"
+ ],
+ {
+ "title_aux": "ComfyUI-RetroDiffusion-API-Node"
+ }
+ ],
+ "https://github.com/swan7-py/ComfyUI-ImageAlphaCrop": [
+ [
+ "ImageAlphaCrop",
+ "ImageAlphaCropAdvanced",
+ "LoadImageWithAlpha",
+ "LoadImagesFromPathRGBA",
+ "SaveImageRGBA"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageAlphaCrop"
+ }
+ ],
+ "https://github.com/sweetndata/ComfyUI-Image-Harmonizer": [
+ [
+ "harmonizer"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Harmonizer"
+ }
+ ],
+ "https://github.com/sweetndata/ComfyUI-Reflatent": [
+ [
+ "RefLatent"
+ ],
+ {
+ "title_aux": "ComfyUI-Reflatent"
+ }
+ ],
+ "https://github.com/sweetndata/ComfyUI-googletrans": [
+ [
+ "googletrans"
+ ],
+ {
+ "title_aux": "ComfyUI-googletrans"
+ }
+ ],
+ "https://github.com/sweetndata/ComfyUI_Sticker_Compositer": [
+ [
+ "Sticker_Compositer"
+ ],
+ {
+ "title_aux": "ComfyUI_Sticker_Compositer"
+ }
+ ],
+ "https://github.com/swfxliyiyu/ComfyUI-FastVideo": [
+ [
+ "DITConfig",
+ "InferenceArgs",
+ "LoadImagePath",
+ "TextEncoderConfig",
+ "VAEConfig",
+ "VideoGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-FastVideo"
+ }
+ ],
+ "https://github.com/syllebra/bilbox-comfyui": [
+ [
+ "BilboXLut",
+ "BilboXPhotoPrompt",
+ "BilboXVignette"
+ ],
+ {
+ "title_aux": "BilboX's ComfyUI Custom Nodes"
+ }
+ ],
+ "https://github.com/sylym/comfy_vid2vid": [
+ [
+ "CheckpointLoaderSimpleSequence",
+ "DdimInversionSequence",
+ "KSamplerSequence",
+ "LoadImageMaskSequence",
+ "LoadImageSequence",
+ "LoraLoaderSequence",
+ "SetLatentNoiseSequence",
+ "TrainUnetSequence",
+ "VAEEncodeForInpaintSequence"
+ ],
+ {
+ "title_aux": "Vid2vid"
+ }
+ ],
+ "https://github.com/synthetai/ComfyUI-JM-Gemini-API": [
+ [
+ "JMGeminiImageGenerator",
+ "JMGeminiReverseGenerator",
+ "JMGeminiVideoGenerator",
+ "JMGeminiWatermarkRemover"
+ ],
+ {
+ "title_aux": "ComfyUI-JM-Gemini-API"
+ }
+ ],
+ "https://github.com/synthetai/ComfyUI-JM-KLing-API": [
+ [
+ "JM-KLingAI-API/api-key",
+ "JM-KLingAI-API/hybrid-video",
+ "JM-KLingAI-API/image-downloader",
+ "JM-KLingAI-API/image-generation",
+ "JM-KLingAI-API/image2video",
+ "JM-KLingAI-API/lip-sync",
+ "JM-KLingAI-API/lip-sync-async",
+ "JM-KLingAI-API/multi-image2image",
+ "JM-KLingAI-API/multi-image2video",
+ "JM-KLingAI-API/query-status",
+ "JM-KLingAI-API/text2video",
+ "JM-KLingAI-API/video-downloader"
+ ],
+ {
+ "title_aux": "ComfyUI-JM-KLing-API"
+ }
+ ],
+ "https://github.com/synthetai/ComfyUI-JM-MiniMax-API": [
+ [
+ "JM-MiniMax-API/check-video-status",
+ "JM-MiniMax-API/download-video",
+ "JM-MiniMax-API/load-audio",
+ "JM-MiniMax-API/music-generation",
+ "JM-MiniMax-API/text-to-speech",
+ "JM-MiniMax-API/video-generation",
+ "JM-MiniMax-API/voice-cloning",
+ "JM-MiniMax-API/voice-design"
+ ],
+ {
+ "title_aux": "ComfyUI-JM-MiniMax-API"
+ }
+ ],
+ "https://github.com/synthetai/ComfyUI-JM-Volcengine-API": [
+ [
+ "VolcengineI2VS2Pro",
+ "VolcengineImgEditV3",
+ "volcengine-doubao-seedance",
+ "volcengine-i2v-s2pro",
+ "volcengine-img-edit-v3",
+ "volcengine-seedream-v3"
+ ],
+ {
+ "title_aux": "ComfyUI-JM-Volcengine-API"
+ }
+ ],
+ "https://github.com/synthetai/ComfyUI-ToolBox": [
+ [
+ "AutoDLDownload",
+ "CreatePaths",
+ "FolderDeleter",
+ "FolderViewe",
+ "PathOutput"
+ ],
+ {
+ "title_aux": "ComfyUI-ToolBox"
+ }
+ ],
+ "https://github.com/synthetai/ComfyUI_FaceEnhancer": [
+ [
+ "GFPGANFaceEnhancer",
+ "GFPGANFolderProcessor"
+ ],
+ {
+ "title_aux": "ComfyUI_FaceEnhancer"
+ }
+ ],
+ "https://github.com/synthetai/ComfyUI_PromptBatcher": [
+ [
+ "LoadPromptsFromDir",
+ "SaveTextToFiles"
+ ],
+ {
+ "title_aux": "ComfyUI_PromptBatcher"
+ }
+ ],
+ "https://github.com/synystersocks/ComfyUI-SocksLatentPatcher": [
+ [
+ "I2VLatentPatcher",
+ "VaceExt4fLatentPatcher",
+ "VaceExt6fLatentPatcher",
+ "VaceExt8fLatentPatcher"
+ ],
+ {
+ "title_aux": "ComfyUI-SocksLatentPatcher"
+ }
+ ],
+ "https://github.com/sysL-padawan/comfyui-elevenlabs-integration": [
+ [
+ "Elevenlabs text to effect",
+ "Elevenlabs text to speech",
+ "ElevenlabsTextToEffect",
+ "ElevenlabsTextToSpeech"
+ ],
+ {
+ "title_aux": "ComfyUI ElevenLabs API integration"
+ }
+ ],
+ "https://github.com/systemaiofinterest-wq/ComfyUI-MetaAI": [
+ [
+ "MetaAiBrowserNode",
+ "MetaAiImageGenerator",
+ "MetaAiSingleVideoGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-MetaAI"
+ }
+ ],
+ "https://github.com/szhublox/ambw_comfyui": [
+ [
+ "Auto Merge Block Weighted",
+ "CLIPMergeSimple",
+ "CheckpointSave",
+ "ModelMergeBlocks",
+ "ModelMergeSimple"
+ ],
+ {
+ "title_aux": "Auto-MBW"
+ }
+ ],
+ "https://github.com/t22m003/ComfyUI_LoopNode": [
+ [
+ "SimpleForLoop",
+ "SimpleForLoopRange"
+ ],
+ {
+ "title_aux": "ComfyUI_LoopNode"
+ }
+ ],
+ "https://github.com/taabata/LCM_Inpaint_Outpaint_Comfy": [
+ [
+ "ComfyNodesToSaveCanvas",
+ "FloatNumber",
+ "FreeU_LCM",
+ "ImageDims",
+ "ImageOutputToComfyNodes",
+ "ImageResize",
+ "ImageShuffle",
+ "ImageSwitch",
+ "LCMGenerate",
+ "LCMGenerate_ReferenceOnly",
+ "LCMGenerate_SDTurbo",
+ "LCMGenerate_img2img",
+ "LCMGenerate_img2img_IPAdapter",
+ "LCMGenerate_img2img_controlnet",
+ "LCMGenerate_inpaintv2",
+ "LCMGenerate_inpaintv3",
+ "LCMLoader",
+ "LCMLoader_RefInpaint",
+ "LCMLoader_ReferenceOnly",
+ "LCMLoader_SDTurbo",
+ "LCMLoader_controlnet",
+ "LCMLoader_controlnet_inpaint",
+ "LCMLoader_img2img",
+ "LCMLoraLoader_inpaint",
+ "LCMLoraLoader_ipadapter",
+ "LCMLora_inpaint",
+ "LCMLora_inpaintV2",
+ "LCMLora_ipadapter",
+ "LCMT2IAdapter",
+ "LCM_IPAdapter",
+ "LCM_IPAdapter_inpaint",
+ "LCM_outpaint_prep",
+ "LoadImageNode_LCM",
+ "Loader_SegmindVega",
+ "OutpaintCanvasTool",
+ "SaveImage_Canvas",
+ "SaveImage_LCM",
+ "SaveImage_Puzzle",
+ "SaveImage_PuzzleV2",
+ "SegmindVega",
+ "SettingsSwitch",
+ "stitch"
+ ],
+ {
+ "title_aux": "LCM_Inpaint-Outpaint_Comfy"
+ }
+ ],
+ "https://github.com/taabata/SANA_LOWVRAM": [
+ [
+ "SANADiffuse",
+ "SANATextEncode"
+ ],
+ {
+ "title_aux": "SANA_LOWVRAM"
+ }
+ ],
+ "https://github.com/tabisheva/comfyui-segs-profile": [
+ [
+ "SEGSIsProfile"
+ ],
+ {
+ "title_aux": "comfyui-segs-profile"
+ }
+ ],
+ "https://github.com/tackcrypto1031/tk_comfyui_img2mask": [
+ [
+ "TK_Image2Mask"
+ ],
+ {
+ "title_aux": "tk_comfyui_img2mask"
+ }
+ ],
+ "https://github.com/tackcrypto1031/tk_comfyui_view_and_light": [
+ [
+ "TK_View_And_Light"
+ ],
+ {
+ "title_aux": "tk_comfyui_view_and_light"
+ }
+ ],
+ "https://github.com/takemetosiberia/ComfyUI-SAMURAI--SAM2-": [
+ [
+ "SAMURAIBoxInputNode",
+ "SAMURAIPointsInputNode",
+ "SAMURAIRefineNode"
+ ],
+ {
+ "title_aux": "SAMURAI Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/talesofai/comfyui-browser": [
+ [
+ "DifyTextGenerator //Browser",
+ "LoadImageByUrl //Browser",
+ "SelectInputs //Browser",
+ "UploadToRemote //Browser",
+ "XyzPlot //Browser"
+ ],
+ {
+ "title_aux": "ComfyUI Browser"
+ }
+ ],
+ "https://github.com/tanglaoya321/ComfyUI-StoryMaker": [
+ [
+ "StoryMakerSinglePortraitNode",
+ "StoryMakerSwapClothNode",
+ "StoryMakerTwoPortraitNode"
+ ],
+ {
+ "title_aux": "ComfyUI-StoryMaker"
+ }
+ ],
+ "https://github.com/tardigrade1001/latent-rotate-90": [
+ [
+ "LatentRotatePortraitLandscape"
+ ],
+ {
+ "title_aux": "latent-rotate-90"
+ }
+ ],
+ "https://github.com/tatookan/comfyui_ssl_gemini_EXP": [
+ [
+ "SSL_GeminiAPIKeyConfig",
+ "SSL_GeminiTextPrompt"
+ ],
+ {
+ "title_aux": "comfyui_ssl_gemini_EXP"
+ }
+ ],
+ "https://github.com/tauraloke/ComfyUI-Unfake-Pixels": [
+ [
+ "PixelArtScaler"
+ ],
+ {
+ "title_aux": "ComfyUI-Unfake-Pixels"
+ }
+ ],
+ "https://github.com/tavyra/ComfyUI_Curves": [
+ [
+ "Curve Visualizer",
+ "RGB Curve Editor",
+ "RGBCurvesAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI_Curves"
+ }
+ ],
+ "https://github.com/teamalpha-ai/comfyui-image-transformer": [
+ [
+ "ImageTransformerResizeToMaxPixels"
+ ],
+ {
+ "title_aux": "ComfyUI-ImageTransformer"
+ }
+ ],
+ "https://github.com/techzuhaib/FaceCLIP-ComfyUI": [
+ [
+ "FaceCLIPSDXLGenerate",
+ "FaceCLIPTextImageEncode"
+ ],
+ {
+ "title_aux": "FaceCLIP-ComfyUI"
+ }
+ ],
+ "https://github.com/teepunkt-esspunkt/ComfyUI-SuiteTea": [
+ [
+ "Tea_ImageCheckpointFromPath",
+ "Tea_LoadFrameFromVidAsImg",
+ "Tea_SaveAndReloadImage"
+ ],
+ {
+ "title_aux": "ComfyUI-SuiteTea"
+ }
+ ],
+ "https://github.com/tenitsky/tenitsky-prompt-cycler-simple": [
+ [
+ "PromptCycler"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Cycler Node"
+ }
+ ],
+ "https://github.com/tercumantanumut/ComfyUI-Omini-Kontext": [
+ [
+ "OminiKontextImageEncoder",
+ "OminiKontextImageScale",
+ "OminiKontextLatentCombiner",
+ "OminiKontextLatentDecoder",
+ "OminiKontextLatentVisualizer",
+ "OminiKontextLoRALoader",
+ "OminiKontextLoRAMerge",
+ "OminiKontextLoRAUnload",
+ "OminiKontextPipeline",
+ "OminiKontextPipelineLoader",
+ "OminiKontextReferenceEncoder",
+ "OminiKontextSplitPipelineLoader",
+ "OminiKontextTextEncoder"
+ ],
+ {
+ "title_aux": "ComfyUI-Omini-Kontext"
+ }
+ ],
+ "https://github.com/terefang/ComfyUI-Terefang-Nodes": [
+ [
+ "Terefang Simple Latent Image",
+ "Terefang Wildcards",
+ "TerefangSimpleLatentImage",
+ "TerefangWildcards"
+ ],
+ {
+ "title_aux": "ComfyUI-Terefang-Nodes"
+ }
+ ],
+ "https://github.com/tester4488/mc_qwen": [
+ [
+ "McTextEncodeQwenImEditPlus"
+ ],
+ {
+ "title_aux": "mc_qwen"
+ }
+ ],
+ "https://github.com/tetsuoo-online/comfyui-too-xmp-metadata": [
+ [
+ "ReadXMPMetadata",
+ "WriteXMPMetadataLossless",
+ "WriteXMPMetadataTensor"
+ ],
+ {
+ "title_aux": "comfyui-too-xmp-metadata"
+ }
+ ],
+ "https://github.com/teward/ComfyUI-Helper-Nodes": [
+ [
+ "HelperNodes_CfgScale",
+ "HelperNodes_CheckpointSelector",
+ "HelperNodes_MultilineStringLiteral",
+ "HelperNodes_Prompt",
+ "HelperNodes_SDXLCommonResolutions",
+ "HelperNodes_SamplerSelector",
+ "HelperNodes_SaveImage",
+ "HelperNodes_SchedulerSelector",
+ "HelperNodes_SeedSelector",
+ "HelperNodes_Steps",
+ "HelperNodes_StringLiteral",
+ "HelperNodes_VAESelector",
+ "HelperNodes_WidthHeight"
+ ],
+ {
+ "title_aux": "ComfyUI-Helper-Nodes"
+ }
+ ],
+ "https://github.com/thalismind/ComfyUI-Blend-Nodes": [
+ [
+ "BlendImageNode"
+ ],
+ {
+ "title_aux": "ComfyUI Blend Image Nodes"
+ }
+ ],
+ "https://github.com/thalismind/ComfyUI-LoadImageWithFilename": [
+ [
+ "CropImageByMask",
+ "LoadImageFolder",
+ "LoadImageWithFilename",
+ "SaveImageWithFilename"
+ ],
+ {
+ "title_aux": "ComfyUI LoadImageWithFilename"
+ }
+ ],
+ "https://github.com/thatname/Comfyui_CharaConsist": [
+ [
+ "BatchedMaskedReferenceGen",
+ "ConditioningMatchMask",
+ "ExtractAttn",
+ "GenConsistent",
+ "GetCrossSim",
+ "MaskToPatchMask",
+ "MasksToPatches",
+ "PreviewSubjectMask",
+ "ReferenceConditionCombine"
+ ],
+ {
+ "title_aux": "Comfyui_CharaConsist"
+ }
+ ],
+ "https://github.com/theAdamColton/ComfyUI-texflow-extension": [
+ [
+ "Load Texflow Depth Image",
+ "Save Texflow Image"
+ ],
+ {
+ "title_aux": "ComfyUI-texflow-extension"
+ }
+ ],
+ "https://github.com/theUpsider/ComfyUI-Styles_CSV_Loader": [
+ [
+ "Load Styles CSV",
+ "StylesCSVLoader"
+ ],
+ {
+ "title_aux": "Styles CSV Loader Extension for ComfyUI"
+ }
+ ],
+ "https://github.com/thecooltechguy/ComfyUI-MagicAnimate": [
+ [
+ "MagicAnimate",
+ "MagicAnimateModelLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-MagicAnimate"
+ }
+ ],
+ "https://github.com/thecooltechguy/ComfyUI-Stable-Video-Diffusion": [
+ [
+ "SVDDecoder",
+ "SVDModelLoader",
+ "SVDSampler",
+ "SVDSimpleImg2Vid"
+ ],
+ {
+ "title_aux": "ComfyUI Stable Video Diffusion"
+ }
+ ],
+ "https://github.com/thedivergentai/divergent_nodes": [
+ [
+ "CLIPTokenCounter",
+ "DivergentGeminiNode",
+ "GeminiBatchProcess",
+ "ImageInfo",
+ "LoraStrengthXYPlot",
+ "MusiQNode",
+ "PreviewText",
+ "PromptCombiner",
+ "SaveImageEnhancedNode",
+ "StringToList"
+ ],
+ {
+ "title_aux": "Divergent Nodes"
+ }
+ ],
+ "https://github.com/theluminhub/ComfyUI-Lumin-Upload": [
+ [
+ "AssetManagerNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Lumin-Upload"
+ }
+ ],
+ "https://github.com/theshubzworld/ComfyUI-FaceCalloutNode": [
+ [
+ "FaceCalloutEffect",
+ "IntegratedFaceComposite",
+ "IsolatedFaceCallout"
+ ],
+ {
+ "title_aux": "ComfyUI-FaceCalloutNode"
+ }
+ ],
+ "https://github.com/theshubzworld/ComfyUI-NvidiaCaptioner": [
+ [
+ "NvidiaCaptionerNode"
+ ],
+ {
+ "title_aux": "ComfyUI-NvidiaCaptioner"
+ }
+ ],
+ "https://github.com/theshubzworld/ComfyUI-SD3.5-Latent-Size-Picker": [
+ [
+ "FluxEmptyLatent",
+ "SD3_5EmptyLatent"
+ ],
+ {
+ "title_aux": "SD3.5 Empty Latent Size Picker"
+ }
+ ],
+ "https://github.com/theshubzworld/ComfyUI-TogetherVision": [
+ [
+ "Together Image \ud83c\udfa8",
+ "TogetherVisionBatchNode",
+ "TogetherVisionNode",
+ "TogetherVisionNode \ud83d\udd0d (Enhanced)"
+ ],
+ {
+ "title_aux": "Together Vision Node"
+ }
+ ],
+ "https://github.com/theshubzworld/ComfyUI-Universal-Latent": [
+ [
+ "UniversalLatent"
+ ],
+ {
+ "title_aux": "ComfyUI-Universal-Latent"
+ }
+ ],
+ "https://github.com/theshubzworld/ComfyUI-ollama_killer": [
+ [
+ "OllamaKiller"
+ ],
+ {
+ "title_aux": "ComfyUI-ollama_killer"
+ }
+ ],
+ "https://github.com/thezveroboy/ComfyUI-CSM-Nodes": [
+ [
+ "CSMTextToSpeech",
+ "CSMTextToSpeechWithContext",
+ "LoadAudioWithTranscription",
+ "LoadCSMCheckpoint",
+ "LoadCSMTokenizer"
+ ],
+ {
+ "title_aux": "ComfyUI-CSM-Nodes"
+ }
+ ],
+ "https://github.com/thezveroboy/ComfyUI-ClipReshaper": [
+ [
+ "CR_ConditioningAssertDim",
+ "CR_ConditioningInspect",
+ "CR_ConditioningLinearProject",
+ "CR_ConditioningPadOrSlice",
+ "CR_SDXLMetadataEnsure"
+ ],
+ {
+ "title_aux": "ComfyUI-ClipReshaper"
+ }
+ ],
+ "https://github.com/thezveroboy/ComfyUI-LoadRandomText": [
+ [
+ "LoadRandomTextClassic",
+ "LoadRandomTextSeed",
+ "LoadRandomTextShuffle"
+ ],
+ {
+ "title_aux": "ComfyUI-LoadRandomText"
+ }
+ ],
+ "https://github.com/thezveroboy/ComfyUI-WAN-ClipSkip": [
+ [
+ "CLIPSkip"
+ ],
+ {
+ "title_aux": "ComfyUI-WAN-ClipSkip"
+ }
+ ],
+ "https://github.com/thezveroboy/ComfyUI-klein4-9multiangle": [
+ [
+ "KleinMultiAnglePrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-klein4-9multiangle"
+ }
+ ],
+ "https://github.com/thezveroboy/ComfyUI-lut": [
+ [
+ "ImageToLUT"
+ ],
+ {
+ "title_aux": "ComfyUI-LUT"
+ }
+ ],
+ "https://github.com/thezveroboy/ComfyUI_ACE-Step-zveroboy": [
+ [
+ "ACEModelLoaderZveroboy",
+ "ACEStepEditZveroboy",
+ "ACEStepExtendZveroboy",
+ "ACEStepGenerateZveroboy",
+ "ACEStepRepaintZveroboy"
+ ],
+ {
+ "title_aux": "ComfyUI_ACE-Step-zveroboy"
+ }
+ ],
+ "https://github.com/thezveroboy/comfyui-RandomPromptsZveroboy": [
+ [
+ "RandomPromptsZveroboy"
+ ],
+ {
+ "title_aux": "comfyui-RandomPromptsZveroboy"
+ }
+ ],
+ "https://github.com/thezveroboy/comfyui-random-image-loader": [
+ [
+ "LoadRandomImage"
+ ],
+ {
+ "title_aux": "ComfyUI Random Image Loader"
+ }
+ ],
+ "https://github.com/thimpat/ThimPatUtils": [
+ [
+ "CalculateAndDisplay",
+ "CalculateVideoFrameCount",
+ "ExtractAudioInfo",
+ "IntToFloatConverter",
+ "LoadPathToAudioInfo",
+ "ResizeVideoFrames"
+ ],
+ {
+ "title_aux": "ComfyUI Multimedia Utilities"
+ }
+ ],
+ "https://github.com/thrakotool/ComfyUI-KiraLoraEQ": [
+ [
+ "KiraLora_EQ"
+ ],
+ {
+ "title_aux": "ComfyUI-KiraLoraEQ"
+ }
+ ],
+ "https://github.com/tianguanggliu/Utools": [
+ [
+ "UTools"
+ ],
+ {
+ "title_aux": "comfyui-utools"
+ }
+ ],
+ "https://github.com/tiankuan93/ComfyUI-V-Express": [
+ [
+ "Load_Audio_Path",
+ "Load_Audio_Path_From_Video",
+ "Load_Image_Path",
+ "Load_Kps_Path",
+ "Load_Kps_Path_From_Video",
+ "Load_Video_Path",
+ "VEINTConstant",
+ "VEPreview_Video",
+ "VEStringConstant",
+ "V_Express_Loader",
+ "V_Express_Sampler"
+ ],
+ {
+ "title_aux": "V-Express: Conditional Dropout for Progressive Training of Portrait Video Generation"
+ }
+ ],
+ "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge": [
+ [
+ "ProjectorzControlnetInput",
+ "ProjectorzControlnetParameter",
+ "ProjectorzInitInput",
+ "ProjectorzOutput",
+ "ProjectorzParameter",
+ "ProjectorzStringToFloat",
+ "ProjectorzStringToInt"
+ ],
+ {
+ "title_aux": "Stable Projectorz Bridge"
+ }
+ ],
+ "https://github.com/tianyuw/ComfyUI-LLM-API": [
+ [
+ "PromptWithImage"
+ ],
+ {
+ "title_aux": "Custom nodes for llm chat with optional image input"
+ }
+ ],
+ "https://github.com/tigeryy2/comfyui-structured-outputs": [
+ [
+ "AttributeNode",
+ "AttributeToTextNode",
+ "StructuredOutputNode"
+ ],
+ {
+ "title_aux": "ComfyUI Structured Outputs"
+ }
+ ],
+ "https://github.com/tighug/comfyui-eagle-feeder": [
+ [
+ "EagleFeederAnimatedWebp",
+ "EagleFeederMp4",
+ "EagleFeederPng"
+ ],
+ {
+ "title_aux": "ComfyUI Eagle Feeder"
+ }
+ ],
+ "https://github.com/tighug/comfyui-rating-checker": [
+ [
+ "RatingCheckerGantMan",
+ "RatingCheckerMarqo",
+ "RatingCheckerNudeNet"
+ ],
+ {
+ "title_aux": "ComfyUI Rating Checker"
+ }
+ ],
+ "https://github.com/tj5miniop/VRAM_Fix_Comfy": [
+ [
+ "VRAMOverrideNode"
+ ],
+ {
+ "title_aux": "VRAM_Fix_Comfy"
+ }
+ ],
+ "https://github.com/tkreuziger/comfyui-claude": [
+ [
+ "Combine Texts",
+ "Describe Image",
+ "Transform Text"
+ ],
+ {
+ "title_aux": "ComfyUI and Claude"
+ }
+ ],
+ "https://github.com/tmagara/ComfyUI-Prediction-Boost": [
+ [
+ "PredictionBoost"
+ ],
+ {
+ "title_aux": "ComfyUI-Prediction-Boost"
+ }
+ ],
+ "https://github.com/tmode-1960/TA-ComfyUI-Nodes-Pack": [
+ [
+ "TAEbuLMStudioLoadModel",
+ "TAEbuLMStudioUnload",
+ "TAEbuLMStudioVisionRequest",
+ "TAFilenameGenerator",
+ "TALMStudioLoadOnRun",
+ "TALMStudioLoadedModels",
+ "TALMStudioModelSelector",
+ "TALMStudioSmartLoader",
+ "TALoadCheckpointModelWithName",
+ "TALoadDiffusionModelWithName",
+ "TALoadGGUFModelWithName",
+ "TAPromptController",
+ "TASaveImageWithPrompt",
+ "ta_captioning"
+ ],
+ {
+ "title_aux": "TA-ComfyUI-Nodes-Pack"
+ }
+ ],
+ "https://github.com/tocubed/ComfyUI-AudioReactor": [
+ [
+ "AudioFrameTransformBeats",
+ "AudioFrameTransformShadertoy",
+ "AudioLoadPath",
+ "Shadertoy"
+ ],
+ {
+ "title_aux": "ComfyUI-AudioReactor"
+ }
+ ],
+ "https://github.com/tocubed/ComfyUI-EvTexture": [
+ [
+ "EVTEventsToImage",
+ "EVTLoadEvTextureModel",
+ "EVTTextureUpscaleVideo",
+ "EVTVideoToEvents"
+ ],
+ {
+ "title_aux": "ComfyUI-EvTexture"
+ }
+ ],
+ "https://github.com/tomudo/ComfyUI-ascii-art": [
+ [
+ "ImageToAscii"
+ ],
+ {
+ "author": "dfl",
+ "description": "CLIP text encoder that does BREAK prompting like A1111",
+ "nickname": "CLIP with BREAK",
+ "title": "CLIP with BREAK syntax",
+ "title_aux": "ComfyUI-ascii-art"
+ }
+ ],
+ "https://github.com/tooldigital/ComfyUI-Yolo-Cropper": [
+ [
+ "ToolYoloCropper"
+ ],
+ {
+ "title_aux": "Easy automatic (square) image cropper using Yolo"
+ }
+ ],
+ "https://github.com/tori29umai0123/ComfyUI-Model_Downloader": [
+ [
+ "HuggingFaceDirectoryDownloader",
+ "ModelDownloader",
+ "ModelDownloaderFromINI"
+ ],
+ {
+ "title_aux": "ComfyUI-Model_Downloader"
+ }
+ ],
+ "https://github.com/toxicwind/ComfyUI-TTools": [
+ [
+ "TTools Extract JSON",
+ "TTools SD3 Resolution Solver",
+ "TToolsExtractJson",
+ "TToolsSD3ResolutionSolver"
+ ],
+ {
+ "title_aux": "TTools for ComfyUI"
+ }
+ ],
+ "https://github.com/toyxyz/ComfyUI_rgbx_Wrapper": [
+ [
+ "rgb2x"
+ ],
+ {
+ "title_aux": "ComfyUI_rgbx_Wrapper"
+ }
+ ],
+ "https://github.com/toyxyz/ComfyUI_toyxyz_test_nodes": [
+ [
+ "CaptureWebcam",
+ "ComfyCoupleMask",
+ "ComfyCoupleRegion",
+ "ComfyCoupleRegionExtractor",
+ "ComfyCoupleRegionVisualizer",
+ "Depth to normal",
+ "Depth_to_normal",
+ "Direct Screen Capture",
+ "Direct_screenCap",
+ "Export glb",
+ "Export_glb",
+ "ImageResize_Padding",
+ "JoinPose",
+ "LatentDelay",
+ "Load Random Text From File",
+ "LoadWebcamImage",
+ "Load_Random_Text_From_File",
+ "OpenposeEditorNode",
+ "PoseKeypointToCoordStr",
+ "PoseToMaskNode",
+ "Pose_Inter",
+ "Remove noise",
+ "Remove_noise",
+ "SaveImagetoPath",
+ "VisualAreaMask"
+ ],
+ {
+ "title_aux": "ComfyUI_toyxyz_test_nodes"
+ }
+ ],
+ "https://github.com/tpc2233/ComfyUI-Z-Image-Turbo": [
+ [
+ "ZImageLoader",
+ "ZImageSampler"
+ ],
+ {
+ "title_aux": "ComfyUI-Z-Image-Turbo"
+ }
+ ],
+ "https://github.com/tppp2806/ComfyUI-YoloTrack": [
+ [
+ "MaskCropExtractNode",
+ "YOLODetectionNode",
+ "YOLOTrackingNode"
+ ],
+ {
+ "title_aux": "ComfyUI-YoloTrack"
+ }
+ ],
+ "https://github.com/transcendedhacker/Mode_personal_node": [
+ [
+ "NegativePromptNode",
+ "PromptComposerNode"
+ ],
+ {
+ "title_aux": "Mode_personal_node"
+ }
+ ],
+ "https://github.com/traugdor/ComfyUI-Riffusion": [
+ [
+ "RiffusionNode",
+ "RiffusionToBatchNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Riffusion"
+ }
+ ],
+ "https://github.com/traugdor/ComfyUI-UltimateSDUpscale-GGUF": [
+ [
+ "UltimateSDUpscaleGGUF"
+ ],
+ {
+ "title_aux": "ComfyUI-UltimateSDUpscale-GGUF"
+ }
+ ],
+ "https://github.com/traugdor/ComfyUI-quadMoons-nodes": [
+ [
+ "AnimateDiff Script",
+ "Apply ControlNet Stack",
+ "Control Net Stacker",
+ "Eff. Loader SDXL",
+ "Efficient Loader",
+ "HighRes-Fix Script",
+ "Image Overlay",
+ "Join XY Inputs of Same Type",
+ "KSampler (Efficient)",
+ "KSampler Adv. (Efficient)",
+ "KSampler SDXL (Eff.)",
+ "LatentUpscaler",
+ "LoRA Stack to String converter",
+ "LoRA Stacker",
+ "Manual XY Entry Info",
+ "NNLatentUpscale",
+ "NNlLatentUpscale",
+ "Noise Control Script",
+ "Pack SDXL Tuple",
+ "Tiled Upscaler Script",
+ "Unpack SDXL Tuple",
+ "XY Input: Add/Return Noise",
+ "XY Input: Aesthetic Score",
+ "XY Input: CFG Scale",
+ "XY Input: Checkpoint",
+ "XY Input: Clip Skip",
+ "XY Input: Control Net",
+ "XY Input: Control Net Plot",
+ "XY Input: Denoise",
+ "XY Input: LoRA",
+ "XY Input: LoRA Plot",
+ "XY Input: LoRA Stacks",
+ "XY Input: Manual XY Entry",
+ "XY Input: Prompt S/R",
+ "XY Input: Refiner On/Off",
+ "XY Input: Sampler/Scheduler",
+ "XY Input: Seeds++ Batch",
+ "XY Input: Steps",
+ "XY Input: VAE",
+ "XY Plot",
+ "quadmoonBatchFromLatent",
+ "quadmoonCLIPTextEncode",
+ "quadmoonCLIPTextEncode2",
+ "quadmoonChangeBackground",
+ "quadmoonConvertBoolToString",
+ "quadmoonConvertFloatToString",
+ "quadmoonConvertImageToPrompt",
+ "quadmoonConvertIntToString",
+ "quadmoonConvertNormalizeHW",
+ "quadmoonConvertNumberToString",
+ "quadmoonINTConditionalOperation",
+ "quadmoonKSampler",
+ "quadmoonKSamplerAdvanced",
+ "quadmoonKSamplerBatched",
+ "quadmoonLatentImage",
+ "quadmoonLoadConfigs",
+ "quadmoonModelLoader",
+ "quadmoonRotationalSampler",
+ "quadmoonSaveNeg",
+ "quadmoonSavePrompt",
+ "quadmoonSmartNeg",
+ "quadmoonSmartPrompt",
+ "quadmoonThebutton"
+ ],
+ {
+ "author": "quadmoon (https://github.com/traugdor)",
+ "description": "These are just some nodes I wanted and couldn't find where anyone else had made them yet.",
+ "nickname": "quadmoon's Nodes",
+ "title": "quadmoon's ComfyUI nodes",
+ "title_aux": "quadmoon's ComfyUI nodes"
+ }
+ ],
+ "https://github.com/tritant/ComfyUI-Advanced-Photo-Grain": [
+ [
+ "FreqSeparationSharpen",
+ "PhotoFilmGrain"
+ ],
+ {
+ "title_aux": "Advanced Photo Grain"
+ }
+ ],
+ "https://github.com/tritant/ComfyUI_CreaPrompt": [
+ [
+ "CSL",
+ "CreaPrompt",
+ "CreaPrompt List",
+ "CreaPrompt_0",
+ "CreaPrompt_1",
+ "CreaPrompt_2",
+ "CreaPrompt_3",
+ "CreaPrompt_4"
+ ],
+ {
+ "title_aux": "ComfyUI-CreaPrompt"
+ }
+ ],
+ "https://github.com/tritant/ComfyUI_Custom_Switch": [
+ [
+ "AutomaticImageSwitcher",
+ "OrchestratorNodeGroupBypasser",
+ "OrchestratorNodeGroupMuter",
+ "OrchestratorNodeMuter",
+ "OrchestratorNodeToogle"
+ ],
+ {
+ "title_aux": "ComfyUI_Custom_Switch"
+ }
+ ],
+ "https://github.com/tritant/ComfyUI_Flux_Block_Lora_Merger": [
+ [
+ "FluxBlockLoraMerger"
+ ],
+ {
+ "title_aux": "Flux Block LoRA Merger"
+ }
+ ],
+ "https://github.com/tritant/ComfyUI_Flux_Lora_Merger": [
+ [
+ "FluxLoraMerger"
+ ],
+ {
+ "title_aux": "Flux LoRA Merger"
+ }
+ ],
+ "https://github.com/tritant/ComfyUI_Kitchen_nvfp4_Converter": [
+ [
+ "ConvertToNVFP4"
+ ],
+ {
+ "title_aux": "ComfyUI_Kitchen_nvfp4_Converter"
+ }
+ ],
+ "https://github.com/tritant/ComfyUI_Layers_Utility": [
+ [
+ "LayerSystem"
+ ],
+ {
+ "title_aux": "Layers System"
+ }
+ ],
+ "https://github.com/tritant/ComfyUI_Relight_Img": [
+ [
+ "RelightNode"
+ ],
+ {
+ "title_aux": "Advanced_Relight_Img"
+ }
+ ],
+ "https://github.com/tritant/ComfyUI_Remove_Banding_Artifacts": [
+ [
+ "ResampleBandingFix"
+ ],
+ {
+ "title_aux": "Remove Banding Artifacts"
+ }
+ ],
+ "https://github.com/tritant/ComfyUI_SuperScaler": [
+ [
+ "SuperScaler_Pipeline"
+ ],
+ {
+ "title_aux": "SuperScaler"
+ }
+ ],
+ "https://github.com/trojblue/trNodes": [
+ [
+ "trColorCorrection",
+ "trLayering",
+ "trRouter",
+ "trRouterLonger"
+ ],
+ {
+ "title_aux": "trNodes"
+ }
+ ],
+ "https://github.com/troyxmccall/ComfyUI-ScaleToTargetMegapixels": [
+ [
+ "ScaleToTargetMegapixels"
+ ],
+ {
+ "title_aux": "ComfyUI-ScaleToTargetMegapixels"
+ }
+ ],
+ "https://github.com/trumanwong/ComfyUI-NSFW-Detection": [
+ [
+ "NSFWDetection"
+ ],
+ {
+ "title_aux": "ComfyUI-NSFW-Detection"
+ }
+ ],
+ "https://github.com/trunksn1/comfyui-change-checkpoint-randomly": [
+ [
+ "BatchIndexCounter",
+ "CheckpointFilename",
+ "CheckpointRotation",
+ "CheckpointRotationSimple",
+ "CheckpointRotationWithCounter",
+ "SaveImageWithCheckpoint",
+ "SimpleCheckpointRotation",
+ "SimpleCounter"
+ ],
+ {
+ "title_aux": "ComfyUI Checkpoint Rotation Node"
+ }
+ ],
+ "https://github.com/tsogzark/ComfyUI-load-image-from-url": [
+ [
+ "LoadImageFromUrlOrPath"
+ ],
+ {
+ "title_aux": "ComfyUI-load-image-from-url"
+ }
+ ],
+ "https://github.com/ttulttul/Better-Gemini": [
+ [
+ "BetterGemini"
+ ],
+ {
+ "title_aux": "Better-Gemini"
+ }
+ ],
+ "https://github.com/ttulttul/ComfyUI-FlowMatching-Inverter": [
+ [
+ "LatentHybridInverter",
+ "MemoryDiagnosticsPassThrough",
+ "QwenRectifiedFlowInverter"
+ ],
+ {
+ "title_aux": "ComfyUI Qwen Rectified Flow Tools"
+ }
+ ],
+ "https://github.com/ttulttul/ComfyUI-FlowMatching-Upscaler": [
+ [
+ "DyPEFlux2",
+ "DyPEQwenImage",
+ "FlowMatchingProgressiveUpscaler",
+ "FlowMatchingStage",
+ "FlowMatchingStageMerge",
+ "FlowMatchingStagePrep",
+ "LatentUpscaleAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-FlowMatching-Upscaler"
+ }
+ ],
+ "https://github.com/ttulttul/ComfyUI-Iterative-Mixer": [
+ [
+ "Batch Unsampler",
+ "Iterative Mixing KSampler",
+ "Iterative Mixing KSampler Advanced",
+ "IterativeMixingSampler",
+ "IterativeMixingScheduler",
+ "IterativeMixingSchedulerAdvanced",
+ "Latent Batch Comparison Plot",
+ "Latent Batch Statistics Plot",
+ "MixingMaskGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI Iterative Mixing Nodes"
+ }
+ ],
+ "https://github.com/ttulttul/ComfyUI-Taylor-Attention": [
+ [
+ "ClockedSweepValues",
+ "Combinations",
+ "Flux2TTRController",
+ "Flux2TTRControllerTrainer",
+ "Flux2TTRTrainer",
+ "Flux2TTRTrainingParameters",
+ "LoadPromptListFromJSON",
+ "RandomSeedBatch"
+ ],
+ {
+ "title_aux": "ComfyUI-Taylor-Attention"
+ }
+ ],
+ "https://github.com/ttulttul/ComfyUI-Tensor-Operations": [
+ [
+ "Fast Image to Noise",
+ "Image Match Normalize",
+ "Latent Match Normalize"
+ ],
+ {
+ "title_aux": "ComfyUI-Tensor-Operations"
+ }
+ ],
+ "https://github.com/ttulttul/Skoogeer-Noise": [
+ [
+ "CombineLatentPhaseMagnitude",
+ "ConditioningAddNoise",
+ "ConditioningFrequencyMerge",
+ "ConditioningFrequencySplit",
+ "ConditioningGaussianBlur",
+ "ConditioningScale",
+ "FluidImageAdvection",
+ "FluidLatentAdvection",
+ "FrequencySelectiveStructuredNoise",
+ "ImageAddNoise",
+ "ImageBatchToLatent",
+ "ImageFractalBrownianMotion",
+ "ImageMeshDrag",
+ "ImageNoise",
+ "ImagePerlinFractalNoise",
+ "ImageReactionDiffusion",
+ "ImageSimplexNoise",
+ "ImageSmokeSimulation",
+ "ImageSwirlNoise",
+ "ImageWorleyNoise",
+ "LatentAddNoise",
+ "LatentChannelLinearTransform",
+ "LatentChannelMerge",
+ "LatentChannelNonlinearTransform",
+ "LatentChannelStatsPreview",
+ "LatentForwardDiffusion",
+ "LatentFractalBrownianMotion",
+ "LatentFrequencyMerge",
+ "LatentFrequencySplit",
+ "LatentGaussianBlur",
+ "LatentMeshDrag",
+ "LatentNoise",
+ "LatentPackedSlotTransform",
+ "LatentPerlinFractalNoise",
+ "LatentReactionDiffusion",
+ "LatentSimplexNoise",
+ "LatentSmokeSimulation",
+ "LatentSwirlNoise",
+ "LatentToImage",
+ "LatentWorleyNoise",
+ "PatchifyFlux2Latent",
+ "SplitLatentPhaseMagnitude",
+ "UnpatchifyFlux2Latent"
+ ],
+ {
+ "title_aux": "Skoogeer-Noise"
+ }
+ ],
+ "https://github.com/tuki0918/ComfyUI_Cooldown_Node": [
+ [
+ "CooldownImageNode",
+ "CooldownIntNode",
+ "CooldownStringNode"
+ ],
+ {
+ "title_aux": "ComfyUI_Cooldown_Node"
+ }
+ ],
+ "https://github.com/tuki0918/comfyui-image-expand-nodes": [
+ [
+ "ImageExpandMerger",
+ "ImageExpandNoiser",
+ "ImageExpandOption"
+ ],
+ {
+ "title_aux": "comfyui-image-expand-nodes"
+ }
+ ],
+ "https://github.com/tuki0918/comfyui-image-tiled-nodes": [
+ [
+ "TiledImageMerger",
+ "TiledImageSplitter"
+ ],
+ {
+ "title_aux": "comfyui-image-tiled-nodes"
+ }
+ ],
+ "https://github.com/tumbowungus/MultiMaskCouple": [
+ [
+ "MaskedRegionCond",
+ "MultiMaskCouple"
+ ],
+ {
+ "title_aux": "MultiMaskCouple"
+ }
+ ],
+ "https://github.com/tungdop2/Comfyui_face_restorer": [
+ [
+ "FaceRestorer",
+ "FaceRestorerLoader"
+ ],
+ {
+ "title_aux": "Face Restorer for ComfyUI"
+ }
+ ],
+ "https://github.com/tungdop2/Comfyui_joy-caption-alpha-two": [
+ [
+ "JoyCaptioner"
+ ],
+ {
+ "title_aux": "Joy Caption Alpha Two for ComfyUI"
+ }
+ ],
+ "https://github.com/turkyden/ComfyUI-SmartCrop": [
+ [
+ "ImageSmartCrop"
+ ],
+ {
+ "title_aux": "ComfyUI-SmartCrop"
+ }
+ ],
+ "https://github.com/turnbros/ComfyBros": [
+ [
+ "ComfyBros_DictGet",
+ "ComfyBros_EndpointConfiguration",
+ "ComfyBros_GenerateImage",
+ "ComfyBros_GenerateImageAPI",
+ "ComfyBros_ImageBatchCombiner",
+ "ComfyBros_ImageBatchSplitter",
+ "ComfyBros_ImageBatchToGIF",
+ "ComfyBros_ImageToImage",
+ "ComfyBros_IntegerCompare",
+ "ComfyBros_IntegerConstant",
+ "ComfyBros_IntegerMath",
+ "ComfyBros_JsonParse",
+ "ComfyBros_LoraDiscovery",
+ "ComfyBros_MediaUpload",
+ "ComfyBros_ModuleManagement",
+ "ComfyBros_OllamaConfiguration",
+ "ComfyBros_OllamaConnection",
+ "ComfyBros_OllamaConverse",
+ "ComfyBros_SDXLLORAPrompter",
+ "ComfyBros_TextConcatenate",
+ "ComfyBros_TextStorage",
+ "ComfyBros_TextTemplate",
+ "ComfyBros_TextToVideo",
+ "ComfyBros_WAN22GenerateVideo",
+ "ComfyBros_WAN22UpscaleImage"
+ ],
+ {
+ "title_aux": "ComfyBros - Custom ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/tusharbhutt/Endless-Nodes": [
+ [
+ "BatchNegativePrompts",
+ "Eight_Input_Int_Switch",
+ "Eight_Input_Int_Switch_Widget",
+ "Eight_Input_Text_Switch",
+ "EndlessReplicateLatents",
+ "FluxBatchPrompts",
+ "FluxKontextBatchPrompts",
+ "Four_Input_Int_Switch",
+ "Four_Input_Int_Switch_Widget",
+ "Four_Input_Text_Switch",
+ "ImageComplexityScorer",
+ "ImageNoveltyScorer",
+ "Image_saver",
+ "PromptCounter",
+ "Random_Prompt_Multipicker",
+ "Random_Prompt_Selector",
+ "Randomizer_Chaos",
+ "Randomizer_Mayhem",
+ "Randomizer_Pandemonium",
+ "SDXLBatchPrompts",
+ "SimpleBatchPrompts",
+ "Six_Input_Int_Switch",
+ "Six_Input_Int_Switch_Widget",
+ "Six_Input_Text_Switch"
+ ],
+ {
+ "title_aux": "Endless \ufe0f\ud83c\udf0a\u2728 Nodes"
+ }
+ ],
+ "https://github.com/twri/sdxl_prompt_styler": [
+ [
+ "SDXLPromptStyler",
+ "SDXLPromptStylerAdvanced"
+ ],
+ {
+ "title_aux": "SDXL Prompt Styler"
+ }
+ ],
+ "https://github.com/ty0x2333/ComfyUI-Dev-Utils": [
+ [
+ "TY_ExecutionTime",
+ "TY_UploadAnything",
+ "TY_UrlDownload"
+ ],
+ {
+ "title_aux": "ComfyUI-Dev-Utils"
+ }
+ ],
+ "https://github.com/u5dev/comfyUI_u5_VramFREE": [
+ [
+ "SequentialCLIPLoaderSimple",
+ "SequentialCheckpointLoader",
+ "SequentialLoRALoader",
+ "SequentialVAELoaderSimple",
+ "VRAMFree"
+ ],
+ {
+ "title_aux": "u5 FreeVRAM - Memory Management"
+ }
+ ],
+ "https://github.com/uarefans/ComfyUI-Fans": [
+ [
+ "Fans Prompt Styler Negative",
+ "Fans Prompt Styler Positive",
+ "Fans Styler",
+ "Fans Text Concatenate"
+ ],
+ {
+ "title_aux": "ComfyUI-Fans"
+ }
+ ],
+ "https://github.com/ubisoft/ComfyUI-Chord": [
+ [
+ "ChordLoadModel",
+ "ChordMaterialEstimation",
+ "ChordNormalToHeight"
+ ],
+ {
+ "title_aux": "ComfyUI-Chord"
+ }
+ ],
+ "https://github.com/ucloud/comfyui-plugin": [
+ [
+ "Gemini Pro Image (Nano Banana Pro)",
+ "ModelVerse Image Packer",
+ "Modelverse FluxDevNode",
+ "Modelverse FluxKontextMaxNode",
+ "Modelverse FluxKontextMaxT2INode",
+ "Modelverse FluxKontextProNode",
+ "Modelverse FluxKontextProT2INode",
+ "Modelverse GPTImage1EditNode",
+ "Modelverse GPTImage1Node",
+ "Modelverse QwenImageEditNode",
+ "Modelverse QwenImageT2INode",
+ "Modelverse Step1xEditNode",
+ "ModelverseChat",
+ "ModelverseInputFiles",
+ "Modelverse_PreviewVideo",
+ "Modelverse_WanAII2V",
+ "Modelverse_WanAIT2V",
+ "NanoBanana",
+ "Sora_Img2Video",
+ "Sora_Text2Video",
+ "UCloud ModelVerse Client",
+ "Vidu_Extend",
+ "Vidu_Img2Video",
+ "Vidu_Reference2Video",
+ "Vidu_StartEnd2Video",
+ "Vidu_Text2Video"
+ ],
+ {
+ "title_aux": "ComfyUl-UCloud"
+ }
+ ],
+ "https://github.com/uczensokratesa/ComfyUI-Claude-VAE": [
+ [
+ "ClaudeSmartVAEDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-Claude-VAE"
+ }
+ ],
+ "https://github.com/uczensokratesa/ComfyUI-Gemini-VAE-Fix": [
+ [
+ "GeminiSmartVAEDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-Gemini-VAE-Fix"
+ }
+ ],
+ "https://github.com/uczensokratesa/ComfyUI-Grok-SmartVAE": [
+ [
+ "UniversalSmartVAEDecode",
+ "UniversalSmartVAEVideoDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-Grok-SmartVAE"
+ }
+ ],
+ "https://github.com/uczensokratesa/ComfyUI-UniversalSmartVAE": [
+ [
+ "TemporalVAEDecode"
+ ],
+ {
+ "title_aux": "ComfyUI-UniversalSmartVAE"
+ }
+ ],
+ "https://github.com/uetuluk/comfyui-webcam-node": [
+ [
+ "webcam_capture_node"
+ ],
+ {
+ "title_aux": "comfyui-webcam-node"
+ }
+ ],
+ "https://github.com/uihp/ComfyUI-String-Chain": [
+ [
+ "String Chain",
+ "String Concat",
+ "String Toggle",
+ "String Toggle (Multiline)"
+ ],
+ {
+ "title_aux": "ComfyUI-String-Chain"
+ }
+ ],
+ "https://github.com/umiyuki/comfyui-pad-to-eight": [
+ [
+ "Pad To Eight"
+ ],
+ {
+ "title_aux": "ComfyUI Pad To Eight"
+ }
+ ],
+ "https://github.com/un-seen/comfyui-tensorops": [
+ [
+ "BackgroundSelect",
+ "ChannelSelector",
+ "DownloadAndLoadFlorence2Model",
+ "DownloadAndLoadSAM2Model",
+ "FaceSwap",
+ "FalDifferentialDiffusion",
+ "FalDiffusion",
+ "FetchFromRedis",
+ "FetchJsonFromSurreal",
+ "Florence2Run",
+ "Florence2toCoordinates",
+ "ForegroundMask",
+ "GetLayerMask",
+ "MaskImage",
+ "Sam2AutoSegmentation",
+ "Sam2Segmentation",
+ "Sam2VideoSegmentation",
+ "Sam2VideoSegmentationAddPoints",
+ "SaveImageToS3",
+ "SaveJsonToSurreal",
+ "SaveTextToSurreal",
+ "SaveToRedis",
+ "SendImageOnWebSocket",
+ "SendJsonOnWebSocket",
+ "SeparateMask"
+ ],
+ {
+ "title_aux": "comfyui-tensorop"
+ }
+ ],
+ "https://github.com/un-seen/comfyui_segment_anything_plus": [
+ [
+ "GroundingDinoModelLoader (segment anything plus)",
+ "GroundingDinoSAMSegment (segment anything plus)",
+ "InvertMask (segment anything plus)",
+ "IsMaskEmpty (segment anything plus)",
+ "SAMModelLoader (segment anything plus)"
+ ],
+ {
+ "title_aux": "ComfyUI Segment Anything"
+ }
+ ],
+ "https://github.com/unicough/comfy_openai_image_api": [
+ [
+ "OpenAI Image API"
+ ],
+ {
+ "title_aux": "OpenAI Image API with gpt-image-1"
+ }
+ ],
+ "https://github.com/unwdef/unwdef-nodes-comfyui": [
+ [
+ "RandomTextFromMultiline",
+ "RandomizeLoras",
+ "RandomizeLorasStack",
+ "TextMultilineWithVariables"
+ ],
+ {
+ "title_aux": "unwdef-nodes"
+ }
+ ],
+ "https://github.com/upseem/comfyui_sun_nodes": [
+ [
+ "SunxAI_BatchImageLoopCloseChen",
+ "SunxAI_BatchImageLoopOpenChen"
+ ],
+ {
+ "title_aux": "SunxAI Custom Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/upseem/comfyui_sunxAI_facetools": [
+ [
+ "ApplyInstantID",
+ "ColorAdjustNew(FaceParsing)",
+ "CropFaces",
+ "DetectFaceByIndex",
+ "DetectFaces",
+ "Example",
+ "InstantIDFaceAnalysis",
+ "InstantIDModelLoader",
+ "LoadFaceEmbeds",
+ "SaveFaceEmbeds",
+ "SaveImageWebsocketNew",
+ "SelectFloatByBool",
+ "VAEDecodeNew",
+ "VAEEncodeNew",
+ "WarpFacesBack"
+ ],
+ {
+ "title_aux": "comfyui_sunxAI_facetools"
+ }
+ ],
+ "https://github.com/usrname0/comfyui-holdup": [
+ [
+ "HoldUp"
+ ],
+ {
+ "title_aux": "comfyui-holdup"
+ }
+ ],
+ "https://github.com/ussoewwin/ComfyUI-DistorchMemoryManager": [
+ [
+ "DisTorchPurgeVRAMV2",
+ "MemoryManager",
+ "ModelPatchMemoryCleaner",
+ "PatchSageAttentionDM"
+ ],
+ {
+ "title_aux": "ComfyUI-DistorchMemoryManager"
+ }
+ ],
+ "https://github.com/ussoewwin/ComfyUI-NunchakuFluxLoraStacker": [
+ [
+ "FastGroupsBypasserV2",
+ "FluxLoraMultiLoader",
+ "ModelPatchLoaderCustom"
+ ],
+ {
+ "title_aux": "ComfyUI-NunchakuFluxLoraStacker"
+ }
+ ],
+ "https://github.com/ussoewwin/ComfyUI-QwenImageLoraLoader": [
+ [
+ "NunchakuQwenImageLoraLoader",
+ "NunchakuQwenImageLoraStack"
+ ],
+ {
+ "title_aux": "ComfyUI-QwenImageLoraLoader"
+ }
+ ],
+ "https://github.com/vadimcro/VKRiez-Edge": [
+ [
+ "VKriezEnhancedEdgePreprocessor",
+ "VKriezHybridEdgePreprocessor"
+ ],
+ {
+ "title_aux": "VKRiez-Edge"
+ }
+ ],
+ "https://github.com/vahidzxc/va-nodes": [
+ [
+ "VA_Seed"
+ ],
+ {
+ "title_aux": "va-nodes"
+ }
+ ],
+ "https://github.com/vahlok-alunmid/ComfyUI-ExtendIPAdapterClipVision": [
+ [
+ "EXTEND_CLIP_VISION_INPUT_SIZE",
+ "IPAdapterAdvancedSizeAware"
+ ],
+ {
+ "title_aux": "ComfyUI-ExtendIPAdapterClipVision"
+ }
+ ],
+ "https://github.com/vaishnav-vn/va1": [
+ [
+ "RandomAspectRatioMask"
+ ],
+ {
+ "title_aux": "va1"
+ }
+ ],
+ "https://github.com/valofey/Openrouter-Node": [
+ [
+ "OpenrouterNode"
+ ],
+ {
+ "title_aux": "OpenRouter Node"
+ }
+ ],
+ "https://github.com/vanche1212/ComfyUI-InspireMusic": [
+ [
+ "InspireMusicTextToMusic"
+ ],
+ {
+ "title_aux": "ComfyUI InspireMusic Plugin"
+ }
+ ],
+ "https://github.com/vanche1212/ComfyUI-ZMG-Nodes": [
+ [
+ "API Request Node",
+ "CombineImageAudioToVideoNode",
+ "Empty Image Node",
+ "JSON Builder Node",
+ "JSON Parser Node",
+ "JsonBuilderNode",
+ "LoadAudioFromUrlNode",
+ "LoadImageFromUrlNode",
+ "MultilinePromptNode",
+ "OSSUploadNode",
+ "RemoveEmptyLinesNode",
+ "SaveVideoRGBA",
+ "TextToImageNode"
+ ],
+ {
+ "title_aux": "ZMG PLUGIN"
+ }
+ ],
+ "https://github.com/vanillacode314/SimpleWildcardsComfyUI": [
+ [
+ "SimpleConcat",
+ "SimpleWildcard"
+ ],
+ {
+ "author": "VanillaCode314",
+ "description": "A simple wildcard node for ComfyUI. Can also be used a style prompt node.",
+ "nickname": "Simple Wildcard",
+ "title": "Simple Wildcard",
+ "title_aux": "Simple Wildcard"
+ }
+ ],
+ "https://github.com/vantagewithai/Vantage-DreamOmni2": [
+ [
+ "TextEncodeDreamOmni2",
+ "VantageAdaptiveImageGrid"
+ ],
+ {
+ "title_aux": "Vantage-DreamOmni2"
+ }
+ ],
+ "https://github.com/vantagewithai/Vantage-DyPE": [
+ [
+ "VantageFluxDyPEPatch"
+ ],
+ {
+ "title_aux": "Vantage-DyPE"
+ }
+ ],
+ "https://github.com/vantagewithai/Vantage-HunyuanFoley": [
+ [
+ "HunyuanFoleyDenoiser",
+ "HunyuanFoleyVAEDecode",
+ "HunyuanTextEncode",
+ "HunyuanVisualEncode"
+ ],
+ {
+ "title_aux": "Vantage-HunyuanFoley"
+ }
+ ],
+ "https://github.com/vantagewithai/Vantage-Nodes": [
+ [
+ "AdvancedCalculator",
+ "AppendImageBatch",
+ "AppendLatentBatch",
+ "CastAnyToIntStringFloat",
+ "ConditionalPassThrough",
+ "DelimiterSplit",
+ "IndexWrap",
+ "JoinImageBatch",
+ "JoinLatentBatch",
+ "PromptSceneRouter",
+ "QwenTTSModelDownloader",
+ "QwenTTSMultiSpeakerNode",
+ "QwenTTSSpeakerBankNode",
+ "QwenTTSVoiceClonePromptNode",
+ "QwenTTSVoiceDesignNode",
+ "RegexFilter",
+ "StringJoiner",
+ "StringListIndex",
+ "StringListRandom",
+ "StringListStepper",
+ "SwitchAny",
+ "SwitchAnyByIndex",
+ "SwitchImageByIndex",
+ "SwitchLatentByIndex",
+ "ValidateImageShape",
+ "VantageGGUFLoader",
+ "VantageWanBlockSwap"
+ ],
+ {
+ "title_aux": "Vantage-Nodes"
+ }
+ ],
+ "https://github.com/vantagewithai/Vantage-Step-Audio-EditX": [
+ [
+ "EditXModelLoader",
+ "EditXMultiVoiceCloner",
+ "EditXSingleVoiceCloner",
+ "EditXSingleVoiceClonerFromPath",
+ "EditXSingleVoiceEditor",
+ "EditXSingleVoiceEditorFromPath",
+ "LoadSpeakers"
+ ],
+ {
+ "title_aux": "Vantage-Step-Audio-EditX"
+ }
+ ],
+ "https://github.com/vantagewithai/VantageLongWanVideo": [
+ [
+ "VantageI2VDualLooper",
+ "VantageI2VSingleLooper",
+ "VantageProject"
+ ],
+ {
+ "title_aux": "Vantage Long Wan Video"
+ }
+ ],
+ "https://github.com/var1ableX/ComfyUI_Accessories": [
+ [
+ "ACC_AnyCast",
+ "AccMakeListNode",
+ "GetMaskDimensions",
+ "GetRandomDimensions",
+ "isImageEmpty",
+ "isMaskEmpty"
+ ],
+ {
+ "title_aux": "ComfyUI_Accessories"
+ }
+ ],
+ "https://github.com/vault-developer/comfyui-image-blender": [
+ [
+ "ImageBlender"
+ ],
+ {
+ "title_aux": "ImageBlender"
+ }
+ ],
+ "https://github.com/veighnsche/comfyui_gr85": [
+ [
+ "GR85_ImageDimensionResizer",
+ "GR85_ImageSizer",
+ "GR85_ImageSizerAll",
+ "GR85_NextSeed",
+ "GR85_RandomFloat",
+ "GR85_RandomInt",
+ "GR85_RandomRatio",
+ "GR85_SeedBasedOutputSelector",
+ "GR85_SimpleWildcardPicker",
+ "GR85_TagInjector",
+ "GR85_TagInjectorDuo",
+ "GR85_TagInjectorLarge",
+ "GR85_TagInjectorSingle"
+ ],
+ {
+ "title_aux": "comfyui_gr85"
+ }
+ ],
+ "https://github.com/vekitan55/SimpleFlux1Merger": [
+ [
+ "ExpertFlux1Merge",
+ "SimplifiedFlux1Merge"
+ ],
+ {
+ "title_aux": "Simple Flux.1 Merger for ComfyUI"
+ }
+ ],
+ "https://github.com/verIdyia/ComfyUI-Qwen-Image-DF11": [
+ [
+ "DFloat11QwenImageLoader",
+ "QwenImageAspectRatio",
+ "QwenImageDecode",
+ "QwenImagePresetSampler",
+ "QwenImageSampler",
+ "QwenImageTextEncode"
+ ],
+ {
+ "title_aux": "ComfyUI Qwen-Image DFloat11 Nodes"
+ }
+ ],
+ "https://github.com/victorchall/comfyui_webcamcapture": [
+ [
+ "WebcamCapture"
+ ],
+ {
+ "title_aux": "Comfyui Webcam capture node"
+ }
+ ],
+ "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration": [
+ [
+ "ChatGptPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-Chat-GPT-Integration"
+ }
+ ],
+ "https://github.com/violet-chen/comfyui-psd2png": [
+ [
+ "Psd2Png",
+ "StringInsert"
+ ],
+ {
+ "title_aux": "comfyui-psd2png"
+ }
+ ],
+ "https://github.com/violet0927/ComfyUI-HuggingFaceLoraUploader": [
+ [
+ "HuggingFaceLoraUploader",
+ "ModelScopeLoraUploader"
+ ],
+ {
+ "title_aux": "Hugging Face LoRA Uploader"
+ }
+ ],
+ "https://github.com/viperyl/ComfyUI-RGT": [
+ [
+ "RGT Upscale",
+ "RGT_Upscale"
+ ],
+ {
+ "title_aux": "ComfyUI-RGT"
+ }
+ ],
+ "https://github.com/visualbruno/ComfyUI-Hunyuan3d-2-1": [
+ [
+ "Hy3D21CameraConfig",
+ "Hy3D21ExportMesh",
+ "Hy3D21GenerateMultiViewsBatch",
+ "Hy3D21IMRemesh",
+ "Hy3D21LoadImageWithTransparency",
+ "Hy3D21LoadMesh",
+ "Hy3D21MeshGenerationBatch",
+ "Hy3D21MeshUVWrap",
+ "Hy3D21MeshlibDecimate",
+ "Hy3D21MultiViewsGeneratorWithMetaData",
+ "Hy3D21PostprocessMesh",
+ "Hy3D21ResizeImages",
+ "Hy3D21SimpleMeshlibDecimate",
+ "Hy3D21UseMultiViews",
+ "Hy3D21UseMultiViewsFromMetaData",
+ "Hy3D21VAEConfig",
+ "Hy3D21VAEDecode",
+ "Hy3D21VAELoader",
+ "Hy3DBakeMultiViews",
+ "Hy3DBakeMultiViewsWithMetaData",
+ "Hy3DHighPolyToLowPolyBakeMultiViewsWithMetaData",
+ "Hy3DInPaint",
+ "Hy3DMeshGenerator",
+ "Hy3DMultiViewsGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-Hunyuan3d-2-1"
+ }
+ ],
+ "https://github.com/visualbruno/ComfyUI-Trellis2": [
+ [
+ "Trellis2BatchSimplifyMeshAndExport",
+ "Trellis2Continue",
+ "Trellis2ExportMesh",
+ "Trellis2FillHolesWithMeshlib",
+ "Trellis2LoadImageWithTransparency",
+ "Trellis2LoadMesh",
+ "Trellis2LoadModel",
+ "Trellis2MeshRefiner",
+ "Trellis2MeshTexturing",
+ "Trellis2MeshWithVoxelAdvancedGenerator",
+ "Trellis2MeshWithVoxelGenerator",
+ "Trellis2MeshWithVoxelToMeshlibMesh",
+ "Trellis2MeshWithVoxelToTrimesh",
+ "Trellis2OvoxelExportToGLB",
+ "Trellis2PostProcess2",
+ "Trellis2PostProcessAndUnWrapAndRasterizer",
+ "Trellis2PostProcessMesh",
+ "Trellis2PreProcessImage",
+ "Trellis2ProgressiveSimplify",
+ "Trellis2ReconstructMesh",
+ "Trellis2Remesh",
+ "Trellis2RemeshWithQuad",
+ "Trellis2SimplifyMesh",
+ "Trellis2SimplifyTrimesh",
+ "Trellis2SmoothNormals",
+ "Trellis2TrimeshToMeshWithVoxel",
+ "Trellis2UnWrapAndRasterizer"
+ ],
+ {
+ "title_aux": "ComfyUI-Trellis2"
+ }
+ ],
+ "https://github.com/vivax3794/ComfyUI-Sub-Nodes": [
+ [
+ "VIV_Default",
+ "VIV_Subgraph",
+ "VIV_Subgraph_Inputs",
+ "VIV_Subgraph_Outputs"
+ ],
+ {
+ "title_aux": "ComfyUI-Sub-Nodes"
+ }
+ ],
+ "https://github.com/vivax3794/ComfyUI-Vivax-Nodes": [
+ [
+ "Any String",
+ "Chunk Up",
+ "Get Chunk",
+ "Inspect",
+ "Join Chunks",
+ "Model From URL"
+ ],
+ {
+ "title_aux": "ComfyUI-Vivax-Nodes"
+ }
+ ],
+ "https://github.com/vjumpkung/ComfyUI-Musubi-Tuner-LoRA-Loader": [
+ [
+ "MusubiTunerLoRALoaderModelOnly"
+ ],
+ {
+ "title_aux": "ComfyUI-Musubi-Tuner-LoRA-Loader"
+ }
+ ],
+ "https://github.com/vjumpkung/ComfyUI-STARWrapper": [
+ [
+ "STARVSRNode"
+ ],
+ {
+ "title_aux": "ComfyUI-STARWrapper"
+ }
+ ],
+ "https://github.com/vkff5833/ComfyUI-MobileClient": [
+ [
+ "MobileClient"
+ ],
+ {
+ "title_aux": "ComfyUI-MobileClient"
+ }
+ ],
+ "https://github.com/vkff5833/ComfyUI-PromptConverter": [
+ [
+ "PromptConverter",
+ "PromptConverterWithFilter"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptConverter"
+ }
+ ],
+ "https://github.com/vladpro3/ComfyUI_BishaNodes": [
+ [
+ "CreatePromptsWithTextFromFile",
+ "EmptyLatentSizePicker",
+ "LoadDataFromFiles",
+ "SimpleSizePicker",
+ "WildcardReplace",
+ "WildcardReplaceFromFile"
+ ],
+ {
+ "title_aux": "ComfyUI_BishaNodes"
+ }
+ ],
+ "https://github.com/voxta-ai/ComfyUI-VoxtaNodes": [
+ [
+ "VoxtaExportCharacter",
+ "VoxtaFilterExistingCombinations",
+ "VoxtaOutputFolder"
+ ],
+ {
+ "title_aux": "Voxta ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/vrgamegirl19/comfyui-vrgamedevgirl": [
+ [
+ "BeatImpactAnalysisNode",
+ "BeatSceneDurationNode",
+ "ColorMatchToReference",
+ "FastFilmGrain",
+ "FastLaplacianSharpen",
+ "FastSobelSharpen",
+ "FastUnsharpSharpen",
+ "IndexedImageFromFolder",
+ "SRTLyricsMerger",
+ "VRGDG_AudioCrop",
+ "VRGDG_AudioCropTime",
+ "VRGDG_AudioDelayByIndex",
+ "VRGDG_BuildVideoOutputPath_General",
+ "VRGDG_BuildVideoOutputPath_General_SRT",
+ "VRGDG_CalculateSetsFromAudio",
+ "VRGDG_CalculateSetsFromAudio_Queue",
+ "VRGDG_CleanAudio",
+ "VRGDG_CombinevideosV2",
+ "VRGDG_CombinevideosV3",
+ "VRGDG_CombinevideosV5",
+ "VRGDG_ConditionalLoadVideos",
+ "VRGDG_CreateFinalVideo",
+ "VRGDG_CreateFinalVideo_SRT",
+ "VRGDG_DisplayIndex",
+ "VRGDG_DurationIndexFloat",
+ "VRGDG_Extract_Frame_Number",
+ "VRGDG_GetFilenamePrefix",
+ "VRGDG_GetIndexNumber",
+ "VRGDG_GetRunIndexFromJson",
+ "VRGDG_HumoReminderNode",
+ "VRGDG_ImageIndexMap",
+ "VRGDG_ImageSwitch4",
+ "VRGDG_IndexedPromptChunker",
+ "VRGDG_IndexedPromptChunkerV2",
+ "VRGDG_LLM_OutputSaver",
+ "VRGDG_LLM_PromptBatcher",
+ "VRGDG_LoadAudioSplitDynamic",
+ "VRGDG_LoadAudioSplitUpload",
+ "VRGDG_LoadAudioSplit_General",
+ "VRGDG_LoadAudioSplit_HUMO",
+ "VRGDG_LoadAudioSplit_HUMO_Transcribe",
+ "VRGDG_LoadAudioSplit_HUMO_TranscribeV2",
+ "VRGDG_LoadAudioSplit_HUMO_TranscribeV3",
+ "VRGDG_LoadAudioSplit_SRTOnly",
+ "VRGDG_LoadAudioSplit_Wan22HumoFMML",
+ "VRGDG_LoadVideos",
+ "VRGDG_LyricsEmotionMerger",
+ "VRGDG_ManualLyricsExtractor",
+ "VRGDG_ManualLyricsExtractor_SRT",
+ "VRGDG_MusicVideoPromptCreator",
+ "VRGDG_MusicVideoPromptCreatorV2",
+ "VRGDG_MusicVideoPromptCreatorV3",
+ "VRGDG_NanoBananaPro",
+ "VRGDG_PadVideoWithLastFrame",
+ "VRGDG_PostRunIndexStepper",
+ "VRGDG_PromptSpitterWithIndex",
+ "VRGDG_PromptSplitter",
+ "VRGDG_PromptSplitter2",
+ "VRGDG_PromptSplitter4",
+ "VRGDG_PromptSplitterForFL",
+ "VRGDG_PromptSplitterForFMML",
+ "VRGDG_PromptSplitterForManual",
+ "VRGDG_PromptSplitterJson",
+ "VRGDG_PromptSplitterV2",
+ "VRGDG_PromptSplitterWithIndex",
+ "VRGDG_PromptSplitter_General",
+ "VRGDG_PromptTemplateBuilder",
+ "VRGDG_QueueTriggerFromAudio",
+ "VRGDG_RunStateLogger_SRT",
+ "VRGDG_SmartSplitTextTwo",
+ "VRGDG_SpeechEmotionExtractor",
+ "VRGDG_SplitPrompt_T2I_I2V",
+ "VRGDG_StoryBoardCreator",
+ "VRGDG_StringConcat",
+ "VRGDG_ThemeSplitter",
+ "VRGDG_TimecodeFromIndex",
+ "VRGDG_TranscribeText",
+ "VRGDG_TriggerCounter",
+ "VRGDG_TrimFinalClip",
+ "VRGDG_TrimImageBatch",
+ "VRGDG_TrimImageBatch_SRTOnly",
+ "VRGDG_VideoSplitter"
+ ],
+ {
+ "title_aux": "VRGameDevGirl Video Enhancement Nodes"
+ }
+ ],
+ "https://github.com/vsaan212/Vsaan212-workflow-utilities": [
+ [
+ "ComfyUI_ScenarioSelector",
+ "ComfyUI_subjectselector",
+ "OptionalSwitchLoRA",
+ "Vsaan_OptionalSwitchLoRA",
+ "Vsaan_ScenarioSelector",
+ "Vsaan_SubjectSelector",
+ "Vsaan_TextSplit"
+ ],
+ {
+ "title_aux": "Vsaan212-workflow-utilities"
+ }
+ ],
+ "https://github.com/vsevolod-oparin/comfyui-kandinsky22": [
+ [
+ "comfy-kandinsky22-decoder-loader",
+ "comfy-kandinsky22-hint-combiner",
+ "comfy-kandinsky22-image-encoder",
+ "comfy-kandinsky22-img-latents",
+ "comfy-kandinsky22-latents",
+ "comfy-kandinsky22-movq-decoder",
+ "comfy-kandinsky22-positive-text-encoder",
+ "comfy-kandinsky22-prior-averaging-2",
+ "comfy-kandinsky22-prior-averaging-3",
+ "comfy-kandinsky22-prior-averaging-4",
+ "comfy-kandinsky22-prior-loader",
+ "comfy-kandinsky22-text-encoder",
+ "comfy-kandinsky22-unet-decoder"
+ ],
+ {
+ "title_aux": "Kandinsky 2.2 ComfyUI Plugin"
+ }
+ ],
+ "https://github.com/vslinx/ComfyUI-vslinx-nodes": [
+ [
+ "vsLinx_AppendLorasFromNodeToString",
+ "vsLinx_BooleanAndOperator",
+ "vsLinx_BooleanFlip",
+ "vsLinx_BooleanOrOperator",
+ "vsLinx_BypassOnBool",
+ "vsLinx_FitImageIntoBBoxMask",
+ "vsLinx_ImpactMultilineWildcardText",
+ "vsLinx_LoadSelectedImagesBatch",
+ "vsLinx_LoadSelectedImagesList",
+ "vsLinx_MuteOnBool",
+ "vsLinx_UpscaleByFactorWithModel"
+ ],
+ {
+ "title_aux": "ComfyUI vsLinx Nodes"
+ }
+ ],
+ "https://github.com/vuhung3990/comfyui-nsfw-guard": [
+ [
+ "NSFWCheck"
+ ],
+ {
+ "title_aux": "NSFW Guard"
+ }
+ ],
+ "https://github.com/vuongminh1907/ComfyUI_ZenID": [
+ [
+ "ApplyZenID",
+ "InstantIDFaceAnalysis",
+ "InstantIDModelLoader",
+ "ZenIDCombineFace"
+ ],
+ {
+ "title_aux": "ComfyUI_ZenID"
+ }
+ ],
+ "https://github.com/wTechArtist/ComfyUI-CustomNodes": [
+ [
+ "GPT4 WWL",
+ "IPAdapter FaceID With Bool",
+ "IPAdapter Mad Scientist Weight_Type",
+ "Image Blending Mode Mask",
+ "Load Image With Bool",
+ "Load Lora With Shared"
+ ],
+ {
+ "title_aux": "ComfyUI-CustomNodes"
+ }
+ ],
+ "https://github.com/wTechArtist/ComfyUI-StableDelight-weiweiliang": [
+ [
+ "WWL_StableDelight"
+ ],
+ {
+ "title_aux": "ComfyUI-StableDelight-weiweiliang"
+ }
+ ],
+ "https://github.com/wTechArtist/ComfyUI_VVL_VideoCamera_Advanced": [
+ [
+ "VGGTVideoCameraNode",
+ "VVLVGGTLoader"
+ ],
+ {
+ "title_aux": "ComfyUI VVL Video Camera Advanced"
+ }
+ ],
+ "https://github.com/wakattac/ComfyUI-AbstractImaGen": [
+ [
+ "AbstractImageBackground",
+ "AbstractImageFilledShapes",
+ "AbstractImageGenerator",
+ "AbstractImageLines",
+ "AbstractImageNoise",
+ "AbstractImagePattern",
+ "AbstractImagePostprocessing"
+ ],
+ {
+ "title_aux": "ComfyUI-AbstractImaGen"
+ }
+ ],
+ "https://github.com/walke2019/ComfyUI-GGUF-VLM": [
+ [
+ "LocalTextModelLoader",
+ "MemoryManagerNode",
+ "MultiImageAnalysis",
+ "NexaServiceStatus",
+ "RemoteAPIConfig",
+ "RemoteTextModelSelector",
+ "RemoteVisionAnalysis",
+ "RemoteVisionModelConfig",
+ "SystemPromptConfig",
+ "TextGeneration",
+ "TextGenerationNode",
+ "TextModelLoader",
+ "VisionLanguageNode",
+ "VisionModelLoader",
+ "VisionModelLoaderTransformers"
+ ],
+ {
+ "title_aux": "Qwen2.5-VL GGUF Nodes"
+ }
+ ],
+ "https://github.com/wallen0322/ComfyUI-AE-Animation": [
+ [
+ "AEAnimation"
+ ],
+ {
+ "title_aux": "ComfyUI-AE-Animation"
+ }
+ ],
+ "https://github.com/wallen0322/ComfyUI-QI-QwenEditSafe": [
+ [
+ "QI_DyPE",
+ "QI_QwenVLClipWrapper",
+ "QI_RefEditEncode_Safe",
+ "QI_TextEncodeQwenImageEdit_Safe",
+ "QI_VAEDecodeLockSize"
+ ],
+ {
+ "title_aux": "ComfyUI-QI-QwenEditSafe"
+ }
+ ],
+ "https://github.com/wallen0322/ComfyUI-SageAttention3": [
+ [
+ "Sage3AttentionOnlySwitch"
+ ],
+ {
+ "title_aux": "ComfyUI-SageAttention3"
+ }
+ ],
+ "https://github.com/wallen0322/ComfyUI-Wan22FMLF": [
+ [
+ "WanAdvancedExtractLastFrames",
+ "WanAdvancedExtractLastImages",
+ "WanAdvancedI2V",
+ "WanFirstMiddleLastFrameToVideo",
+ "WanFourFrameReferenceUltimate",
+ "WanMultiFrameRefToVideo",
+ "WanMultiImageLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Wan22FMLF"
+ }
+ ],
+ "https://github.com/wallen0322/ComfyUI-WanAnimate-Enhancer": [
+ [
+ "WanAnimateModelEnhancer",
+ "WanAnimateToVideoEnhanced"
+ ],
+ {
+ "title_aux": "ComfyUI-WanAnimate-Enhancer"
+ }
+ ],
+ "https://github.com/wallen0322/ComfyUI-qwenmultianglelight": [
+ [
+ "QwenMultiangleLightningNode"
+ ],
+ {
+ "title_aux": "ComfyUI-qwenmultianglelight"
+ }
+ ],
+ "https://github.com/wallish77/wlsh_nodes": [
+ [
+ "Build Filename String (WLSH)",
+ "CLIP +/- w/Text Unified (WLSH)",
+ "CLIP Positive-Negative (WLSH)",
+ "CLIP Positive-Negative XL (WLSH)",
+ "CLIP Positive-Negative XL w/Text (WLSH)",
+ "CLIP Positive-Negative w/Text (WLSH)",
+ "Checkpoint Loader w/Name (WLSH)",
+ "Empty Latent by Pixels (WLSH)",
+ "Empty Latent by Ratio (WLSH)",
+ "Empty Latent by Size (WLSH)",
+ "Generate Border Mask (WLSH)",
+ "Grayscale Image (WLSH)",
+ "Image Load with Metadata (WLSH)",
+ "Image Save with Prompt (WLSH)",
+ "Image Save with Prompt File (WLSH)",
+ "Image Save with Prompt/Info (WLSH)",
+ "Image Save with Prompt/Info File (WLSH)",
+ "Image Scale By Factor (WLSH)",
+ "Image Scale by Shortside (WLSH)",
+ "KSamplerAdvanced (WLSH)",
+ "Multiply Integer (WLSH)",
+ "Outpaint to Image (WLSH)",
+ "Prompt Weight (WLSH)",
+ "Quick Resolution Multiply (WLSH)",
+ "Resolutions by Ratio (WLSH)",
+ "SDXL Quick Empty Latent (WLSH)",
+ "SDXL Quick Image Scale (WLSH)",
+ "SDXL Resolutions (WLSH)",
+ "SDXL Steps (WLSH)",
+ "Save Positive Prompt(WLSH)",
+ "Save Prompt (WLSH)",
+ "Save Prompt/Info (WLSH)",
+ "Seed and Int (WLSH)",
+ "Seed to Number (WLSH)",
+ "Simple Pattern Replace (WLSH)",
+ "Simple String Combine (WLSH)",
+ "Time String (WLSH)",
+ "Upscale by Factor with Model (WLSH)",
+ "VAE Encode for Inpaint w/Padding (WLSH)"
+ ],
+ {
+ "title_aux": "wlsh_nodes"
+ }
+ ],
+ "https://github.com/wangyff-code/ComfyUI-PixelArt-Converter": [
+ [
+ "PixelArtConverter"
+ ],
+ {
+ "title_aux": "ComfyUI PixelArt Converter"
+ }
+ ],
+ "https://github.com/wanjin123111/ComfyUI-3D-Human-Pose": [
+ [
+ "ThreeD_Human_Pose"
+ ],
+ {
+ "title_aux": "ComfyUI-3D-Human-Pose"
+ }
+ ],
+ "https://github.com/wasilone11/comfyui-pvm-node": [
+ [
+ "SyncPVMessengerNode"
+ ],
+ {
+ "title_aux": "ComfyUI Sync PVM Node"
+ }
+ ],
+ "https://github.com/wasilone11/comfyui-sync-lipsync-node": [
+ [
+ "SyncLipsyncInputNode",
+ "SyncLipsyncMainNode",
+ "SyncLipsyncOutputNode"
+ ],
+ {
+ "title_aux": "ComfyUI Sync Lipsync Node"
+ }
+ ],
+ "https://github.com/watarika/ComfyUI-SendToEagle-w-Metadata": [
+ [
+ "CreateExtraMetadata",
+ "SendToEagleWithMetadata",
+ "SendToEagleWithMetadataSimple"
+ ],
+ {
+ "title_aux": "ComfyUI-SendToEagle-w-Metadata"
+ }
+ ],
+ "https://github.com/wawahuy/ComfyUI-HTTP": [
+ [
+ "Base64ToImage",
+ "HTTPAuth",
+ "HTTPConvertJSON",
+ "HTTPDelete",
+ "HTTPDisplayResult",
+ "HTTPFileUpload",
+ "HTTPFormData",
+ "HTTPFormDataConcat",
+ "HTTPFormDataItem",
+ "HTTPFormFileItem",
+ "HTTPFormImageItem",
+ "HTTPFormTextItem",
+ "HTTPGet",
+ "HTTPGetJSONField",
+ "HTTPHead",
+ "HTTPImageLoader",
+ "HTTPOptions",
+ "HTTPPatch",
+ "HTTPPost",
+ "HTTPPut",
+ "HTTPSessionManager",
+ "HTTPUtils",
+ "ImageToBase64"
+ ],
+ {
+ "title_aux": "ComfyUI HTTP - REST API Nodes"
+ }
+ ],
+ "https://github.com/web3nomad/ComfyUI_Invisible_Watermark": [
+ [
+ "InvisibleWatermarkEncode"
+ ],
+ {
+ "title_aux": "ComfyUI Invisible Watermark"
+ }
+ ],
+ "https://github.com/weberjc/book-cover-finder-comfy": [
+ [
+ "BookCoverFinder"
+ ],
+ {
+ "title_aux": "BookCoverFinder"
+ }
+ ],
+ "https://github.com/webfiltered/DebugNode-ComfyUI": [
+ [
+ "WTFDebugNode"
+ ],
+ {
+ "title_aux": "WTF? - a debug node for ComfyUI"
+ }
+ ],
+ "https://github.com/webuilder/WB-ComfyUI-Utils": [
+ [
+ "WB_AudioDuration"
+ ],
+ {
+ "title_aux": "ComfyUI WB Utils"
+ }
+ ],
+ "https://github.com/weekii/ComfyUI-GGUF-FX": [
+ [
+ "GGUFModelManager",
+ "LocalTextModelLoader",
+ "MultiImageAnalysis",
+ "MultiImageComparison",
+ "NexaModelSelector",
+ "NexaServiceStatus",
+ "NexaTextGeneration",
+ "RemoteTextModelSelector",
+ "SystemPromptConfig",
+ "TextGeneration",
+ "TextGenerationNode",
+ "TextModelLoader",
+ "VisionLanguageNode",
+ "VisionLanguageNodeTransformers",
+ "VisionModelLoader",
+ "VisionModelLoaderTransformers"
+ ],
+ {
+ "title_aux": "ComfyUI-GGUF-FX"
+ }
+ ],
+ "https://github.com/weekii/comfyui-save-image-pro": [
+ [
+ "LoadImageFromURLPro",
+ "LoadMaskFromURLPro",
+ "SaveImageAdvanced",
+ "SaveImageSimple"
+ ],
+ {
+ "author": "weekii",
+ "description": "\u4e13\u4e1a\u7ea7\u56fe\u50cf\u4fdd\u5b58\u63d2\u4ef6\uff0c\u652f\u6301\u591a\u683c\u5f0f\u3001\u81ea\u5b9a\u4e49\u547d\u540d\u548c\u9ad8\u7ea7\u529f\u80fd",
+ "nickname": "Save Image Pro",
+ "title": "ComfyUI Save Image Pro",
+ "title_aux": "comfyui-save-image-pro"
+ }
+ ],
+ "https://github.com/weilin9999/WeiLin-Comfyui-Tools": [
+ [
+ "WeiLinPromptUI",
+ "WeiLinPromptUIOnlyLoraStack",
+ "WeiLinPromptUIWithoutLora"
+ ],
+ {
+ "title_aux": "WeiLin-Comfyui-Tools"
+ }
+ ],
+ "https://github.com/welltop-cn/ComfyUI-TeaCache": [
+ [
+ "CompileModel",
+ "TeaCache",
+ "TeaCacheForCogVideoX"
+ ],
+ {
+ "title_aux": "ComfyUI-TeaCache"
+ }
+ ],
+ "https://github.com/wentao-uw/ComfyUI-template-matching": [
+ [
+ "IsMaskEmptyNode (template matching)",
+ "TemplateMatching (template matching)"
+ ],
+ {
+ "title_aux": "ComfyUI template matching"
+ }
+ ],
+ "https://github.com/westNeighbor/ComfyUI-ultimate-openpose-editor": [
+ [
+ "AppendageEditorNode",
+ "OpenposeEditorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-ultimate-openpose-editor"
+ }
+ ],
+ "https://github.com/westNeighbor/ComfyUI-ultimate-openpose-estimator": [
+ [
+ "OpenposeEstimatorNode"
+ ],
+ {
+ "title_aux": "ComfyUI-ultimate-openpose-estimator"
+ }
+ ],
+ "https://github.com/westNeighbor/ComfyUI-ultimate-openpose-render": [
+ [
+ "OpenposeRenderNode"
+ ],
+ {
+ "title_aux": "ComfyUI-ultimate-openpose-render"
+ }
+ ],
+ "https://github.com/wgedeon/comfyui_play_traversal": [
+ [
+ "fot_BatchData",
+ "fot_PlayAct",
+ "fot_PlayActData",
+ "fot_PlayContinue",
+ "fot_PlayData",
+ "fot_PlayStart",
+ "fot_Scene",
+ "fot_SceneBackdrop",
+ "fot_SceneBackdropData",
+ "fot_SceneBeat",
+ "fot_SceneBeatData",
+ "fot_SceneData"
+ ],
+ {
+ "title_aux": "comfyui_play_traversal"
+ }
+ ],
+ "https://github.com/whatbirdisthat/cyberdolphin": [
+ [
+ "CyberDolphin GPT-3.5 (Simple)",
+ "CyberDolphin Gradio",
+ "CyberDolphin OpenAI (Advanced)",
+ "CyberDolphin OpenAI Compatible",
+ "CyberDolphin OpenAI DALL\u00b7E",
+ "\ud83d\udc2c Gradio ChatInterface",
+ "\ud83d\udc2c OpenAI Advanced",
+ "\ud83d\udc2c OpenAI Compatible",
+ "\ud83d\udc2c OpenAI DALL\u00b7E",
+ "\ud83d\udc2c OpenAI Simple"
+ ],
+ {
+ "title_aux": "cyberdolphin"
+ }
+ ],
+ "https://github.com/whmc76/ComfyUI-Openpose-Editor-Plus": [
+ [
+ "CDL.OpenPoseEditorPlus"
+ ],
+ {
+ "title_aux": "ComfyUI-Openpose-Editor-Plus"
+ }
+ ],
+ "https://github.com/whmc76/ComfyUI-RemoveBackgroundSuite": [
+ [
+ "BiRefNetUltra_RBS",
+ "MaskProcessDetails_RBS",
+ "TransparentBackgroundUltra_RBS"
+ ],
+ {
+ "title_aux": "ComfyUI-RemoveBackgroundSuite"
+ }
+ ],
+ "https://github.com/whmc76/ComfyUI-UniversalToolkit": [
+ [
+ "APIImageGenerator_UTK",
+ "AudioCropProcessUTK",
+ "BboxVisualize_UTK",
+ "BestContextWindow_UTK",
+ "BlockifyMask_UTK",
+ "CheckMask_UTK",
+ "ColorMatch_UTK",
+ "ColorToMask_UTK",
+ "CropByMask_UTK",
+ "DepthMapBlur_UTK",
+ "EmptyUnitGenerator_UTK",
+ "Extract_Video_Frames_UTK",
+ "FillMaskedArea_UTK",
+ "GetImageRangeFromBatch_UTK",
+ "ImageAndMaskPreview_UTK",
+ "ImageBlendAdvance_UTK",
+ "ImageCombineAlpha_UTK",
+ "ImageConcatenateMulti_UTK",
+ "ImageConcatenate_UTK",
+ "ImageCropByMaskAndResize_UTK",
+ "ImageMaskScaleAs_UTK",
+ "ImagePadForOutpaintMasked_UTK",
+ "ImageRatioDetector_UTK",
+ "ImageRemoveAlpha_UTK",
+ "ImageScaleByAspectRatio_UTK",
+ "ImageScaleRestore_UTK",
+ "ImitationHueNode_UTK",
+ "LazySwitchKJ_UTK",
+ "LoadAudioPlusFromPath_UTK",
+ "LoadKontextPresets_UTK",
+ "LoraInfo_UTK",
+ "MaskAdd_UTK",
+ "MaskAnd_UTK",
+ "MaskSub_UTK",
+ "MathExpression_UTK",
+ "PurgeVRAM_UTK",
+ "ResizeImageVerKJ_UTK",
+ "RestoreCropBox_UTK",
+ "SeparateMasks_UTK",
+ "ShowAny_UTK",
+ "TextBoxNode_UTK",
+ "TextConcatenate_UTK",
+ "TextTranslatorAPI_UTK",
+ "ThinkRemover_UTK",
+ "Video_Prompt_Helper"
+ ],
+ {
+ "title_aux": "ComfyUI-UniversalToolkit"
+ }
+ ],
+ "https://github.com/wildminder/ComfyUI-Chatterbox": [
+ [
+ "ChatterboxTTS",
+ "ChatterboxVC"
+ ],
+ {
+ "title_aux": "ComfyUI-Chatterbox"
+ }
+ ],
+ "https://github.com/wildminder/ComfyUI-DyPE": [
+ [
+ "DyPE_FLUX"
+ ],
+ {
+ "title_aux": "ComfyUI-DyPE"
+ }
+ ],
+ "https://github.com/wildminder/ComfyUI-KEEP": [
+ [
+ "KEEP_FaceUpscaleImage",
+ "KEEP_ModelLoader",
+ "KEEP_ProcessImageSequence"
+ ],
+ {
+ "title_aux": "ComfyUI-KEEP"
+ }
+ ],
+ "https://github.com/wildminder/ComfyUI-KaniTTS": [
+ [
+ "KaniTTS"
+ ],
+ {
+ "title_aux": "ComfyUI-KaniTTS"
+ }
+ ],
+ "https://github.com/wildminder/ComfyUI-VibeVoice": [
+ [
+ "VibeVoiceTTS"
+ ],
+ {
+ "title_aux": "ComfyUI-VibeVoice"
+ }
+ ],
+ "https://github.com/wildminder/ComfyUI-VoxCPM": [
+ [
+ "VoxCPM_DatasetMaker",
+ "VoxCPM_LoraTrainer",
+ "VoxCPM_TTS",
+ "VoxCPM_TrainConfig"
+ ],
+ {
+ "title_aux": "ComfyUI-VoxCPM"
+ }
+ ],
+ "https://github.com/willchil/ComfyUI-Environment-Visualizer": [
+ [
+ "EnvironmentVisualizer",
+ "InterpolateEdges",
+ "MapEquirectangular"
+ ],
+ {
+ "title_aux": "ComfyUI-Environment-Visualizer"
+ }
+ ],
+ "https://github.com/willmiao/ComfyUI-Lora-Manager": [
+ [
+ "DebugMetadataLM",
+ "LoraCyclerLM",
+ "LoraLoaderLM",
+ "LoraPoolLM",
+ "LoraRandomizerLM",
+ "LoraStackerLM",
+ "LoraTextLoaderLM",
+ "PromptLM",
+ "SaveImageLM",
+ "TextLM",
+ "TriggerWordToggleLM",
+ "WanVideoLoraSelectLM",
+ "WanVideoLoraTextSelectLM"
+ ],
+ {
+ "title_aux": "ComfyUI-Lora-Manager"
+ }
+ ],
+ "https://github.com/windfancy/zsq_prompt": [
+ [
+ "BatchPromptJson",
+ "BatchPromptSelector",
+ "ConnectionString",
+ "DoubleCLIPEncode",
+ "FaceRestoreCFWithModel",
+ "FloatMathOperation",
+ "ImageAddText",
+ "ImageColorAdapter",
+ "ImageEmpty",
+ "IndexString",
+ "IntMathOperation",
+ "JoinImageBatch",
+ "LLMImage",
+ "LLMText",
+ "LoadImagesFromFolder",
+ "MaskToImage",
+ "OptionString",
+ "PersonMaskUltraV2",
+ "PortraitStyler",
+ "ReActorBuildFaceModel",
+ "ReActorMakeFaceModelBatch",
+ "ReActorSaveFaceModel",
+ "SaveJpgImage",
+ "StringInput",
+ "ZSQPixelLatent",
+ "ZSQRatioLatent",
+ "ZSQShowINT",
+ "ZSQShowText",
+ "ZsqLatent",
+ "checkpoint_sampler",
+ "checkpoint_sampler_dualclip",
+ "checkpoint_sampler_tripleclip",
+ "checkpoint_sampler_unet",
+ "controlnetStack",
+ "controlnetStack_2",
+ "face_reactor",
+ "face_reactor_plus",
+ "imageConcat",
+ "imageCount",
+ "imageCrop",
+ "imageDetailTransfer",
+ "imageFilter",
+ "imageFlip",
+ "imageGaussianBlur",
+ "imageRGB",
+ "imageRatio",
+ "imageResize",
+ "imageRotate",
+ "imageSaveSimple",
+ "imageScaleDown",
+ "imageScaleDownBy",
+ "imageSharpen",
+ "imageSize",
+ "imageTilesFromBatch",
+ "imagesSplitImage",
+ "loraStack",
+ "loraStack_2",
+ "stylesSelector",
+ "zsq_rmbg",
+ "zsqcheckpoint",
+ "zsqcontrolnet",
+ "zsqsampler"
+ ],
+ {
+ "title_aux": "zsq_prompt"
+ }
+ ],
+ "https://github.com/wings6407/ComfyUI_HBH-image_overlay": [
+ [
+ "HBH_ImageCoordinatePicker",
+ "HBH_ImageCoordinatePreview",
+ "HBH_ImageInteractivePicker",
+ "HBH_ImageOverlay",
+ "HBH_ImageOverlayPreview",
+ "HBH_ImagePreview"
+ ],
+ {
+ "title_aux": "ComfyUI_HBH-image_overlay"
+ }
+ ],
+ "https://github.com/wirytiox/ComfyUI-SelectStringFromListWithIndex": [
+ [
+ "StringFromList"
+ ],
+ {
+ "title_aux": "ComfyUI-SelectStringFromListWithIndex"
+ }
+ ],
+ "https://github.com/withmpx/mpx-comfyui-nodes": [
+ [
+ "Agent_PickBestImageFromList",
+ "Agent_ReflectionOnImageList",
+ "ImagesTo3DModels",
+ "LoadImageData",
+ "ObjectListToImageList",
+ "PickFromList",
+ "SaveModelsToDisk",
+ "ShowList",
+ "ShowString",
+ "StringListToStringList",
+ "StringListToText",
+ "TextToImage",
+ "TextToList",
+ "TextToObjectList",
+ "TextToScriptBreakdown",
+ "TextToStory",
+ "TextToText",
+ "TransformObjectList",
+ "TwoTextToText"
+ ],
+ {
+ "title_aux": "mpx-comfyui-nodes"
+ }
+ ],
+ "https://github.com/wizdroid/wizdroid-character": [
+ [
+ "WizdroidBackground",
+ "WizdroidCharacterEdit",
+ "WizdroidCharacterPrompt",
+ "WizdroidContestPrompt",
+ "WizdroidImageEdit",
+ "WizdroidLoRADataset",
+ "WizdroidLoRADatasetValidator",
+ "WizdroidLoRATrainer",
+ "WizdroidLoRAValidate",
+ "WizdroidMetaPrompt",
+ "WizdroidPhotoAspect",
+ "WizdroidPromptCombiner",
+ "WizdroidSceneGenerator"
+ ],
+ {
+ "title_aux": "Wizdroid Character Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/wjl0313/ComfyUI_KimNodes": [
+ [
+ "Add_ImageMetadata",
+ "Bitch_Filter",
+ "BoundingBox_Cropper",
+ "Crop_Paste",
+ "Distribute_Icons",
+ "Edge_Element_Cropper",
+ "IconDistributeByGrid",
+ "Icon_Position_Cropper",
+ "Image_Classification",
+ "Image_List_Splitter",
+ "Image_PixelFilter",
+ "Image_Resize",
+ "Image_Square_Pad",
+ "JSON_Image_Compositor",
+ "KimFilter",
+ "KimHDR",
+ "LoRA_Metadata_Reader",
+ "LoadImage_Metadata",
+ "Manual_MetadataInput",
+ "Mask_Add_Switch",
+ "Mask_Noise_Cleaner",
+ "Mask_White_Area_Ratio",
+ "MaxLength_ImageListSelector",
+ "Percentage_Cropper",
+ "Pixelate_Filter",
+ "Prompt_Loader",
+ "Prompt_Text",
+ "Save_Image",
+ "Seamless_Icon_Generator",
+ "Seamless_Tiling_Generator",
+ "Split_Mask",
+ "Text_Match",
+ "Text_Processor",
+ "Transparent_Area_Cropper",
+ "Transparent_Image_Filter",
+ "Whitening_Node",
+ "YOLOWorld_Match",
+ "YOLO_Crop",
+ "YOLO_Multi_Crop"
+ ],
+ {
+ "title_aux": "ComfyUI_KimNodes"
+ }
+ ],
+ "https://github.com/wmatson/easy-comfy-nodes": [
+ [
+ "EZAssocDictNode",
+ "EZAssocImgNode",
+ "EZAssocStrNode",
+ "EZEmptyDictNode",
+ "EZHttpPostNode",
+ "EZLoadImgBatchFromUrlsNode",
+ "EZLoadImgFromUrlNode",
+ "EZRemoveImgBackground",
+ "EZS3Uploader"
+ ],
+ {
+ "title_aux": "easy-comfy-nodes"
+ }
+ ],
+ "https://github.com/wmpmiles/comfyui-some-image-processing-stuff": [
+ [
+ "Blur Mask",
+ "Color Grading",
+ "Latent Zero Mask",
+ "Mask-Crop Inpaint | Post",
+ "Mask-Crop Inpaint | Pre",
+ "Mask-Crop | Post",
+ "Mask-Crop | Pre",
+ "Resample Image",
+ "Resample Latent",
+ "Resample Mask",
+ "Resampler | Area",
+ "Resampler | Jinc-Lanczos",
+ "Resampler | Lanczos",
+ "Resampler | Mitchell-Netravali",
+ "Resampler | Nearest-Neighbor",
+ "Resampler | Triangle",
+ "Scaler | Area",
+ "Scaler | Fixed",
+ "Scaler | Megapixels",
+ "Scaler | Pixel Deltas",
+ "Scaler | Side",
+ "Scaler | Sides Unlinked"
+ ],
+ {
+ "title_aux": "comfyui-some-image-processing-stuff"
+ }
+ ],
+ "https://github.com/woct0rdho/ComfyUI-RadialAttn": [
+ [
+ "PatchRadialAttn"
+ ],
+ {
+ "title_aux": "ComfyUI-RadialAttn"
+ }
+ ],
+ "https://github.com/wolfden/ComfyUi_PromptStylers": [
+ [
+ "SDXLPromptStylerAll",
+ "SDXLPromptStylerHorror",
+ "SDXLPromptStylerMisc",
+ "SDXLPromptStylerbyArtist",
+ "SDXLPromptStylerbyCamera",
+ "SDXLPromptStylerbyComposition",
+ "SDXLPromptStylerbyCyberpunkSurrealism",
+ "SDXLPromptStylerbyDepth",
+ "SDXLPromptStylerbyEnvironment",
+ "SDXLPromptStylerbyFantasySetting",
+ "SDXLPromptStylerbyFilter",
+ "SDXLPromptStylerbyFocus",
+ "SDXLPromptStylerbyImpressionism",
+ "SDXLPromptStylerbyLighting",
+ "SDXLPromptStylerbyMileHigh",
+ "SDXLPromptStylerbyMood",
+ "SDXLPromptStylerbyMythicalCreature",
+ "SDXLPromptStylerbyOriginal",
+ "SDXLPromptStylerbyQuantumRealism",
+ "SDXLPromptStylerbySteamPunkRealism",
+ "SDXLPromptStylerbySubject",
+ "SDXLPromptStylerbySurrealism",
+ "SDXLPromptStylerbyTheme",
+ "SDXLPromptStylerbyTimeofDay",
+ "SDXLPromptStylerbyWyvern",
+ "SDXLPromptbyCelticArt",
+ "SDXLPromptbyContemporaryNordicArt",
+ "SDXLPromptbyFashionArt",
+ "SDXLPromptbyGothicRevival",
+ "SDXLPromptbyIrishFolkArt",
+ "SDXLPromptbyRomanticNationalismArt",
+ "SDXLPromptbySportsArt",
+ "SDXLPromptbyStreetArt",
+ "SDXLPromptbyVikingArt",
+ "SDXLPromptbyWildlifeArt"
+ ],
+ {
+ "title_aux": "SDXL Prompt Styler (customized version by wolfden)"
+ }
+ ],
+ "https://github.com/wolfden/ComfyUi_String_Function_Tree": [
+ [
+ "StringFunction"
+ ],
+ {
+ "title_aux": "ComfyUi_String_Function_Tree"
+ }
+ ],
+ "https://github.com/wootwootwootwoot/ComfyUI-RK-Sampler": [
+ [
+ "RungeKuttaSampler"
+ ],
+ {
+ "author": "wootwootwootwoot",
+ "description": "Batched Runge-Kutta Samplers for ComfyUI",
+ "nickname": "ComfyUI-RK-Sampler",
+ "title": "ComfyUI-RK-Sampler",
+ "title_aux": "ComfyUI-RK-Sampler"
+ }
+ ],
+ "https://github.com/wouterverweirder/comfyui-penplotter": [
+ [
+ "DisengagePlotter",
+ "ImageToCenterline",
+ "OptimizeSVG",
+ "PlotSVG"
+ ],
+ {
+ "title_aux": "ComfyUI PenPlotter"
+ }
+ ],
+ "https://github.com/wouterverweirder/comfyui_live_input_stream": [
+ [
+ "be.aboutme.comfyui.live_input_stream.mjpeg_stream_capture_advanced",
+ "be.aboutme.comfyui.live_input_stream.screen_capture_advanced",
+ "be.aboutme.comfyui.live_input_stream.webcam_capture_advanced"
+ ],
+ {
+ "title_aux": "comfyui_live_input_stream"
+ }
+ ],
+ "https://github.com/wouterverweirder/comfyui_sam3": [
+ [
+ "MaskOutline",
+ "SAM3Segmentation",
+ "SEGSToRectangle"
+ ],
+ {
+ "title_aux": "ComfyUI SAM3"
+ }
+ ],
+ "https://github.com/wqjuser/ComfyUI-Chat-Image": [
+ [
+ "LLMImageDescription"
+ ],
+ {
+ "title_aux": "ComfyUI-Chat-Image"
+ }
+ ],
+ "https://github.com/writer-in-fancy-pants/octo_json_presets": [
+ [
+ "Anything into string",
+ "Load Experiment Presets Json",
+ "Model Presets",
+ "Save Experiment Presets Json"
+ ],
+ {
+ "title_aux": "Octo Json Presets"
+ }
+ ],
+ "https://github.com/wu12023/ComfyUI-Image-Evaluation": [
+ [
+ "Clip_Score-\ud83d\udd2c",
+ "Dino_Score-\ud83d\udd2c"
+ ],
+ {
+ "title_aux": "ComfyUI-Image-Evaluation"
+ }
+ ],
+ "https://github.com/wujm424606/ComfyUi-Ollama-YN": [
+ [
+ "MyOllamaDeleteModel",
+ "MyOllamaGenerate",
+ "MyOllamaGenerateAdvance",
+ "MyOllamaLoadContext",
+ "MyOllamaSaveContext",
+ "MyOllamaSpecialGenerateAdvance",
+ "MyOllamaVision"
+ ],
+ {
+ "title_aux": "ComfyUi-Ollama-YN"
+ }
+ ],
+ "https://github.com/wutipong/ComfyUI-TextUtils": [
+ [
+ "Text Utils - Join N-Elements of String List",
+ "Text Utils - Join String List",
+ "Text Utils - Join Strings",
+ "Text Utils - Split String to List"
+ ],
+ {
+ "title_aux": "ComfyUI-TextUtils"
+ }
+ ],
+ "https://github.com/wwwins/ComfyUI-Simple-Aspect-Ratio": [
+ [
+ "SimpleAspectRatio"
+ ],
+ {
+ "title_aux": "ComfyUI-Simple-Aspect-Ratio"
+ }
+ ],
+ "https://github.com/wwzhifeng/comfyui-jsonprompt": [
+ [
+ "JSONPromptBuilder"
+ ],
+ {
+ "title_aux": "comfyui-jsonprompt"
+ }
+ ],
+ "https://github.com/wywywywy/ComfyUI-pause": [
+ [
+ "PauseWorkflowNode"
+ ],
+ {
+ "title_aux": "ComfyUI Pause Workflow Node"
+ }
+ ],
+ "https://github.com/wzken/ComfyUI-Steganos-Node": [
+ [
+ "SteganosNode"
+ ],
+ {
+ "title_aux": "Steganos Node for ComfyUI"
+ }
+ ],
+ "https://github.com/wzyfromhust/ComfyUI_SAM2UltraV2": [
+ [
+ "SAM2UltraV2: Crop",
+ "SAM2UltraV2: LoadModel",
+ "SAM2UltraV2: MaskKeepLargestN",
+ "SAM2UltraV2: UpperBody"
+ ],
+ {
+ "author": "chflame",
+ "description": "A set of nodes for ComfyUI that can composite layer and mask to achieve Photoshop like functionality.",
+ "nickname": "LayerStyle",
+ "title": "LayerStyle",
+ "title_aux": "ComfyUI_SAM2UltraV2"
+ }
+ ],
+ "https://github.com/x0x0b/ComfyUI-PromptHistoryGallery": [
+ [
+ "PromptHistoryInput"
+ ],
+ {
+ "title_aux": "Prompt History Gallery"
+ }
+ ],
+ "https://github.com/x0x0b/ComfyUI-spritefusion-pixel-snapper": [
+ [
+ "PixelSnapper"
+ ],
+ {
+ "title_aux": "ComfyUI-spritefusion-pixel-snapper"
+ }
+ ],
+ "https://github.com/xLegende/ComfyUI-Prompt-Formatter": [
+ [
+ "CategorizedPromptAnalyzer",
+ "CategorizedPromptFormatter",
+ "CategorizedRandomPromptFormatter",
+ "WildcardImporter"
+ ],
+ {
+ "title_aux": "ComfyUI-Prompt-Formatter"
+ }
+ ],
+ "https://github.com/xXAdonesXx/NodeGPT": [
+ [
+ "AppendAgent",
+ "Assistant",
+ "Chat",
+ "ChatGPT",
+ "CombineInput",
+ "Conditioning",
+ "CostumeAgent_1",
+ "CostumeAgent_2",
+ "CostumeMaster_1",
+ "Critic",
+ "DisplayString",
+ "DisplayTextAsImage",
+ "EVAL",
+ "Engineer",
+ "Executor",
+ "GroupChat",
+ "Image_generation_Conditioning",
+ "LM_Studio",
+ "LoadAPIconfig",
+ "LoadTXT",
+ "MemGPT",
+ "Memory_Excel",
+ "Model_1",
+ "Ollama",
+ "Output2String",
+ "Planner",
+ "Scientist",
+ "TextCombine",
+ "TextGeneration",
+ "TextGenerator",
+ "TextInput",
+ "TextOutput",
+ "UserProxy",
+ "llama-cpp",
+ "llava",
+ "oobaboogaOpenAI"
+ ],
+ {
+ "title_aux": "NodeGPT"
+ }
+ ],
+ "https://github.com/xela-io/ComfyUI-HairDetailer": [
+ [
+ "HairColorAnalyzer",
+ "HairDetailEnhancer",
+ "HairDetector",
+ "HairDetectorAdvanced",
+ "HairMaskRefiner",
+ "HairRegionPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-HairDetailer"
+ }
+ ],
+ "https://github.com/xela-io/ComfyUI-RegionalPrompting": [
+ [
+ "MaskFromRegions",
+ "MaskRegionCreator",
+ "RegionalConditioningCombiner",
+ "RegionalPromptComposer",
+ "SimpleRegionalPrompt"
+ ],
+ {
+ "title_aux": "ComfyUI-RegionalPrompting"
+ }
+ ],
+ "https://github.com/xfgexo/EXO-Custom-ComfyUI-Nodes": [
+ [
+ "ComfyUI_EXO_Clip_Text_Encode",
+ "ComfyUI_EXO_DisplayText",
+ "ComfyUI_EXO_FluxSampler",
+ "ComfyUI_EXO_FluxSamplerMini",
+ "ComfyUI_EXO_ImageRescale",
+ "ComfyUI_EXO_LatentImageSize",
+ "ComfyUI_EXO_LatentImageSizeX",
+ "ComfyUI_EXO_Notes",
+ "ComfyUI_EXO_NumericValue",
+ "ComfyUI_EXO_PromptBuilderDeluxe",
+ "ComfyUI_EXO_SaveText",
+ "ComfyUI_EXO_TranslateText"
+ ],
+ {
+ "title_aux": "EXO Custom ComfyUI Nodes"
+ }
+ ],
+ "https://github.com/xhh522/ComfyUI-preview-monitor": [
+ [
+ "HybridPreviewImageMonitor",
+ "PreviewImageMonitor"
+ ],
+ {
+ "title_aux": "ComfyUI Preview Monitor"
+ }
+ ],
+ "https://github.com/xhiroga/ComfyUI-FramePackWrapper_PlusOne": [
+ [
+ "DownloadAndLoadFramePackModel",
+ "FramePackFindNearestBucket",
+ "FramePackLoraSelect",
+ "FramePackSampler",
+ "FramePackSampler_F1",
+ "FramePackSingleFrameResizeSampler",
+ "FramePackSingleFrameSampler",
+ "FramePackTimestampedTextEncode",
+ "FramePackTorchCompileSettings",
+ "LoadFramePackModel",
+ "ReferenceEmbedsList",
+ "ReferenceLatentList",
+ "ReferenceMaskList"
+ ],
+ {
+ "title_aux": "ComfyUI-FramePackWrapper_PlusOne"
+ }
+ ],
+ "https://github.com/xiangyuT/ComfyUI-PromptEnhance": [
+ [
+ "PromptEnhance",
+ "PromptEnhanceAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI-PromptEnhance"
+ }
+ ],
+ "https://github.com/xiaogui8dangjia/Comfyui-imagetoSTL": [
+ [
+ "ImageToSTLNode"
+ ],
+ {
+ "title_aux": "Comfyui-imagetoSTL"
+ }
+ ],
+ "https://github.com/xiaoshengyvlin/ComfyUI-MetaData-ZaKo": [
+ [
+ "MetaDataZaKo"
+ ],
+ {
+ "title_aux": "ComfyUI-MetaData-ZaKo"
+ }
+ ],
+ "https://github.com/xiaowc-lib/comfyui-dynamic-params": [
+ [
+ "DynamicParams"
+ ],
+ {
+ "title_aux": "Comfyui-Dynamic-Params"
+ }
+ ],
+ "https://github.com/xiaoxiaodesha/hd_node": [
+ [
+ "Combine HDMasks",
+ "Cover HDMasks",
+ "HD FaceIndex",
+ "HD GetMaskArea",
+ "HD Image Levels",
+ "HD SmoothEdge",
+ "HD UltimateSDUpscale"
+ ],
+ {
+ "title_aux": "hd-nodes-comfyui"
+ }
+ ],
+ "https://github.com/xingBaGan/ComfyUI-connect-ui": [
+ [
+ "SaveImageByWebsocket",
+ "reciveImageByWebsocket"
+ ],
+ {
+ "title_aux": "ComfyUI-connect-ui"
+ }
+ ],
+ "https://github.com/xiujiang1987/ComfyUI-SmartSize": [
+ [
+ "GetImageSize_Custom"
+ ],
+ {
+ "title_aux": "ComfyUI-SmartSize"
+ }
+ ],
+ "https://github.com/xlinx/ComfyUI-decadetw-auto-messaging-realtime": [
+ [
+ "Auto-MSG-ALL",
+ "Auto-MSG-Discord-Bot",
+ "Auto-MSG-Line-Notify",
+ "Auto-MSG-Telegram-Bot"
+ ],
+ {
+ "title_aux": "ComfyUI-decadetw-auto-messaging-realtime"
+ }
+ ],
+ "https://github.com/xlinx/ComfyUI-decadetw-auto-prompt-llm": [
+ [
+ "Auto-LLM-Chat",
+ "Auto-LLM-Text",
+ "Auto-LLM-Text-Vision",
+ "Auto-LLM-Vision"
+ ],
+ {
+ "title_aux": "ComfyUI-decadetw-auto-prompt-llm"
+ }
+ ],
+ "https://github.com/xlinx/ComfyUI-decadetw-spout-syphon-im-vj": [
+ [
+ "Im-SD-VJ-SPOUT",
+ "Im-SD-VJ-SYPHON"
+ ],
+ {
+ "title_aux": "ComfyUI-decadetw-spout-syphon-im-vj"
+ }
+ ],
+ "https://github.com/xliry/ComfyUI_SendDiscord": [
+ [
+ "SendDiscord"
+ ],
+ {
+ "title_aux": "ComfyUI_SendDiscord"
+ }
+ ],
+ "https://github.com/xmarre/TorchCompileModel_LoRASafe": [
+ [
+ "TorchCompileModel_LoRASafe"
+ ],
+ {
+ "title_aux": "LoRA-Safe TorchCompile"
+ }
+ ],
+ "https://github.com/xobiomesh/ComfyUI_xObiomesh": [
+ [
+ "OllamaModelSelect",
+ "OllamaTextGen",
+ "ShowText_xO",
+ "xO_ComfyUIPortRunner",
+ "xO_GetImageFilename",
+ "xO_LoadRecentFile",
+ "xO_TestScriptRunner",
+ "xO_WorkflowRunner"
+ ],
+ {
+ "title_aux": "ComfyUI Neural Nodes"
+ }
+ ],
+ "https://github.com/xs315431/Comfyui_Get_promptId": [
+ [
+ "GetPromptId",
+ "SuccessCallback",
+ "UploadVideo"
+ ],
+ {
+ "title_aux": "Comfyui_Get_promptId"
+ }
+ ],
+ "https://github.com/xufengbo1993/ComfyUI-ZFL-JSON-Extractor": [
+ [
+ "JSONExtractorFourWay"
+ ],
+ {
+ "title_aux": "ComfyUI-ZFL-JSON-Extractor"
+ }
+ ],
+ "https://github.com/xuheyao/comfyui-dinov3-point-prompt": [
+ [
+ "DINOv3Loader",
+ "DINOv3PointCollector",
+ "DINOv3Process",
+ "DINOv3Similarity"
+ ],
+ {
+ "title_aux": "comfyui-dinov3-point-prompt"
+ }
+ ],
+ "https://github.com/xuhongming251/ComfyUI-GPEN": [
+ [
+ "FaceEnhancement"
+ ],
+ {
+ "title_aux": "ComfyUI-GPEN"
+ }
+ ],
+ "https://github.com/xuhongming251/ComfyUI-InfiniteTalk-MultiImage": [
+ [
+ "GetFloatByIndex",
+ "GetIntByIndex",
+ "InfiniteTalkEmbedsSlice",
+ "InfiniteTalkMultiImage",
+ "MakeBatchFromFloatList",
+ "MakeBatchFromIntList",
+ "VideoFromPathsAndAudio"
+ ],
+ {
+ "title_aux": "ComfyUI-InfiniteTalk-MultiImage"
+ }
+ ],
+ "https://github.com/xuhongming251/ComfyUI-Jimeng": [
+ [
+ "JimengAPIClient",
+ "JimengFirstLastFrame2Video",
+ "JimengImage2Video",
+ "PreviewVideoFromUrl"
+ ],
+ {
+ "title_aux": "ComfyUI-Jimeng"
+ }
+ ],
+ "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils": [
+ [
+ "MuseTalkPostprocess",
+ "MuseTalkPreprocess",
+ "MuseTalkTrain",
+ "MuseTalkTrainPreprocess"
+ ],
+ {
+ "title_aux": "ComfyUI-MuseTalkUtils"
+ }
+ ],
+ "https://github.com/xuhongming251/ComfyUI_Camera": [
+ [
+ "Load Image From Local Camera",
+ "Save Image To Local Camera"
+ ],
+ {
+ "title_aux": "ComfyUI_Camera"
+ }
+ ],
+ "https://github.com/yamanacn/comfyui_kontext_Analyze": [
+ [
+ "KontextDuoImageAnalyzer"
+ ],
+ {
+ "title_aux": "ComfyUI Kontext Duo Image Analyzer"
+ }
+ ],
+ "https://github.com/yangrui511/ComfyUI-Text-Preserve": [
+ [
+ "TextPreserveNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Text-Preserve"
+ }
+ ],
+ "https://github.com/yanhuifair/comfyui-janus": [
+ [
+ "JanusProImageGenerationNode",
+ "JanusProModelLoaderNode",
+ "JanusProMultimodalUnderstandingNode"
+ ],
+ {
+ "title_aux": "comfyui-janus"
+ }
+ ],
+ "https://github.com/yanlang0123/ComfyUI_Lam": [
+ [
+ "AppParams",
+ "AspectRatio",
+ "AudioBeforeAfterSilence",
+ "AutioInfo",
+ "AutioPath",
+ "DoWhileEnd",
+ "DoWhileStart",
+ "EasyPromptSelecto",
+ "FaceFusion",
+ "ForEnd",
+ "ForInnerEnd",
+ "ForInnerStart",
+ "ForStart",
+ "IdentifyingQR",
+ "IfInnerExecute",
+ "Image2Video",
+ "ImageAddMask",
+ "ImageBlank",
+ "ImageClone",
+ "ImageCropFaces",
+ "ImageLama",
+ "ImageToMasks",
+ "JyAnimationGroup",
+ "JyAnimationIn",
+ "JyAnimationOut",
+ "JyAudio2CaptionsGroup",
+ "JyAudioNative",
+ "JyAudioTrack",
+ "JyCaptionsNative",
+ "JyCaptionsTrack",
+ "JyEffectNative",
+ "JyEffectTrack",
+ "JyMediaAnimation",
+ "JyMediaNative",
+ "JyMediaTrack",
+ "JyMultiAudioGroup",
+ "JyMultiCaptionsGroup",
+ "JyMultiEffectGroup",
+ "JyMultiMediaGroup",
+ "JySaveDraft",
+ "JySaveNoOutDraft",
+ "JySaveNotOutDraft",
+ "JySaveOutDraft",
+ "JyTransition",
+ "LAM.OpenPoseEditorPlus",
+ "LamCommonHidden",
+ "LamCommonNames",
+ "LamCommonPrint",
+ "LamCommonPrintNoOutput",
+ "LamFaceAnalysisModels",
+ "LamGetPngInfo",
+ "LamHeyGemNode",
+ "LamHeyGemQueryNode",
+ "LamIndexTTS2AdvancedParams",
+ "LamIndexTTS2Node0",
+ "LamIndexTTS2Node1",
+ "LamIndexTTS2Node2",
+ "LamIndexTTS2Node3",
+ "LamIndexTTS2UnloadModel",
+ "LamLoadImageBase64",
+ "LamLoadPathImage",
+ "LamLoadVideo",
+ "LamPanorama2Spherical",
+ "LamReadFileList",
+ "LamSamplerName",
+ "LamSaveAudio",
+ "LamSaveOnly",
+ "LamSaveVideo",
+ "LamScheduler",
+ "LamSpherical2Panorama",
+ "LamSwitchMiddle",
+ "LamSwitchStart",
+ "LamSwitcherCase",
+ "LamViewVideo",
+ "LamViewVideoOut",
+ "LoadDirImgPaths",
+ "LoadImagePath",
+ "LoadReplaceImage",
+ "LongTextToList",
+ "MultiControlNetApply",
+ "MultiGLIGENTextBoxApply",
+ "MultiIPAdapterRegional",
+ "MultiIntFormula",
+ "MultiMergeAudio",
+ "MultiMergeVideos",
+ "MultiParamFormula",
+ "MultiTextConcatenate",
+ "MultiTextEncode",
+ "MultiTextEncodeAdvanced",
+ "MultiTextSelelct",
+ "MultiTextSetArea",
+ "MultiTextSetGligen",
+ "MultiTextSetMask",
+ "OpenAiPrompt",
+ "OutDoWhileEnd",
+ "OutDoWhileStart",
+ "PreviewImageLam",
+ "PromptTranslator",
+ "QRCode",
+ "QwenImageEditNode",
+ "QwenImageNode",
+ "SaveImageLam",
+ "SaveImgOutputLam",
+ "SectionEnd",
+ "SectionStart",
+ "StyleSelecto",
+ "Text2AutioEdgeTts",
+ "TextListSelelct",
+ "VideoAddAudio",
+ "VideoExtractAudio",
+ "VideoFaceFusion",
+ "VideoPath",
+ "WaitImagSelector",
+ "ZhPromptTranslator"
+ ],
+ {
+ "title_aux": "ComfyUI_Lam"
+ }
+ ],
+ "https://github.com/yannickcruz/ComfyUI_YSC_HighResFix": [
+ [
+ "YSC_HighresFix"
+ ],
+ {
+ "title_aux": "ComfyUI YSC HighRes-Fix"
+ }
+ ],
+ "https://github.com/yano/comfyui-fast-mosaic-detector": [
+ [
+ "MosaicDetectionNode"
+ ],
+ {
+ "title_aux": "ComfyUI Fast Mosaic Detector"
+ }
+ ],
+ "https://github.com/yasser-baalla/comfyUI-SemanticImageFetch": [
+ [
+ "ColorGradeSampler",
+ "ColorGrading",
+ "SemanticImageFetch"
+ ],
+ {
+ "title_aux": "comfyUI-SemanticImageFetch"
+ }
+ ],
+ "https://github.com/ycchanau/ComfyUI_Preview_Magnifier": [
+ [
+ "YC.ImageComparerMagnifier",
+ "YC.PreviewImageMagnifier",
+ "YC.XYPreviewImageMagnifier"
+ ],
+ {
+ "title_aux": "ComfyUI Preview Magnifier"
+ }
+ ],
+ "https://github.com/ycyy/ComfyUI-YCYY-API": [
+ [
+ "YCYY_API_Config_Options",
+ "YCYY_API_Proxy_Options",
+ "YCYY_Gemini_Image_API",
+ "YCYY_Gemini_Image_Preset",
+ "YCYY_Gemini_STT_API",
+ "YCYY_Gemini_TTS_API",
+ "YCYY_ModelScope_Image_API",
+ "YCYY_Ollama_LLM_API",
+ "YCYY_Ollama_LLM_Advanced_Options",
+ "YCYY_Ollama_VLM_API"
+ ],
+ {
+ "title_aux": "ComfyUI-YCYY-API"
+ }
+ ],
+ "https://github.com/ycyy/ComfyUI-YCYY-LoraInfo": [
+ [
+ "LoraInfo"
+ ],
+ {
+ "title_aux": "ComfyUI-YCYY-LoraInfo"
+ }
+ ],
+ "https://github.com/yeeyou/ComfyUI-OpenAI-Compatible-API": [
+ [
+ "OpenAICompatibleLLM"
+ ],
+ {
+ "title_aux": "ComfyUI OpenAI Compatible API Node"
+ }
+ ],
+ "https://github.com/yffyhk/comfyui_auto_danbooru": [
+ [
+ "GetDanbooru",
+ "TagEncode"
+ ],
+ {
+ "title_aux": "comfyui_auto_danbooru"
+ }
+ ],
+ "https://github.com/yhayano-ponotech/ComfyUI-Fal-API-Flux": [
+ [
+ "FalAPIFluxControlNetConfigNode",
+ "FalAPIFluxControlNetUnionConfigNode",
+ "FalAPIFluxDevCannyWithLoraNode",
+ "FalAPIFluxDevImageToImageNode",
+ "FalAPIFluxDevNode",
+ "FalAPIFluxDevWithLoraAndControlNetImageToImageNode",
+ "FalAPIFluxDevWithLoraAndControlNetInpaintNode",
+ "FalAPIFluxDevWithLoraAndControlNetNode",
+ "FalAPIFluxDevWithLoraImageToImageNode",
+ "FalAPIFluxDevWithLoraInpaintNode",
+ "FalAPIFluxDevWithLoraNode",
+ "FalAPIFluxLoraConfigNode",
+ "FalAPIFluxProCannyNode",
+ "FalAPIFluxProDepthNode",
+ "FalAPIFluxProFillNode",
+ "FalAPIFluxProNode",
+ "FalAPIFluxProReduxNode",
+ "FalAPIFluxProV11Node",
+ "FalAPIFluxProV11UltraNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Fal-API-Flux"
+ }
+ ],
+ "https://github.com/yhayano-ponotech/comfyui-save-image-local": [
+ [
+ "Local Save"
+ ],
+ {
+ "title_aux": "ComfyUI Local Save Node"
+ }
+ ],
+ "https://github.com/yhayano-ponotech/comfyui-stability-ai-api": [
+ [
+ "StabilityControlSketch",
+ "StabilityControlStructure",
+ "StabilityControlStyle",
+ "StabilityEdit",
+ "StabilityImageCore",
+ "StabilityImageSD3",
+ "StabilityImageToVideo",
+ "StabilityImageUltra",
+ "StabilityUpscaleConservative",
+ "StabilityUpscaleCreative",
+ "StabilityUpscaleFast"
+ ],
+ {
+ "title_aux": "ComfyUI-Stability-AI-API"
+ }
+ ],
+ "https://github.com/yichengup/ComfyUI-LinearTransition": [
+ [
+ "GradientTransition",
+ "LinearTransition"
+ ],
+ {
+ "title_aux": "ComfyUI-LinearTransition"
+ }
+ ],
+ "https://github.com/yichengup/ComfyUI-VideoTransition": [
+ [
+ "CubeRotationNode",
+ "VideoBlindsTransitionNode",
+ "VideoBlinkTransitionNode",
+ "VideoCheckerboardTransitionNode",
+ "VideoCrossfadeNode",
+ "VideoCubeRotationAdvancedNode",
+ "VideoCubeTransitionNode",
+ "VideoExplosionTransitionNode",
+ "VideoFlip3DTransitionNode",
+ "VideoGlitchArtEnhancedNode",
+ "VideoGlitchArtTransitionNode",
+ "VideoPageTurnNode",
+ "VideoShakeTransitionNode",
+ "VideoWarpTransitionNode"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoTransition"
+ }
+ ],
+ "https://github.com/yichengup/ComfyUI-YCNodes": [
+ [
+ "AdvancedImageSelector",
+ "DynamicThreshold",
+ "ImageBatchSelector",
+ "ImageBlendMaskFitCover",
+ "ImageBlendResize",
+ "ImageIC",
+ "ImageICAdvanced",
+ "ImageLoaderAdvanced",
+ "ImageMirror",
+ "ImageMosaic",
+ "ImageRotate",
+ "ImageScaleRestoreV2_YC",
+ "ImageSelector",
+ "ImageUpscaleTiled",
+ "IrregularToEllipseMask",
+ "LoadImagesFromFolder",
+ "MaskBatchComposite",
+ "MaskBatchCopy",
+ "MaskComposite",
+ "MaskContourFillNode",
+ "MaskCropRestore_YC",
+ "MaskCrop_YC",
+ "MaskFilterBySolidity",
+ "MaskFromBatch",
+ "MaskPreviewNode",
+ "MaskRepeatBatch",
+ "MaskResizeToRatio",
+ "MaskSmartValleySplit",
+ "MaskSplitFilter",
+ "MaskTopNFilter",
+ "TextKeyword",
+ "YC Extract Number",
+ "YC Mask Condition Switch",
+ "YC Seed List",
+ "YC Super Selector",
+ "YC Text Condition Switch",
+ "YC Text Index Switch",
+ "YC Universal Gate",
+ "YCImageAccumulator",
+ "YCImageSmartCrop",
+ "YCImageSmartPad",
+ "YCImageTile",
+ "YCImageUntile",
+ "YCMaskBlur",
+ "YCMaskDirectionExpand",
+ "YCMaskRatioPadCrop",
+ "YCRemapMaskRange",
+ "YCTextImageGenerator",
+ "YC_FiveTextCombineNode",
+ "YC_Image_Save",
+ "YC_MaskColorOverlay",
+ "YC_SingleTextNode",
+ "YC_textReplaceNode",
+ "ycImageTilem"
+ ],
+ {
+ "title_aux": "ComfyUI-YCNodes"
+ }
+ ],
+ "https://github.com/yichengup/ComfyUI-YCNodes_Toolkit": [
+ [
+ "YCLiveLoadImagesMulti",
+ "YCSwitch",
+ "YC_ShowText",
+ "ycBBoxBridge",
+ "ycCanvasBBox",
+ "ycCanvasBBoxMask",
+ "ycimagebrushmask"
+ ],
+ {
+ "title_aux": "ComfyUI-YCNodes_Toolkit"
+ }
+ ],
+ "https://github.com/yichengup/ComfyUI-gaussian_preview": [
+ [
+ "SavePLY",
+ "YCGaussianPreview"
+ ],
+ {
+ "title_aux": "ComfyUI-gaussian_preview"
+ }
+ ],
+ "https://github.com/yichengup/ComfyUI_SwiftCut": [
+ [
+ "SelectImages",
+ "SelectImagesAdvanced",
+ "YCImageBatchBlend",
+ "YCImageColorTrackBindPro",
+ "YCImageOverlayBlend",
+ "YCImagePushPullLens",
+ "YC_Subtitle"
+ ],
+ {
+ "title_aux": "ComfyUI_SwiftCut"
+ }
+ ],
+ "https://github.com/yichengup/ComfyUI_Yc_JanusPro": [
+ [
+ "ImageAnalyzer",
+ "JanusChatAnalyzer",
+ "JanusImageGenerator",
+ "JanusProLoader"
+ ],
+ {
+ "title_aux": "ComfyUI_Yc_JanusPro"
+ }
+ ],
+ "https://github.com/yichengup/Comfyui-Deepseek": [
+ [
+ "DeepseekAdvancedNode",
+ "DeepseekNode",
+ "DeepseekReasonerNode",
+ "SiliconDeepseekChat",
+ "SiliconDeepseekReasoner"
+ ],
+ {
+ "title_aux": "Comfyui-Deepseek"
+ }
+ ],
+ "https://github.com/yichengup/Comfyui-Ycanvas": [
+ [
+ "CanvasNode"
+ ],
+ {
+ "title_aux": "Comfyui-Ycanvas"
+ }
+ ],
+ "https://github.com/yichengup/Comfyui_Flux_Style_Adjust": [
+ [
+ "StyleModelAdvancedApply"
+ ],
+ {
+ "title_aux": "Comfyui_Flux_Style_Adjust (Redux)"
+ }
+ ],
+ "https://github.com/yichengup/Comfyui_Redux_Advanced": [
+ [
+ "StyleAdvancedApply",
+ "YC_LG_Redux"
+ ],
+ {
+ "title_aux": "Comfyui_Redux_Advanced"
+ }
+ ],
+ "https://github.com/yichengup/comfyui-face-liquify": [
+ [
+ "FaceLiquifyNode"
+ ],
+ {
+ "title_aux": "comfyui-face-liquify"
+ }
+ ],
+ "https://github.com/yiwangsimple/ComfyUI_DW_Chat": [
+ [
+ "DeepSeekChatNode",
+ "DeepSeekTranslator",
+ "ErrorLogNode",
+ "ExecutionTime",
+ "FileBasedChatNode",
+ "FluxPromptEngineeringNode",
+ "Gemini1_5Text",
+ "Gemini1_5Vision",
+ "GeminiFluxPrompt",
+ "Gemma2PromptNode",
+ "GemmaDialogueNode",
+ "GithubLinkNode",
+ "GroqChatNode",
+ "MoonshotMultiChatNode",
+ "MoonshotSingleChatNode",
+ "OllamaImageToText",
+ "OllamaPromptExtractor",
+ "OllamaTextToText",
+ "PaliGemma3bCaptioner",
+ "PromptEngineeringNode",
+ "PromptExtractorNode",
+ "Qwen2VLCaption",
+ "Qwen2VLLocalCaption",
+ "SD3LongCaptionerV2",
+ "SDPromptAgent",
+ "dwimage2"
+ ],
+ {
+ "title_aux": "ComfyUI_DW_Chat"
+ }
+ ],
+ "https://github.com/yiwangsimple/florence_dw": [
+ [
+ "Florence2",
+ "Florence2Postprocess",
+ "Florence2PostprocessAll",
+ "LoadFlorence2Model"
+ ],
+ {
+ "title_aux": "florence_dw"
+ }
+ ],
+ "https://github.com/yohji-yohji/comfyui-nanobanana-pro": [
+ [
+ "Gemini3ProGenerateContent"
+ ],
+ {
+ "title_aux": "comfyui-nanobanana-pro"
+ }
+ ],
+ "https://github.com/yolain/ComfyUI-Easy-DotsOCR": [
+ [
+ "easy applyDotsOCR",
+ "easy downloadDotsOCRAndLoadModel"
+ ],
+ {
+ "title_aux": "ComfyUI-Easy-DotsOCR"
+ }
+ ],
+ "https://github.com/yolain/ComfyUI-Easy-Use": [
+ [
+ "dynamicThresholdingFull",
+ "easy LLLiteLoader",
+ "easy XYInputs: CFG Scale",
+ "easy XYInputs: Checkpoint",
+ "easy XYInputs: ControlNet",
+ "easy XYInputs: Denoise",
+ "easy XYInputs: FluxGuidance",
+ "easy XYInputs: Lora",
+ "easy XYInputs: ModelMergeBlocks",
+ "easy XYInputs: NegativeCond",
+ "easy XYInputs: NegativeCondList",
+ "easy XYInputs: PositiveCond",
+ "easy XYInputs: PositiveCondList",
+ "easy XYInputs: PromptSR",
+ "easy XYInputs: Sampler/Scheduler",
+ "easy XYInputs: Seeds++ Batch",
+ "easy XYInputs: Steps",
+ "easy XYPlot",
+ "easy XYPlotAdvanced",
+ "easy a1111Loader",
+ "easy ab",
+ "easy anythingIndexSwitch",
+ "easy anythingInversedSwitch",
+ "easy applyBrushNet",
+ "easy applyFooocusInpaint",
+ "easy applyInpaint",
+ "easy applyPowerPaint",
+ "easy batchAnything",
+ "easy blocker",
+ "easy boolean",
+ "easy cascadeKSampler",
+ "easy cascadeLoader",
+ "easy ckptNames",
+ "easy cleanGpuUsed",
+ "easy clearCacheAll",
+ "easy clearCacheKey",
+ "easy comfyLoader",
+ "easy compare",
+ "easy conditioningIndexSwitch",
+ "easy controlnetLoader",
+ "easy controlnetLoader++",
+ "easy controlnetLoaderADV",
+ "easy controlnetNames",
+ "easy controlnetStack",
+ "easy controlnetStackApply",
+ "easy convertAnything",
+ "easy detailerFix",
+ "easy float",
+ "easy fluxLoader",
+ "easy forLoopEnd",
+ "easy forLoopStart",
+ "easy fullCascadeKSampler",
+ "easy fullLoader",
+ "easy fullkSampler",
+ "easy globalSeed",
+ "easy hiresFix",
+ "easy humanSegmentation",
+ "easy hunyuanDiTLoader",
+ "easy icLightApply",
+ "easy if",
+ "easy ifElse",
+ "easy imageBatchToImageList",
+ "easy imageChooser",
+ "easy imageColorMatch",
+ "easy imageConcat",
+ "easy imageCount",
+ "easy imageCropFromMask",
+ "easy imageDetailTransfer",
+ "easy imageHSVMask",
+ "easy imageIndexSwitch",
+ "easy imageInsetCrop",
+ "easy imageInterrogator",
+ "easy imageListToImageBatch",
+ "easy imagePixelPerfect",
+ "easy imageRatio",
+ "easy imageRemBg",
+ "easy imageSave",
+ "easy imageScaleDown",
+ "easy imageScaleDownBy",
+ "easy imageScaleDownToSize",
+ "easy imageScaleToNormPixels",
+ "easy imageSize",
+ "easy imageSizeByLongerSide",
+ "easy imageSizeBySide",
+ "easy imageSplitGrid",
+ "easy imageSplitList",
+ "easy imageSplitTiles",
+ "easy imageSwitch",
+ "easy imageTilesFromBatch",
+ "easy imageToBase64",
+ "easy imageToMask",
+ "easy imageUncropFromBBOX",
+ "easy imagesCountInDirectory",
+ "easy imagesSplitImage",
+ "easy indexAnything",
+ "easy injectNoiseToLatent",
+ "easy instantIDApply",
+ "easy instantIDApplyADV",
+ "easy int",
+ "easy ipadapterApply",
+ "easy ipadapterApplyADV",
+ "easy ipadapterApplyEmbeds",
+ "easy ipadapterApplyEncoder",
+ "easy ipadapterApplyFaceIDKolors",
+ "easy ipadapterApplyFromParams",
+ "easy ipadapterApplyRegional",
+ "easy ipadapterStyleComposition",
+ "easy isFileExist",
+ "easy isMaskEmpty",
+ "easy isNone",
+ "easy isSDXL",
+ "easy joinImageBatch",
+ "easy joyCaption2API",
+ "easy joyCaption3API",
+ "easy kSampler",
+ "easy kSamplerCustom",
+ "easy kSamplerDownscaleUnet",
+ "easy kSamplerInpainting",
+ "easy kSamplerLayerDiffusion",
+ "easy kSamplerSDTurbo",
+ "easy kSamplerTiled",
+ "easy kolorsLoader",
+ "easy latentCompositeMaskedWithCond",
+ "easy latentNoisy",
+ "easy lengthAnything",
+ "easy loadImageBase64",
+ "easy loadImagesForLoop",
+ "easy loraNames",
+ "easy loraPromptApply",
+ "easy loraStack",
+ "easy loraStackApply",
+ "easy loraSwitcher",
+ "easy makeImageForICLora",
+ "easy mathFloat",
+ "easy mathInt",
+ "easy mathString",
+ "easy mochiLoader",
+ "easy multiAngle",
+ "easy negative",
+ "easy outputToList",
+ "easy pipeBatchIndex",
+ "easy pipeEdit",
+ "easy pipeEditPrompt",
+ "easy pipeIn",
+ "easy pipeOut",
+ "easy pipeToBasicPipe",
+ "easy pixArtLoader",
+ "easy pixels",
+ "easy portraitMaster",
+ "easy poseEditor",
+ "easy positive",
+ "easy preDetailerFix",
+ "easy preMaskDetailerFix",
+ "easy preSampling",
+ "easy preSamplingAdvanced",
+ "easy preSamplingCascade",
+ "easy preSamplingCustom",
+ "easy preSamplingDynamicCFG",
+ "easy preSamplingLayerDiffusion",
+ "easy preSamplingLayerDiffusionADDTL",
+ "easy preSamplingNoiseIn",
+ "easy preSamplingSdTurbo",
+ "easy prompt",
+ "easy promptAwait",
+ "easy promptConcat",
+ "easy promptLine",
+ "easy promptList",
+ "easy promptReplace",
+ "easy pulIDApply",
+ "easy pulIDApplyADV",
+ "easy rangeFloat",
+ "easy rangeInt",
+ "easy removeLocalImage",
+ "easy samLoaderPipe",
+ "easy saveImageLazy",
+ "easy saveText",
+ "easy saveTextLazy",
+ "easy seed",
+ "easy seedList",
+ "easy showAnything",
+ "easy showAnythingLazy",
+ "easy showLoaderSettingsNames",
+ "easy showSpentTime",
+ "easy showTensorShape",
+ "easy simpleMath",
+ "easy simpleMathDual",
+ "easy sleep",
+ "easy sliderControl",
+ "easy stableDiffusion3API",
+ "easy string",
+ "easy stringJoinLines",
+ "easy stringToFloatList",
+ "easy stringToIntList",
+ "easy styleAlignedBatchAlign",
+ "easy stylesSelector",
+ "easy sv3dLoader",
+ "easy svdLoader",
+ "easy textIndexSwitch",
+ "easy textSwitch",
+ "easy ultralyticsDetectorPipe",
+ "easy unSampler",
+ "easy whileLoopEnd",
+ "easy whileLoopStart",
+ "easy wildcards",
+ "easy wildcardsMatrix",
+ "easy xyAny",
+ "easy zero123Loader"
+ ],
+ {
+ "title_aux": "ComfyUI Easy Use"
+ }
+ ],
+ "https://github.com/yolain/SaveVideoRGBA": [
+ [
+ "SaveVideoRGBA"
+ ],
+ {
+ "title_aux": "SaveVideoRGBA"
+ }
+ ],
+ "https://github.com/yolanother/ComfyUI-Save16bitPng": [
+ [
+ "SaveImageARGB16PNG"
+ ],
+ {
+ "title_aux": "Save Uncompressed 16 Bit PNG"
+ }
+ ],
+ "https://github.com/yolanother/DTAIComfyImageSubmit": [
+ [
+ "DTSimpleSubmitImage",
+ "DTSubmitImage"
+ ],
+ {
+ "title_aux": "Comfy AI DoubTech.ai Image Sumission Node"
+ }
+ ],
+ "https://github.com/yolanother/DTAIComfyLoaders": [
+ [
+ "DTCLIPLoader",
+ "DTCLIPVisionLoader",
+ "DTCheckpointLoader",
+ "DTCheckpointLoaderSimple",
+ "DTControlNetLoader",
+ "DTDiffControlNetLoader",
+ "DTDiffusersLoader",
+ "DTGLIGENLoader",
+ "DTLoadImage",
+ "DTLoadImageMask",
+ "DTLoadLatent",
+ "DTLoraLoader",
+ "DTLorasLoader",
+ "DTPreviewImage",
+ "DTStyleModelLoader",
+ "DTUpscaleModelLoader",
+ "DTVAELoader",
+ "DTunCLIPCheckpointLoader"
+ ],
+ {
+ "title_aux": "Comfy UI Online Loaders"
+ }
+ ],
+ "https://github.com/yolanother/DTAIComfyPromptAgent": [
+ [
+ "DTPromptAgent",
+ "DTPromptAgentString"
+ ],
+ {
+ "title_aux": "Comfy UI Prompt Agent"
+ }
+ ],
+ "https://github.com/yolanother/DTAIComfyQRCodes": [
+ [
+ "QRCode"
+ ],
+ {
+ "title_aux": "Comfy UI QR Codes"
+ }
+ ],
+ "https://github.com/yolanother/DTAIComfyVariables": [
+ [
+ "DTCLIPTextEncode",
+ "DTSingleLineStringVariable",
+ "DTSingleLineStringVariableNoClip",
+ "FloatVariable",
+ "IntVariable",
+ "StringFormat",
+ "StringFormatSingleLine",
+ "StringVariable"
+ ],
+ {
+ "title_aux": "Variables for Comfy UI"
+ }
+ ],
+ "https://github.com/yolanother/DTAIImageToTextNode": [
+ [
+ "DTAIImageToTextNode",
+ "DTAIImageUrlToTextNode"
+ ],
+ {
+ "title_aux": "Image to Text Node"
+ }
+ ],
+ "https://github.com/yondonfu/ComfyUI-Background-Edit": [
+ [
+ "BackgroundColor",
+ "Composite",
+ "GaussianBlur"
+ ],
+ {
+ "title_aux": "ComfyUI-Background-Edit"
+ }
+ ],
+ "https://github.com/yondonfu/ComfyUI-Torch-Compile": [
+ [
+ "TorchCompileLoadControlNet",
+ "TorchCompileLoadVAE"
+ ],
+ {
+ "title_aux": "ComfyUI-Torch-Compile"
+ }
+ ],
+ "https://github.com/yorkane/ComfyUI-KYNode": [
+ [
+ "KY_AnyByIndex",
+ "KY_AnyToList",
+ "KY_BBoxPosition",
+ "KY_BBoxToXYWH",
+ "KY_BBoxesToSAM2",
+ "KY_CreateMask",
+ "KY_CreateVideoObjectFromPath",
+ "KY_CropImageByXYWH",
+ "KY_DummyOut",
+ "KY_Eval_Python",
+ "KY_FFmpegAddAudio",
+ "KY_FFmpegCustomCmd",
+ "KY_FFmpegImagesToVideo",
+ "KY_FFmpegTrimVideo",
+ "KY_FFmpegVideoToImages",
+ "KY_FilePathAnalyzer-",
+ "KY_FileSequenceAnalyzer",
+ "KY_First_NOT_EMPTY",
+ "KY_GetFromPath",
+ "KY_ImageCompare",
+ "KY_ImageCropByBBox",
+ "KY_JSONToBBox",
+ "KY_JoinToString",
+ "KY_LoadImageFrom",
+ "KY_LoadVideoByPath",
+ "KY_Load_Images_from_path",
+ "KY_MathExpression",
+ "KY_MergeToJSON",
+ "KY_OpenAICaptionImage",
+ "KY_OpenAICaptionImages",
+ "KY_OpenAIChat",
+ "KY_ReadImage",
+ "KY_RegexExtractor",
+ "KY_RegexReplace",
+ "KY_SaveImageSequence",
+ "KY_SaveImageToPath",
+ "KY_SaveVideo",
+ "KY_ToVideoUrl",
+ "KY_Uploads",
+ "KY_VideoCompare",
+ "KY_isNone",
+ "KY_restoreBBox",
+ "KY_toBBox"
+ ],
+ {
+ "title_aux": "ComfyUI-KYNode"
+ }
+ ],
+ "https://github.com/younyokel/comfyui_prompt_formatter": [
+ [
+ "CLIPTextEncodeFormatter",
+ "TextAppendFormatter",
+ "TextOnlyFormatter"
+ ],
+ {
+ "title_aux": "ComfyUI Prompt Formatter"
+ }
+ ],
+ "https://github.com/youyegit/tdxh_node_comfyui": [
+ [
+ "TdxhBoolNumber",
+ "TdxhClipVison",
+ "TdxhControlNetApply",
+ "TdxhControlNetProcessor",
+ "TdxhFloatInput",
+ "TdxhImageToSize",
+ "TdxhImageToSizeAdvanced",
+ "TdxhImg2ImgLatent",
+ "TdxhIntInput",
+ "TdxhLoraLoader",
+ "TdxhOnOrOff",
+ "TdxhReference",
+ "TdxhStringInput",
+ "TdxhStringInputTranslator",
+ "TdxhToggleGuest",
+ "TdxhToggleMaster"
+ ],
+ {
+ "title_aux": "tdxh_node_comfyui"
+ }
+ ],
+ "https://github.com/ytoaa/ComfyUI-LLM-Client": [
+ [
+ "QwenSecureE2EEClient"
+ ],
+ {
+ "title_aux": "ComfyUI-LLM-Client"
+ }
+ ],
+ "https://github.com/yuan199696/add_text_2_img": [
+ [
+ "AddText"
+ ],
+ {
+ "title_aux": "add_text_2_img"
+ }
+ ],
+ "https://github.com/yuan199696/chinese_clip_encode": [
+ [
+ "ChineseCLIPEncode"
+ ],
+ {
+ "title_aux": "chinese_clip_encode"
+ }
+ ],
+ "https://github.com/yuanyuan-spec/comfyui_hunyuanvideo_1.5_plugin": [
+ [
+ "HyVidelSrTransformerUpsamplerLoader",
+ "HyVidelSrVaeDecoder",
+ "HyVideo15Byt5Loader",
+ "HyVideo15CFG",
+ "HyVideo15GlyphByT5",
+ "HyVideo15I2VSampler",
+ "HyVideo15LatentsPrepare",
+ "HyVideo15ModelLoader",
+ "HyVideo15T2VSampler",
+ "HyVideo15TextEncode",
+ "HyVideo15TextEncoderLoader",
+ "HyVideo15Transformer",
+ "HyVideo15TransformerLoader",
+ "HyVideo15VaeDecode",
+ "HyVideo15VaeEncode",
+ "HyVideo15VaeLoader",
+ "HyVideo15VisionEncode",
+ "HyVideo15VisionEncoderLoader",
+ "HyVideoSrLatentsPrepare",
+ "HyVideoSrTransformer",
+ "HyVideoSrVaeEncode"
+ ],
+ {
+ "title_aux": "HunyuanVideo-1.5 nodes"
+ }
+ ],
+ "https://github.com/yukascomfy/ATI_AudioReactive": [
+ [
+ "AudioReactivePathAnimator"
+ ],
+ {
+ "title_aux": "ATI_AudioReactive"
+ }
+ ],
+ "https://github.com/yushan777/ComfyUI-Y7-SBS-2Dto3D": [
+ [
+ "Y7_SideBySide",
+ "Y7_VideoSideBySide"
+ ],
+ {
+ "title_aux": "ComfyUI-Y7-SBS-2Dto3D"
+ }
+ ],
+ "https://github.com/yushan777/ComfyUI-Y7Nodes": [
+ [
+ "Y7Nodes_CLIP_TokenCounter",
+ "Y7Nodes_CatchEditTextNodeDual",
+ "Y7Nodes_Grid2Batch",
+ "Y7Nodes_ImageRow",
+ "Y7Nodes_ImageSizePresets",
+ "Y7Nodes_PromptEnhancerFlux",
+ "Y7Nodes_ShowAnything",
+ "Y7Nodes_SmolVLM",
+ "Y7Nodes_T5_TokenCounter",
+ "Y7Nodes_Text"
+ ],
+ {
+ "title_aux": "Y7Nodes for ComfyUI"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-Depth-Anything-Tensorrt": [
+ [
+ "DepthAnythingEngineBuilder",
+ "DepthAnythingMapDisplay",
+ "DepthAnythingTensorrt",
+ "DepthAnythingTensorrtAdvanced"
+ ],
+ {
+ "title_aux": "ComfyUI Depth Anything TensorRT"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-Dwpose-Tensorrt": [
+ [
+ "DwposeTensorrt",
+ "LoadDwposeTensorrtModels"
+ ],
+ {
+ "title_aux": "ComfyUI Dwpose TensorRT"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-FLOAT": [
+ [
+ "FloatProcess",
+ "LoadFloatModels"
+ ],
+ {
+ "title_aux": "ComfyUI FLOAT"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-Facerestore-Tensorrt": [
+ [
+ "FaceRestoreTensorrt"
+ ],
+ {
+ "title_aux": "ComfyUI Facerestore TensorRT"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-PiperTTS": [
+ [
+ "PiperTTS"
+ ],
+ {
+ "title_aux": "ComfyUI PiperTTS"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-Pronodes": [
+ [
+ "ImagesSeekerNode",
+ "ImagesShufflerNode",
+ "LoadImageFromOutputDirectoryNode",
+ "LoadYoutubeVideoNode",
+ "PreviewVHSAudioNode",
+ "SaveAndOverwriteImageNode",
+ "VHSFilenamesToPathNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Pronodes"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-Rife-Tensorrt": [
+ [
+ "RifeTensorrt"
+ ],
+ {
+ "title_aux": "ComfyUI Rife TensorRT"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-Thera": [
+ [
+ "LoadTheraModel",
+ "TheraProcess"
+ ],
+ {
+ "title_aux": "ComfyUI Thera"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-Upscaler-Tensorrt": [
+ [
+ "LoadUpscalerTensorrtModel",
+ "UpscalerTensorrt"
+ ],
+ {
+ "title_aux": "ComfyUI Upscaler TensorRT"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-Video-Depth-Anything": [
+ [
+ "LoadVideoDepthAnythingModel",
+ "VideoDepthAnythingOutput",
+ "VideoDepthAnythingProcess",
+ "VideoDepthAnythingSaveEXR"
+ ],
+ {
+ "title_aux": "ComfyUI Video Depth Anything"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-Vsgan": [
+ [
+ "DepthAnythingTrtNode",
+ "TTSCapcutNode",
+ "UpscaleVideoTrtNode"
+ ],
+ {
+ "title_aux": "ComfyUI-Vsgan"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-Whisper": [
+ [
+ "Add Subtitles To Background",
+ "Add Subtitles To Frames",
+ "Apply Whisper",
+ "Resize Cropped Subtitles",
+ "Save SRT"
+ ],
+ {
+ "title_aux": "ComfyUI Whisper"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI-YoloNasPose-Tensorrt": [
+ [
+ "YoloNasPoseEngineBuilder",
+ "YoloNasPoseTensorrt"
+ ],
+ {
+ "title_aux": "ComfyUI YoloNasPose Tensorrt"
+ }
+ ],
+ "https://github.com/yuvraj108c/ComfyUI_InvSR": [
+ [
+ "InvSRSampler",
+ "LoadInvSRModels"
+ ],
+ {
+ "title_aux": "ComfyUI InvSR"
+ }
+ ],
+ "https://github.com/yvann-ba/ComfyUI_Yvann-Nodes": [
+ [
+ "Audio Analysis",
+ "Audio IPAdapter Transitions",
+ "Audio Peaks Detection",
+ "Audio Prompt Schedule",
+ "Audio Remixer",
+ "Edit Audio Weights",
+ "Float to Int",
+ "Floats To Weights Strategy",
+ "Floats Visualizer",
+ "Invert Floats",
+ "Load Audio Separation Model",
+ "Mask To Float",
+ "Repeat Image To Count"
+ ],
+ {
+ "title_aux": "ComfyUI_Yvann-Nodes"
+ }
+ ],
+ "https://github.com/za-wa-n-go/ComfyUI_Zwng_Nodes": [
+ [
+ "ZwngLoadImagePathOrURL",
+ "ZwngPreviewImageAndMask",
+ "ZwngSimpleGoogleTranslater",
+ "ZwngSimplePhotoshopConnector"
+ ],
+ {
+ "title_aux": "ComfyUI_Zwng_Nodes"
+ }
+ ],
+ "https://github.com/zade23/Comfyui-Distill-Any-Depth": [
+ [
+ "DistillAnyDepthProcessImage",
+ "DownloadDistillAnyDepthModel"
+ ],
+ {
+ "title_aux": "Comfyui-Distill-Any-Depth"
+ }
+ ],
+ "https://github.com/zade23/Comfyui-MoGe2": [
+ [
+ "RunMoGe2Process"
+ ],
+ {
+ "title_aux": "ComfyUI-MoGe2"
+ }
+ ],
+ "https://github.com/zaheenrahman/ComfyUI-ColorCorrection": [
+ [
+ "ClothingColorCorrection"
+ ],
+ {
+ "title_aux": "ComfyUI-ColorCorrection"
+ }
+ ],
+ "https://github.com/zavatmotion/ComfyUI-Workflow-Backup": [
+ [
+ "WorkflowBackup"
+ ],
+ {
+ "title_aux": "ComfyUI Workflow Backup"
+ }
+ ],
+ "https://github.com/zccrs/comfyui-dci": [
+ [
+ "Base64Decoder",
+ "Base64Encoder",
+ "BinaryFileLoader",
+ "BinaryFileSaver",
+ "DCIAnalysis",
+ "DCIFileNode",
+ "DCIFileSaver",
+ "DCIImage",
+ "DCIImagePreview",
+ "DCIPreviewNode",
+ "DCISampleImage",
+ "DCI_Analysis",
+ "DCI_Base64Decoder",
+ "DCI_Base64Encoder",
+ "DCI_BinaryFileLoader",
+ "DCI_BinaryFileSaver",
+ "DCI_DebLoader",
+ "DCI_DebPackager",
+ "DCI_DirectoryLoader",
+ "DCI_FileNode",
+ "DCI_FileSaver",
+ "DCI_Image",
+ "DCI_ImagePreview",
+ "DCI_PreviewNode",
+ "DCI_SampleImage",
+ "DebLoader",
+ "DebPackager",
+ "DirectoryLoader"
+ ],
+ {
+ "title_aux": "ComfyUI DCI"
+ }
+ ],
+ "https://github.com/zcfrank1st/Comfyui-Toolbox": [
+ [
+ "PreviewJson",
+ "SaveJson",
+ "TestJsonPreview"
+ ],
+ {
+ "title_aux": "Comfyui-Toolbox"
+ }
+ ],
+ "https://github.com/zcfrank1st/Comfyui-Yolov8": [
+ [
+ "Yolov8Detection",
+ "Yolov8Segmentation"
+ ],
+ {
+ "title_aux": "ComfyUI Yolov8"
+ }
+ ],
+ "https://github.com/zcfrank1st/comfyui_visual_anagrams": [
+ [
+ "VisialAnagramsSample",
+ "VisualAnagramsSample"
+ ],
+ {
+ "title_aux": "comfyui_visual_anagram"
+ }
+ ],
+ "https://github.com/zeeoale/PromptCreatorNode": [
+ [
+ "IdentityMixerNode",
+ "PFN_PromptTagsExtractor",
+ "PromptBuilderNode",
+ "PromptCreatorNode",
+ "PromptReplayNode",
+ "PromptTagsExtractorNode"
+ ],
+ {
+ "title_aux": "PromptCreatorNodetraumakom Prompt Generator"
+ }
+ ],
+ "https://github.com/zengxianyu/ComfyUIIntensityDepth": [
+ [
+ "IntensityDepthEstimation"
+ ],
+ {
+ "title_aux": "Intensity Fake Depth Node for ComfyUI"
+ }
+ ],
+ "https://github.com/zengxianyu/structured-noise": [
+ [
+ "StructuredNoise"
+ ],
+ {
+ "title_aux": "Phase-Preserving Noise"
+ }
+ ],
+ "https://github.com/zentrocdot/ComfyUI-RealESRGAN_Upscaler": [
+ [
+ "\ud83d\ude80 Universal RealESRGAN Upscaler",
+ "\ud83e\uddf3 Show Data"
+ ],
+ {
+ "title_aux": "ComfyUI-RealESRGAN_Upscaler"
+ }
+ ],
+ "https://github.com/zentrocdot/ComfyUI-Simple_Image_To_Prompt": [
+ [
+ "\ud83d\udc41\ufe0f Image To Prompt",
+ "\ud83d\udc41\ufe0f Image To Prompt (NO UPDATE)",
+ "\ud83e\uddf3 Show Data"
+ ],
+ {
+ "title_aux": "ComfyUI-Simple_Image_To_Prompt"
+ }
+ ],
+ "https://github.com/zentrocdot/ComfyUI_Circle_Detection": [
+ [
+ "\u270f\ufe0f Input Data",
+ "\ud83d\udcc4 Show Data",
+ "\ud83d\udd2c Circle Detection (Hough)",
+ "\ud83d\udd2c Ellipse Detection (Simple)"
+ ],
+ {
+ "title_aux": "ComfyUI_Circle_Detection"
+ }
+ ],
+ "https://github.com/zer0TF/cute-comfy": [
+ [
+ "Cute.Placeholder"
+ ],
+ {
+ "title_aux": "Cute Comfy"
+ }
+ ],
+ "https://github.com/zer0thgear/zer0-comfy-utils": [
+ [
+ "List Combine Node (zer0)",
+ "Multiline String Node (zer0)",
+ "Prompt Minimizer And Splitter Node (zer0)",
+ "Quality Tag Prepend Node (zer0)",
+ "Tavern Card Creation Node (zer0)",
+ "Tavern Card Info Node (zer0)"
+ ],
+ {
+ "author": "zer0gear",
+ "description": "Dubiously useful nodes that I've made for my own use.",
+ "nickname": "zer0gear Comfy Utils",
+ "title": "zer0gear's Comfy Utilities",
+ "title_aux": "zer0 Comfy Utilities"
+ }
+ ],
+ "https://github.com/zeroxoxo/ComfyUI-Fast-Style-Transfer": [
+ [
+ "FastStyleTransfer",
+ "NeuralStyleTransfer",
+ "TrainFastStyleTransfer"
+ ],
+ {
+ "title_aux": "ComfyUI-Fast-Style-Transfer"
+ }
+ ],
+ "https://github.com/zfkun/ComfyUI_zfkun": [
+ [
+ "ZFLoadImagePath",
+ "ZFPreviewText",
+ "ZFPreviewTextList",
+ "ZFPreviewTextMultiline",
+ "ZFShareScreen",
+ "ZFSplitText",
+ "ZFTextTranslation"
+ ],
+ {
+ "title_aux": "ComfyUI_zfkun"
+ }
+ ],
+ "https://github.com/zhangle0013/comfyui-EmptyImageYesON": [
+ [
+ "ImageAutoDisableNode"
+ ],
+ {
+ "title_aux": "comfyui-EmptyImageYesON"
+ }
+ ],
+ "https://github.com/zhanglongxiao111/Comfyui-geminiapi": [
+ [
+ "ElevenLabsTTSNode",
+ "FluxKontextMaxNode",
+ "FluxKontextProNode",
+ "GPTImageEditNode",
+ "GeminiChatNode",
+ "GeminiSegmentationNode",
+ "GeminiTTSNode",
+ "GoogleImagenEditNode",
+ "GoogleImagenNode",
+ "NanoBananaNode",
+ "NanoBananaProNode",
+ "NanoBananaProVertexNode",
+ "Veo3VideoGenerator"
+ ],
+ {
+ "title_aux": "Comfyui-geminiapi"
+ }
+ ],
+ "https://github.com/zhangp365/ComfyUI-utils-nodes": [
+ [
+ "AspectRatioSizeNodeOfUtils",
+ "BooleanControlOutput",
+ "CheckpointLoaderSimpleWithSwitch",
+ "ColorCorrectOfUtils",
+ "ConcatTextOfUtils",
+ "CropByMaskToSpecificSize",
+ "DeepfaceAnalyzeFaceAttributes",
+ "DetectorForNSFW",
+ "EmptyConditioning",
+ "FalFunControlVideoRequestNode",
+ "FalImage2VideoRequestNode",
+ "FalNanoBananaNode",
+ "FalVideo2VideoRequestNode",
+ "FloatMultipleAddLiteral",
+ "FrameAdjuster",
+ "GeminiPromptEnhance",
+ "GenderControlOutput",
+ "ImageAutoSelector",
+ "ImageBatchOneOrMore",
+ "ImageCompositeMaskedOneByOne",
+ "ImageCompositeMaskedWithSwitch",
+ "ImageCompositeWatermark",
+ "ImageConcanateOfUtils",
+ "ImageMaskColorAverage",
+ "ImageResizeTo8x",
+ "ImageScaleToTotalPixelsSwitch",
+ "ImageTransition",
+ "ImageTransitionBottomToTop",
+ "ImageTransitionLeftToRight",
+ "ImageTransitionRightToLeft",
+ "ImageTransitionTopToBottom",
+ "ImagesConcanateToGrid",
+ "IntMultipleAddLiteral",
+ "LayerUtility: CropByMask To Specific Size",
+ "LoadImageMaskWithSwitch",
+ "LoadImageMaskWithoutListDir",
+ "LoadImageWithSwitch",
+ "LoadImageWithoutListDir",
+ "MaskAreaComparison",
+ "MaskAutoSelector",
+ "MaskCoverFourCorners",
+ "MaskFastGrow",
+ "MaskFromFaceModel",
+ "MaskofCenter",
+ "MatchImageRatioToPreset",
+ "ModelsDownloaderOfUtils",
+ "ModifyTextGender",
+ "NeedImageSizeAndCount",
+ "NovitaVideoRequestNode",
+ "QwenEditPlusLoraNode",
+ "ReferenceLatentSwitch",
+ "ReplicateRequstNode",
+ "ReplicateVideoRequestNode",
+ "SegmindVideoRequestNode",
+ "SplitMask",
+ "TextInputAutoSelector",
+ "TextPreview",
+ "TorchCompileModelAdvancedOfUtils",
+ "UpscaleImageWithModelIfNeed",
+ "VAEEncoderSwitch",
+ "VolcanoArkImageEditNode",
+ "VolcanoImageEditNode",
+ "VolcanoOutpaintingNode"
+ ],
+ {
+ "title_aux": "zhangp365/ComfyUI-utils-nodes"
+ }
+ ],
+ "https://github.com/zhangp365/ComfyUI_photomakerV2_native": [
+ [
+ "PhotoMakerEncodeV2",
+ "PhotoMakerLoaderV2"
+ ],
+ {
+ "title_aux": "ComfyUI_photomakerV2_native"
+ }
+ ],
+ "https://github.com/zhaocaiji/ComfyUI-Mute-Switch": [
+ [
+ "MuteSwitch"
+ ],
+ {
+ "title_aux": "ComfyUI-Mute-Switch"
+ }
+ ],
+ "https://github.com/zhaocaiji/ComfyUI-VideoFrameTools": [
+ [
+ "VideoFrameReorderAndSkip"
+ ],
+ {
+ "title_aux": "ComfyUI-VideoFrameTools"
+ }
+ ],
+ "https://github.com/zhiselfly/ComfyUI-Alimama-ControlNet-compatible": [
+ [
+ "SD3AlimamaInpaintControlNetApplyAdvanced",
+ "SD3AlimamaInpaintControlNetLoader"
+ ],
+ {
+ "title_aux": "ComfyUI-Alimama-ControlNet-compatible"
+ }
+ ],
+ "https://github.com/zhongpei/ComfyUI-InstructIR": [
+ [
+ "InstructIRProcess",
+ "LoadInstructIRModel"
+ ],
+ {
+ "title_aux": "ComfyUI for InstructIR"
+ }
+ ],
+ "https://github.com/zhuanqianfish/ComfyUI-EasyNode": [
+ [
+ "EasyCaptureNode",
+ "EasyVideoOutputNode",
+ "SendImageWebSocket",
+ "SendImageWebSocketNode"
+ ],
+ {
+ "title_aux": "EasyCaptureNode for ComfyUI"
+ }
+ ],
+ "https://github.com/zhulu111/ComfyUI_Bxb": [
+ [
+ "bxbSwitch",
+ "sdBxb",
+ "sdBxb_saveImage",
+ "sdBxb_textInput"
+ ],
+ {
+ "title_aux": "ComfyUI_Bxb"
+ }
+ ],
+ "https://github.com/zhuyanan/Comfy-FilmSimulator": [
+ [
+ "DNG Image Reader",
+ "FilmSimNode",
+ "SaveAVIF_HDR"
+ ],
+ {
+ "title_aux": "Comfy-FilmSimulator"
+ }
+ ],
+ "https://github.com/zichongc/ComfyUI-Attention-Distillation": [
+ [
+ "ADHandler",
+ "ADOptimizer",
+ "ADSampler",
+ "LoadDistiller",
+ "LoadPILImage",
+ "PureText",
+ "ResizeImage"
+ ],
+ {
+ "title_aux": "ComfyUI-Attention-Distillation"
+ }
+ ],
+ "https://github.com/zisb/comfyui-texture-packer": [
+ [
+ "AlphaEdgeSolidify"
+ ],
+ {
+ "title_aux": "comfyui-texture-packer"
+ }
+ ],
+ "https://github.com/zl9739379/ComfyUI-ArkVideoGenerate": [
+ [
+ "ArkVideoGenerate"
+ ],
+ {
+ "title_aux": "ComfyUI-ArkVideoGenerate"
+ }
+ ],
+ "https://github.com/zmwv823/ComfyUI_Anytext": [
+ [
+ "UL_AnyText2Fonts",
+ "UL_AnyTextComposer",
+ "UL_AnyTextEncoder",
+ "UL_AnyTextFontImg",
+ "UL_AnyTextFormatter",
+ "UL_AnyTextLoader",
+ "UL_AnyTextSampler",
+ "UL_DiffusersCheckpointLoader",
+ "UL_DiffusersControlNetApplyAdvanced",
+ "UL_DiffusersControlNetLoader",
+ "UL_Image_Generation_Diffusers_Sampler",
+ "UL_Image_Generation_Glyph_ByT5",
+ "UL_Image_Generation_Glyph_ByT5_Checkponits_Loader",
+ "UL_Image_Generation_Glyph_ByT5_Font",
+ "UL_Image_Generation_JoyType_Font_Img",
+ "UL_Image_Generation_JoyType_Render_List",
+ "UL_Image_Process_Common_Cv2_Canny",
+ "UL_Translator",
+ "UL_TranslatorLoader",
+ "U_LoRAS"
+ ],
+ {
+ "title_aux": "ComfyUI_Anytext"
+ }
+ ],
+ "https://github.com/zn123/ComfyUI-image-processor-zn123": [
+ [
+ "ImageAdjustBrightness",
+ "ImageAdjustContrast",
+ "ImageBlur",
+ "ImageCrop",
+ "ImageFlip",
+ "ImageGrayscale",
+ "ImageResize",
+ "ImageRotate",
+ "ImageScaleByLongSide",
+ "ImageScaleByShortSide",
+ "ImageScaleByShortSideFactor",
+ "ImageSharpen",
+ "ImageUpscale"
+ ],
+ {
+ "title_aux": "ComfyUI-image-processor-zn123"
+ }
+ ],
+ "https://github.com/zohac/ComfyUI_ZC_DrawShape": [
+ [
+ "ZcDrawShape"
+ ],
+ {
+ "author": "Zohac",
+ "description": "nodes for artists, designers and animators.",
+ "nickname": "Zc DrawShape",
+ "title": "Zc DrawShape",
+ "title_aux": "ComfyUI_ZC_DrawShape"
+ }
+ ],
+ "https://github.com/zombieyang/sd-ppp": [
+ [
+ "CLIP Text Encode PS Regional",
+ "Get Image From Photoshop Layer",
+ "Send Images To Photoshop"
+ ],
+ {
+ "title_aux": "SD-PPP"
+ }
+ ],
+ "https://github.com/zubenelakrab/ComfyUI-ASV-Nodes": [
+ [
+ "ASVPromptGenerator"
+ ],
+ {
+ "title_aux": "ComfyUI-ASV-Nodes Node"
+ }
+ ],
+ "https://github.com/zwaigani/ComfyUI-LoRA-stacker": [
+ [
+ "LoRA Stacker"
+ ],
+ {
+ "title_aux": "ComfyUI-LoRA-stacker"
+ }
+ ],
+ "https://github.com/zwaigani/ComfyUI-VRAM-watcher": [
+ [
+ "VRAMWatcher"
+ ],
+ {
+ "title_aux": "ComfyUI-VRAM-watcher"
+ }
+ ],
+ "https://github.com/zygion/comfyui-zygion-util-nodes": [
+ [
+ "ItemListNode",
+ "SceneQueueNode",
+ "TemplateInputNode",
+ "TemplateProcessorNode",
+ "TriggerPassthroughNode"
+ ],
+ {
+ "title_aux": "i-zygion-util-nodes"
+ }
+ ],
+ "https://github.com/zzubnik/TT_TextTools": [
+ [
+ "TT_StoryCombiner",
+ "TT_TextFileSelectorNode",
+ "TT_TextInput",
+ "TT_TextReplacer"
+ ],
+ {
+ "title_aux": "TT_TextTools"
+ }
+ ],
+ "https://github.com/zzw5516/ComfyUI-zw-tools": [
+ [
+ "ZwPrompt",
+ "ZwPromptText"
+ ],
+ {
+ "title_aux": "ComfyUI-zw-tools"
+ }
+ ],
+ "https://raw.githubusercontent.com/1shadow1/hayo_comfyui_nodes/main/LZCNodes.py": [
+ [
+ "LoadPILImages",
+ "MergeImages",
+ "make_transparentmask",
+ "tensor_trans_pil",
+ "words_generatee"
+ ],
+ {
+ "title_aux": "Hayo comfyui nodes"
+ }
+ ],
+ "https://raw.githubusercontent.com/CaptainGrock/ComfyUIInvisibleWatermark/main/Invisible%20Watermark.py": [
+ [
+ "Apply Invisible Watermark",
+ "Extract Watermark"
+ ],
+ {
+ "title_aux": "ComfyUIInvisibleWatermark"
+ }
+ ],
+ "https://raw.githubusercontent.com/NeuralNotW0rk/ComfyUI-Waveform-Extensions/main/EXT_AudioManipulation.py": [
+ [
+ "BatchJoinAudio",
+ "CutAudio",
+ "DuplicateAudio",
+ "JoinAudio",
+ "ResampleAudio",
+ "ReverseAudio",
+ "StretchAudio"
+ ],
+ {
+ "title_aux": "Waveform Extensions"
+ }
+ ],
+ "https://raw.githubusercontent.com/Onierous/QRNG_Node_ComfyUI/main/qrng_node.py": [
+ [
+ "QRNG_Node_CSV"
+ ],
+ {
+ "title_aux": "QRNG_Node_ComfyUI"
+ }
+ ],
+ "https://raw.githubusercontent.com/SadaleNet/CLIPTextEncodeA1111-ComfyUI/master/custom_nodes/clip_text_encoder_a1111.py": [
+ [
+ "CLIPTextEncodeA1111",
+ "RerouteTextForCLIPTextEncodeA1111"
+ ],
+ {
+ "title_aux": "ComfyUI A1111-like Prompt Custom Node Solution"
+ }
+ ],
+ "https://raw.githubusercontent.com/Ser-Hilary/SDXL_sizing/main/conditioning_sizing_for_SDXL.py": [
+ [
+ "get_aspect_from_image",
+ "get_aspect_from_ints",
+ "sizing_node",
+ "sizing_node_basic",
+ "sizing_node_unparsed"
+ ],
+ {
+ "title_aux": "SDXL_sizing"
+ }
+ ],
+ "https://raw.githubusercontent.com/barckley75/comfyUI_DaVinciResolve/main/custom_nodes/node_text_to_speech.py": [
+ [
+ "TextToSpeech"
+ ],
+ {
+ "title_aux": "comfyUI_DaVinciResolve"
+ }
+ ],
+ "https://raw.githubusercontent.com/bkunbargi/BrevImage/main/BrevLoadImage.py": [
+ [
+ "BrevImage"
+ ],
+ {
+ "title_aux": "BrevImage"
+ }
+ ],
+ "https://raw.githubusercontent.com/catscandrive/comfyui-imagesubfolders/main/loadImageWithSubfolders.py": [
+ [
+ "LoadImagewithSubfolders"
+ ],
+ {
+ "title_aux": "Image loader with subfolders"
+ }
+ ],
+ "https://raw.githubusercontent.com/dawangraoming/ComfyUI_ksampler_gpu/main/ksampler_gpu.py": [
+ [
+ "KSamplerAdvancedGPU",
+ "KSamplerGPU"
+ ],
+ {
+ "title_aux": "KSampler GPU"
+ }
+ ],
+ "https://raw.githubusercontent.com/fitCorder/fcSuite/main/fcSuite.py": [
+ [
+ "fcFloat",
+ "fcFloatMatic",
+ "fcFloatNode",
+ "fcHex",
+ "fcInteger",
+ "fcIntegerNode"
+ ],
+ {
+ "title_aux": "fcSuite"
+ }
+ ],
+ "https://raw.githubusercontent.com/folkghost/comfyui_search_csv/main/search_csv_node.py": [
+ [
+ "Search CSV",
+ "search_csv"
+ ],
+ {
+ "title_aux": "CSV Search Node"
+ }
+ ],
+ "https://raw.githubusercontent.com/huimengshiguang/AspectAwareTiling/refs/heads/main/hmsg-quanjing.py": [
+ [
+ "AspectAwareTiling"
+ ],
+ {
+ "title_aux": "AspectAwareTiling"
+ }
+ ],
+ "https://raw.githubusercontent.com/lordgasmic/comfyui_wildcards/master/wildcards.py": [
+ [
+ "CLIPTextEncodeWithWildcards"
+ ],
+ {
+ "title_aux": "Wildcards"
+ }
+ ],
+ "https://raw.githubusercontent.com/lrzjason/ComfyUIJasonNode/main/SDXLMixSampler.py": [
+ [
+ "JNode",
+ "SDXLMixSampler"
+ ],
+ {
+ "title_aux": "ComfyUIJasonNode"
+ }
+ ],
+ "https://raw.githubusercontent.com/m957ymj75urz/ComfyUI-Custom-Nodes/main/clip-text-encode-split/clip_text_encode_split.py": [
+ [
+ "RawText",
+ "RawTextCombine",
+ "RawTextEncode",
+ "RawTextReplace"
+ ],
+ {
+ "title_aux": "m957ymj75urz/ComfyUI-Custom-Nodes"
+ }
+ ],
+ "https://raw.githubusercontent.com/nicolai256/comfyUI_Nodes_nicolai256/main/yugioh-presets.py": [
+ [
+ "yugioh_Presets"
+ ],
+ {
+ "title_aux": "comfyUI_Nodes_nicolai256"
+ }
+ ],
+ "https://raw.githubusercontent.com/ntdviet/comfyui-ext/main/custom_nodes/gcLatentTunnel/gcLatentTunnel.py": [
+ [
+ "gcLatentTunnel"
+ ],
+ {
+ "title_aux": "ntdviet/comfyui-ext"
+ }
+ ],
+ "https://raw.githubusercontent.com/s1dlx/comfy_meh/main/meh.py": [
+ [
+ "MergingExecutionHelper"
+ ],
+ {
+ "title_aux": "comfy_meh"
+ }
+ ],
+ "https://raw.githubusercontent.com/seghier/ComfyUI_LibreTranslate/main/translate_node.py": [
+ [
+ "LibreTranslateLocally",
+ "LibreTranslateOnline"
+ ],
+ {
+ "title_aux": "ComfyUI_LibreTranslate"
+ }
+ ],
+ "https://raw.githubusercontent.com/taabata/Comfy_Syrian_Falcon_Nodes/main/SyrianFalconNodes.py": [
+ [
+ "CompositeImage",
+ "KSamplerAlternate",
+ "KSamplerPromptEdit",
+ "KSamplerPromptEditAndAlternate",
+ "LoopBack",
+ "QRGenerate",
+ "WordAsImage"
+ ],
+ {
+ "title_aux": "Syrian Falcon Nodes"
+ }
+ ],
+ "https://raw.githubusercontent.com/throttlekitty/SDXLCustomAspectRatio/main/SDXLAspectRatio.py": [
+ [
+ "SDXLAspectRatio"
+ ],
+ {
+ "title_aux": "SDXLCustomAspectRatio"
+ }
+ ],
+ "https://raw.githubusercontent.com/time-river/ComfyUI-CLIPSeg/main/custom_nodes/clipseg.py": [
+ [
+ "CLIPSeg",
+ "CombineSegMasks"
+ ],
+ {
+ "title_aux": "CLIPSeg"
+ }
+ ],
+ "https://raw.githubusercontent.com/ultimatech-cn/FaceSimilarity/main/faceSimilarity.py": [
+ [
+ "Face-analyze",
+ "Face-similarity"
+ ],
+ {
+ "title_aux": "FaceSimilarity"
+ }
+ ],
+ "https://raw.githubusercontent.com/vxinhao/color2rgb/main/color2rgb.py": [
+ [
+ "color2RGB"
+ ],
+ {
+ "title_aux": "color2rgb"
+ }
+ ],
+ "https://raw.githubusercontent.com/wsippel/comfyui_ws/main/sdxl_utility.py": [
+ [
+ "SDXLResolutionPresets"
+ ],
+ {
+ "title_aux": "SDXLResolutionPresets"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/new/model-list.json b/custom_nodes/ComfyUI-Manager/node_db/new/model-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..8b696c975c0ec8225d2d5856dc821247b0d23c79
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/new/model-list.json
@@ -0,0 +1,692 @@
+{
+ "models": [
+
+ {
+ "name": "Comfy-Org/Wan2.2 i2v high noise 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for i2v high noise 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_i2v_high_noise_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_i2v_high_noise_14B_fp16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 i2v high noise 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for i2v high noise 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 i2v low noise 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for i2v low noise 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_i2v_low_noise_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_i2v_low_noise_14B_fp16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 i2v low noise 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for i2v low noise 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 t2v high noise 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for t2v high noise 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_t2v_high_noise_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_t2v_high_noise_14B_fp16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 t2v high noise 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for t2v high noise 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_t2v_high_noise_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_t2v_high_noise_14B_fp8_scaled.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 t2v low noise 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for t2v low noise 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_t2v_low_noise_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_t2v_low_noise_14B_fp16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 t2v low noise 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for t2v low noise 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_t2v_low_noise_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_t2v_low_noise_14B_fp8_scaled.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.2 ti2v 5B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.2",
+ "save_path": "diffusion_models/Wan2.2",
+ "description": "Wan2.2 diffusion model for ti2v 5B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged",
+ "filename": "wan2.2_ti2v_5B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_ti2v_5B_fp16.safetensors",
+ "size": "10.0GB"
+ },
+
+ {
+ "name": "sam2.1_hiera_tiny.pt",
+ "type": "sam2.1",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2.1 hiera model (tiny)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2.1_hiera_tiny.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_tiny.pt",
+ "size": "149.0MB"
+ },
+ {
+ "name": "sam2.1_hiera_small.pt",
+ "type": "sam2.1",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2.1 hiera model (small)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2.1_hiera_small.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_small.pt",
+ "size": "176.0MB"
+ },
+ {
+ "name": "sam2.1_hiera_base_plus.pt",
+ "type": "sam2.1",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2.1 hiera model (base+)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2.1_hiera_base_plus.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_base_plus.pt",
+ "size": "309.0MB"
+ },
+ {
+ "name": "sam2.1_hiera_large.pt",
+ "type": "sam2.1",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2.1 hiera model (large)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2.1_hiera_large.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_large.pt",
+ "size": "857.0MB"
+ },
+
+ {
+ "name": "sam2_hiera_tiny.pt",
+ "type": "sam2",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2 hiera model (tiny)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2_hiera_tiny.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_tiny.pt",
+ "size": "149.0MB"
+ },
+ {
+ "name": "sam2_hiera_small.pt",
+ "type": "sam2",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2 hiera model (small)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2_hiera_small.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_small.pt",
+ "size": "176.0MB"
+ },
+ {
+ "name": "sam2_hiera_base_plus.pt",
+ "type": "sam2",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2 hiera model (base+)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2_hiera_base_plus.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_base_plus.pt",
+ "size": "309.0MB"
+ },
+ {
+ "name": "sam2_hiera_large.pt",
+ "type": "sam2",
+ "base": "SAM",
+ "save_path": "sams",
+ "description": "Segmenty Anything SAM 2 hiera model (large)",
+ "reference": "https://github.com/facebookresearch/sam2#model-description",
+ "filename": "sam2_hiera_large.pt",
+ "url": "https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_large.pt",
+ "size": "857.0MB"
+ },
+
+ {
+ "name": "Comfy-Org/omnigen2_fp16.safetensors",
+ "type": "diffusion_model",
+ "base": "OmniGen2",
+ "save_path": "default",
+ "description": "OmniGen2 diffusion model. This is required for using OmniGen2.",
+ "reference": "https://huggingface.co/Comfy-Org/Omnigen2_ComfyUI_repackaged",
+ "filename": "omnigen2_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Omnigen2_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/omnigen2_fp16.safetensors",
+ "size": "7.93GB"
+ },
+ {
+ "name": "Comfy-Org/qwen_2.5_vl_fp16.safetensors",
+ "type": "clip",
+ "base": "qwen-2.5",
+ "save_path": "default",
+ "description": "text encoder for OmniGen2",
+ "reference": "https://huggingface.co/Comfy-Org/Omnigen2_ComfyUI_repackaged",
+ "filename": "qwen_2.5_vl_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Omnigen2_ComfyUI_repackaged/resolve/main/split_files/text_encoders/qwen_2.5_vl_fp16.safetensors",
+ "size": "7.51GB"
+ },
+
+ {
+ "name": "Latent Bridge Matching for Image Relighting",
+ "type": "diffusion_model",
+ "base": "LBM",
+ "save_path": "diffusion_models/LBM",
+ "description": "Latent Bridge Matching (LBM) Relighting model",
+ "reference": "https://huggingface.co/jasperai/LBM_relighting",
+ "filename": "LBM_relighting.safetensors",
+ "url": "https://huggingface.co/jasperai/LBM_relighting/resolve/main/model.safetensors",
+ "size": "5.02GB"
+ },
+
+ {
+ "name": "LTX-Video 13B Distilled v0.9.7",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "Distilled version of the LTX-Video 13B model, providing improved efficiency while maintaining high-resolution quality.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.7-distilled.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.7-distilled.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "LTX-Video 13B Distilled FP8 v0.9.7",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "Quantized distilled version of the LTX-Video 13B model, optimized for even lower VRAM usage while maintaining quality.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.7-distilled-fp8.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.7-distilled-fp8.safetensors",
+ "size": "15.7GB"
+ },
+ {
+ "name": "LTX-Video 13B Distilled LoRA v0.9.7",
+ "type": "lora",
+ "base": "LTX-Video",
+ "save_path": "loras",
+ "description": "A LoRA adapter that transforms the standard LTX-Video 13B model into a distilled version when loaded.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.7-distilled-lora128.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.7-distilled-lora128.safetensors",
+ "size": "1.33GB"
+ },
+ {
+ "name": "lllyasviel/FramePackI2V_HY",
+ "type": "FramePackI2V",
+ "base": "FramePackI2V",
+ "save_path": "diffusers/lllyasviel",
+ "description": "[SNAPSHOT] This is the f1k1_x_g9_f1k1f2k2f16k4_td FramePack for HY. [w/You cannot download this item on ComfyUI-Manager versions below V3.18]",
+ "reference": "https://huggingface.co/lllyasviel/FramePackI2V_HY",
+ "filename": "",
+ "url": "lllyasviel/FramePackI2V_HY",
+ "size": "25.75GB"
+ },
+
+ {
+ "name": "LTX-Video Spatial Upscaler v0.9.7",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "Spatial upscaler model for LTX-Video. This model enhances the spatial resolution of generated videos.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-spatial-upscaler-0.9.7.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-spatial-upscaler-0.9.7.safetensors",
+ "size": "505MB"
+ },
+ {
+ "name": "LTX-Video Temporal Upscaler v0.9.7",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "Temporal upscaler model for LTX-Video. This model enhances the temporal resolution and smoothness of generated videos.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-temporal-upscaler-0.9.7.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-temporal-upscaler-0.9.7.safetensors",
+ "size": "524MB"
+ },
+ {
+ "name": "LTX-Video 13B v0.9.7",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "High-resolution quality LTX-Video 13B model.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.7-dev.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.7-dev.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "LTX-Video 13B FP8 v0.9.7",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "Quantized version of the LTX-Video 13B model, optimized for lower VRAM usage while maintaining high quality.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltxv-13b-0.9.7-dev-fp8.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-13b-0.9.7-dev-fp8.safetensors",
+ "size": "15.7GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 480p 14B (bf16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 480p 14B (bf16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_480p_14B_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_480p_14B_bf16.safetensors",
+ "size": "32.8GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 480p 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 480p 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_480p_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_480p_14B_fp16.safetensors",
+ "size": "32.8GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 480p 14B (fp8_e4m3fn)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 480p 14B (fp8_e4m3fn)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_480p_14B_fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_480p_14B_fp8_e4m3fn.safetensors",
+ "size": "16.4GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 480p 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 480p 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_480p_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_480p_14B_fp8_scaled.safetensors",
+ "size": "16.4GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 720p 14B (bf16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 720p 14B (bf16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_720p_14B_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_720p_14B_bf16.safetensors",
+ "size": "32.8GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 720p 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 720p 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_720p_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_720p_14B_fp16.safetensors",
+ "size": "32.8GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 720p 14B (fp8_e4m3fn)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 720p 14B (fp8_e4m3fn)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_720p_14B_fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_720p_14B_fp8_e4m3fn.safetensors",
+ "size": "16.4GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 i2v 720p 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for i2v 720p 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_i2v_720p_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_720p_14B_fp8_scaled.safetensors",
+ "size": "16.4GB"
+ },
+ {
+ "name": "Comfy-Org/clip_vision_h.safetensors",
+ "type": "clip_vision",
+ "base": "clip_vision_h",
+ "save_path": "clip_vision",
+ "description": "clip_vision_h model for Wan2.1",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "clip_vision_h.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/clip_vision/clip_vision_h.safetensors",
+ "size": "1.26GB"
+ },
+
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 1.3B (bf16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 1.3B (bf16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_1.3B_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_1.3B_bf16.safetensors",
+ "size": "2.84GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 1.3B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 1.3B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_1.3B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_1.3B_fp16.safetensors",
+ "size": "2.84GB"
+ },
+
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 14B (bf16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 14B (bf16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_14B_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_14B_bf16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 14B (fp16)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 14B (fp16)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_14B_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_14B_fp16.safetensors",
+ "size": "28.6GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 14B (fp8_e4m3fn)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 14B (fp8_e4m3fn)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_14B_fp8_e4m3fn.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_14B_fp8_e4m3fn.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 t2v 14B (fp8_scaled)",
+ "type": "diffusion_model",
+ "base": "Wan2.1",
+ "save_path": "diffusion_models/Wan2.1",
+ "description": "Wan2.1 difussion model for t2v 14B (fp8_scaled)",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan2.1_t2v_14B_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_t2v_14B_fp8_scaled.safetensors",
+ "size": "14.3GB"
+ },
+ {
+ "name": "Comfy-Org/Wan2.1 VAE",
+ "type": "vae",
+ "base": "Wan2.1",
+ "save_path": "vae",
+ "description": "Wan2.1 VAE model",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "wan_2.1_vae.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/vae/wan_2.1_vae.safetensors",
+ "size": "254MB"
+ },
+
+
+ {
+ "name": "Comfy-Org/umt5_xxl_fp16.safetensors",
+ "type": "clip",
+ "base": "umt5_xxl",
+ "save_path": "text_encoders",
+ "description": "umt5_xxl_fp16 text encoder for Wan2.1",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "umt5_xxl_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp16.safetensors",
+ "size": "11.4GB"
+ },
+ {
+ "name": "Comfy-Org/umt5_xxl_fp8_e4m3fn_scaled.safetensors",
+ "type": "clip",
+ "base": "umt5_xxl",
+ "save_path": "text_encoders",
+ "description": "umt5_xxl_fp8_e4m3fn_scaled text encoder for Wan2.1",
+ "reference": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged",
+ "filename": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors",
+ "size": "6.74GB"
+ },
+
+ {
+ "name": "Comfy-Org/hunyuan_video_image_to_video_720p_bf16.safetensors",
+ "type": "diffusion_model",
+ "base": "Hunyuan Video",
+ "save_path": "diffusion_models/hunyuan_video",
+ "description": "Huyuan Video Image2Video diffusion model. repackaged version.",
+ "reference": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged",
+ "filename": "hunyuan_video_image_to_video_720p_bf16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged/resolve/main/split_files/diffusion_models/hunyuan_video_image_to_video_720p_bf16.safetensors",
+ "size": "25.6GB"
+ },
+ {
+ "name": "Comfy-Org/llava_llama3_vision.safetensors",
+ "type": "clip_vision",
+ "base": "LLaVA-Llama-3",
+ "save_path": "text_encoders",
+ "description": "llava_llama3_vision clip vison model. This is required for using Hunyuan Video Image2Video.",
+ "reference": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged",
+ "filename": "llava_llama3_vision.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged/resolve/main/split_files/clip_vision/llava_llama3_vision.safetensors",
+ "size": "649MB"
+ },
+
+ {
+ "name": "LTX-Video 2B v0.9.5 Checkpoint",
+ "type": "checkpoint",
+ "base": "LTX-Video",
+ "save_path": "checkpoints/LTXV",
+ "description": "LTX-Video is the first DiT-based video generation model capable of generating high-quality videos in real-time. It produces 24 FPS videos at a 768x512 resolution faster than they can be watched. Trained on a large-scale dataset of diverse videos, the model generates high-resolution videos with realistic and varied content.",
+ "reference": "https://huggingface.co/Lightricks/LTX-Video",
+ "filename": "ltx-video-2b-v0.9.5.safetensors",
+ "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltx-video-2b-v0.9.5.safetensors",
+ "size": "6.34GB"
+ },
+ {
+ "name": "kolors/vae/diffusion_pytorch_model.fp16.safetensors",
+ "type": "VAE",
+ "base": "Kolors",
+ "save_path": "vae/kolors",
+ "description": "Kolors VAE",
+ "reference": "https://huggingface.co/Kwai-Kolors/Kolors",
+ "filename": "diffusion_pytorch_model.fp16.safetensors",
+ "url": "https://huggingface.co/Kwai-Kolors/Kolors/resolve/main/vae/diffusion_pytorch_model.fp16.safetensors",
+ "size": "167MB"
+ },
+ {
+ "name": "kolors/vae/diffusion_pytorch_model.safetensors",
+ "type": "VAE",
+ "base": "Kolors",
+ "save_path": "vae/kolors",
+ "description": "Kolors VAE",
+ "reference": "https://huggingface.co/Kwai-Kolors/Kolors",
+ "filename": "diffusion_pytorch_model.safetensors",
+ "url": "https://huggingface.co/Kwai-Kolors/Kolors/resolve/main/vae/diffusion_pytorch_model.safetensors",
+ "size": "335MB"
+ },
+
+ {
+ "name": "deepseek-ai/Janus-Pro-1B",
+ "type": "Janus-Pro",
+ "base": "Janus-Pro",
+ "save_path": "Janus-Pro",
+ "description": "[SNAPSHOT] Janus-Pro-1B model.[w/You cannot download this item on ComfyUI-Manager versions below V3.18]",
+ "reference": "https://huggingface.co/deepseek-ai/Janus-Pro-1B",
+ "filename": "",
+ "url": "deepseek-ai/Janus-Pro-1B",
+ "size": "7.8GB"
+ },
+ {
+ "name": "deepseek-ai/Janus-Pro-7B",
+ "type": "Janus-Pro",
+ "base": "Janus-Pro",
+ "save_path": "Janus-Pro",
+ "description": "[SNAPSHOT] Janus-Pro-7B model.[w/You cannot download this item on ComfyUI-Manager versions below V3.18]",
+ "reference": "https://huggingface.co/deepseek-ai/Janus-Pro-7B",
+ "filename": "",
+ "url": "deepseek-ai/Janus-Pro-7B",
+ "size": "14.85GB"
+ },
+
+ {
+ "name": "Leoxing/pia.ckpt",
+ "type": "animatediff-pia",
+ "base": "SD1.x",
+ "save_path": "animatediff_models",
+ "description": "AnimateDiff-PIA Model",
+ "reference": "https://huggingface.co/Leoxing/PIA/tree/main",
+ "filename": "pia.ckpt",
+ "url": "https://huggingface.co/Leoxing/PIA/resolve/main/pia.ckpt",
+ "size": "1.67GB"
+ },
+
+ {
+ "name": "comfyanonymous/cosmos_cv8x8x8_1.0.safetensors",
+ "type": "VAE",
+ "base": "Cosmos-1.0",
+ "save_path": "default",
+ "description": "VAE model for Cosmos 1.0",
+ "reference": "https://huggingface.co/comfyanonymous/cosmos_1.0_text_encoder_and_VAE_ComfyUI/tree/main",
+ "filename": "cosmos_cv8x8x8_1.0.safetensors",
+ "url": "https://huggingface.co/comfyanonymous/cosmos_1.0_text_encoder_and_VAE_ComfyUI/resolve/main/vae/cosmos_cv8x8x8_1.0.safetensors",
+ "size": "211MB"
+ },
+ {
+ "name": "mcmonkey/Cosmos-1_0-Diffusion-7B-Text2World.safetensors",
+ "type": "diffusion_model",
+ "base": "Cosmos-1.0",
+ "save_path": "diffusion_models/cosmos-1.0",
+ "description": "Cosmos 1.0 Text2World Diffusion Model (7B)",
+ "reference": "https://huggingface.co/mcmonkey/cosmos-1.0",
+ "filename": "Cosmos-1_0-Diffusion-7B-Text2World.safetensors",
+ "url": "https://huggingface.co/mcmonkey/cosmos-1.0/resolve/main/Cosmos-1_0-Diffusion-7B-Text2World.safetensors",
+ "size": "14.5GB"
+ },
+ {
+ "name": "mcmonkey/Cosmos-1_0-Diffusion-7B-Video2World.safetensors",
+ "type": "diffusion_model",
+ "base": "Cosmos-1.0",
+ "save_path": "diffusion_models/cosmos-1.0",
+ "description": "Cosmos 1.0 Video2World Diffusion Model (7B)",
+ "reference": "https://huggingface.co/mcmonkey/cosmos-1.0",
+ "filename": "Cosmos-1_0-Diffusion-7B-Video2World.safetensors",
+ "url": "https://huggingface.co/mcmonkey/cosmos-1.0/resolve/main/Cosmos-1_0-Diffusion-7B-Video2World.safetensors",
+ "size": "14.5GB"
+ },
+ {
+ "name": "mcmonkey/Cosmos-1_0-Diffusion-14B-Text2World.safetensors",
+ "type": "diffusion_model",
+ "base": "Cosmos-1.0",
+ "save_path": "diffusion_models/cosmos-1.0",
+ "description": "Cosmos 1.0 Text2World Diffusion Model (14B)",
+ "reference": "https://huggingface.co/mcmonkey/cosmos-1.0",
+ "filename": "Cosmos-1_0-Diffusion-14B-Text2World.safetensors",
+ "url": "https://huggingface.co/mcmonkey/cosmos-1.0/resolve/main/Cosmos-1_0-Diffusion-14B-Text2World.safetensors",
+ "size": "28.5GB"
+ },
+ {
+ "name": "mcmonkey/Cosmos-1_0-Diffusion-14B-Video2World.safetensors",
+ "type": "diffusion_model",
+ "base": "Cosmos-1.0",
+ "save_path": "diffusion_models/cosmos-1.0",
+ "description": "Cosmos 1.0 Video2World Diffusion Model (14B)",
+ "reference": "https://huggingface.co/mcmonkey/cosmos-1.0",
+ "filename": "Cosmos-1_0-Diffusion-14B-Video2World.safetensors",
+ "url": "https://huggingface.co/mcmonkey/cosmos-1.0/resolve/main/Cosmos-1_0-Diffusion-14B-Video2World.safetensors",
+ "size": "28.5GB"
+ },
+
+ {
+ "name": "Comfy-Org/llava_llama3_fp8_scaled.safetensors",
+ "type": "clip",
+ "base": "LLaVA-Llama-3",
+ "save_path": "text_encoders",
+ "description": "llava_llama3_fp8_scaled text encoder model. This is required for using Hunyuan Video.",
+ "reference": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged",
+ "filename": "llava_llama3_fp8_scaled.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged/resolve/main/split_files/text_encoders/llava_llama3_fp8_scaled.safetensors",
+ "size": "9.09GB"
+ },
+ {
+ "name": "Comfy-Org/llava_llama3_fp16.safetensors",
+ "type": "clip",
+ "base": "LLaVA-Llama-3",
+ "save_path": "text_encoders",
+ "description": "llava_llama3_fp16 text encoder model. This is required for using Hunyuan Video.",
+ "reference": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged",
+ "filename": "llava_llama3_fp16.safetensors",
+ "url": "https://huggingface.co/Comfy-Org/HunyuanVideo_repackaged/resolve/main/split_files/text_encoders/llava_llama3_fp16.safetensors",
+ "size": "16.1GB"
+ }
+ ]
+}
diff --git a/custom_nodes/ComfyUI-Manager/node_db/tutorial/custom-node-list.json b/custom_nodes/ComfyUI-Manager/node_db/tutorial/custom-node-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..4d4242483972d1867fb1c5dba566c85b9b1fa98f
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/tutorial/custom-node-list.json
@@ -0,0 +1,376 @@
+{
+ "custom_nodes": [
+ {
+ "author": "Comfy-Org",
+ "title": "ComfyUI React Extension Template",
+ "reference": "https://github.com/Comfy-Org/ComfyUI-React-Extension-Template",
+ "files": [
+ "https://github.com/Comfy-Org/ComfyUI-React-Extension-Template"
+ ],
+ "install_type": "git-clone",
+ "description": "A minimal template for creating React/TypeScript frontend extensions for ComfyUI, with complete boilerplate setup including internationalization and unit testing."
+ },
+ {
+ "author": "comfyui-wiki",
+ "title": "ComfyUI-i18n-demo",
+ "reference": "https://github.com/comfyui-wiki/ComfyUI-i18n-demo",
+ "files": [
+ "https://github.com/comfyui-wiki/ComfyUI-i18n-demo"
+ ],
+ "install_type": "git-clone",
+ "description": "ComfyUI custom node develop i18n support demo "
+ },
+ {
+ "author": "Suzie1",
+ "title": "Guide To Making Custom Nodes in ComfyUI",
+ "reference": "https://github.com/Suzie1/ComfyUI_Guide_To_Making_Custom_Nodes",
+ "files": [
+ "https://github.com/Suzie1/ComfyUI_Guide_To_Making_Custom_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "There is a small node pack attached to this guide. This includes the init file and 3 nodes associated with the tutorials."
+ },
+ {
+ "author": "bamboodia",
+ "title": "BAM Nodes",
+ "reference": "https://github.com/bamboodia/BAM_Nodes",
+ "files": [
+ "https://github.com/bamboodia/BAM_Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "A collection of comfyui nodes that I have made for nothing more than educational purposes."
+ },
+ {
+ "author": "BadCafeCode",
+ "title": "execution-inversion-demo-comfyui",
+ "reference": "https://github.com/BadCafeCode/execution-inversion-demo-comfyui",
+ "files": [
+ "https://github.com/BadCafeCode/execution-inversion-demo-comfyui"
+ ],
+ "install_type": "git-clone",
+ "description": "These are demo nodes for [a/PR2666](https://github.com/comfyanonymous/ComfyUI/pull/2666)"
+ },
+ {
+ "author": "ecjojo",
+ "title": "ecjojo_example_nodes",
+ "reference": "https://github.com/ecjojo/ecjojo-example-nodes",
+ "files": [
+ "https://github.com/ecjojo/ecjojo-example-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Welcome to ecjojo_example_nodes! This example is specifically designed for beginners who want to learn how to write a simple custom node.\nFeel free to modify this example and make it your own. Experiment with different features and functionalities to enhance your understanding of ComfyUI custom nodes. Don't be afraid to explore and customize the code to suit your needs.\nBy diving into this example and making it your own, you'll gain valuable hands-on experience in creating custom nodes in ComfyUI. Enjoy the process of learning and have fun with your custom node development journey!"
+ },
+ {
+ "author": "dynamixar",
+ "title": "Atluris",
+ "reference": "https://github.com/dynamixar/Atluris",
+ "files": [
+ "https://github.com/dynamixar/Atluris"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Random Line"
+ },
+ {
+ "author": "et118",
+ "title": "ComfyUI-ElGogh-Nodes",
+ "reference": "https://github.com/et118/ComfyUI-ElGogh-Nodes",
+ "files": [
+ "https://github.com/et118/ComfyUI-ElGogh-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:ElGogh Positive Prompt, ElGogh NEGATIVE Prompt, ElGogh Empty Latent Image, ElGogh Checkpoint Loader Simple"
+ },
+ {
+ "author": "LarryJane491",
+ "title": "Custom-Node-Base",
+ "reference": "https://github.com/LarryJane491/Custom-Node-Base",
+ "files": [
+ "https://github.com/LarryJane491/Custom-Node-Base"
+ ],
+ "install_type": "git-clone",
+ "description": "This project is an `empty` custom node that is already in its own folder. It serves as a base to build any custom node. Whenever you want to create a custom node, you can download that, put it in custom_nodes, then you just have to change the names and fill it with code!"
+ },
+ {
+ "author": "foxtrot-roger",
+ "title": "comfyui-custom-nodes",
+ "reference": "https://github.com/foxtrot-roger/comfyui-custom-nodes",
+ "files": [
+ "https://github.com/foxtrot-roger/comfyui-custom-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Tutorial nodes"
+ },
+ {
+ "author": "wailovet",
+ "title": "ComfyUI-WW",
+ "reference": "https://github.com/wailovet/ComfyUI-WW",
+ "files": [
+ "https://github.com/wailovet/ComfyUI-WW"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:WW_ImageResize"
+ },
+ {
+ "author": "azure-dragon-ai",
+ "title": "ComfyUI-HPSv2-Nodes",
+ "reference": "https://github.com/azure-dragon-ai/ComfyUI-HPSv2-Nodes",
+ "files": [
+ "https://github.com/azure-dragon-ai/ComfyUI-HPSv2-Nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Loader, Image Processor, Text Processor, ImageScore"
+ },
+ {
+ "author": "kappa54m",
+ "title": "ComfyUI-HPSv2-Nodes",
+ "reference": "https://github.com/kappa54m/ComfyUI_Usability",
+ "files": [
+ "https://github.com/kappa54m/ComfyUI_Usability"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Load Image Dedup"
+ },
+ {
+ "author": "IvanRybakov",
+ "title": "comfyui-node-int-to-string-convertor",
+ "reference": "https://github.com/IvanRybakov/comfyui-node-int-to-string-convertor",
+ "files": [
+ "https://github.com/IvanRybakov/comfyui-node-int-to-string-convertor"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Int To String Convertor"
+ },
+ {
+ "author": "yowipr",
+ "title": "ComfyUI-Manual",
+ "reference": "https://github.com/yowipr/ComfyUI-Manual",
+ "files": [
+ "https://github.com/yowipr/ComfyUI-Manual"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:M_Layer, M_Output"
+ },
+ {
+ "author": "andrewharp",
+ "title": "ComfyUI Function Annotator",
+ "reference": "https://github.com/andrewharp/ComfyUI-Annotations",
+ "files": [
+ "https://github.com/andrewharp/ComfyUI-Annotations"
+ ],
+ "install_type": "git-clone",
+ "description": "This module provides an annotation @ComfyFunc to streamline adding custom node types in ComfyUI. It processes your function's signature to create a wrapped function and custom node definition required for ComfyUI, eliminating all the boilerplate code. In most cases you can just add a @ComfyFunc(\"category\") annotation to your existing function."
+ },
+ {
+ "author": "OuticNZ",
+ "title": "ComfyUI-Simple-Of-Complex",
+ "reference": "https://github.com/OuticNZ/ComfyUI-Simple-Of-Complex",
+ "files": [
+ "https://github.com/OuticNZ/ComfyUI-Simple-Of-Complex"
+ ],
+ "install_type": "git-clone",
+ "description": "Keeping it simple for starting. Single branch for now and will add development branch later."
+ },
+ {
+ "author": "jtong",
+ "title": "comfyui-jtong-workflow",
+ "reference": "https://github.com/jtong/comfyui-jtong-workflow",
+ "files": [
+ "https://github.com/jtong/comfyui-jtong-workflow"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:jtong.Highway, Example"
+ },
+ {
+ "author": "thinkthinking",
+ "title": "ComfyUI-Ye",
+ "reference": "https://github.com/thinkthinking/ComfyUI-Ye",
+ "files": [
+ "https://github.com/thinkthinking/ComfyUI-Ye"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:Signature|Ye, CheckpointLoader|Ye, PrintHelloWorld|Ye."
+ },
+ {
+ "author": "BoosterCore",
+ "title": "ComfyUI-BC-Experimental",
+ "reference": "https://github.com/BoosterCore/ComfyUI-BC-Experimental",
+ "files": [
+ "https://github.com/BoosterCore/ComfyUI-BC-Experimental"
+ ],
+ "install_type": "git-clone",
+ "description": "Nodes:ClipTextEncodeBC, SaveAnyText, SimpleText"
+ },
+ {
+ "author": "sonyeon-sj",
+ "title": "ComfyUI-easy_ImageSize_Selecter",
+ "reference": "https://github.com/sonyeon-sj/ComfyUI-easy_ImageSize_Selecter",
+ "files": [
+ "https://github.com/sonyeon-sj/ComfyUI-easy_ImageSize_Selecter"
+ ],
+ "install_type": "git-clone",
+ "description": "Custom node for ComfyUI Select the image size from the preset and select Vertical and Horizontal to output Width and Height."
+ },
+ {
+ "author": "boricuapab",
+ "title": "ComfyUI_BoricuapabWFNodePack",
+ "reference": "https://github.com/boricuapab/ComfyUI_BoricuapabWFNodePack",
+ "files": [
+ "https://github.com/boricuapab/ComfyUI_BoricuapabWFNodePack"
+ ],
+ "install_type": "git-clone",
+ "description": "Learning how to make my own comfy ui custom nodes"
+ },
+ {
+ "author": "mira-6",
+ "title": "mira-wildcard-node",
+ "reference": "https://github.com/mira-6/mira-wildcard-node",
+ "files": [
+ "https://github.com/mira-6/mira-wildcard-node"
+ ],
+ "install_type": "git-clone",
+ "description": "Mira's Simple Wildcard Node"
+ },
+ {
+ "author": "BetaDoggo",
+ "title": "ComfyUI Tetris",
+ "id": "tetris",
+ "reference": "https://github.com/BetaDoggo/ComfyUI-Tetris",
+ "files": [
+ "https://github.com/BetaDoggo/ComfyUI-Tetris"
+ ],
+ "install_type": "git-clone",
+ "description": "The primitive node and dummy input are required because comfy doesn't accept requests with identical graphs. You'll also need a show text node. I like the one from ComfyUI-Custom-Scripts. I got the generic tetris remake from claude so it may or may not be ripped from somewhere else."
+ },
+ {
+ "author": "FlyMyAI",
+ "title": "ComfyUI-ExampleNode",
+ "reference": "https://github.com/FlyMyAI/ComfyUI-ExampleNode",
+ "files": [
+ "https://github.com/FlyMyAI/ComfyUI-ExampleNode"
+ ],
+ "install_type": "git-clone",
+ "description": "Node to provide convenient ComfyUI standard, supported by flymy_comfyui."
+ },
+ {
+ "author": "Wanghanying",
+ "title": "ComfyUI_RAGDemo",
+ "reference": "https://github.com/Wanghanying/ComfyUI_RAGDemo",
+ "files": [
+ "https://github.com/Wanghanying/ComfyUI_RAGDemo"
+ ],
+ "install_type": "git-clone",
+ "description": "RAG Demo for LLM"
+ },
+ {
+ "author": "FelixTeutsch",
+ "title": "BachelorThesis",
+ "reference": "https://github.com/FelixTeutsch/BachelorThesis",
+ "files": [
+ "https://github.com/FelixTeutsch/BachelorThesis"
+ ],
+ "install_type": "git-clone",
+ "description": "This is a ComfyUi custom node, that build a new UI on top of the already existing AI, to enable the use of custom controllers"
+ },
+ {
+ "author": "jhj0517",
+ "title": "ComfyUI-CustomNodes-Template",
+ "reference": "https://github.com/jhj0517/ComfyUI-CustomNodes-Template",
+ "files": [
+ "https://github.com/jhj0517/ComfyUI-CustomNodes-Template"
+ ],
+ "install_type": "git-clone",
+ "description": "This is the ComfyUI custom node template repository that anyone can use to create their own custom nodes."
+ },
+ {
+ "author": "laogou666",
+ "title": "Comfyui_LG_Advertisement",
+ "reference": "https://github.com/LAOGOU-666/Comfyui_LG_Advertisement",
+ "files": [
+ "https://github.com/LAOGOU-666/Comfyui_LG_Advertisement"
+ ],
+ "install_type": "git-clone",
+ "description": "A node for demonstration."
+ },
+ {
+ "author": "amorano",
+ "title": "cozy_spoke",
+ "reference": "https://github.com/cozy-comfyui/cozy_spoke",
+ "files": [
+ "https://github.com/cozy-comfyui/cozy_spoke"
+ ],
+ "install_type": "git-clone",
+ "description": "Example node communicating between ComfyUI Javascript and Python."
+ },
+ {
+ "author": "amorano",
+ "title": "Cozy Link Toggle",
+ "id": "cozyLinkToggle",
+ "reference": "https://github.com/cozy-comfyui/cozy_link_toggle",
+ "files": [
+ "https://github.com/cozy-comfyui/cozy_link_toggle"
+ ],
+ "install_type": "git-clone",
+ "description": "Example of using ComfyUI Toolbar to Toggle ComfyUI links on/off"
+ },
+ {
+ "author": "xhiroga",
+ "title": "ComfyUI-TypeScript-CustomNode",
+ "reference": "https://github.com/xhiroga/ComfyUI-TypeScript-CustomNode",
+ "files": [
+ "https://github.com/xhiroga/ComfyUI-TypeScript-CustomNode"
+ ],
+ "install_type": "git-clone",
+ "description": "This project is generated from xhiroga/ComfyUI-TypeScript-CustomNode"
+ },
+ {
+ "author": "zentrocdot",
+ "title": "ComfyUI-Turtle_Graphics_Demos",
+ "reference": "https://github.com/zentrocdot/ComfyUI-Turtle_Graphics_Demo",
+ "files": [
+ "https://github.com/zentrocdot/ComfyUI-Turtle_Graphics_Demo"
+ ],
+ "description": "ComfyUI node for creating some Turtle Graphic demos.",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "cozy-comfyui",
+ "title": "cozy_ex_dynamic",
+ "reference": "https://github.com/cozy-comfyui/cozy_ex_dynamic",
+ "files": [
+ "https://github.com/cozy-comfyui/cozy_ex_dynamic"
+ ],
+ "description": "Dynamic Node examples for ComfyUI",
+ "install_type": "git-clone"
+ },
+ {
+ "author": "Jonathon-Doran",
+ "title": "remote-combo-demo",
+ "reference": "https://github.com/Jonathon-Doran/remote-combo-demo",
+ "files": [
+ "https://github.com/Jonathon-Doran/remote-combo-demo"
+ ],
+ "install_type": "git-clone",
+ "description": "A minimal test suite demonstrating how remote COMBO inputs behave in ComfyUI, with and without force_input"
+ },
+ {
+ "author": "J1mB091",
+ "title": "ComfyUI-J1mB091 Custom Nodes",
+ "reference": "https://github.com/J1mB091/ComfyUI-J1mB091",
+ "files": [
+ "https://github.com/J1mB091/ComfyUI-J1mB091"
+ ],
+ "install_type": "git-clone",
+ "description": "Vibe Coded ComfyUI Custom Nodes"
+ },
+ {
+ "author": "aiforhumans",
+ "title": "XDev Nodes - Complete Toolkit",
+ "reference": "https://github.com/aiforhumans/comfyui-xdev-nodes",
+ "files": [
+ "https://github.com/aiforhumans/comfyui-xdev-nodes"
+ ],
+ "install_type": "git-clone",
+ "description": "Complete ComfyUI development toolkit with 8 professional nodes including VAE tools, universal type testing, and comprehensive debugging infrastructure."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/tutorial/extension-node-map.json b/custom_nodes/ComfyUI-Manager/node_db/tutorial/extension-node-map.json
new file mode 100644
index 0000000000000000000000000000000000000000..d5b0c984d2dd1e04e64c8a5d76d0b7af1be1b3b6
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/tutorial/extension-node-map.json
@@ -0,0 +1,573 @@
+{
+ "https://github.com/BadCafeCode/execution-inversion-demo-comfyui": [
+ [
+ "AccumulateNode",
+ "AccumulationGetItemNode",
+ "AccumulationGetLengthNode",
+ "AccumulationHeadNode",
+ "AccumulationSetItemNode",
+ "AccumulationTailNode",
+ "AccumulationToListNode",
+ "BoolOperationNode",
+ "ComponentInput",
+ "ComponentMetadata",
+ "ComponentOutput",
+ "DebugPrint",
+ "ExecutionBlocker",
+ "FloatConditions",
+ "ForLoopClose",
+ "ForLoopOpen",
+ "IntConditions",
+ "IntMathOperation",
+ "InversionDemoAdvancedPromptNode",
+ "InversionDemoLazyConditional",
+ "InversionDemoLazyIndexSwitch",
+ "InversionDemoLazyMixImages",
+ "InversionDemoLazySwitch",
+ "ListToAccumulationNode",
+ "MakeListNode",
+ "StringConditions",
+ "ToBoolNode",
+ "WhileLoopClose",
+ "WhileLoopOpen"
+ ],
+ {
+ "title_aux": "execution-inversion-demo-comfyui"
+ }
+ ],
+ "https://github.com/BetaDoggo/ComfyUI-Tetris": [
+ [
+ "Tetris"
+ ],
+ {
+ "title_aux": "ComfyUI Tetris"
+ }
+ ],
+ "https://github.com/BoosterCore/ComfyUI-BC-Experimental": [
+ [
+ "ClipTextEncodeBC",
+ "ClipTextEncodeBCA",
+ "FluxEmptyLatentSize",
+ "LoraWithTriggerWord",
+ "SaveAnyText",
+ "SimpleText"
+ ],
+ {
+ "title_aux": "ComfyUI-BC-Experimental"
+ }
+ ],
+ "https://github.com/FlyMyAI/ComfyUI-ExampleNode": [
+ [
+ "ExampleT2IFMANode"
+ ],
+ {
+ "title_aux": "ComfyUI-ExampleNode"
+ }
+ ],
+ "https://github.com/IvanRybakov/comfyui-node-int-to-string-convertor": [
+ [
+ "Int To String"
+ ],
+ {
+ "title_aux": "comfyui-node-int-to-string-convertor"
+ }
+ ],
+ "https://github.com/LarryJane491/Custom-Node-Base": [
+ [
+ "My First Node"
+ ],
+ {
+ "title_aux": "Custom-Node-Base"
+ }
+ ],
+ "https://github.com/OuticNZ/ComfyUI-Simple-Of-Complex": [
+ [
+ "Pipe From Parameters",
+ "Pipe To Parameters",
+ "Prompt Tidy",
+ "Text Switch 2 Way",
+ "Text With Context"
+ ],
+ {
+ "title_aux": "ComfyUI-Simple-Of-Complex"
+ }
+ ],
+ "https://github.com/Suzie1/ComfyUI_Guide_To_Making_Custom_Nodes": [
+ [
+ "Concatenate Hello World",
+ "Hello World Overlay Text",
+ "Print Hello World"
+ ],
+ {
+ "title_aux": "Guide To Making Custom Nodes in ComfyUI"
+ }
+ ],
+ "https://github.com/Wanghanying/ComfyUI_RAGDemo": [
+ [
+ "testRAG"
+ ],
+ {
+ "title_aux": "ComfyUI_RAGDemo"
+ }
+ ],
+ "https://github.com/azure-dragon-ai/ComfyUI-HPSv2-Nodes": [
+ [
+ "GetImageSize",
+ "HaojihuiHPSv2ImageProcessor",
+ "HaojihuiHPSv2ImageScore",
+ "HaojihuiHPSv2ImageScores",
+ "HaojihuiHPSv2Loader",
+ "HaojihuiHPSv2SaveAnimatedWEBP",
+ "HaojihuiHPSv2SaveImage",
+ "HaojihuiHPSv2SaveWEBP",
+ "HaojihuiHPSv2SaveWebpImage",
+ "HaojihuiHPSv2TextProcessor",
+ "SaveImageWebp",
+ "ScaleShort"
+ ],
+ {
+ "title_aux": "ComfyUI-HPSv2-Nodes"
+ }
+ ],
+ "https://github.com/bamboodia/BAM_Nodes": [
+ [
+ "BAM Crop To Ratio",
+ "BAM Empty Latent By Ratio",
+ "BAM Get Shortest Side",
+ "BAM OnOff INT",
+ "BAM Random Float",
+ "BAM Random Image From Folder"
+ ],
+ {
+ "title_aux": "BAM Nodes"
+ }
+ ],
+ "https://github.com/boricuapab/ComfyUI_BoricuapabWFNodePack": [
+ [
+ "BoricuapabWF Concatenate Hello World",
+ "BoricuapabWF Integer",
+ "BoricuapabWF Print Hello Puerto Rican World",
+ "BoricuapabWF Print Puerto Rican"
+ ],
+ {
+ "title_aux": "ComfyUI_BoricuapabWFNodePack"
+ }
+ ],
+ "https://github.com/comfyanonymous/ComfyUI": [
+ [
+ "AddNoise",
+ "AlignYourStepsScheduler",
+ "BasicGuider",
+ "BasicScheduler",
+ "BetaSamplingScheduler",
+ "CFGGuider",
+ "CLIPAttentionMultiply",
+ "CLIPLoader",
+ "CLIPMergeAdd",
+ "CLIPMergeSimple",
+ "CLIPMergeSubtract",
+ "CLIPSave",
+ "CLIPSetLastLayer",
+ "CLIPTextEncode",
+ "CLIPTextEncodeControlnet",
+ "CLIPTextEncodeFlux",
+ "CLIPTextEncodeHunyuanDiT",
+ "CLIPTextEncodePixArtAlpha",
+ "CLIPTextEncodeSD3",
+ "CLIPTextEncodeSDXL",
+ "CLIPTextEncodeSDXLRefiner",
+ "CLIPVisionEncode",
+ "CLIPVisionLoader",
+ "Canny",
+ "CheckpointLoader",
+ "CheckpointLoaderSimple",
+ "CheckpointSave",
+ "ConditioningAverage",
+ "ConditioningCombine",
+ "ConditioningConcat",
+ "ConditioningSetArea",
+ "ConditioningSetAreaPercentage",
+ "ConditioningSetAreaStrength",
+ "ConditioningSetMask",
+ "ConditioningSetTimestepRange",
+ "ConditioningStableAudio",
+ "ConditioningZeroOut",
+ "ControlNetApply",
+ "ControlNetApplyAdvanced",
+ "ControlNetApplySD3",
+ "ControlNetInpaintingAliMamaApply",
+ "ControlNetLoader",
+ "CropMask",
+ "DiffControlNetLoader",
+ "DifferentialDiffusion",
+ "DiffusersLoader",
+ "DisableNoise",
+ "DualCFGGuider",
+ "DualCLIPLoader",
+ "EmptyHunyuanLatentVideo",
+ "EmptyImage",
+ "EmptyLTXVLatentVideo",
+ "EmptyLatentAudio",
+ "EmptyLatentImage",
+ "EmptyMochiLatentVideo",
+ "EmptySD3LatentImage",
+ "ExponentialScheduler",
+ "FeatherMask",
+ "FlipSigmas",
+ "FluxGuidance",
+ "FreeU",
+ "FreeU_V2",
+ "GITSScheduler",
+ "GLIGENLoader",
+ "GLIGENTextBoxApply",
+ "GrowMask",
+ "HyperTile",
+ "HypernetworkLoader",
+ "ImageBatch",
+ "ImageBlend",
+ "ImageBlur",
+ "ImageColorToMask",
+ "ImageCompositeMasked",
+ "ImageCrop",
+ "ImageFromBatch",
+ "ImageInvert",
+ "ImageOnlyCheckpointLoader",
+ "ImageOnlyCheckpointSave",
+ "ImagePadForOutpaint",
+ "ImageQuantize",
+ "ImageScale",
+ "ImageScaleBy",
+ "ImageScaleToTotalPixels",
+ "ImageSharpen",
+ "ImageToMask",
+ "ImageUpscaleWithModel",
+ "InpaintModelConditioning",
+ "InstructPixToPixConditioning",
+ "InvertMask",
+ "JoinImageWithAlpha",
+ "KSampler",
+ "KSamplerAdvanced",
+ "KSamplerSelect",
+ "KarrasScheduler",
+ "LTXVConditioning",
+ "LTXVImgToVideo",
+ "LTXVScheduler",
+ "LaplaceScheduler",
+ "LatentAdd",
+ "LatentApplyOperation",
+ "LatentApplyOperationCFG",
+ "LatentBatch",
+ "LatentBatchSeedBehavior",
+ "LatentBlend",
+ "LatentComposite",
+ "LatentCompositeMasked",
+ "LatentCrop",
+ "LatentFlip",
+ "LatentFromBatch",
+ "LatentInterpolate",
+ "LatentMultiply",
+ "LatentOperationSharpen",
+ "LatentOperationTonemapReinhard",
+ "LatentRotate",
+ "LatentSubtract",
+ "LatentUpscale",
+ "LatentUpscaleBy",
+ "Load3D",
+ "Load3DAnimation",
+ "LoadAudio",
+ "LoadImage",
+ "LoadImageMask",
+ "LoadLatent",
+ "LoraLoader",
+ "LoraLoaderModelOnly",
+ "LoraSave",
+ "Mahiro",
+ "MaskComposite",
+ "MaskToImage",
+ "ModelMergeAdd",
+ "ModelMergeAuraflow",
+ "ModelMergeBlocks",
+ "ModelMergeFlux1",
+ "ModelMergeLTXV",
+ "ModelMergeMochiPreview",
+ "ModelMergeSD1",
+ "ModelMergeSD2",
+ "ModelMergeSD35_Large",
+ "ModelMergeSD3_2B",
+ "ModelMergeSDXL",
+ "ModelMergeSimple",
+ "ModelMergeSubtract",
+ "ModelSamplingAuraFlow",
+ "ModelSamplingContinuousEDM",
+ "ModelSamplingContinuousV",
+ "ModelSamplingDiscrete",
+ "ModelSamplingFlux",
+ "ModelSamplingLTXV",
+ "ModelSamplingSD3",
+ "ModelSamplingStableCascade",
+ "ModelSave",
+ "Morphology",
+ "PatchModelAddDownscale",
+ "PerpNeg",
+ "PerpNegGuider",
+ "PerturbedAttentionGuidance",
+ "PhotoMakerEncode",
+ "PhotoMakerLoader",
+ "PolyexponentialScheduler",
+ "PorterDuffImageComposite",
+ "Preview3D",
+ "PreviewAudio",
+ "PreviewImage",
+ "RandomNoise",
+ "RebatchImages",
+ "RebatchLatents",
+ "RepeatImageBatch",
+ "RepeatLatentBatch",
+ "RescaleCFG",
+ "SDTurboScheduler",
+ "SD_4XUpscale_Conditioning",
+ "SV3D_Conditioning",
+ "SVD_img2vid_Conditioning",
+ "SamplerCustom",
+ "SamplerCustomAdvanced",
+ "SamplerDPMAdaptative",
+ "SamplerDPMPP_2M_SDE",
+ "SamplerDPMPP_2S_Ancestral",
+ "SamplerDPMPP_3M_SDE",
+ "SamplerDPMPP_SDE",
+ "SamplerEulerAncestral",
+ "SamplerEulerAncestralCFGPP",
+ "SamplerEulerCFGpp",
+ "SamplerLCMUpscale",
+ "SamplerLMS",
+ "SaveAnimatedPNG",
+ "SaveAnimatedWEBP",
+ "SaveAudio",
+ "SaveImage",
+ "SaveImageWebsocket",
+ "SaveLatent",
+ "SelfAttentionGuidance",
+ "SetLatentNoiseMask",
+ "SetUnionControlNetType",
+ "SkipLayerGuidanceDiT",
+ "SkipLayerGuidanceSD3",
+ "SolidMask",
+ "SplitImageWithAlpha",
+ "SplitSigmas",
+ "SplitSigmasDenoise",
+ "StableCascade_EmptyLatentImage",
+ "StableCascade_StageB_Conditioning",
+ "StableCascade_StageC_VAEEncode",
+ "StableCascade_SuperResolutionControlnet",
+ "StableZero123_Conditioning",
+ "StableZero123_Conditioning_Batched",
+ "StubConstantImage",
+ "StubFloat",
+ "StubImage",
+ "StubInt",
+ "StubMask",
+ "StyleModelApply",
+ "StyleModelLoader",
+ "TestAccumulateNode",
+ "TestAccumulationGetItemNode",
+ "TestAccumulationGetLengthNode",
+ "TestAccumulationHeadNode",
+ "TestAccumulationSetItemNode",
+ "TestAccumulationTailNode",
+ "TestAccumulationToListNode",
+ "TestBoolOperationNode",
+ "TestCustomIsChanged",
+ "TestCustomValidation1",
+ "TestCustomValidation2",
+ "TestCustomValidation3",
+ "TestCustomValidation4",
+ "TestCustomValidation5",
+ "TestDynamicDependencyCycle",
+ "TestExecutionBlocker",
+ "TestFloatConditions",
+ "TestForLoopClose",
+ "TestForLoopOpen",
+ "TestIntConditions",
+ "TestIntMathOperation",
+ "TestIsChangedWithConstants",
+ "TestLazyMixImages",
+ "TestListToAccumulationNode",
+ "TestMakeListNode",
+ "TestMixedExpansionReturns",
+ "TestStringConditions",
+ "TestToBoolNode",
+ "TestVariadicAverage",
+ "TestWhileLoopClose",
+ "TestWhileLoopOpen",
+ "ThresholdMask",
+ "TomePatchModel",
+ "TorchCompileModel",
+ "TripleCLIPLoader",
+ "UNETLoader",
+ "UNetCrossAttentionMultiply",
+ "UNetSelfAttentionMultiply",
+ "UNetTemporalAttentionMultiply",
+ "UpscaleModelLoader",
+ "VAEDecode",
+ "VAEDecodeAudio",
+ "VAEDecodeTiled",
+ "VAEEncode",
+ "VAEEncodeAudio",
+ "VAEEncodeForInpaint",
+ "VAEEncodeTiled",
+ "VAELoader",
+ "VAESave",
+ "VPScheduler",
+ "VideoLinearCFGGuidance",
+ "VideoTriangleCFGGuidance",
+ "WebcamCapture",
+ "unCLIPCheckpointLoader",
+ "unCLIPConditioning"
+ ],
+ {
+ "title_aux": "ComfyUI"
+ }
+ ],
+ "https://github.com/dynamixar/Atluris": [
+ [
+ "RandomLine"
+ ],
+ {
+ "title_aux": "Atluris"
+ }
+ ],
+ "https://github.com/ecjojo/ecjojo-example-nodes": [
+ [
+ "BiggerNote_Example",
+ "DisplayTextNode_Example",
+ "EmptyNode_Example",
+ "ExampleNode_Example",
+ "FilePrefixNode_Example",
+ "HelloWorldNode_Example",
+ "RandomSizeNode_Example",
+ "StringNode_Example",
+ "TextOverlayNode_Example"
+ ],
+ {
+ "title_aux": "ecjojo_example_nodes"
+ }
+ ],
+ "https://github.com/et118/ComfyUI-ElGogh-Nodes": [
+ [
+ "ElGoghCLIPSetLastLayer",
+ "ElGoghCheckpointLoaderSimple",
+ "ElGoghEmptyLatentImage",
+ "ElGoghKSamplerAdvanced",
+ "ElGoghNegativePrompt",
+ "ElGoghPositivePrompt",
+ "ElGoghPrimaryLoraLoader",
+ "ElGoghSecondaryLoraLoader",
+ "ElGoghSendWebsocketNSFWBool",
+ "ElGoghTertiaryLoraLoader",
+ "ElGoghVAELoader"
+ ],
+ {
+ "title_aux": "ComfyUI-ElGogh-Nodes"
+ }
+ ],
+ "https://github.com/foxtrot-roger/comfyui-custom-nodes": [
+ [
+ "RF_Tutorial"
+ ],
+ {
+ "title_aux": "comfyui-custom-nodes"
+ }
+ ],
+ "https://github.com/jhj0517/ComfyUI-CustomNodes-Template": [
+ [
+ "(Down)Load My Model",
+ "Calculate Minus",
+ "Calculate Plus",
+ "Example Output Node"
+ ],
+ {
+ "title_aux": "ComfyUI-CustomNodes-Template"
+ }
+ ],
+ "https://github.com/jtong/comfyui-jtong-workflow": [
+ [
+ "Example",
+ "high_workflow_caller",
+ "jtong.Highend",
+ "jtong.Highway"
+ ],
+ {
+ "author": "Trung0246",
+ "description": "Random nodes for ComfyUI I made to solve my struggle with ComfyUI (ex: pipe, process). Have varying quality.",
+ "nickname": "ComfyUI-0246",
+ "title": "ComfyUI-0246",
+ "title_aux": "comfyui-jtong-workflow"
+ }
+ ],
+ "https://github.com/kappa54m/ComfyUI_Usability": [
+ [
+ "KLoadImageByPath",
+ "KLoadImageByPathAdvanced",
+ "KLoadImageDedup"
+ ],
+ {
+ "title_aux": "ComfyUI-HPSv2-Nodes"
+ }
+ ],
+ "https://github.com/mira-6/mira-wildcard-node": [
+ [
+ "MiraWildcard"
+ ],
+ {
+ "author": "mira-6",
+ "description": "Single-node wildcard implementation.",
+ "nickname": "mira-wildcard-node",
+ "title": "mira-wildcard-node",
+ "title_aux": "mira-wildcard-node"
+ }
+ ],
+ "https://github.com/sonyeon-sj/ComfyUI-easy_ImageSize_Selecter": [
+ [
+ "ImageSizer",
+ "promptSelecter"
+ ],
+ {
+ "title_aux": "ComfyUI-easy_ImageSize_Selecter"
+ }
+ ],
+ "https://github.com/thinkthinking/ComfyUI-Ye": [
+ [
+ "CheckpointLoader|Ye",
+ "OllamaVision|Ye",
+ "PrintHelloWorld|Ye",
+ "Signature|Ye"
+ ],
+ {
+ "title_aux": "ComfyUI-Ye"
+ }
+ ],
+ "https://github.com/wailovet/ComfyUI-WW": [
+ [
+ "WW_AccumulationPreviewImages",
+ "WW_AppendString",
+ "WW_CurrentPreviewImages",
+ "WW_ImageResize",
+ "WW_PreviewTextNode",
+ "WW_RandString"
+ ],
+ {
+ "title_aux": "ComfyUI-WW"
+ }
+ ],
+ "https://github.com/yowipr/ComfyUI-Manual": [
+ [
+ "EXAMPLE",
+ "M_Layer",
+ "M_Output",
+ "M_RenderArea"
+ ],
+ {
+ "title_aux": "ComfyUI-Manual"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/node_db/tutorial/model-list.json b/custom_nodes/ComfyUI-Manager/node_db/tutorial/model-list.json
new file mode 100644
index 0000000000000000000000000000000000000000..8e3e1dc4858a08aa46190aa53ba320d565206cf4
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/tutorial/model-list.json
@@ -0,0 +1,3 @@
+{
+ "models": []
+}
diff --git a/custom_nodes/ComfyUI-Manager/node_db/tutorial/scan.sh b/custom_nodes/ComfyUI-Manager/node_db/tutorial/scan.sh
new file mode 100644
index 0000000000000000000000000000000000000000..6e3e6dafd1f031eeee2ed170b3ba1b9cf731f924
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/node_db/tutorial/scan.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+rm ~/.tmp/dev/*.py > /dev/null 2>&1
+python ../../scanner.py ~/.tmp/tutorial
diff --git a/custom_nodes/ComfyUI-Manager/notebooks/comfyui_colab_with_manager.ipynb b/custom_nodes/ComfyUI-Manager/notebooks/comfyui_colab_with_manager.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..3cfa484b9d2e9bd87624528dd713e83afd4b77ee
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/notebooks/comfyui_colab_with_manager.ipynb
@@ -0,0 +1,373 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "aaaaaaaaaa"
+ },
+ "source": [
+ "Git clone the repo and install the requirements. (ignore the pip errors about protobuf)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "bbbbbbbbbb"
+ },
+ "outputs": [],
+ "source": [
+ "# #@title Environment Setup\n",
+ "\n",
+ "from pathlib import Path\n",
+ "\n",
+ "OPTIONS = {}\n",
+ "\n",
+ "USE_GOOGLE_DRIVE = True #@param {type:\"boolean\"}\n",
+ "UPDATE_COMFY_UI = True #@param {type:\"boolean\"}\n",
+ "USE_COMFYUI_MANAGER = True #@param {type:\"boolean\"}\n",
+ "INSTALL_CUSTOM_NODES_DEPENDENCIES = True #@param {type:\"boolean\"}\n",
+ "OPTIONS['USE_GOOGLE_DRIVE'] = USE_GOOGLE_DRIVE\n",
+ "OPTIONS['UPDATE_COMFY_UI'] = UPDATE_COMFY_UI\n",
+ "OPTIONS['USE_COMFYUI_MANAGER'] = USE_COMFYUI_MANAGER\n",
+ "OPTIONS['INSTALL_CUSTOM_NODES_DEPENDENCIES'] = INSTALL_CUSTOM_NODES_DEPENDENCIES\n",
+ "\n",
+ "current_dir = !pwd\n",
+ "WORKSPACE = f\"{current_dir[0]}/ComfyUI\"\n",
+ "\n",
+ "if OPTIONS['USE_GOOGLE_DRIVE']:\n",
+ " !echo \"Mounting Google Drive...\"\n",
+ " %cd /\n",
+ "\n",
+ " from google.colab import drive\n",
+ " drive.mount('/content/drive')\n",
+ "\n",
+ " WORKSPACE = \"/content/drive/MyDrive/ComfyUI\"\n",
+ " %cd /content/drive/MyDrive\n",
+ "\n",
+ "![ ! -d $WORKSPACE ] && echo -= Initial setup ComfyUI =- && git clone https://github.com/comfyanonymous/ComfyUI\n",
+ "%cd $WORKSPACE\n",
+ "\n",
+ "if OPTIONS['UPDATE_COMFY_UI']:\n",
+ " !echo -= Updating ComfyUI =-\n",
+ "\n",
+ " # Correction of the issue of permissions being deleted on Google Drive.\n",
+ " ![ -f \".ci/nightly/update_windows/update_comfyui_and_python_dependencies.bat\" ] && chmod 755 .ci/nightly/update_windows/update_comfyui_and_python_dependencies.bat\n",
+ " ![ -f \".ci/nightly/windows_base_files/run_nvidia_gpu.bat\" ] && chmod 755 .ci/nightly/windows_base_files/run_nvidia_gpu.bat\n",
+ " ![ -f \".ci/update_windows/update_comfyui_and_python_dependencies.bat\" ] && chmod 755 .ci/update_windows/update_comfyui_and_python_dependencies.bat\n",
+ " ![ -f \".ci/update_windows_cu118/update_comfyui_and_python_dependencies.bat\" ] && chmod 755 .ci/update_windows_cu118/update_comfyui_and_python_dependencies.bat\n",
+ " ![ -f \".ci/update_windows/update.py\" ] && chmod 755 .ci/update_windows/update.py\n",
+ " ![ -f \".ci/update_windows/update_comfyui.bat\" ] && chmod 755 .ci/update_windows/update_comfyui.bat\n",
+ " ![ -f \".ci/update_windows/README_VERY_IMPORTANT.txt\" ] && chmod 755 .ci/update_windows/README_VERY_IMPORTANT.txt\n",
+ " ![ -f \".ci/update_windows/run_cpu.bat\" ] && chmod 755 .ci/update_windows/run_cpu.bat\n",
+ " ![ -f \".ci/update_windows/run_nvidia_gpu.bat\" ] && chmod 755 .ci/update_windows/run_nvidia_gpu.bat\n",
+ "\n",
+ " !git pull\n",
+ "\n",
+ "!echo -= Install dependencies =-\n",
+ "!pip3 install accelerate\n",
+ "!pip3 install einops transformers>=4.28.1 safetensors>=0.4.2 aiohttp pyyaml Pillow scipy tqdm psutil tokenizers>=0.13.3\n",
+ "!pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121\n",
+ "!pip3 install torchsde\n",
+ "!pip3 install kornia>=0.7.1 spandrel soundfile sentencepiece\n",
+ "\n",
+ "if OPTIONS['USE_COMFYUI_MANAGER']:\n",
+ " %cd custom_nodes\n",
+ "\n",
+ " # Correction of the issue of permissions being deleted on Google Drive.\n",
+ " ![ -f \"ComfyUI-Manager/check.sh\" ] && chmod 755 ComfyUI-Manager/check.sh\n",
+ " ![ -f \"ComfyUI-Manager/scan.sh\" ] && chmod 755 ComfyUI-Manager/scan.sh\n",
+ " ![ -f \"ComfyUI-Manager/node_db/dev/scan.sh\" ] && chmod 755 ComfyUI-Manager/node_db/dev/scan.sh\n",
+ " ![ -f \"ComfyUI-Manager/node_db/tutorial/scan.sh\" ] && chmod 755 ComfyUI-Manager/node_db/tutorial/scan.sh\n",
+ " ![ -f \"ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh\" ] && chmod 755 ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh\n",
+ " ![ -f \"ComfyUI-Manager/scripts/install-comfyui-venv-win.bat\" ] && chmod 755 ComfyUI-Manager/scripts/install-comfyui-venv-win.bat\n",
+ "\n",
+ " ![ ! -d ComfyUI-Manager ] && echo -= Initial setup ComfyUI-Manager =- && git clone https://github.com/ltdrdata/ComfyUI-Manager\n",
+ " %cd ComfyUI-Manager\n",
+ " !git pull\n",
+ "\n",
+ "%cd $WORKSPACE\n",
+ "\n",
+ "if OPTIONS['INSTALL_CUSTOM_NODES_DEPENDENCIES']:\n",
+ " !echo -= Install custom nodes dependencies =-\n",
+ " !pip install GitPython\n",
+ " !python custom_nodes/ComfyUI-Manager/cm-cli.py restore-dependencies\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "cccccccccc"
+ },
+ "source": [
+ "Download some models/checkpoints/vae or custom comfyui nodes (uncomment the commands for the ones you want)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "dddddddddd"
+ },
+ "outputs": [],
+ "source": [
+ "# Checkpoints\n",
+ "\n",
+ "### SDXL\n",
+ "### I recommend these workflow examples: https://comfyanonymous.github.io/ComfyUI_examples/sdxl/\n",
+ "\n",
+ "#!wget -c https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors -P ./models/checkpoints/\n",
+ "#!wget -c https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors -P ./models/checkpoints/\n",
+ "\n",
+ "# SDXL ReVision\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/clip_vision_g/resolve/main/clip_vision_g.safetensors -P ./models/clip_vision/\n",
+ "\n",
+ "# SD1.5\n",
+ "!wget -c https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt -P ./models/checkpoints/\n",
+ "\n",
+ "# SD2\n",
+ "#!wget -c https://huggingface.co/stabilityai/stable-diffusion-2-1-base/resolve/main/v2-1_512-ema-pruned.safetensors -P ./models/checkpoints/\n",
+ "#!wget -c https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-ema-pruned.safetensors -P ./models/checkpoints/\n",
+ "\n",
+ "# Some SD1.5 anime style\n",
+ "#!wget -c https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix2/AbyssOrangeMix2_hard.safetensors -P ./models/checkpoints/\n",
+ "#!wget -c https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A1_orangemixs.safetensors -P ./models/checkpoints/\n",
+ "#!wget -c https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A3_orangemixs.safetensors -P ./models/checkpoints/\n",
+ "#!wget -c https://huggingface.co/Linaqruf/anything-v3.0/resolve/main/anything-v3-fp16-pruned.safetensors -P ./models/checkpoints/\n",
+ "\n",
+ "# Waifu Diffusion 1.5 (anime style SD2.x 768-v)\n",
+ "#!wget -c https://huggingface.co/waifu-diffusion/wd-1-5-beta3/resolve/main/wd-illusion-fp16.safetensors -P ./models/checkpoints/\n",
+ "\n",
+ "\n",
+ "# unCLIP models\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/illuminatiDiffusionV1_v11_unCLIP/resolve/main/illuminatiDiffusionV1_v11-unclip-h-fp16.safetensors -P ./models/checkpoints/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/wd-1.5-beta2_unCLIP/resolve/main/wd-1-5-beta2-aesthetic-unclip-h-fp16.safetensors -P ./models/checkpoints/\n",
+ "\n",
+ "\n",
+ "# VAE\n",
+ "!wget -c https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.safetensors -P ./models/vae/\n",
+ "#!wget -c https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/VAEs/orangemix.vae.pt -P ./models/vae/\n",
+ "#!wget -c https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/vae/kl-f8-anime2.ckpt -P ./models/vae/\n",
+ "\n",
+ "\n",
+ "# Loras\n",
+ "#!wget -c https://civitai.com/api/download/models/10350 -O ./models/loras/theovercomer8sContrastFix_sd21768.safetensors #theovercomer8sContrastFix SD2.x 768-v\n",
+ "#!wget -c https://civitai.com/api/download/models/10638 -O ./models/loras/theovercomer8sContrastFix_sd15.safetensors #theovercomer8sContrastFix SD1.x\n",
+ "#!wget -c https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors -P ./models/loras/ #SDXL offset noise lora\n",
+ "\n",
+ "\n",
+ "# T2I-Adapter\n",
+ "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_depth_sd14v1.pth -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_seg_sd14v1.pth -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_sketch_sd14v1.pth -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_keypose_sd14v1.pth -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_openpose_sd14v1.pth -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_color_sd14v1.pth -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_canny_sd14v1.pth -P ./models/controlnet/\n",
+ "\n",
+ "# T2I Styles Model\n",
+ "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_style_sd14v1.pth -P ./models/style_models/\n",
+ "\n",
+ "# CLIPVision model (needed for styles model)\n",
+ "#!wget -c https://huggingface.co/openai/clip-vit-large-patch14/resolve/main/pytorch_model.bin -O ./models/clip_vision/clip_vit14.bin\n",
+ "\n",
+ "\n",
+ "# ControlNet\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11e_sd15_ip2p_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11e_sd15_shuffle_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_canny_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11f1p_sd15_depth_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_inpaint_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_lineart_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_mlsd_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_normalbae_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_openpose_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_scribble_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_seg_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_softedge_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15s2_lineart_anime_fp16.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11u_sd15_tile_fp16.safetensors -P ./models/controlnet/\n",
+ "\n",
+ "# ControlNet SDXL\n",
+ "#!wget -c https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-canny-rank256.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-depth-rank256.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-recolor-rank256.safetensors -P ./models/controlnet/\n",
+ "#!wget -c https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-sketch-rank256.safetensors -P ./models/controlnet/\n",
+ "\n",
+ "# Controlnet Preprocessor nodes by Fannovel16\n",
+ "#!cd custom_nodes && git clone https://github.com/Fannovel16/comfy_controlnet_preprocessors; cd comfy_controlnet_preprocessors && python install.py\n",
+ "\n",
+ "\n",
+ "# GLIGEN\n",
+ "#!wget -c https://huggingface.co/comfyanonymous/GLIGEN_pruned_safetensors/resolve/main/gligen_sd14_textbox_pruned_fp16.safetensors -P ./models/gligen/\n",
+ "\n",
+ "\n",
+ "# ESRGAN upscale model\n",
+ "#!wget -c https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth -P ./models/upscale_models/\n",
+ "#!wget -c https://huggingface.co/sberbank-ai/Real-ESRGAN/resolve/main/RealESRGAN_x2.pth -P ./models/upscale_models/\n",
+ "#!wget -c https://huggingface.co/sberbank-ai/Real-ESRGAN/resolve/main/RealESRGAN_x4.pth -P ./models/upscale_models/\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "kkkkkkkkkkkkkkk"
+ },
+ "source": [
+ "### Run ComfyUI with cloudflared (Recommended Way)\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "jjjjjjjjjjjjjj"
+ },
+ "outputs": [],
+ "source": [
+ "!wget -P ~ https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb\n",
+ "!dpkg -i ~/cloudflared-linux-amd64.deb\n",
+ "\n",
+ "import subprocess\n",
+ "import threading\n",
+ "import time\n",
+ "import socket\n",
+ "import urllib.request\n",
+ "\n",
+ "def iframe_thread(port):\n",
+ " while True:\n",
+ " time.sleep(0.5)\n",
+ " sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n",
+ " result = sock.connect_ex(('127.0.0.1', port))\n",
+ " if result == 0:\n",
+ " break\n",
+ " sock.close()\n",
+ " print(\"\\nComfyUI finished loading, trying to launch cloudflared (if it gets stuck here cloudflared is having issues)\\n\")\n",
+ "\n",
+ " p = subprocess.Popen([\"cloudflared\", \"tunnel\", \"--url\", \"http://127.0.0.1:{}\".format(port)], stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n",
+ " for line in p.stderr:\n",
+ " l = line.decode()\n",
+ " if \"trycloudflare.com \" in l:\n",
+ " print(\"This is the URL to access ComfyUI:\", l[l.find(\"http\"):], end='')\n",
+ " #print(l, end='')\n",
+ "\n",
+ "\n",
+ "threading.Thread(target=iframe_thread, daemon=True, args=(8188,)).start()\n",
+ "\n",
+ "!python main.py --dont-print-server"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "kkkkkkkkkkkkkk"
+ },
+ "source": [
+ "### Run ComfyUI with localtunnel\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "jjjjjjjjjjjjj"
+ },
+ "outputs": [],
+ "source": [
+ "!npm install -g localtunnel\n",
+ "\n",
+ "import subprocess\n",
+ "import threading\n",
+ "import time\n",
+ "import socket\n",
+ "import urllib.request\n",
+ "\n",
+ "def iframe_thread(port):\n",
+ " while True:\n",
+ " time.sleep(0.5)\n",
+ " sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n",
+ " result = sock.connect_ex(('127.0.0.1', port))\n",
+ " if result == 0:\n",
+ " break\n",
+ " sock.close()\n",
+ " print(\"\\nComfyUI finished loading, trying to launch localtunnel (if it gets stuck here localtunnel is having issues)\\n\")\n",
+ "\n",
+ " print(\"The password/enpoint ip for localtunnel is:\", urllib.request.urlopen('https://ipv4.icanhazip.com').read().decode('utf8').strip(\"\\n\"))\n",
+ " p = subprocess.Popen([\"lt\", \"--port\", \"{}\".format(port)], stdout=subprocess.PIPE)\n",
+ " for line in p.stdout:\n",
+ " print(line.decode(), end='')\n",
+ "\n",
+ "\n",
+ "threading.Thread(target=iframe_thread, daemon=True, args=(8188,)).start()\n",
+ "\n",
+ "!python main.py --dont-print-server"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "gggggggggg"
+ },
+ "source": [
+ "### Run ComfyUI with colab iframe (use only in case the previous way with localtunnel doesn't work)\n",
+ "\n",
+ "You should see the ui appear in an iframe. If you get a 403 error, it's your firefox settings or an extension that's messing things up.\n",
+ "\n",
+ "If you want to open it in another window use the link.\n",
+ "\n",
+ "Note that some UI features like live image previews won't work because the colab iframe blocks websockets."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "hhhhhhhhhh"
+ },
+ "outputs": [],
+ "source": [
+ "import threading\n",
+ "import time\n",
+ "import socket\n",
+ "def iframe_thread(port):\n",
+ " while True:\n",
+ " time.sleep(0.5)\n",
+ " sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n",
+ " result = sock.connect_ex(('127.0.0.1', port))\n",
+ " if result == 0:\n",
+ " break\n",
+ " sock.close()\n",
+ " from google.colab import output\n",
+ " output.serve_kernel_port_as_iframe(port, height=1024)\n",
+ " print(\"to open it in a window you can open this link here:\")\n",
+ " output.serve_kernel_port_as_window(port)\n",
+ "\n",
+ "threading.Thread(target=iframe_thread, daemon=True, args=(8188,)).start()\n",
+ "\n",
+ "!python main.py --dont-print-server"
+ ]
+ }
+ ],
+ "metadata": {
+ "accelerator": "GPU",
+ "colab": {
+ "provenance": []
+ },
+ "gpuClass": "standard",
+ "kernelspec": {
+ "display_name": "Python 3",
+ "name": "python3"
+ },
+ "language_info": {
+ "name": "python"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/custom_nodes/ComfyUI-Manager/openapi.yaml b/custom_nodes/ComfyUI-Manager/openapi.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0446259e384505abd197f903d01af671aa8403fe
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/openapi.yaml
@@ -0,0 +1,903 @@
+openapi: 3.1.0
+info:
+ title: ComfyUI-Manager API
+ description: |
+ API for ComfyUI-Manager, a comprehensive management tool for ComfyUI custom nodes, models, and components.
+ This API enables programmatic access to node management, model downloading, snapshot operations,
+ and overall system configuration.
+ version: "3.32.3"
+ contact:
+ name: ComfyUI-Manager Maintainers
+servers:
+ - url: '/'
+ description: Default ComfyUI server
+
+# Common API components
+components:
+ schemas:
+ Error:
+ type: object
+ properties:
+ error:
+ type: string
+ description: Error message
+
+ NodePackageMetadata:
+ type: object
+ properties:
+ title:
+ type: string
+ description: Display name of the node package
+ name:
+ type: string
+ description: Repository/package name
+ files:
+ type: array
+ items:
+ type: string
+ description: Source URLs for the package
+ description:
+ type: string
+ description: Description of the node package functionality
+ install_type:
+ type: string
+ enum: [git, copy, pip]
+ description: Installation method
+ version:
+ type: string
+ description: Version identifier
+ id:
+ type: string
+ description: Unique identifier for the node package
+ ui_id:
+ type: string
+ description: ID for UI reference
+ channel:
+ type: string
+ description: Source channel
+ mode:
+ type: string
+ description: Source mode
+
+ ModelMetadata:
+ type: object
+ properties:
+ name:
+ type: string
+ description: Name of the model
+ type:
+ type: string
+ description: Type of model
+ base:
+ type: string
+ description: Base model type
+ save_path:
+ type: string
+ description: Path for saving the model
+ url:
+ type: string
+ description: Download URL
+ filename:
+ type: string
+ description: Target filename
+ ui_id:
+ type: string
+ description: ID for UI reference
+
+ SnapshotItem:
+ type: string
+ description: Name of the snapshot
+
+ QueueStatus:
+ type: object
+ properties:
+ total_count:
+ type: integer
+ description: Total number of tasks
+ done_count:
+ type: integer
+ description: Number of completed tasks
+ in_progress_count:
+ type: integer
+ description: Number of tasks in progress
+ is_processing:
+ type: boolean
+ description: Whether the queue is currently processing
+
+ ImportFailInfoBulkRequest:
+ type: object
+ properties:
+ cnr_ids:
+ type: array
+ items:
+ type: string
+ description: A list of CNR IDs to check.
+ urls:
+ type: array
+ items:
+ type: string
+ description: A list of repository URLs to check.
+
+ ImportFailInfoBulkResponse:
+ type: object
+ additionalProperties:
+ $ref: '#/components/schemas/ImportFailInfoItem'
+ description: >-
+ A dictionary where each key is a cnr_id or url from the request,
+ and the value is the corresponding error info.
+
+ ImportFailInfoItem:
+ oneOf:
+ - type: object
+ properties:
+ error:
+ type: string
+ traceback:
+ type: string
+ - type: "null"
+
+ securitySchemes:
+ securityLevel:
+ type: apiKey
+ in: header
+ name: Security-Level
+ description: Security level for sensitive operations
+
+ parameters:
+ modeParam:
+ name: mode
+ in: query
+ description: Source mode (e.g., "local", "remote")
+ schema:
+ type: string
+ enum: [local, remote, default]
+
+ targetParam:
+ name: target
+ in: query
+ description: Target identifier
+ required: true
+ schema:
+ type: string
+
+ valueParam:
+ name: value
+ in: query
+ description: New value to set
+ required: true
+ schema:
+ type: string
+
+# API Paths
+paths:
+ # Custom Nodes Endpoints
+ /customnode/getmappings:
+ get:
+ summary: Get node-to-package mappings
+ description: Provides unified mapping between nodes and node packages
+ parameters:
+ - $ref: '#/components/parameters/modeParam'
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ additionalProperties:
+ type: array
+ items:
+ type: array
+ description: Mapping of node packages to node classes
+
+ /customnode/fetch_updates:
+ get:
+ summary: Check for updates
+ description: Fetches updates for custom nodes
+ parameters:
+ - $ref: '#/components/parameters/modeParam'
+ responses:
+ '200':
+ description: No updates available
+ '201':
+ description: Updates found
+ '400':
+ description: Error occurred
+
+ /customnode/installed:
+ get:
+ summary: Get installed custom nodes
+ description: Returns a list of installed node packages
+ parameters:
+ - name: mode
+ in: query
+ description: Lists mode, default or imported
+ schema:
+ type: string
+ enum: [default, imported]
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ additionalProperties:
+ $ref: '#/components/schemas/NodePackageMetadata'
+
+ /customnode/getlist:
+ get:
+ summary: Get custom node list
+ description: Provides a list of available custom nodes
+ parameters:
+ - $ref: '#/components/parameters/modeParam'
+ - name: skip_update
+ in: query
+ description: Skip update check
+ schema:
+ type: boolean
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ channel:
+ type: string
+ node_packs:
+ type: object
+ additionalProperties:
+ $ref: '#/components/schemas/NodePackageMetadata'
+
+ /customnode/alternatives:
+ get:
+ summary: Get alternative node options
+ description: Provides alternatives for nodes
+ parameters:
+ - $ref: '#/components/parameters/modeParam'
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ additionalProperties:
+ type: object
+
+ /customnode/versions/{node_name}:
+ get:
+ summary: Get available versions for a node
+ description: Lists all available versions for a specific node
+ parameters:
+ - name: node_name
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: object
+ properties:
+ version:
+ type: string
+ '400':
+ description: Node not found
+
+ /customnode/disabled_versions/{node_name}:
+ get:
+ summary: Get disabled versions for a node
+ description: Lists all disabled versions for a specific node
+ parameters:
+ - name: node_name
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: object
+ properties:
+ version:
+ type: string
+ '400':
+ description: Node not found
+
+ /customnode/import_fail_info:
+ post:
+ summary: Get import failure information
+ description: Returns information about why a node failed to import
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ cnr_id:
+ type: string
+ url:
+ type: string
+ responses:
+ '200':
+ description: Successful operation
+ '400':
+ description: No information available
+
+ /v2/customnode/import_fail_info_bulk:
+ post:
+ summary: Get import failure info for multiple nodes
+ description: Retrieves recorded import failure information for a list of custom nodes.
+ tags:
+ - customnode
+ requestBody:
+ description: A list of CNR IDs or repository URLs to check.
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ImportFailInfoBulkRequest'
+ responses:
+ '200':
+ description: A dictionary containing the import failure information.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ImportFailInfoBulkResponse'
+ '400':
+ description: Bad Request. The request body is invalid.
+ '500':
+ description: Internal Server Error.
+
+ /customnode/install/git_url:
+ post:
+ summary: Install custom node via Git URL
+ description: Installs a custom node from a Git repository URL
+ security:
+ - securityLevel: []
+ requestBody:
+ required: true
+ content:
+ text/plain:
+ schema:
+ type: string
+ responses:
+ '200':
+ description: Installation successful or already installed
+ '400':
+ description: Installation failed
+ '403':
+ description: Security policy violation
+
+ /customnode/install/pip:
+ post:
+ summary: Install custom node dependencies via pip
+ description: Installs Python package dependencies for custom nodes
+ security:
+ - securityLevel: []
+ requestBody:
+ required: true
+ content:
+ text/plain:
+ schema:
+ type: string
+ responses:
+ '200':
+ description: Installation successful
+ '403':
+ description: Security policy violation
+
+ # Model Management Endpoints
+ /externalmodel/getlist:
+ get:
+ summary: Get external model list
+ description: Provides a list of available external models
+ parameters:
+ - $ref: '#/components/parameters/modeParam'
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ models:
+ type: array
+ items:
+ $ref: '#/components/schemas/ModelMetadata'
+
+ # Queue Management Endpoints
+ /manager/queue/update_all:
+ get:
+ summary: Update all custom nodes
+ description: Queues update operations for all installed custom nodes
+ security:
+ - securityLevel: []
+ parameters:
+ - $ref: '#/components/parameters/modeParam'
+ responses:
+ '200':
+ description: Update queued successfully
+ '401':
+ description: Processing already in progress
+ '403':
+ description: Security policy violation
+
+ /manager/queue/reset:
+ get:
+ summary: Reset queue
+ description: Resets the operation queue
+ responses:
+ '200':
+ description: Queue reset successfully
+
+ /manager/queue/status:
+ get:
+ summary: Get queue status
+ description: Returns the current status of the operation queue
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/QueueStatus'
+
+ /manager/queue/install:
+ post:
+ summary: Install custom node
+ description: Queues installation of a custom node
+ security:
+ - securityLevel: []
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NodePackageMetadata'
+ responses:
+ '200':
+ description: Installation queued successfully
+ '403':
+ description: Security policy violation
+ '404':
+ description: Target node not found or security issue
+
+ /manager/queue/start:
+ get:
+ summary: Start queue processing
+ description: Starts processing the operation queue
+ responses:
+ '200':
+ description: Processing started
+ '201':
+ description: Processing already in progress
+
+ /manager/queue/fix:
+ post:
+ summary: Fix custom node
+ description: Attempts to fix a broken custom node installation
+ security:
+ - securityLevel: []
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NodePackageMetadata'
+ responses:
+ '200':
+ description: Fix operation queued successfully
+ '403':
+ description: Security policy violation
+
+ /manager/queue/reinstall:
+ post:
+ summary: Reinstall custom node
+ description: Uninstalls and then reinstalls a custom node
+ security:
+ - securityLevel: []
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NodePackageMetadata'
+ responses:
+ '200':
+ description: Reinstall operation queued successfully
+ '403':
+ description: Security policy violation
+
+ /manager/queue/uninstall:
+ post:
+ summary: Uninstall custom node
+ description: Queues uninstallation of a custom node
+ security:
+ - securityLevel: []
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NodePackageMetadata'
+ responses:
+ '200':
+ description: Uninstallation queued successfully
+ '403':
+ description: Security policy violation
+
+ /manager/queue/update:
+ post:
+ summary: Update custom node
+ description: Queues update of a custom node
+ security:
+ - securityLevel: []
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NodePackageMetadata'
+ responses:
+ '200':
+ description: Update queued successfully
+ '403':
+ description: Security policy violation
+
+ /manager/queue/disable:
+ post:
+ summary: Disable custom node
+ description: Disables a custom node without uninstalling it
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NodePackageMetadata'
+ responses:
+ '200':
+ description: Disable operation queued successfully
+
+ /manager/queue/update_comfyui:
+ get:
+ summary: Update ComfyUI
+ description: Queues an update operation for ComfyUI itself
+ responses:
+ '200':
+ description: Update queued successfully
+
+ /manager/queue/install_model:
+ post:
+ summary: Install model
+ description: Queues installation of a model
+ security:
+ - securityLevel: []
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ModelMetadata'
+ responses:
+ '200':
+ description: Installation queued successfully
+ '400':
+ description: Invalid model request
+ '403':
+ description: Security policy violation
+
+ # Snapshot Management Endpoints
+ /snapshot/getlist:
+ get:
+ summary: Get snapshot list
+ description: Returns a list of available snapshots
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ items:
+ type: array
+ items:
+ $ref: '#/components/schemas/SnapshotItem'
+
+ /snapshot/remove:
+ get:
+ summary: Remove snapshot
+ description: Removes a specified snapshot
+ security:
+ - securityLevel: []
+ parameters:
+ - $ref: '#/components/parameters/targetParam'
+ responses:
+ '200':
+ description: Snapshot removed successfully
+ '400':
+ description: Error removing snapshot
+ '403':
+ description: Security policy violation
+
+ /snapshot/restore:
+ get:
+ summary: Restore snapshot
+ description: Restores a specified snapshot
+ security:
+ - securityLevel: []
+ parameters:
+ - $ref: '#/components/parameters/targetParam'
+ responses:
+ '200':
+ description: Snapshot restoration scheduled
+ '400':
+ description: Error restoring snapshot
+ '403':
+ description: Security policy violation
+
+ /snapshot/get_current:
+ get:
+ summary: Get current snapshot
+ description: Returns the current system state as a snapshot
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ '400':
+ description: Error creating snapshot
+
+ /snapshot/save:
+ get:
+ summary: Save snapshot
+ description: Saves the current system state as a new snapshot
+ responses:
+ '200':
+ description: Snapshot saved successfully
+ '400':
+ description: Error saving snapshot
+
+ # ComfyUI Management Endpoints
+ /comfyui_manager/comfyui_versions:
+ get:
+ summary: Get ComfyUI versions
+ description: Returns available and current ComfyUI versions
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ versions:
+ type: array
+ items:
+ type: string
+ current:
+ type: string
+ '400':
+ description: Error retrieving versions
+
+ /comfyui_manager/comfyui_switch_version:
+ get:
+ summary: Switch ComfyUI version
+ description: Switches to a specified ComfyUI version
+ parameters:
+ - name: ver
+ in: query
+ description: Target version
+ schema:
+ type: string
+ responses:
+ '200':
+ description: Version switch successful
+ '400':
+ description: Error switching version
+
+ /manager/reboot:
+ get:
+ summary: Reboot ComfyUI
+ description: Restarts the ComfyUI server
+ security:
+ - securityLevel: []
+ responses:
+ '200':
+ description: Reboot initiated
+ '403':
+ description: Security policy violation
+
+ # Configuration Endpoints
+ /manager/preview_method:
+ get:
+ summary: Get or set preview method
+ description: Gets or sets the latent preview method
+ parameters:
+ - name: value
+ in: query
+ required: false
+ description: New preview method
+ schema:
+ type: string
+ enum: [auto, latent2rgb, taesd, none]
+ responses:
+ '200':
+ description: Setting updated or current value returned
+ content:
+ text/plain:
+ schema:
+ type: string
+
+ /manager/db_mode:
+ get:
+ summary: Get or set database mode
+ description: Gets or sets the database mode
+ parameters:
+ - name: value
+ in: query
+ required: false
+ description: New database mode
+ schema:
+ type: string
+ enum: [channel, local, remote]
+ responses:
+ '200':
+ description: Setting updated or current value returned
+ content:
+ text/plain:
+ schema:
+ type: string
+
+ /manager/policy/component:
+ get:
+ summary: Get or set component policy
+ description: Gets or sets the component policy
+ parameters:
+ - name: value
+ in: query
+ required: false
+ description: New component policy
+ schema:
+ type: string
+ responses:
+ '200':
+ description: Setting updated or current value returned
+ content:
+ text/plain:
+ schema:
+ type: string
+
+ /manager/policy/update:
+ get:
+ summary: Get or set update policy
+ description: Gets or sets the update policy
+ parameters:
+ - name: value
+ in: query
+ required: false
+ description: New update policy
+ schema:
+ type: string
+ enum: [stable, nightly, nightly-comfyui]
+ responses:
+ '200':
+ description: Setting updated or current value returned
+ content:
+ text/plain:
+ schema:
+ type: string
+
+ /manager/channel_url_list:
+ get:
+ summary: Get or set channel URL
+ description: Gets or sets the channel URL for custom node sources
+ parameters:
+ - name: value
+ in: query
+ required: false
+ description: New channel name
+ schema:
+ type: string
+ responses:
+ '200':
+ description: Setting updated or channel list returned
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ selected:
+ type: string
+ list:
+ type: array
+ items:
+ type: object
+ properties:
+ name:
+ type: string
+ url:
+ type: string
+
+ # Component Management Endpoints
+ /manager/component/save:
+ post:
+ summary: Save component
+ description: Saves a reusable workflow component
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ name:
+ type: string
+ workflow:
+ type: object
+ responses:
+ '200':
+ description: Component saved successfully
+ content:
+ text/plain:
+ schema:
+ type: string
+ '400':
+ description: Error saving component
+
+ /manager/component/loads:
+ post:
+ summary: Load components
+ description: Loads all available workflow components
+ responses:
+ '200':
+ description: Components loaded successfully
+ content:
+ application/json:
+ schema:
+ type: object
+ '400':
+ description: Error loading components
+
+ # Miscellaneous Endpoints
+ /manager/version:
+ get:
+ summary: Get manager version
+ description: Returns the current version of ComfyUI-Manager
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ text/plain:
+ schema:
+ type: string
+
+ /manager/notice:
+ get:
+ summary: Get manager notice
+ description: Returns HTML content with notices and version information
+ responses:
+ '200':
+ description: Successful operation
+ content:
+ text/html:
+ schema:
+ type: string
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/pip_overrides.json.template b/custom_nodes/ComfyUI-Manager/pip_overrides.json.template
new file mode 100644
index 0000000000000000000000000000000000000000..3884edb920a3baf02eab169a835d82e3a463c8f2
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/pip_overrides.json.template
@@ -0,0 +1,21 @@
+{
+ "imageio-ffmpeg": "imageio",
+ "imageio[ffmpeg]": "imageio",
+ "imageio_ffmpeg": "imageio",
+ "diffusers~=0.21.4": "diffusers",
+ "huggingface_hub": "huggingface-hub",
+ "numpy<1.24>=1.18": "numpy==1.26.4",
+ "numpy>=1.18.5, <1.25.0": "numpy==1.26.4",
+ "opencv-contrib-python": "opencv-contrib-python-headless",
+ "opencv-python": "opencv-contrib-python-headless",
+ "opencv-python-headless": "opencv-contrib-python-headless",
+ "opencv-python-headless[ffmpeg]<=4.7.0.72": "opencv-contrib-python-headless",
+ "opencv-python>=4.7.0.72": "opencv-contrib-python-headless",
+ "pandas<=1.5.1": "pandas",
+ "scikit-image==0.20.0": "scikit-image",
+ "scipy>=1.11.4": "scipy",
+ "segment_anything": "segment-anything",
+ "timm==0.6.5": "timm",
+ "timm>=0.4.12": "timm",
+ "transformers==4.26.1": "transformers"
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/pip_overrides.osx.template b/custom_nodes/ComfyUI-Manager/pip_overrides.osx.template
new file mode 100644
index 0000000000000000000000000000000000000000..3884edb920a3baf02eab169a835d82e3a463c8f2
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/pip_overrides.osx.template
@@ -0,0 +1,21 @@
+{
+ "imageio-ffmpeg": "imageio",
+ "imageio[ffmpeg]": "imageio",
+ "imageio_ffmpeg": "imageio",
+ "diffusers~=0.21.4": "diffusers",
+ "huggingface_hub": "huggingface-hub",
+ "numpy<1.24>=1.18": "numpy==1.26.4",
+ "numpy>=1.18.5, <1.25.0": "numpy==1.26.4",
+ "opencv-contrib-python": "opencv-contrib-python-headless",
+ "opencv-python": "opencv-contrib-python-headless",
+ "opencv-python-headless": "opencv-contrib-python-headless",
+ "opencv-python-headless[ffmpeg]<=4.7.0.72": "opencv-contrib-python-headless",
+ "opencv-python>=4.7.0.72": "opencv-contrib-python-headless",
+ "pandas<=1.5.1": "pandas",
+ "scikit-image==0.20.0": "scikit-image",
+ "scipy>=1.11.4": "scipy",
+ "segment_anything": "segment-anything",
+ "timm==0.6.5": "timm",
+ "timm>=0.4.12": "timm",
+ "transformers==4.26.1": "transformers"
+}
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/prestartup_script.py b/custom_nodes/ComfyUI-Manager/prestartup_script.py
new file mode 100644
index 0000000000000000000000000000000000000000..dabd39dae1b33d354c7e853b11a96ab8639dc590
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/prestartup_script.py
@@ -0,0 +1,869 @@
+import os
+import shutil
+import subprocess
+import sys
+import atexit
+import threading
+import re
+import locale
+import platform
+import json
+import ast
+import logging
+import traceback
+
+glob_path = os.path.join(os.path.dirname(__file__), "glob")
+sys.path.append(glob_path)
+
+import security_check
+import manager_util
+import cm_global
+import manager_downloader
+import folder_paths
+
+manager_util.add_python_path_to_env()
+
+import datetime as dt
+
+if hasattr(dt, 'datetime'):
+ from datetime import datetime as dt_datetime
+
+ def current_timestamp():
+ return dt_datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
+else:
+ # NOTE: Occurs in some Mac environments.
+ import time
+ logging.error(f"[ComfyUI-Manager] fallback timestamp mode\n datetime module is invalid: '{dt.__file__}'")
+
+ def current_timestamp():
+ return str(time.time()).split('.')[0]
+
+
+cm_global.pip_blacklist = {'torch', 'torchaudio', 'torchsde', 'torchvision'}
+cm_global.pip_downgrade_blacklist = ['torch', 'torchaudio', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia']
+
+
+def skip_pip_spam(x):
+ return ('Requirement already satisfied:' in x) or ("DEPRECATION: Loading egg at" in x)
+
+
+message_collapses = [skip_pip_spam]
+import_failed_extensions = set()
+cm_global.variables['cm.on_revision_detected_handler'] = []
+enable_file_logging = True
+
+
+def register_message_collapse(f):
+ global message_collapses
+ message_collapses.append(f)
+
+
+def is_import_failed_extension(name):
+ global import_failed_extensions
+ return name in import_failed_extensions
+
+
+comfy_path = os.environ.get('COMFYUI_PATH')
+comfy_base_path = os.environ.get('COMFYUI_FOLDERS_BASE_PATH')
+
+if comfy_path is None:
+ # legacy env var
+ comfy_path = os.environ.get('COMFYUI_PATH')
+
+if comfy_path is None:
+ comfy_path = os.path.abspath(os.path.dirname(sys.modules['__main__'].__file__))
+
+if comfy_base_path is None:
+ comfy_base_path = comfy_path
+
+sys.__comfyui_manager_register_message_collapse = register_message_collapse
+sys.__comfyui_manager_is_import_failed_extension = is_import_failed_extension
+cm_global.register_api('cm.register_message_collapse', register_message_collapse)
+cm_global.register_api('cm.is_import_failed_extension', is_import_failed_extension)
+
+
+comfyui_manager_path = os.path.abspath(os.path.dirname(__file__))
+
+custom_nodes_base_path = folder_paths.get_folder_paths('custom_nodes')[0]
+
+# Check for System User API availability (PR #10966)
+_has_system_user_api = hasattr(folder_paths, 'get_system_user_directory')
+
+if _has_system_user_api:
+ manager_files_path = os.path.abspath(os.path.join(folder_paths.get_user_directory(), '__manager'))
+else:
+ manager_files_path = os.path.abspath(os.path.join(folder_paths.get_user_directory(), 'default', 'ComfyUI-Manager'))
+
+manager_pip_overrides_path = os.path.join(manager_files_path, "pip_overrides.json")
+manager_pip_blacklist_path = os.path.join(manager_files_path, "pip_blacklist.list")
+restore_snapshot_path = os.path.join(manager_files_path, "startup-scripts", "restore-snapshot.json")
+manager_config_path = os.path.join(manager_files_path, 'config.ini')
+
+cm_cli_path = os.path.join(comfyui_manager_path, "cm-cli.py")
+
+
+default_conf = {}
+
+def read_config():
+ global default_conf
+ try:
+ import configparser
+ config = configparser.ConfigParser(strict=False)
+ config.read(manager_config_path)
+ default_conf = config['default']
+ except Exception:
+ pass
+
+def read_uv_mode():
+ if 'use_uv' in default_conf:
+ manager_util.use_uv = default_conf['use_uv'].lower() == 'true'
+
+def check_file_logging():
+ global enable_file_logging
+ if 'file_logging' in default_conf and default_conf['file_logging'].lower() == 'false':
+ enable_file_logging = False
+
+
+read_config()
+read_uv_mode()
+security_check.security_check()
+check_file_logging()
+
+cm_global.pip_overrides = {}
+
+if os.path.exists(manager_pip_overrides_path):
+ with open(manager_pip_overrides_path, 'r', encoding="UTF-8", errors="ignore") as json_file:
+ cm_global.pip_overrides = json.load(json_file)
+
+
+if os.path.exists(manager_pip_blacklist_path):
+ with open(manager_pip_blacklist_path, 'r', encoding="UTF-8", errors="ignore") as f:
+ for x in f.readlines():
+ y = x.strip()
+ if y != '':
+ cm_global.pip_blacklist.add(y)
+
+
+def remap_pip_package(pkg):
+ if pkg in cm_global.pip_overrides:
+ res = cm_global.pip_overrides[pkg]
+ print(f"[ComfyUI-Manager] '{pkg}' is remapped to '{res}'")
+ return res
+ else:
+ return pkg
+
+
+std_log_lock = threading.Lock()
+
+
+def handle_stream(stream, prefix):
+ stream.reconfigure(encoding=locale.getpreferredencoding(), errors='replace')
+ for msg in stream:
+ if prefix == '[!]' and ('it/s]' in msg or 's/it]' in msg) and ('%|' in msg or 'it [' in msg):
+ if msg.startswith('100%'):
+ print('\r' + msg, end="", file=sys.stderr),
+ else:
+ print('\r' + msg[:-1], end="", file=sys.stderr),
+ else:
+ if prefix == '[!]':
+ print(prefix, msg, end="", file=sys.stderr)
+ else:
+ print(prefix, msg, end="")
+
+
+def process_wrap(cmd_str, cwd_path, handler=None, env=None):
+ process = subprocess.Popen(cmd_str, cwd=cwd_path, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1)
+
+ if handler is None:
+ handler = handle_stream
+
+ stdout_thread = threading.Thread(target=handler, args=(process.stdout, ""))
+ stderr_thread = threading.Thread(target=handler, args=(process.stderr, "[!]"))
+
+ stdout_thread.start()
+ stderr_thread.start()
+
+ stdout_thread.join()
+ stderr_thread.join()
+
+ return process.wait()
+
+
+original_stdout = sys.stdout
+
+
+def try_get_custom_nodes(x):
+ for custom_nodes_dir in folder_paths.get_folder_paths('custom_nodes'):
+ if x.startswith(custom_nodes_dir):
+ relative_path = os.path.relpath(x, custom_nodes_dir)
+ next_segment = relative_path.split(os.sep)[0]
+ if next_segment.lower() != 'comfyui-manager':
+ return next_segment, os.path.join(custom_nodes_dir, next_segment)
+ return None
+
+
+def extract_origin_module():
+ stack = traceback.extract_stack()[:-2]
+ for frame in reversed(stack):
+ info = try_get_custom_nodes(frame.filename)
+ if info is None:
+ continue
+ else:
+ return info
+ return None
+
+def extract_origin_module_from_strings(file_paths):
+ for filepath in file_paths:
+ info = try_get_custom_nodes(filepath)
+ if info is None:
+ continue
+ else:
+ return info
+ return None
+
+
+def finalize_startup():
+ res = {}
+ for k, v in cm_global.error_dict.items():
+ if v['path'] in import_failed_extensions:
+ res[k] = v
+
+ cm_global.error_dict = res
+
+
+try:
+ if '--port' in sys.argv:
+ port_index = sys.argv.index('--port')
+ if port_index + 1 < len(sys.argv):
+ port = int(sys.argv[port_index + 1])
+ postfix = f"_{port}"
+ else:
+ postfix = ""
+ else:
+ postfix = ""
+
+ # Logger setup
+ log_path_base = None
+ if enable_file_logging:
+ log_path_base = os.path.join(folder_paths.user_directory, 'comfyui')
+
+ if not os.path.exists(folder_paths.user_directory):
+ os.makedirs(folder_paths.user_directory)
+
+ if os.path.exists(f"{log_path_base}{postfix}.log"):
+ if os.path.exists(f"{log_path_base}{postfix}.prev.log"):
+ if os.path.exists(f"{log_path_base}{postfix}.prev2.log"):
+ os.remove(f"{log_path_base}{postfix}.prev2.log")
+ os.rename(f"{log_path_base}{postfix}.prev.log", f"{log_path_base}{postfix}.prev2.log")
+ os.rename(f"{log_path_base}{postfix}.log", f"{log_path_base}{postfix}.prev.log")
+
+ log_file = open(f"{log_path_base}{postfix}.log", "w", encoding="utf-8", errors="ignore")
+
+ log_lock = threading.Lock()
+
+ original_stdout = sys.stdout
+ original_stderr = sys.stderr
+
+ if original_stdout.encoding.lower() == 'utf-8':
+ write_stdout = original_stdout.write
+ write_stderr = original_stderr.write
+ else:
+ def wrapper_stdout(msg):
+ original_stdout.write(msg.encode('utf-8').decode(original_stdout.encoding, errors="ignore"))
+
+ def wrapper_stderr(msg):
+ original_stderr.write(msg.encode('utf-8').decode(original_stderr.encoding, errors="ignore"))
+
+ write_stdout = wrapper_stdout
+ write_stderr = wrapper_stderr
+
+ pat_tqdm = r'\d+%.*\[(.*?)\]'
+ pat_import_fail = r'seconds \(IMPORT FAILED\):(.*)$'
+
+ is_start_mode = True
+
+
+ class ComfyUIManagerLogger:
+ def __init__(self, is_stdout):
+ self.is_stdout = is_stdout
+ self.encoding = "utf-8"
+ self.last_char = ''
+
+ def fileno(self):
+ try:
+ if self.is_stdout:
+ return original_stdout.fileno()
+ else:
+ return original_stderr.fileno()
+ except AttributeError:
+ # Handle error
+ raise ValueError("The object does not have a fileno method")
+
+ def isatty(self):
+ return False
+
+ def write(self, message):
+ global is_start_mode
+
+ if any(f(message) for f in message_collapses):
+ return
+
+ if is_start_mode:
+ match = re.search(pat_import_fail, message)
+ if match:
+ import_failed_extensions.add(match.group(1).strip())
+
+ if not self.is_stdout:
+ origin_info = extract_origin_module()
+ if origin_info is not None:
+ name, origin_path = origin_info
+
+ if name != 'comfyui-manager':
+ if name not in cm_global.error_dict:
+ cm_global.error_dict[name] = {'name': name, 'path': origin_path, 'msg': ''}
+
+ cm_global.error_dict[name]['msg'] += message
+
+ if not self.is_stdout:
+ match = re.search(pat_tqdm, message)
+ if match:
+ message = re.sub(r'([#|])\d', r'\1▌', message)
+ message = re.sub('#', '█', message)
+ if '100%' in message:
+ self.sync_write(message)
+ else:
+ write_stderr(message)
+ original_stderr.flush()
+ else:
+ self.sync_write(message)
+ else:
+ self.sync_write(message)
+
+ def sync_write(self, message, file_only=False):
+ with log_lock:
+ timestamp = current_timestamp()
+ if self.last_char != '\n':
+ log_file.write(message)
+ else:
+ log_file.write(f"[{timestamp}] {message}")
+
+ try:
+ log_file.flush()
+ except Exception:
+ pass
+
+ self.last_char = message if message == '' else message[-1]
+
+ if not file_only:
+ with std_log_lock:
+ if self.is_stdout:
+ write_stdout(message)
+ original_stdout.flush()
+ else:
+ write_stderr(message)
+ original_stderr.flush()
+
+ def flush(self):
+ try:
+ log_file.flush()
+ except Exception:
+ pass
+
+ with std_log_lock:
+ try:
+ if self.is_stdout:
+ original_stdout.flush()
+ else:
+ original_stderr.flush()
+ except (OSError, ValueError):
+ pass
+
+ def close(self):
+ self.flush()
+
+ def reconfigure(self, *args, **kwargs):
+ pass
+
+ # You can close through sys.stderr.close_log()
+ def close_log(self):
+ sys.stderr = original_stderr
+ sys.stdout = original_stdout
+ log_file.close()
+
+ def close_log():
+ sys.stderr = original_stderr
+ sys.stdout = original_stdout
+ log_file.close()
+
+
+ if enable_file_logging:
+ sys.stdout = ComfyUIManagerLogger(True)
+ stderr_wrapper = ComfyUIManagerLogger(False)
+ sys.stderr = stderr_wrapper
+
+ atexit.register(close_log)
+ else:
+ sys.stdout.close_log = lambda: None
+ stderr_wrapper = None
+
+
+ class LoggingHandler(logging.Handler):
+ def emit(self, record):
+ global is_start_mode
+
+ message = record.getMessage()
+
+ if is_start_mode:
+ match = re.search(pat_import_fail, message)
+ if match:
+ import_failed_extensions.add(match.group(1).strip())
+
+ if 'Traceback' in message:
+ file_lists = self._extract_file_paths(message)
+ origin_info = extract_origin_module_from_strings(file_lists)
+ if origin_info is not None:
+ name, origin_path = origin_info
+
+ if name != 'comfyui-manager':
+ if name not in cm_global.error_dict:
+ cm_global.error_dict[name] = {'name': name, 'path': origin_path, 'msg': ''}
+
+ cm_global.error_dict[name]['msg'] += message
+
+ if 'Starting server' in message:
+ is_start_mode = False
+ finalize_startup()
+
+ if stderr_wrapper:
+ stderr_wrapper.sync_write(message+'\n', file_only=True)
+
+ def _extract_file_paths(self, msg):
+ file_paths = []
+ for line in msg.split('\n'):
+ match = re.findall(r'File \"(.*?)\", line \d+', line)
+ for x in match:
+ if not x.startswith('<'):
+ file_paths.extend(match)
+ return file_paths
+
+
+ logging.getLogger().addHandler(LoggingHandler())
+
+
+except Exception as e:
+ print(f"[ComfyUI-Manager] Logging failed: {e}")
+
+
+def ensure_dependencies():
+ try:
+ import git # noqa: F401
+ import toml # noqa: F401
+ import rich # noqa: F401
+ import chardet # noqa: F401
+ except ModuleNotFoundError:
+ my_path = os.path.dirname(__file__)
+ requirements_path = os.path.join(my_path, "requirements.txt")
+
+ print("## ComfyUI-Manager: installing dependencies. (GitPython)")
+ try:
+ subprocess.check_output(manager_util.make_pip_cmd(['install', '-r', requirements_path]))
+ except subprocess.CalledProcessError:
+ print("## [ERROR] ComfyUI-Manager: Attempting to reinstall dependencies using an alternative method.")
+ try:
+ subprocess.check_output(manager_util.make_pip_cmd(['install', '--user', '-r', requirements_path]))
+ except subprocess.CalledProcessError:
+ print("## [ERROR] ComfyUI-Manager: Failed to install the GitPython package in the correct Python environment. Please install it manually in the appropriate environment. (You can seek help at https://app.element.io/#/room/%23comfyui_space%3Amatrix.org)")
+
+ try:
+ print("## ComfyUI-Manager: installing dependencies done.")
+ except:
+ # maybe we should sys.exit() here? there is at least two screens worth of error messages still being pumped after our error messages
+ print("## [ERROR] ComfyUI-Manager: GitPython package seems to be installed, but failed to load somehow. Make sure you have a working git client installed")
+
+ensure_dependencies()
+
+
+print("** ComfyUI startup time:", current_timestamp())
+print("** Platform:", platform.system())
+print("** Python version:", sys.version)
+print("** Python executable:", sys.executable)
+print("** ComfyUI Path:", comfy_path)
+print("** ComfyUI Base Folder Path:", comfy_base_path)
+print("** User directory:", folder_paths.user_directory)
+print("** ComfyUI-Manager config path:", manager_config_path)
+
+
+if log_path_base is not None:
+ print("** Log path:", os.path.abspath(f'{log_path_base}.log'))
+else:
+ print("** Log path: file logging is disabled")
+
+
+def read_downgrade_blacklist():
+ try:
+ if 'downgrade_blacklist' in default_conf:
+ items = default_conf['downgrade_blacklist'].split(',')
+ items = [x.strip() for x in items if x != '']
+ cm_global.pip_downgrade_blacklist += items
+ cm_global.pip_downgrade_blacklist = list(set(cm_global.pip_downgrade_blacklist))
+ except:
+ pass
+
+
+read_downgrade_blacklist()
+
+
+def check_bypass_ssl():
+ try:
+ import ssl
+ if 'bypass_ssl' in default_conf and default_conf['bypass_ssl'].lower() == 'true':
+ print(f"[ComfyUI-Manager] WARN: Unsafe - SSL verification bypass option is Enabled. (see {manager_config_path})")
+ ssl._create_default_https_context = ssl._create_unverified_context # SSL certificate error fix.
+ except Exception:
+ pass
+
+check_bypass_ssl()
+
+
+# Perform install
+processed_install = set()
+# Use manager_files_path for consistency (fixes path inconsistency bug)
+script_list_path = os.path.join(manager_files_path, "startup-scripts", "install-scripts.txt")
+pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages(), comfy_path, manager_files_path)
+
+
+def is_installed(name):
+ name = name.strip()
+
+ if name.startswith('#'):
+ return True
+
+ pattern = r'([^<>!~=]+)([<>!~=]=?)([0-9.a-zA-Z]*)'
+ match = re.search(pattern, name)
+
+ if match:
+ name = match.group(1)
+
+ if name in cm_global.pip_blacklist:
+ return True
+
+ if name in cm_global.pip_downgrade_blacklist:
+ pips = manager_util.get_installed_packages()
+
+ if match is None:
+ if name in pips:
+ return True
+ elif match.group(2) in ['<=', '==', '<', '~=']:
+ if name in pips:
+ if manager_util.StrictVersion(pips[name]) >= manager_util.StrictVersion(match.group(3)):
+ print(f"[ComfyUI-Manager] skip black listed pip installation: '{name}'")
+ return True
+
+ pkg = manager_util.get_installed_packages().get(name.lower())
+ if pkg is None:
+ return False # update if not installed
+
+ if match is None:
+ return True # don't update if version is not specified
+
+ if match.group(2) in ['>', '>=']:
+ if manager_util.StrictVersion(pkg) < manager_util.StrictVersion(match.group(3)):
+ return False
+ elif manager_util.StrictVersion(pkg) > manager_util.StrictVersion(match.group(3)):
+ print(f"[SKIP] Downgrading pip package isn't allowed: {name.lower()} (cur={pkg})")
+
+ if match.group(2) == '==':
+ if manager_util.StrictVersion(pkg) < manager_util.StrictVersion(match.group(3)):
+ return False
+
+ if match.group(2) == '~=':
+ if manager_util.StrictVersion(pkg) == manager_util.StrictVersion(match.group(3)):
+ return False
+
+ return True # prevent downgrade
+
+
+if os.path.exists(restore_snapshot_path):
+ try:
+ cloned_repos = []
+
+ def msg_capture(stream, prefix):
+ stream.reconfigure(encoding=locale.getpreferredencoding(), errors='replace')
+ for msg in stream:
+ if msg.startswith("CLONE: "):
+ cloned_repos.append(msg[7:])
+ if prefix == '[!]':
+ print(prefix, msg, end="", file=sys.stderr)
+ else:
+ print(prefix, msg, end="")
+
+ elif prefix == '[!]' and ('it/s]' in msg or 's/it]' in msg) and ('%|' in msg or 'it [' in msg):
+ if msg.startswith('100%'):
+ print('\r' + msg, end="", file=sys.stderr),
+ else:
+ print('\r'+msg[:-1], end="", file=sys.stderr),
+ else:
+ if prefix == '[!]':
+ print(prefix, msg, end="", file=sys.stderr)
+ else:
+ print(prefix, msg, end="")
+
+ print("[ComfyUI-Manager] Restore snapshot.")
+ new_env = os.environ.copy()
+ if 'COMFYUI_FOLDERS_BASE_PATH' not in new_env:
+ new_env["COMFYUI_FOLDERS_BASE_PATH"] = comfy_path
+
+ cmd_str = [sys.executable, cm_cli_path, 'restore-snapshot', restore_snapshot_path]
+ exit_code = process_wrap(cmd_str, custom_nodes_base_path, handler=msg_capture, env=new_env)
+
+ if exit_code != 0:
+ print("[ComfyUI-Manager] Restore snapshot failed.")
+ else:
+ print("[ComfyUI-Manager] Restore snapshot done.")
+
+ except Exception as e:
+ print(e)
+ print("[ComfyUI-Manager] Restore snapshot failed.")
+
+ os.remove(restore_snapshot_path)
+
+
+def execute_lazy_install_script(repo_path, executable):
+ global processed_install
+
+ install_script_path = os.path.join(repo_path, "install.py")
+ requirements_path = os.path.join(repo_path, "requirements.txt")
+
+ if os.path.exists(requirements_path):
+ print(f"Install: pip packages for '{repo_path}'")
+
+ lines = manager_util.robust_readlines(requirements_path)
+ for line in lines:
+ package_name = remap_pip_package(line.strip())
+ package_name = package_name.split('#')[0].strip()
+ if package_name and not is_installed(package_name):
+ if '--index-url' in package_name:
+ s = package_name.split('--index-url')
+ install_cmd = manager_util.make_pip_cmd(["install", s[0].strip(), '--index-url', s[1].strip()])
+ else:
+ install_cmd = manager_util.make_pip_cmd(["install", package_name])
+
+ process_wrap(install_cmd, repo_path)
+
+ if os.path.exists(install_script_path) and f'{repo_path}/install.py' not in processed_install:
+ processed_install.add(f'{repo_path}/install.py')
+ print(f"Install: install script for '{repo_path}'")
+ install_cmd = [executable, "install.py"]
+
+ new_env = os.environ.copy()
+ if 'COMFYUI_FOLDERS_BASE_PATH' not in new_env:
+ new_env["COMFYUI_FOLDERS_BASE_PATH"] = comfy_path
+ process_wrap(install_cmd, repo_path, env=new_env)
+
+
+def execute_lazy_cnr_switch(target, zip_url, from_path, to_path, no_deps, custom_nodes_path):
+ import uuid
+ import shutil
+
+ # 1. download
+ archive_name = f"CNR_temp_{str(uuid.uuid4())}.zip" # should be unpredictable name - security precaution
+ download_path = os.path.join(custom_nodes_path, archive_name)
+ manager_downloader.download_url(zip_url, custom_nodes_path, archive_name)
+
+ # 2. extract files into @
+ extracted = manager_util.extract_package_as_zip(download_path, from_path)
+ os.remove(download_path)
+
+ if extracted is None:
+ if len(os.listdir(from_path)) == 0:
+ shutil.rmtree(from_path)
+
+ print(f'Empty archive file: {target}')
+ return False
+
+
+ # 3. calculate garbage files (.tracking - extracted)
+ tracking_info_file = os.path.join(from_path, '.tracking')
+ prev_files = set()
+ with open(tracking_info_file, 'r') as f:
+ for line in f:
+ prev_files.add(line.strip())
+ garbage = prev_files.difference(extracted)
+ garbage = [os.path.join(custom_nodes_path, x) for x in garbage]
+
+ # 4-1. remove garbage files
+ for x in garbage:
+ if os.path.isfile(x):
+ os.remove(x)
+
+ # 4-2. remove garbage dir if empty
+ for x in garbage:
+ if os.path.isdir(x):
+ if not os.listdir(x):
+ os.rmdir(x)
+
+ # 5. rename dir name @ ==> @
+ print(f"'{from_path}' is moved to '{to_path}'")
+ shutil.move(from_path, to_path)
+
+ # 6. create .tracking file
+ tracking_info_file = os.path.join(to_path, '.tracking')
+ with open(tracking_info_file, "w", encoding='utf-8') as file:
+ file.write('\n'.join(list(extracted)))
+
+
+script_executed = False
+
+def execute_startup_script():
+ global script_executed
+ print("\n#######################################################################")
+ print("[ComfyUI-Manager] Starting dependency installation/(de)activation for the extension\n")
+
+ custom_nodelist_cache = None
+
+ def get_custom_node_paths():
+ nonlocal custom_nodelist_cache
+ if custom_nodelist_cache is None:
+ custom_nodelist_cache = set()
+ for base in folder_paths.get_folder_paths('custom_nodes'):
+ for x in os.listdir(base):
+ fullpath = os.path.join(base, x)
+ if os.path.isdir(fullpath):
+ custom_nodelist_cache.add(fullpath)
+
+ return custom_nodelist_cache
+
+ def execute_lazy_delete(path):
+ # Validate to prevent arbitrary paths from being deleted
+ if path not in get_custom_node_paths():
+ logging.error(f"## ComfyUI-Manager: The scheduled '{path}' is not a custom node path, so the deletion has been canceled.")
+ return
+
+ if not os.path.exists(path):
+ logging.info(f"## ComfyUI-Manager: SKIP-DELETE => '{path}' (already deleted)")
+ return
+
+ try:
+ shutil.rmtree(path)
+ logging.info(f"## ComfyUI-Manager: DELETE => '{path}'")
+ except Exception as e:
+ logging.error(f"## ComfyUI-Manager: Failed to delete '{path}' ({e})")
+
+ executed = set()
+ # Read each line from the file and convert it to a list using eval
+ with open(script_list_path, 'r', encoding="UTF-8", errors="ignore") as file:
+ for line in file:
+ if line in executed:
+ continue
+
+ executed.add(line)
+
+ try:
+ script = ast.literal_eval(line)
+
+ if script[1].startswith('#') and script[1] != '#FORCE':
+ if script[1] == "#LAZY-INSTALL-SCRIPT":
+ execute_lazy_install_script(script[0], script[2])
+
+ elif script[1] == "#LAZY-CNR-SWITCH-SCRIPT":
+ execute_lazy_cnr_switch(script[0], script[2], script[3], script[4], script[5], script[6])
+ execute_lazy_install_script(script[3], script[7])
+
+ elif script[1] == "#LAZY-DELETE-NODEPACK":
+ execute_lazy_delete(script[2])
+
+ elif os.path.exists(script[0]):
+ if script[1] == "#FORCE":
+ del script[1]
+ else:
+ if 'pip' in script[1:] and 'install' in script[1:] and is_installed(script[-1]):
+ continue
+
+ print(f"\n## ComfyUI-Manager: EXECUTE => {script[1:]}")
+ print(f"\n## Execute management script for '{script[0]}'")
+
+ new_env = os.environ.copy()
+ if 'COMFYUI_FOLDERS_BASE_PATH' not in new_env:
+ new_env["COMFYUI_FOLDERS_BASE_PATH"] = comfy_path
+ exit_code = process_wrap(script[1:], script[0], env=new_env)
+
+ if exit_code != 0:
+ print(f"management script failed: {script[0]}")
+ else:
+ print(f"\n## ComfyUI-Manager: CANCELED => {script[1:]}")
+
+ except Exception as e:
+ print(f"[ERROR] Failed to execute management script: {line} / {e}")
+
+ # Remove the script_list_path file
+ if os.path.exists(script_list_path):
+ script_executed = True
+ os.remove(script_list_path)
+
+ print("\n[ComfyUI-Manager] Startup script completed.")
+ print("#######################################################################\n")
+
+
+# Check if script_list_path exists
+# Block startup-scripts on old ComfyUI (security measure)
+if not _has_system_user_api:
+ if os.path.exists(script_list_path):
+ print("[ComfyUI-Manager] Startup scripts blocked on old ComfyUI version.")
+elif os.path.exists(script_list_path):
+ execute_startup_script()
+
+
+pip_fixer.fix_broken()
+
+del processed_install
+del pip_fixer
+manager_util.clear_pip_cache()
+
+if script_executed:
+ # Restart
+ print("[ComfyUI-Manager] Restarting to reapply dependency installation.")
+
+ if '__COMFY_CLI_SESSION__' in os.environ:
+ with open(os.path.join(os.environ['__COMFY_CLI_SESSION__'] + '.reboot'), 'w'):
+ pass
+
+ print("--------------------------------------------------------------------------\n")
+ exit(0)
+ else:
+ sys_argv = sys.argv.copy()
+
+ if sys_argv[0].endswith("__main__.py"): # this is a python module
+ module_name = os.path.basename(os.path.dirname(sys_argv[0]))
+ cmds = [sys.executable, '-m', module_name] + sys_argv[1:]
+ elif sys.platform.startswith('win32'):
+ cmds = ['"' + sys.executable + '"', '"' + sys_argv[0] + '"'] + sys_argv[1:]
+ else:
+ cmds = [sys.executable] + sys_argv
+
+ print(f"Command: {cmds}", flush=True)
+ print("--------------------------------------------------------------------------\n")
+
+ os.execv(sys.executable, cmds)
+
+
+def check_windows_event_loop_policy():
+ try:
+ import configparser
+ config = configparser.ConfigParser(strict=False)
+ config.read(manager_config_path)
+ default_conf = config['default']
+
+ if 'windows_selector_event_loop_policy' in default_conf and default_conf['windows_selector_event_loop_policy'].lower() == 'true':
+ try:
+ import asyncio
+ import asyncio.windows_events
+ asyncio.set_event_loop_policy(asyncio.windows_events.WindowsSelectorEventLoopPolicy())
+ print("[ComfyUI-Manager] Windows event loop policy mode enabled")
+ except Exception as e:
+ print(f"[ComfyUI-Manager] WARN: Windows initialization fail: {e}")
+ except Exception:
+ pass
+
+
+if platform.system() == 'Windows':
+ check_windows_event_loop_policy()
diff --git a/custom_nodes/ComfyUI-Manager/pyproject.toml b/custom_nodes/ComfyUI-Manager/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e15ea6e4350194680e714bf339501ba8e363d1d2
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/pyproject.toml
@@ -0,0 +1,15 @@
+[project]
+name = "comfyui-manager"
+description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
+version = "3.39.2"
+license = { file = "LICENSE.txt" }
+dependencies = ["GitPython", "PyGithub", "matrix-nio", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions", "toml", "uv", "chardet"]
+
+[project.urls]
+Repository = "https://github.com/ltdrdata/ComfyUI-Manager"
+# Used by Comfy Registry https://comfyregistry.org
+
+[tool.comfy]
+PublisherId = "drltdata"
+DisplayName = "ComfyUI-Manager"
+Icon = ""
diff --git a/custom_nodes/ComfyUI-Manager/requirements.txt b/custom_nodes/ComfyUI-Manager/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b179f07f14ff12d0a5a2b45ae7eb8cb79c0260c6
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/requirements.txt
@@ -0,0 +1,11 @@
+GitPython
+PyGithub
+matrix-nio
+transformers
+huggingface-hub
+typer
+rich
+typing-extensions
+toml
+uv
+chardet
diff --git a/custom_nodes/ComfyUI-Manager/ruff.toml b/custom_nodes/ComfyUI-Manager/ruff.toml
new file mode 100644
index 0000000000000000000000000000000000000000..26ec1d895e319c85a0deda2aee7c584cd55fc7f0
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/ruff.toml
@@ -0,0 +1,12 @@
+# Disable all rules by default
+lint.ignore = ["ALL"]
+
+# Enable specific rules
+lint.select = [
+ "S307", # suspicious-eval-usage
+ # The "F" series in Ruff stands for "Pyflakes" rules, which catch various Python syntax errors and undefined names.
+ # See all rules here: https://docs.astral.sh/ruff/rules/#pyflakes-f
+ "F",
+]
+
+exclude = ["*.ipynb"]
diff --git a/custom_nodes/ComfyUI-Manager/scan.sh b/custom_nodes/ComfyUI-Manager/scan.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c35e90a508f019e2ba5a6320de04fc897c8bddef
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/scan.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+rm ~/.tmp/default/*.py > /dev/null 2>&1
+python scanner.py ~/.tmp/default $*
+cp extension-node-map.json node_db/new/.
+
+echo "Integrity check"
+if [ -f "check2.sh" ]; then
+ ./check2.sh
+else
+ ./check.sh
+fi
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-Manager/scanner.py b/custom_nodes/ComfyUI-Manager/scanner.py
new file mode 100644
index 0000000000000000000000000000000000000000..c395dc1236edc7d393fb628eacac7439bf7b5917
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/scanner.py
@@ -0,0 +1,1562 @@
+import ast
+import re
+import os
+import json
+from git import Repo
+import concurrent
+import datetime
+import concurrent.futures
+import requests
+import warnings
+import argparse
+
+builtin_nodes = set()
+
+import sys
+
+from urllib.parse import urlparse
+from github import Github, Auth
+from pathlib import Path
+from typing import Set, Dict, Optional
+
+# Scanner version for cache invalidation
+SCANNER_VERSION = "2.0.13" # Add fallback for dynamic v3 node_id
+
+# Cache for extract_nodes and extract_nodes_enhanced results
+_extract_nodes_cache: Dict[str, Set[str]] = {}
+_extract_nodes_enhanced_cache: Dict[str, Set[str]] = {}
+_file_mtime_cache: Dict[Path, float] = {}
+
+
+def _get_repo_root(file_path: Path) -> Optional[Path]:
+ """Find the repository root directory containing .git"""
+ current = file_path if file_path.is_dir() else file_path.parent
+ while current != current.parent:
+ if (current / ".git").exists():
+ return current
+ current = current.parent
+ return None
+
+
+def _get_repo_hash(repo_path: Path) -> str:
+ """Get git commit hash or fallback identifier"""
+ git_dir = repo_path / ".git"
+ if not git_dir.exists():
+ return ""
+
+ try:
+ # Read HEAD to get current commit
+ head_file = git_dir / "HEAD"
+ if head_file.exists():
+ head_content = head_file.read_text().strip()
+ if head_content.startswith("ref:"):
+ # HEAD points to a ref
+ ref_path = git_dir / head_content[5:].strip()
+ if ref_path.exists():
+ commit_hash = ref_path.read_text().strip()
+ return commit_hash[:16] # First 16 chars
+ else:
+ # Detached HEAD
+ return head_content[:16]
+ except:
+ pass
+
+ return ""
+
+
+def _load_per_repo_cache(repo_path: Path) -> Optional[tuple]:
+ """Load nodes and metadata from per-repo cache
+
+ Returns:
+ tuple: (nodes_set, metadata_dict) or None if cache invalid
+ """
+ cache_file = repo_path / ".git" / "nodecache.json"
+
+ if not cache_file.exists():
+ return None
+
+ try:
+ with open(cache_file, 'r') as f:
+ cache_data = json.load(f)
+
+ # Verify scanner version
+ if cache_data.get('scanner_version') != SCANNER_VERSION:
+ return None
+
+ # Verify git hash
+ current_hash = _get_repo_hash(repo_path)
+ if cache_data.get('git_hash') != current_hash:
+ return None
+
+ # Return nodes and metadata
+ nodes = cache_data.get('nodes', [])
+ metadata = cache_data.get('metadata', {})
+ return (set(nodes) if nodes else set(), metadata)
+
+ except:
+ return None
+
+
+def _save_per_repo_cache(repo_path: Path, all_nodes: Set[str], metadata: dict = None):
+ """Save nodes and metadata to per-repo cache"""
+ cache_file = repo_path / ".git" / "nodecache.json"
+
+ if not cache_file.parent.exists():
+ return
+
+ git_hash = _get_repo_hash(repo_path)
+ cache_data = {
+ "scanner_version": SCANNER_VERSION,
+ "git_hash": git_hash,
+ "scanned_at": datetime.datetime.now().isoformat(),
+ "nodes": sorted(list(all_nodes)),
+ "metadata": metadata if metadata else {}
+ }
+
+ try:
+ with open(cache_file, 'w') as f:
+ json.dump(cache_data, f, indent=2)
+ except:
+ pass # Silently fail - cache is optional
+
+
+def download_url(url, dest_folder, filename=None):
+ # Ensure the destination folder exists
+ if not os.path.exists(dest_folder):
+ os.makedirs(dest_folder)
+
+ # Extract filename from URL if not provided
+ if filename is None:
+ filename = os.path.basename(url)
+
+ # Full path to save the file
+ dest_path = os.path.join(dest_folder, filename)
+
+ # Download the file
+ response = requests.get(url, stream=True)
+ if response.status_code == 200:
+ with open(dest_path, 'wb') as file:
+ for chunk in response.iter_content(chunk_size=1024):
+ if chunk:
+ file.write(chunk)
+ else:
+ raise Exception(f"Failed to download file from {url}")
+
+
+def parse_arguments():
+ """Parse command-line arguments"""
+ parser = argparse.ArgumentParser(
+ description='ComfyUI Manager Node Scanner',
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ epilog='''
+Examples:
+ # Standard mode
+ python3 scanner.py
+ python3 scanner.py --skip-update
+ python3 scanner.py --skip-all --force-rescan
+
+ # Scan-only mode
+ python3 scanner.py --scan-only temp-urls-clean.list
+ python3 scanner.py --scan-only urls.list --temp-dir /custom/temp
+ python3 scanner.py --scan-only urls.list --skip-update --force-rescan
+ '''
+ )
+
+ parser.add_argument('--scan-only', type=str, metavar='URL_LIST_FILE',
+ help='Scan-only mode: provide URL list file (one URL per line)')
+ parser.add_argument('--temp-dir', type=str, metavar='DIR',
+ help='Temporary directory for cloned repositories')
+ parser.add_argument('--skip-update', action='store_true',
+ help='Skip git clone/pull operations')
+ parser.add_argument('--skip-stat-update', action='store_true',
+ help='Skip GitHub stats collection')
+ parser.add_argument('--skip-all', action='store_true',
+ help='Skip all update operations')
+ parser.add_argument('--force-rescan', action='store_true',
+ help='Force rescan all nodes (ignore cache)')
+
+ # Backward compatibility: positional argument for temp_dir
+ parser.add_argument('temp_dir_positional', nargs='?', metavar='TEMP_DIR',
+ help='(Legacy) Temporary directory path')
+
+ args = parser.parse_args()
+ return args
+
+
+# Module-level variables (will be set in main if running as script)
+args = None
+scan_only_mode = False
+url_list_file = None
+temp_dir = None
+skip_update = False
+skip_stat_update = True
+g = None
+
+
+parse_cnt = 0
+
+
+def extract_nodes(code_text):
+ global parse_cnt
+
+ # Check cache first
+ cache_key = hash(code_text)
+ if cache_key in _extract_nodes_cache:
+ return _extract_nodes_cache[cache_key].copy()
+
+ try:
+ if parse_cnt % 100 == 0:
+ print(".", end="", flush=True)
+ parse_cnt += 1
+
+ code_text = re.sub(r'\\[^"\']', '', code_text)
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=SyntaxWarning)
+ warnings.filterwarnings('ignore', category=DeprecationWarning)
+ parsed_code = ast.parse(code_text)
+
+ # Support both ast.Assign and ast.AnnAssign (for type-annotated assignments)
+ assignments = (node for node in parsed_code.body if isinstance(node, (ast.Assign, ast.AnnAssign)))
+
+ for assignment in assignments:
+ # Handle ast.AnnAssign (e.g., NODE_CLASS_MAPPINGS: Type = {...})
+ if isinstance(assignment, ast.AnnAssign):
+ if isinstance(assignment.target, ast.Name) and assignment.target.id in ['NODE_CONFIG', 'NODE_CLASS_MAPPINGS']:
+ node_class_mappings = assignment.value
+ break
+ # Handle ast.Assign (e.g., NODE_CLASS_MAPPINGS = {...})
+ elif isinstance(assignment.targets[0], ast.Name) and assignment.targets[0].id in ['NODE_CONFIG', 'NODE_CLASS_MAPPINGS']:
+ node_class_mappings = assignment.value
+ break
+ else:
+ node_class_mappings = None
+
+ if node_class_mappings:
+ s = set()
+
+ for key in node_class_mappings.keys:
+ if key is not None and isinstance(key.value, str):
+ s.add(key.value.strip())
+
+ # Cache the result
+ _extract_nodes_cache[cache_key] = s
+ return s
+ else:
+ # Cache empty result
+ _extract_nodes_cache[cache_key] = set()
+ return set()
+ except:
+ # Cache empty result on error
+ _extract_nodes_cache[cache_key] = set()
+ return set()
+
+def extract_nodes_from_repo(repo_path: Path, verbose: bool = False, force_rescan: bool = False) -> tuple:
+ """
+ Extract all nodes and metadata from a repository with per-repo caching.
+
+ Automatically caches results in .git/nodecache.json.
+ Cache is invalidated when:
+ - Git commit hash changes
+ - Scanner version changes
+ - force_rescan flag is True
+
+ Args:
+ repo_path: Path to repository root
+ verbose: If True, print UI-only extension detection messages
+ force_rescan: If True, ignore cache and force fresh scan
+
+ Returns:
+ tuple: (nodes_set, metadata_dict)
+ """
+ # Ensure path is absolute
+ repo_path = repo_path.resolve()
+
+ # Check per-repo cache first (unless force_rescan is True)
+ if not force_rescan:
+ cached_result = _load_per_repo_cache(repo_path)
+ if cached_result is not None:
+ return cached_result
+
+ # Cache miss - scan all .py files
+ all_nodes = set()
+ all_metadata = {}
+ py_files = list(repo_path.rglob("*.py"))
+
+ # Filter out __pycache__, .git, and other hidden directories
+ filtered_files = []
+ for f in py_files:
+ try:
+ rel_path = f.relative_to(repo_path)
+ # Skip __pycache__, .git, and any directory starting with .
+ if '__pycache__' not in str(rel_path) and not any(part.startswith('.') for part in rel_path.parts):
+ filtered_files.append(f)
+ except:
+ continue
+ py_files = filtered_files
+
+ for py_file in py_files:
+ try:
+ # Read file with proper encoding
+ with open(py_file, 'r', encoding='utf-8', errors='ignore') as f:
+ code = f.read()
+
+ if code:
+ # Extract nodes using SAME logic as scan_in_file
+ # V1 nodes (enhanced with fallback patterns)
+ nodes = extract_nodes_enhanced(code, py_file, visited=set(), verbose=verbose)
+ all_nodes.update(nodes)
+
+ # V3 nodes detection
+ v3_nodes = extract_v3_nodes(code)
+ all_nodes.update(v3_nodes)
+
+ # Dict parsing - exclude commented NODE_CLASS_MAPPINGS lines
+ pattern = r"_CLASS_MAPPINGS\s*(?::\s*\w+\s*)?=\s*(?:\\\s*)?{([^}]*)}"
+ regex = re.compile(pattern, re.MULTILINE | re.DOTALL)
+
+ for match_obj in regex.finditer(code):
+ # Get the line where NODE_CLASS_MAPPINGS is defined
+ match_start = match_obj.start()
+ line_start = code.rfind('\n', 0, match_start) + 1
+ line_end = code.find('\n', match_start)
+ if line_end == -1:
+ line_end = len(code)
+ line = code[line_start:line_end]
+
+ # Skip if line starts with # (commented)
+ if re.match(r'^\s*#', line):
+ continue
+
+ match = match_obj.group(1)
+
+ # Filter out commented lines from dict content
+ match_lines = match.split('\n')
+ match_filtered = '\n'.join(
+ line for line in match_lines
+ if not re.match(r'^\s*#', line)
+ )
+
+ # Extract key-value pairs with double quotes
+ key_value_pairs = re.findall(r"\"([^\"]*)\"\s*:\s*([^,\n]*)", match_filtered)
+ for key, value in key_value_pairs:
+ all_nodes.add(key.strip())
+
+ # Extract key-value pairs with single quotes
+ key_value_pairs = re.findall(r"'([^']*)'\s*:\s*([^,\n]*)", match_filtered)
+ for key, value in key_value_pairs:
+ all_nodes.add(key.strip())
+
+ # Handle .update() pattern (AFTER comment removal)
+ code_cleaned = re.sub(r'^#.*?$', '', code, flags=re.MULTILINE)
+
+ update_pattern = r"_CLASS_MAPPINGS\.update\s*\(\s*{([^}]*)}\s*\)"
+ update_match = re.search(update_pattern, code_cleaned, re.DOTALL)
+ if update_match:
+ update_dict_text = update_match.group(1)
+ # Extract key-value pairs (double quotes)
+ update_pairs = re.findall(r'"([^"]*)"\s*:\s*([^,\n]*)', update_dict_text)
+ for key, value in update_pairs:
+ all_nodes.add(key.strip())
+ # Extract key-value pairs (single quotes)
+ update_pairs_single = re.findall(r"'([^']*)'\s*:\s*([^,\n]*)", update_dict_text)
+ for key, value in update_pairs_single:
+ all_nodes.add(key.strip())
+
+ # Additional regex patterns (AFTER comment removal)
+ patterns = [
+ r'^[^=]*_CLASS_MAPPINGS\["(.*?)"\]',
+ r'^[^=]*_CLASS_MAPPINGS\[\'(.*?)\'\]',
+ r'@register_node\("(.+)",\s*\".+"\)',
+ r'"(\w+)"\s*:\s*{"class":\s*\w+\s*'
+ ]
+
+ for pattern in patterns:
+ keys = re.findall(pattern, code_cleaned)
+ all_nodes.update(key.strip() for key in keys)
+
+ # Extract metadata from this file
+ metadata = extract_metadata_only(str(py_file))
+ all_metadata.update(metadata)
+ except Exception:
+ # Silently skip files that can't be read
+ continue
+
+ # Save to per-repo cache
+ _save_per_repo_cache(repo_path, all_nodes, all_metadata)
+
+ return (all_nodes, all_metadata)
+
+
+def _verify_class_exists(node_name: str, code_text: str, file_path: Optional[Path] = None) -> tuple[bool, Optional[str], Optional[int]]:
+ """
+ Verify that a node class exists and has ComfyUI node structure.
+
+ Returns: (exists: bool, file_path: str, line_number: int)
+
+ A valid ComfyUI node must have:
+ - Class definition (not commented)
+ - At least one of: INPUT_TYPES, RETURN_TYPES, FUNCTION method/attribute
+ """
+ try:
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=SyntaxWarning)
+ tree = ast.parse(code_text)
+ except:
+ return (False, None, None)
+
+ for node in ast.walk(tree):
+ if isinstance(node, ast.ClassDef):
+ if node.name == node_name or node.name.replace('_', '') == node_name.replace('_', ''):
+ # Found class definition - check if it has ComfyUI interface
+ has_input_types = False
+ has_return_types = False
+ has_function = False
+
+ for item in node.body:
+ # Check for INPUT_TYPES method
+ if isinstance(item, ast.FunctionDef) and item.name == 'INPUT_TYPES':
+ has_input_types = True
+ # Check for RETURN_TYPES attribute
+ elif isinstance(item, ast.Assign):
+ for target in item.targets:
+ if isinstance(target, ast.Name):
+ if target.id == 'RETURN_TYPES':
+ has_return_types = True
+ elif target.id == 'FUNCTION':
+ has_function = True
+ # Check for FUNCTION method
+ elif isinstance(item, ast.FunctionDef):
+ has_function = True
+
+ # Valid if has any ComfyUI signature
+ if has_input_types or has_return_types or has_function:
+ file_str = str(file_path) if file_path else None
+ return (True, file_str, node.lineno)
+
+ return (False, None, None)
+
+
+def _extract_display_name_mappings(code_text: str) -> Set[str]:
+ """
+ Extract node names from NODE_DISPLAY_NAME_MAPPINGS.
+
+ Pattern:
+ NODE_DISPLAY_NAME_MAPPINGS = {
+ "node_key": "Display Name",
+ ...
+ }
+
+ Returns:
+ Set of node keys from NODE_DISPLAY_NAME_MAPPINGS
+ """
+ try:
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=SyntaxWarning)
+ tree = ast.parse(code_text)
+ except:
+ return set()
+
+ nodes = set()
+
+ for node in tree.body:
+ if isinstance(node, ast.Assign):
+ for target in node.targets:
+ if isinstance(target, ast.Name) and target.id == 'NODE_DISPLAY_NAME_MAPPINGS':
+ if isinstance(node.value, ast.Dict):
+ for key in node.value.keys:
+ if isinstance(key, ast.Constant) and isinstance(key.value, str):
+ nodes.add(key.value.strip())
+
+ return nodes
+
+
+def extract_nodes_enhanced(
+ code_text: str,
+ file_path: Optional[Path] = None,
+ visited: Optional[Set[Path]] = None,
+ verbose: bool = False
+) -> Set[str]:
+ """
+ Enhanced node extraction with multi-layer detection system.
+
+ Scanner 2.0.11 - Comprehensive detection strategy:
+ - Phase 1: NODE_CLASS_MAPPINGS dict literal
+ - Phase 2: Class.NAME attribute access (e.g., FreeChat.NAME)
+ - Phase 3: Item assignment (NODE_CLASS_MAPPINGS["key"] = value)
+ - Phase 4: Class existence verification (detects active classes even if registration commented)
+ - Phase 5: NODE_DISPLAY_NAME_MAPPINGS cross-reference
+ - Phase 6: Empty dict detection (UI-only extensions, logging only)
+
+ Fixed Bugs:
+ - Scanner 2.0.9: Fallback cascade prevented Phase 3 execution
+ - Scanner 2.0.10: Missed active classes with commented registrations (15 false negatives)
+
+ Args:
+ code_text: Python source code
+ file_path: Path to file (for logging and caching)
+ visited: Visited paths (for circular import prevention)
+ verbose: If True, print UI-only extension detection messages
+
+ Returns:
+ Set of node names (union of all detected patterns)
+ """
+ # Check file-based cache if file_path provided
+ if file_path is not None:
+ try:
+ file_path_obj = Path(file_path) if not isinstance(file_path, Path) else file_path
+ if file_path_obj.exists():
+ current_mtime = file_path_obj.stat().st_mtime
+
+ # Check if we have cached result with matching mtime and scanner version
+ if file_path_obj in _file_mtime_cache:
+ cached_mtime = _file_mtime_cache[file_path_obj]
+ cache_key = (str(file_path_obj), cached_mtime, SCANNER_VERSION)
+
+ if current_mtime == cached_mtime and cache_key in _extract_nodes_enhanced_cache:
+ return _extract_nodes_enhanced_cache[cache_key].copy()
+ except:
+ pass # Ignore cache errors, proceed with normal execution
+
+ # Suppress warnings from AST parsing
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=SyntaxWarning)
+ warnings.filterwarnings('ignore', category=DeprecationWarning)
+
+ # Phase 1: Original extract_nodes() - dict literal
+ phase1_nodes = extract_nodes(code_text)
+
+ # Phase 2: Class.NAME pattern
+ if visited is None:
+ visited = set()
+ phase2_nodes = _fallback_classname_resolver(code_text, file_path)
+
+ # Phase 3: Item assignment pattern
+ phase3_nodes = _fallback_item_assignment(code_text)
+
+ # Phase 4: NODE_DISPLAY_NAME_MAPPINGS cross-reference (NEW in 2.0.11)
+ # This catches nodes that are in display names but not in NODE_CLASS_MAPPINGS
+ phase4_nodes = _extract_display_name_mappings(code_text)
+
+ # Phase 5: Class existence verification ONLY for display name candidates (NEW in 2.0.11)
+ # This phase is CONSERVATIVE - only verify classes that appear in display names
+ # This catches the specific Scanner 2.0.10 bug pattern:
+ # - NODE_CLASS_MAPPINGS registration is commented
+ # - NODE_DISPLAY_NAME_MAPPINGS still has the entry
+ # - Class implementation exists
+ # Example: Bjornulf_ollamaLoader in Bjornulf_custom_nodes
+ phase5_nodes = set()
+ for node_name in phase4_nodes:
+ # Only check classes that appear in display names but not in registrations
+ if node_name not in (phase1_nodes | phase2_nodes | phase3_nodes):
+ exists, _, _ = _verify_class_exists(node_name, code_text, file_path)
+ if exists:
+ phase5_nodes.add(node_name)
+
+ # Phase 6: Dict comprehension pattern (NEW in 2.0.12)
+ # Detects: NODE_CLASS_MAPPINGS = {cls.__name__: cls for cls in to_export}
+ # Example: TobiasGlaubach/ComfyUI-TG_PyCode
+ phase6_nodes = _fallback_dict_comprehension(code_text, file_path)
+
+ # Phase 7: Import-based class names for dict comprehension (NEW in 2.0.12)
+ # Detects imported classes that are added to export lists
+ phase7_nodes = _fallback_import_class_names(code_text, file_path)
+
+ # Union all results (FIX: Scanner 2.0.9 bug + Scanner 2.0.10 bug + Scanner 2.0.12 dict comp)
+ # 2.0.9: Used early return which missed Phase 3 nodes
+ # 2.0.10: Only checked registrations, missed classes referenced in display names
+ # 2.0.12: Added dict comprehension and import-based class detection
+ all_nodes = phase1_nodes | phase2_nodes | phase3_nodes | phase4_nodes | phase5_nodes | phase6_nodes | phase7_nodes
+
+ # Phase 8: Empty dict detector (logging only, doesn't add nodes)
+ if not all_nodes:
+ _fallback_empty_dict_detector(code_text, file_path, verbose)
+
+ # Cache the result
+ if file_path is not None:
+ try:
+ file_path_obj = Path(file_path) if not isinstance(file_path, Path) else file_path
+ if file_path_obj.exists():
+ current_mtime = file_path_obj.stat().st_mtime
+ cache_key = (str(file_path_obj), current_mtime, SCANNER_VERSION)
+ _extract_nodes_enhanced_cache[cache_key] = all_nodes
+ _file_mtime_cache[file_path_obj] = current_mtime
+ except:
+ pass
+
+ return all_nodes
+
+
+def _fallback_classname_resolver(code_text: str, file_path: Optional[Path]) -> Set[str]:
+ """
+ Detect Class.NAME pattern in NODE_CLASS_MAPPINGS.
+
+ Pattern:
+ NODE_CLASS_MAPPINGS = {
+ FreeChat.NAME: FreeChat,
+ PaidChat.NAME: PaidChat
+ }
+ """
+ try:
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=SyntaxWarning)
+ parsed = ast.parse(code_text)
+ except:
+ return set()
+
+ nodes = set()
+
+ for node in parsed.body:
+ if isinstance(node, ast.Assign):
+ for target in node.targets:
+ if isinstance(target, ast.Name) and target.id == 'NODE_CLASS_MAPPINGS':
+ if isinstance(node.value, ast.Dict):
+ for key in node.value.keys:
+ # Detect Class.NAME pattern
+ if isinstance(key, ast.Attribute):
+ if isinstance(key.value, ast.Name):
+ # Use class name as node name
+ nodes.add(key.value.id)
+ # Also handle literal strings
+ elif isinstance(key, ast.Constant) and isinstance(key.value, str):
+ nodes.add(key.value.strip())
+
+ return nodes
+
+
+def _fallback_item_assignment(code_text: str) -> Set[str]:
+ """
+ Detect item assignment pattern.
+
+ Pattern:
+ NODE_CLASS_MAPPINGS = {}
+ NODE_CLASS_MAPPINGS["MyNode"] = MyNode
+ """
+ try:
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=SyntaxWarning)
+ parsed = ast.parse(code_text)
+ except:
+ return set()
+
+ nodes = set()
+
+ for node in ast.walk(parsed):
+ if isinstance(node, ast.Assign):
+ for target in node.targets:
+ if isinstance(target, ast.Subscript):
+ if (isinstance(target.value, ast.Name) and
+ target.value.id in ['NODE_CLASS_MAPPINGS', 'NODE_CONFIG']):
+ # Extract key
+ if isinstance(target.slice, ast.Constant):
+ if isinstance(target.slice.value, str):
+ nodes.add(target.slice.value)
+
+ return nodes
+
+
+def _fallback_dict_comprehension(code_text: str, file_path: Optional[Path] = None) -> Set[str]:
+ """
+ Detect dict comprehension pattern with __name__ attribute access.
+
+ Pattern:
+ NODE_CLASS_MAPPINGS = {cls.__name__: cls for cls in to_export}
+ NODE_CLASS_MAPPINGS = {c.__name__: c for c in [ClassA, ClassB]}
+
+ This function detects dict comprehension assignments to NODE_CLASS_MAPPINGS
+ and extracts class names from the iterable (list literal or variable reference).
+
+ Returns:
+ Set of class names extracted from the dict comprehension
+ """
+ try:
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=SyntaxWarning)
+ parsed = ast.parse(code_text)
+ except:
+ return set()
+
+ nodes = set()
+ export_lists = {} # Track list variables and their contents
+
+ # First pass: collect list assignments (to_export = [...], exports = [...])
+ for node in ast.walk(parsed):
+ if isinstance(node, ast.Assign):
+ for target in node.targets:
+ if isinstance(target, ast.Name):
+ var_name = target.id
+ # Check for list literal
+ if isinstance(node.value, ast.List):
+ class_names = set()
+ for elt in node.value.elts:
+ if isinstance(elt, ast.Name):
+ class_names.add(elt.id)
+ export_lists[var_name] = class_names
+
+ # Handle augmented assignment: to_export += [...]
+ elif isinstance(node, ast.AugAssign):
+ if isinstance(node.target, ast.Name) and isinstance(node.op, ast.Add):
+ var_name = node.target.id
+ if isinstance(node.value, ast.List):
+ class_names = set()
+ for elt in node.value.elts:
+ if isinstance(elt, ast.Name):
+ class_names.add(elt.id)
+ if var_name in export_lists:
+ export_lists[var_name].update(class_names)
+ else:
+ export_lists[var_name] = class_names
+
+ # Second pass: find NODE_CLASS_MAPPINGS dict comprehension
+ for node in ast.walk(parsed):
+ if isinstance(node, ast.Assign):
+ for target in node.targets:
+ if isinstance(target, ast.Name) and target.id in ['NODE_CLASS_MAPPINGS', 'NODE_CONFIG']:
+ # Check for dict comprehension
+ if isinstance(node.value, ast.DictComp):
+ dictcomp = node.value
+
+ # Check if key is cls.__name__ pattern
+ key = dictcomp.key
+ if isinstance(key, ast.Attribute) and key.attr == '__name__':
+ # Get the iterable from the first generator
+ for generator in dictcomp.generators:
+ iter_node = generator.iter
+
+ # Case 1: Inline list [ClassA, ClassB, ...]
+ if isinstance(iter_node, ast.List):
+ for elt in iter_node.elts:
+ if isinstance(elt, ast.Name):
+ nodes.add(elt.id)
+
+ # Case 2: Variable reference (to_export, exports, etc.)
+ elif isinstance(iter_node, ast.Name):
+ var_name = iter_node.id
+ if var_name in export_lists:
+ nodes.update(export_lists[var_name])
+
+ return nodes
+
+
+def _fallback_import_class_names(code_text: str, file_path: Optional[Path] = None) -> Set[str]:
+ """
+ Extract class names from imports that are added to export lists.
+
+ Pattern:
+ from .module import ClassA, ClassB
+ to_export = [ClassA, ClassB]
+ NODE_CLASS_MAPPINGS = {cls.__name__: cls for cls in to_export}
+
+ This is a complementary fallback that works with _fallback_dict_comprehension
+ to resolve import-based node registrations.
+
+ Returns:
+ Set of imported class names that appear in export-like contexts
+ """
+ try:
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=SyntaxWarning)
+ parsed = ast.parse(code_text)
+ except:
+ return set()
+
+ # Collect imported names
+ imported_names = set()
+ for node in ast.walk(parsed):
+ if isinstance(node, ast.ImportFrom):
+ for alias in node.names:
+ name = alias.asname if alias.asname else alias.name
+ imported_names.add(name)
+
+ # Check if these names appear in list assignments that feed into NODE_CLASS_MAPPINGS
+ export_candidates = set()
+ has_dict_comp_mapping = False
+
+ for node in ast.walk(parsed):
+ # Check for dict comprehension NODE_CLASS_MAPPINGS
+ if isinstance(node, ast.Assign):
+ for target in node.targets:
+ if isinstance(target, ast.Name) and target.id == 'NODE_CLASS_MAPPINGS':
+ if isinstance(node.value, ast.DictComp):
+ has_dict_comp_mapping = True
+
+ # Collect list contents
+ if isinstance(node, ast.Assign):
+ if isinstance(node.value, ast.List):
+ for elt in node.value.elts:
+ if isinstance(elt, ast.Name) and elt.id in imported_names:
+ export_candidates.add(elt.id)
+
+ # Handle augmented assignment
+ elif isinstance(node, ast.AugAssign):
+ if isinstance(node.value, ast.List):
+ for elt in node.value.elts:
+ if isinstance(elt, ast.Name) and elt.id in imported_names:
+ export_candidates.add(elt.id)
+
+ # Only return if there's a dict comprehension mapping
+ if has_dict_comp_mapping:
+ return export_candidates
+
+ return set()
+
+
+def _extract_repo_name(file_path: Path) -> str:
+ """
+ Extract repository name from file path.
+
+ Path structure: /home/rho/.tmp/analysis/temp/{author}_{reponame}/{path/to/file.py}
+ Returns: {author}_{reponame} or filename if extraction fails
+ """
+ try:
+ parts = file_path.parts
+ # Find 'temp' directory in path
+ if 'temp' in parts:
+ temp_idx = parts.index('temp')
+ if temp_idx + 1 < len(parts):
+ # Next part after 'temp' is the repo directory
+ return parts[temp_idx + 1]
+ except (ValueError, IndexError):
+ pass
+
+ # Fallback to filename if extraction fails
+ return file_path.name if hasattr(file_path, 'name') else str(file_path)
+
+
+def _fallback_empty_dict_detector(code_text: str, file_path: Optional[Path], verbose: bool = False) -> None:
+ """
+ Detect empty NODE_CLASS_MAPPINGS (UI-only extensions).
+ Logs for documentation purposes only (when verbose=True).
+
+ Args:
+ code_text: Python source code to analyze
+ file_path: Path to the file being analyzed
+ verbose: If True, print detection messages
+ """
+ empty_patterns = [
+ 'NODE_CLASS_MAPPINGS = {}',
+ 'NODE_CLASS_MAPPINGS={}',
+ ]
+
+ code_normalized = code_text.replace(' ', '').replace('\n', '')
+
+ for pattern in empty_patterns:
+ pattern_normalized = pattern.replace(' ', '')
+ if pattern_normalized in code_normalized:
+ if file_path and verbose:
+ repo_name = _extract_repo_name(file_path)
+ print(f"Info: UI-only extension (empty NODE_CLASS_MAPPINGS): {repo_name}")
+ return
+
+def has_comfy_node_base(class_node):
+ """Check if class inherits from io.ComfyNode or ComfyNode"""
+ for base in class_node.bases:
+ # Case 1: ComfyNode
+ if isinstance(base, ast.Name) and base.id == 'ComfyNode':
+ return True
+ # Case 2: io.ComfyNode
+ elif isinstance(base, ast.Attribute):
+ if base.attr == 'ComfyNode':
+ return True
+ return False
+
+
+def extract_keyword_value(call_node, keyword):
+ """
+ Extract string value of keyword argument
+ Schema(node_id="MyNode") -> "MyNode"
+ """
+ for kw in call_node.keywords:
+ if kw.arg == keyword:
+ # ast.Constant (Python 3.8+)
+ if isinstance(kw.value, ast.Constant):
+ if isinstance(kw.value.value, str):
+ return kw.value.value
+ # ast.Str (Python 3.7-) - suppress deprecation warning
+ else:
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=DeprecationWarning)
+ if hasattr(ast, 'Str') and isinstance(kw.value, ast.Str):
+ return kw.value.s
+ return None
+
+
+def is_schema_call(call_node):
+ """Check if ast.Call is io.Schema() or Schema()"""
+ func = call_node.func
+ if isinstance(func, ast.Name) and func.id == 'Schema':
+ return True
+ elif isinstance(func, ast.Attribute) and func.attr == 'Schema':
+ return True
+ return False
+
+
+def extract_node_id_from_schema(class_node):
+ """
+ Extract node_id from define_schema() method
+ """
+ for item in class_node.body:
+ if isinstance(item, ast.FunctionDef) and item.name == 'define_schema':
+ # Walk through function body
+ for stmt in ast.walk(item):
+ if isinstance(stmt, ast.Call):
+ # Check if it's Schema() call
+ if is_schema_call(stmt):
+ node_id = extract_keyword_value(stmt, 'node_id')
+ if node_id:
+ return node_id
+ return None
+
+
+def extract_v3_nodes(code_text):
+ """
+ Extract V3 node IDs using AST parsing
+ Returns: set of node_id strings
+ """
+ global parse_cnt
+
+ try:
+ if parse_cnt % 100 == 0:
+ print(".", end="", flush=True)
+ parse_cnt += 1
+
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=SyntaxWarning)
+ warnings.filterwarnings('ignore', category=DeprecationWarning)
+ tree = ast.parse(code_text)
+ except (SyntaxError, UnicodeDecodeError):
+ return set()
+
+ nodes = set()
+
+ # Find io.ComfyNode subclasses
+ for node in ast.walk(tree):
+ if isinstance(node, ast.ClassDef):
+ # Check if inherits from ComfyNode
+ if has_comfy_node_base(node):
+ node_id = extract_node_id_from_schema(node)
+ if node_id:
+ nodes.add(node_id)
+ else:
+ # Fallback: use class name when node_id is dynamic/empty
+ nodes.add(node.name)
+
+ return nodes
+
+
+# scan
+def extract_metadata_only(filename):
+ """Extract only metadata (@author, @title, etc) without node scanning"""
+ try:
+ with open(filename, encoding='utf-8', errors='ignore') as file:
+ code = file.read()
+
+ metadata = {}
+ lines = code.strip().split('\n')
+ for line in lines:
+ if line.startswith('@'):
+ if line.startswith("@author:") or line.startswith("@title:") or line.startswith("@nickname:") or line.startswith("@description:"):
+ key, value = line[1:].strip().split(':', 1)
+ metadata[key.strip()] = value.strip()
+
+ return metadata
+ except:
+ return {}
+
+
+def scan_in_file(filename, is_builtin=False):
+ global builtin_nodes
+
+ with open(filename, encoding='utf-8', errors='ignore') as file:
+ code = file.read()
+
+ # Support type annotations (e.g., NODE_CLASS_MAPPINGS: Type = {...}) and line continuations (\)
+ pattern = r"_CLASS_MAPPINGS\s*(?::\s*\w+\s*)?=\s*(?:\\\s*)?{([^}]*)}"
+ regex = re.compile(pattern, re.MULTILINE | re.DOTALL)
+
+ nodes = set()
+ class_dict = {}
+
+ # V1 nodes detection (enhanced with fallback patterns)
+ nodes |= extract_nodes_enhanced(code, file_path=Path(filename), visited=set())
+
+ # V3 nodes detection
+ nodes |= extract_v3_nodes(code)
+ code = re.sub(r'^#.*?$', '', code, flags=re.MULTILINE)
+
+ def extract_keys(pattern, code):
+ keys = re.findall(pattern, code)
+ return {key.strip() for key in keys}
+
+ def update_nodes(nodes, new_keys):
+ nodes |= new_keys
+
+ patterns = [
+ r'^[^=]*_CLASS_MAPPINGS\["(.*?)"\]',
+ r'^[^=]*_CLASS_MAPPINGS\[\'(.*?)\'\]',
+ r'@register_node\("(.+)",\s*\".+"\)',
+ r'"(\w+)"\s*:\s*{"class":\s*\w+\s*'
+ ]
+
+ with concurrent.futures.ThreadPoolExecutor() as executor:
+ futures = {executor.submit(extract_keys, pattern, code): pattern for pattern in patterns}
+ for future in concurrent.futures.as_completed(futures):
+ update_nodes(nodes, future.result())
+
+ matches = regex.findall(code)
+ for match in matches:
+ dict_text = match
+
+ key_value_pairs = re.findall(r"\"([^\"]*)\"\s*:\s*([^,\n]*)", dict_text)
+ for key, value in key_value_pairs:
+ class_dict[key.strip()] = value.strip()
+
+ key_value_pairs = re.findall(r"'([^']*)'\s*:\s*([^,\n]*)", dict_text)
+ for key, value in key_value_pairs:
+ class_dict[key.strip()] = value.strip()
+
+ for key, value in class_dict.items():
+ nodes.add(key.strip())
+
+ update_pattern = r"_CLASS_MAPPINGS.update\s*\({([^}]*)}\)"
+ update_match = re.search(update_pattern, code)
+ if update_match:
+ update_dict_text = update_match.group(1)
+ update_key_value_pairs = re.findall(r"\"([^\"]*)\"\s*:\s*([^,\n]*)", update_dict_text)
+ for key, value in update_key_value_pairs:
+ class_dict[key.strip()] = value.strip()
+ nodes.add(key.strip())
+
+ metadata = {}
+ lines = code.strip().split('\n')
+ for line in lines:
+ if line.startswith('@'):
+ if line.startswith("@author:") or line.startswith("@title:") or line.startswith("@nickname:") or line.startswith("@description:"):
+ key, value = line[1:].strip().split(':', 1)
+ metadata[key.strip()] = value.strip()
+
+ if is_builtin:
+ builtin_nodes += set(nodes)
+ else:
+ for x in builtin_nodes:
+ if x in nodes:
+ nodes.remove(x)
+
+ return nodes, metadata
+
+
+def get_py_file_paths(dirname):
+ file_paths = []
+
+ for root, dirs, files in os.walk(dirname):
+ if ".git" in root or "__pycache__" in root:
+ continue
+
+ for file in files:
+ if file.endswith(".py"):
+ file_path = os.path.join(root, file)
+ file_paths.append(file_path)
+
+ return file_paths
+
+
+def get_nodes(target_dir):
+ py_files = []
+ directories = []
+
+ for item in os.listdir(target_dir):
+ if ".git" in item or "__pycache__" in item:
+ continue
+
+ path = os.path.abspath(os.path.join(target_dir, item))
+
+ if os.path.isfile(path) and item.endswith(".py"):
+ py_files.append(path)
+ elif os.path.isdir(path):
+ directories.append(path)
+
+ return py_files, directories
+
+
+def get_urls_from_list_file(list_file):
+ """
+ Read URLs from list file for scan-only mode
+
+ Args:
+ list_file (str): Path to URL list file (one URL per line)
+
+ Returns:
+ list of tuples: [(url, "", None, None), ...]
+ Format: (url, title, preemptions, nodename_pattern)
+ - title: Empty string
+ - preemptions: None
+ - nodename_pattern: None
+
+ File format:
+ https://github.com/owner/repo1
+ https://github.com/owner/repo2
+ # Comments starting with # are ignored
+
+ Raises:
+ FileNotFoundError: If list_file does not exist
+ """
+ if not os.path.exists(list_file):
+ raise FileNotFoundError(f"URL list file not found: {list_file}")
+
+ urls = []
+ with open(list_file, 'r', encoding='utf-8') as f:
+ for line_num, line in enumerate(f, 1):
+ line = line.strip()
+
+ # Skip empty lines and comments
+ if not line or line.startswith('#'):
+ continue
+
+ # Validate URL format (basic check)
+ if not (line.startswith('http://') or line.startswith('https://')):
+ print(f"WARNING: Line {line_num} is not a valid URL: {line}")
+ continue
+
+ # Add URL with empty metadata
+ # (url, title, preemptions, nodename_pattern)
+ urls.append((line, "", None, None))
+
+ print(f"Loaded {len(urls)} URLs from {list_file}")
+ return urls
+
+
+def get_git_urls_from_json(json_file):
+ with open(json_file, encoding='utf-8') as file:
+ data = json.load(file)
+
+ custom_nodes = data.get('custom_nodes', [])
+ git_clone_files = []
+ for node in custom_nodes:
+ if node.get('install_type') == 'git-clone':
+ files = node.get('files', [])
+ if files:
+ git_clone_files.append((files[0], node.get('title'), node.get('preemptions'), node.get('nodename_pattern')))
+
+ git_clone_files.append(("https://github.com/comfyanonymous/ComfyUI", "ComfyUI", None, None))
+
+ return git_clone_files
+
+
+def get_py_urls_from_json(json_file):
+ with open(json_file, encoding='utf-8') as file:
+ data = json.load(file)
+
+ custom_nodes = data.get('custom_nodes', [])
+ py_files = []
+ for node in custom_nodes:
+ if node.get('install_type') == 'copy':
+ files = node.get('files', [])
+ if files:
+ py_files.append((files[0], node.get('title'), node.get('preemptions'), node.get('nodename_pattern')))
+
+ return py_files
+
+
+def clone_or_pull_git_repository(git_url):
+ repo_name = git_url.split("/")[-1]
+ if repo_name.endswith(".git"):
+ repo_name = repo_name[:-4]
+
+ repo_dir = os.path.join(temp_dir, repo_name)
+
+ if os.path.exists(repo_dir):
+ try:
+ repo = Repo(repo_dir)
+ origin = repo.remote(name="origin")
+ origin.pull()
+ repo.git.submodule('update', '--init', '--recursive')
+ print(f"Pulling {repo_name}...")
+ except Exception as e:
+ print(f"Failed to pull '{repo_name}': {e}")
+ else:
+ try:
+ Repo.clone_from(git_url, repo_dir, recursive=True)
+ print(f"Cloning {repo_name}...")
+ except Exception as e:
+ print(f"Failed to clone '{repo_name}': {e}")
+
+
+def update_custom_nodes(scan_only_mode=False, url_list_file=None):
+ """
+ Update custom nodes by cloning/pulling repositories
+
+ Args:
+ scan_only_mode (bool): If True, use URL list file instead of custom-node-list.json
+ url_list_file (str): Path to URL list file (required if scan_only_mode=True)
+
+ Returns:
+ dict: node_info mapping {repo_name: (url, title, preemptions, node_pattern)}
+ """
+ if not os.path.exists(temp_dir):
+ os.makedirs(temp_dir)
+
+ node_info = {}
+
+ # Select URL source based on mode
+ if scan_only_mode:
+ if not url_list_file:
+ raise ValueError("url_list_file is required in scan-only mode")
+
+ git_url_titles_preemptions = get_urls_from_list_file(url_list_file)
+ print("\n[Scan-Only Mode]")
+ print(f" - URL source: {url_list_file}")
+ print(" - GitHub stats: DISABLED")
+ print(f" - Git clone/pull: {'ENABLED' if not skip_update else 'DISABLED'}")
+ print(" - Metadata: EMPTY")
+ else:
+ if not os.path.exists('custom-node-list.json'):
+ raise FileNotFoundError("custom-node-list.json not found")
+
+ git_url_titles_preemptions = get_git_urls_from_json('custom-node-list.json')
+ print("\n[Standard Mode]")
+ print(" - URL source: custom-node-list.json")
+ print(f" - GitHub stats: {'ENABLED' if not skip_stat_update else 'DISABLED'}")
+ print(f" - Git clone/pull: {'ENABLED' if not skip_update else 'DISABLED'}")
+ print(" - Metadata: FULL")
+
+ def process_git_url_title(url, title, preemptions, node_pattern):
+ name = os.path.basename(url)
+ if name.endswith(".git"):
+ name = name[:-4]
+
+ node_info[name] = (url, title, preemptions, node_pattern)
+ if not skip_update:
+ clone_or_pull_git_repository(url)
+
+ def process_git_stats(git_url_titles_preemptions):
+ GITHUB_STATS_CACHE_FILENAME = 'github-stats-cache.json'
+ GITHUB_STATS_FILENAME = 'github-stats.json'
+
+ github_stats = {}
+ try:
+ with open(GITHUB_STATS_CACHE_FILENAME, 'r', encoding='utf-8') as file:
+ github_stats = json.load(file)
+ except FileNotFoundError:
+ pass
+
+ def is_rate_limit_exceeded():
+ return g.rate_limiting[0] <= 20
+
+ if is_rate_limit_exceeded():
+ print(f"GitHub API Rate Limit Exceeded: remained - {(g.rate_limiting_resettime - datetime.datetime.now().timestamp())/60:.2f} min")
+ else:
+ def renew_stat(url):
+ if is_rate_limit_exceeded():
+ return
+
+ if 'github.com' not in url:
+ return None
+
+ print('.', end="")
+ sys.stdout.flush()
+ try:
+ # Parsing the URL
+ parsed_url = urlparse(url)
+ domain = parsed_url.netloc
+ path = parsed_url.path
+ path_parts = path.strip("/").split("/")
+ if len(path_parts) >= 2 and domain == "github.com":
+ owner_repo = "/".join(path_parts[-2:])
+ repo = g.get_repo(owner_repo)
+ owner = repo.owner
+ now = datetime.datetime.now(datetime.timezone.utc)
+ author_time_diff = now - owner.created_at
+
+ last_update = repo.pushed_at.strftime("%Y-%m-%d %H:%M:%S") if repo.pushed_at else 'N/A'
+ item = {
+ "stars": repo.stargazers_count,
+ "last_update": last_update,
+ "cached_time": now.timestamp(),
+ "author_account_age_days": author_time_diff.days,
+ }
+ return url, item
+ else:
+ print(f"\nInvalid URL format for GitHub repository: {url}\n")
+ except Exception as e:
+ print(f"\nERROR on {url}\n{e}")
+
+ return None
+
+ # resolve unresolved urls
+ with concurrent.futures.ThreadPoolExecutor(11) as executor:
+ futures = []
+ for url, title, preemptions, node_pattern in git_url_titles_preemptions:
+ if url not in github_stats:
+ futures.append(executor.submit(renew_stat, url))
+
+ for future in concurrent.futures.as_completed(futures):
+ url_item = future.result()
+ if url_item is not None:
+ url, item = url_item
+ github_stats[url] = item
+
+ # renew outdated cache
+ outdated_urls = []
+ for k, v in github_stats.items():
+ elapsed = (datetime.datetime.now().timestamp() - v['cached_time'])
+ if elapsed > 60*60*12: # 12 hours
+ outdated_urls.append(k)
+
+ with concurrent.futures.ThreadPoolExecutor(11) as executor:
+ for url in outdated_urls:
+ futures.append(executor.submit(renew_stat, url))
+
+ for future in concurrent.futures.as_completed(futures):
+ url_item = future.result()
+ if url_item is not None:
+ url, item = url_item
+ github_stats[url] = item
+
+ with open('github-stats-cache.json', 'w', encoding='utf-8') as file:
+ json.dump(github_stats, file, ensure_ascii=False, indent=4)
+
+ with open(GITHUB_STATS_FILENAME, 'w', encoding='utf-8') as file:
+ for v in github_stats.values():
+ if "cached_time" in v:
+ del v["cached_time"]
+
+ github_stats = dict(sorted(github_stats.items()))
+
+ json.dump(github_stats, file, ensure_ascii=False, indent=4)
+
+ print(f"Successfully written to {GITHUB_STATS_FILENAME}.")
+
+ if not skip_stat_update:
+ process_git_stats(git_url_titles_preemptions)
+
+ # Git clone/pull for all repositories
+ with concurrent.futures.ThreadPoolExecutor(11) as executor:
+ for url, title, preemptions, node_pattern in git_url_titles_preemptions:
+ executor.submit(process_git_url_title, url, title, preemptions, node_pattern)
+
+ # .py file download (skip in scan-only mode - only process git repos)
+ if not scan_only_mode:
+ py_url_titles_and_pattern = get_py_urls_from_json('custom-node-list.json')
+
+ def download_and_store_info(url_title_preemptions_and_pattern):
+ url, title, preemptions, node_pattern = url_title_preemptions_and_pattern
+ name = os.path.basename(url)
+ if name.endswith(".py"):
+ node_info[name] = (url, title, preemptions, node_pattern)
+
+ try:
+ download_url(url, temp_dir)
+ except:
+ print(f"[ERROR] Cannot download '{url}'")
+
+ with concurrent.futures.ThreadPoolExecutor(10) as executor:
+ executor.map(download_and_store_info, py_url_titles_and_pattern)
+
+ return node_info
+
+
+def gen_json(node_info, scan_only_mode=False, force_rescan=False):
+ """
+ Generate extension-node-map.json from scanned node information
+
+ Args:
+ node_info (dict): Repository metadata mapping
+ scan_only_mode (bool): If True, exclude metadata from output
+ force_rescan (bool): If True, ignore cache and force rescan all nodes
+ """
+ # scan from .py file
+ node_files, node_dirs = get_nodes(temp_dir)
+
+ comfyui_path = os.path.abspath(os.path.join(temp_dir, "ComfyUI"))
+ # Only reorder if ComfyUI exists in the list
+ if comfyui_path in node_dirs:
+ node_dirs.remove(comfyui_path)
+ node_dirs = [comfyui_path] + node_dirs
+
+ data = {}
+ for dirname in node_dirs:
+ py_files = get_py_file_paths(dirname)
+ metadata = {}
+
+ # Use per-repo cache for node AND metadata extraction
+ try:
+ nodes, metadata = extract_nodes_from_repo(Path(dirname), verbose=False, force_rescan=force_rescan)
+ except:
+ # Fallback to file-by-file scanning if extract_nodes_from_repo fails
+ nodes = set()
+ for py in py_files:
+ nodes_in_file, metadata_in_file = scan_in_file(py, dirname == "ComfyUI")
+ nodes.update(nodes_in_file)
+ metadata.update(metadata_in_file)
+
+ dirname = os.path.basename(dirname)
+
+ if 'Jovimetrix' in dirname:
+ pass
+
+ if len(nodes) > 0 or (dirname in node_info and node_info[dirname][3] is not None):
+ nodes = list(nodes)
+ nodes.sort()
+
+ if dirname in node_info:
+ git_url, title, preemptions, node_pattern = node_info[dirname]
+
+ # Conditionally add metadata based on mode
+ if not scan_only_mode:
+ # Standard mode: include all metadata
+ metadata['title_aux'] = title
+
+ if preemptions is not None:
+ metadata['preemptions'] = preemptions
+
+ if node_pattern is not None:
+ metadata['nodename_pattern'] = node_pattern
+ # Scan-only mode: metadata remains empty
+
+ data[git_url] = (nodes, metadata)
+ else:
+ # Scan-only mode: Repository not in node_info (expected behavior)
+ # Construct URL from dirname (author_repo format)
+ if '_' in dirname:
+ parts = dirname.split('_', 1)
+ git_url = f"https://github.com/{parts[0]}/{parts[1]}"
+ data[git_url] = (nodes, metadata)
+ else:
+ print(f"WARN: {dirname} is removed from custom-node-list.json")
+
+ for file in node_files:
+ nodes, metadata = scan_in_file(file)
+
+ if len(nodes) > 0 or (dirname in node_info and node_info[dirname][3] is not None):
+ nodes = list(nodes)
+ nodes.sort()
+
+ file = os.path.basename(file)
+
+ if file in node_info:
+ url, title, preemptions, node_pattern = node_info[file]
+
+ # Conditionally add metadata based on mode
+ if not scan_only_mode:
+ metadata['title_aux'] = title
+
+ if preemptions is not None:
+ metadata['preemptions'] = preemptions
+
+ if node_pattern is not None:
+ metadata['nodename_pattern'] = node_pattern
+
+ data[url] = (nodes, metadata)
+ else:
+ print(f"Missing info: {file}")
+
+ # scan from node_list.json file
+ extensions = [name for name in os.listdir(temp_dir) if os.path.isdir(os.path.join(temp_dir, name))]
+
+ for extension in extensions:
+ node_list_json_path = os.path.join(temp_dir, extension, 'node_list.json')
+ if os.path.exists(node_list_json_path):
+ # Skip if extension not in node_info (scan-only mode with limited URLs)
+ if extension not in node_info:
+ continue
+
+ git_url, title, preemptions, node_pattern = node_info[extension]
+
+ with open(node_list_json_path, 'r', encoding='utf-8') as f:
+ try:
+ node_list_json = json.load(f)
+ except Exception as e:
+ print(f"\nERROR: Invalid json format '{node_list_json_path}'")
+ print("------------------------------------------------------")
+ print(e)
+ print("------------------------------------------------------")
+ node_list_json = {}
+
+ metadata_in_url = {}
+ if git_url not in data:
+ nodes = set()
+ else:
+ nodes_in_url, metadata_in_url = data[git_url]
+ nodes = set(nodes_in_url)
+
+ try:
+ for x, desc in node_list_json.items():
+ nodes.add(x.strip())
+ except Exception as e:
+ print(f"\nERROR: Invalid json format '{node_list_json_path}'")
+ print("------------------------------------------------------")
+ print(e)
+ print("------------------------------------------------------")
+ node_list_json = {}
+
+ # Conditionally add metadata based on mode
+ if not scan_only_mode:
+ metadata_in_url['title_aux'] = title
+
+ if preemptions is not None:
+ metadata_in_url['preemptions'] = preemptions
+
+ if node_pattern is not None:
+ metadata_in_url['nodename_pattern'] = node_pattern
+
+ nodes = list(nodes)
+ nodes.sort()
+ data[git_url] = (nodes, metadata_in_url)
+
+ json_path = "extension-node-map.json"
+ with open(json_path, "w", encoding='utf-8') as file:
+ json.dump(data, file, indent=4, sort_keys=True)
+
+
+if __name__ == "__main__":
+ # Parse arguments
+ args = parse_arguments()
+
+ # Determine mode
+ scan_only_mode = args.scan_only is not None
+ url_list_file = args.scan_only if scan_only_mode else None
+
+ # Determine temp_dir
+ if args.temp_dir:
+ temp_dir = args.temp_dir
+ elif args.temp_dir_positional:
+ temp_dir = args.temp_dir_positional
+ else:
+ temp_dir = os.path.join(os.getcwd(), ".tmp")
+
+ if not os.path.exists(temp_dir):
+ os.makedirs(temp_dir)
+
+ # Determine skip flags
+ skip_update = args.skip_update or args.skip_all
+ skip_stat_update = args.skip_stat_update or args.skip_all or scan_only_mode
+
+ if not skip_stat_update:
+ auth = Auth.Token(os.environ.get('GITHUB_TOKEN'))
+ g = Github(auth=auth)
+ else:
+ g = None
+
+ print("### ComfyUI Manager Node Scanner ###")
+
+ if scan_only_mode:
+ print(f"\n# [Scan-Only Mode] Processing URL list: {url_list_file}\n")
+ else:
+ print("\n# [Standard Mode] Updating extensions\n")
+
+ # Update/clone repositories and collect node info
+ updated_node_info = update_custom_nodes(scan_only_mode, url_list_file)
+
+ print("\n# Generating 'extension-node-map.json'...\n")
+
+ # Generate extension-node-map.json
+ force_rescan = args.force_rescan if hasattr(args, 'force_rescan') else False
+ if force_rescan:
+ print("⚠️ Force rescan enabled - ignoring all cached results\n")
+ gen_json(updated_node_info, scan_only_mode, force_rescan)
+
+ print("\n✅ DONE.\n")
+
+ if scan_only_mode:
+ print("Output: extension-node-map.json (node mappings only)")
+ else:
+ print("Output: extension-node-map.json (full metadata)")
diff --git a/custom_nodes/ComfyUI-Manager/scripts/colab-dependencies.py b/custom_nodes/ComfyUI-Manager/scripts/colab-dependencies.py
new file mode 100644
index 0000000000000000000000000000000000000000..d5a70ed6dd92ba90e8084e07fbb9097fe3096ea5
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/scripts/colab-dependencies.py
@@ -0,0 +1,39 @@
+import os
+import subprocess
+
+
+def get_enabled_subdirectories_with_files(base_directory):
+ subdirs_with_files = []
+ for subdir in os.listdir(base_directory):
+ try:
+ full_path = os.path.join(base_directory, subdir)
+ if os.path.isdir(full_path) and not subdir.endswith(".disabled") and not subdir.startswith('.') and subdir != '__pycache__':
+ print(f"## Install dependencies for '{subdir}'")
+ requirements_file = os.path.join(full_path, "requirements.txt")
+ install_script = os.path.join(full_path, "install.py")
+
+ if os.path.exists(requirements_file) or os.path.exists(install_script):
+ subdirs_with_files.append((full_path, requirements_file, install_script))
+ except Exception as e:
+ print(f"EXCEPTION During Dependencies INSTALL on '{subdir}':\n{e}")
+
+ return subdirs_with_files
+
+
+def install_requirements(requirements_file_path):
+ if os.path.exists(requirements_file_path):
+ subprocess.run(["pip", "install", "-r", requirements_file_path])
+
+
+def run_install_script(install_script_path):
+ if os.path.exists(install_script_path):
+ subprocess.run(["python", install_script_path])
+
+
+custom_nodes_directory = "custom_nodes"
+subdirs_with_files = get_enabled_subdirectories_with_files(custom_nodes_directory)
+
+
+for subdir, requirements_file, install_script in subdirs_with_files:
+ install_requirements(requirements_file)
+ run_install_script(install_script)
diff --git a/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh b/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh
new file mode 100644
index 0000000000000000000000000000000000000000..5a736ef1be2757c9b0307132506916411a65b46b
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh
@@ -0,0 +1,21 @@
+git clone https://github.com/comfyanonymous/ComfyUI
+cd ComfyUI/custom_nodes
+git clone https://github.com/ltdrdata/ComfyUI-Manager comfyui-manager
+cd ..
+python -m venv venv
+source venv/bin/activate
+python -m pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu121
+python -m pip install -r requirements.txt
+python -m pip install -r custom_nodes/comfyui-manager/requirements.txt
+cd ..
+echo "#!/bin/bash" > run_gpu.sh
+echo "cd ComfyUI" >> run_gpu.sh
+echo "source venv/bin/activate" >> run_gpu.sh
+echo "python main.py --preview-method auto" >> run_gpu.sh
+chmod +x run_gpu.sh
+
+echo "#!/bin/bash" > run_cpu.sh
+echo "cd ComfyUI" >> run_cpu.sh
+echo "source venv/bin/activate" >> run_cpu.sh
+echo "python main.py --preview-method auto --cpu" >> run_cpu.sh
+chmod +x run_cpu.sh
diff --git a/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-win.bat b/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-win.bat
new file mode 100644
index 0000000000000000000000000000000000000000..47470098bb09af02abb0a7e0021a4da49df47213
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-win.bat
@@ -0,0 +1,17 @@
+git clone https://github.com/comfyanonymous/ComfyUI
+cd ComfyUI/custom_nodes
+git clone https://github.com/ltdrdata/ComfyUI-Manager comfyui-manager
+cd ..
+python -m venv venv
+call venv/Scripts/activate
+python -m pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu121
+python -m pip install -r requirements.txt
+python -m pip install -r custom_nodes/comfyui-manager/requirements.txt
+cd ..
+echo "cd ComfyUI" >> run_gpu.bat
+echo "call venv/Scripts/activate" >> run_gpu.bat
+echo "python main.py" >> run_gpu.bat
+
+echo "cd ComfyUI" >> run_cpu.bat
+echo "call venv/Scripts/activate" >> run_cpu.bat
+echo "python main.py --cpu" >> run_cpu.bat
diff --git a/custom_nodes/ComfyUI-Manager/scripts/install-manager-for-portable-version.bat b/custom_nodes/ComfyUI-Manager/scripts/install-manager-for-portable-version.bat
new file mode 100644
index 0000000000000000000000000000000000000000..6eb58b741b09be2c74aa85e235825a5859b84978
--- /dev/null
+++ b/custom_nodes/ComfyUI-Manager/scripts/install-manager-for-portable-version.bat
@@ -0,0 +1,3 @@
+.\python_embeded\python.exe -s -m pip install gitpython
+.\python_embeded\python.exe -c "import git; git.Repo.clone_from('https://github.com/ltdrdata/ComfyUI-Manager', './ComfyUI/custom_nodes/comfyui-manager')"
+.\python_embeded\python.exe -m pip install -r ./ComfyUI/custom_nodes/comfyui-manager/requirements.txt
diff --git a/custom_nodes/ComfyUI-Manager/snapshots/the_snapshot_files_are_located_here b/custom_nodes/ComfyUI-Manager/snapshots/the_snapshot_files_are_located_here
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/custom_nodes/ComfyUI-RunpodDirect/LICENSE b/custom_nodes/ComfyUI-RunpodDirect/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..f288702d2fa16d3cdf0035b15a9fcbc552cd88e7
--- /dev/null
+++ b/custom_nodes/ComfyUI-RunpodDirect/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+ .
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/custom_nodes/ComfyUI-RunpodDirect/README.md b/custom_nodes/ComfyUI-RunpodDirect/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..6bb1136353b67dcc012a5f32a53311d64ddd679c
--- /dev/null
+++ b/custom_nodes/ComfyUI-RunpodDirect/README.md
@@ -0,0 +1,88 @@
+# ComfyUI RunpodDirect
+
+[](https://www.gnu.org/licenses/gpl-3.0)
+[](https://github.com/MadiatorLabs/ComfyUI-RunpodDirect)
+
+Direct model downloads to your Runpod pod with blazing-fast multi-connection support. No more downloading models to your local machine and re-uploading!
+
+## Features
+
+- **Multi-Connection Downloads**: Up to 4x faster with parallel chunk downloading (4 connections per file)
+- **Pause/Resume/Cancel**: Full control over active downloads
+- **Download All Models**: Queue and download all missing models sequentially with one click
+- **Real-Time Progress**: Live progress tracking with download speed, file size, and completion percentage
+
+## Installation
+
+1. Clone or download this repository into your ComfyUI `custom_nodes` directory:
+
+```bash
+cd ComfyUI/custom_nodes
+git clone https://github.com/MadiatorLabs/ComfyUI-RunpodDirect.git
+```
+
+Or manually:
+- Create a folder: `ComfyUI/custom_nodes/ComfyUI-RunpodDirect`
+- Copy all files from this repository into that folder
+
+2. Restart ComfyUI
+
+3. **Hard refresh your browser** to load the new extension:
+ - Windows/Linux: `Ctrl + Shift + R` or `Ctrl + F5`
+ - Mac: `Cmd + Shift + R`
+ - Or: Open DevTools (F12) → Right-click refresh → "Empty Cache and Hard Reload"
+
+4. Verify the version loaded by checking the browser console (F12) for:
+ ```
+ [RunpodDirect] v1.0.0
+ ```
+
+## Usage
+
+### Via Missing Models Dialog
+
+1. Load a workflow that references missing models
+2. When the "Missing Models" dialog appears, you'll see:
+ - **Download All Models to Pod** button (downloads all models sequentially)
+ - Individual buttons for each model:
+ - **Download** (browser download - original functionality)
+ - **Copy URL** (copy model URL - original functionality)
+ - **Download to Pod** (NEW - downloads directly to server)
+
+3. **Option A: Download All Models**
+ - Click "Download All Models to Pod (X)" button
+ - Watch the progress area showing:
+ - Current file being downloaded
+ - Overall progress (X/Y completed)
+ - Download speed and file size
+ - Pause/Resume/Cancel controls
+
+4. **Option B: Download Individual Model**
+ - Click "Download to Pod" button for a specific model
+ - Button shows status with icons (spinner → checkmark/error)
+ - Download happens in the background with multi-connection support
+
+## Security
+
+- Only allows downloads from whitelisted sources (as defined in ComfyUI's frontend)
+- Downloads are saved to ComfyUI's model directories only
+- Prevents overwriting existing files
+- Validates all input parameters
+
+## License
+
+GNU General Public License v3.0 - See [LICENSE](LICENSE) for details.
+
+This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+## Contributing
+
+Contributions are welcome! Please feel free to submit a Pull Request or open an Issue on [GitHub](https://github.com/MadiatorLabs/ComfyUI-RunpodDirect).
+
+## Credits
+
+Developed by [MadiatorLabs](https://github.com/MadiatorLabs)
+
+## Support
+
+If you find this useful, please ⭐ star the repo on [GitHub](https://github.com/MadiatorLabs/ComfyUI-RunpodDirect)!
diff --git a/custom_nodes/ComfyUI-RunpodDirect/__init__.py b/custom_nodes/ComfyUI-RunpodDirect/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..484a287998b355becb120b86270f7ce769244a28
--- /dev/null
+++ b/custom_nodes/ComfyUI-RunpodDirect/__init__.py
@@ -0,0 +1,567 @@
+"""
+ComfyUI RunpodDirect - Direct Model Downloads for RunPod
+Download models directly to your RunPod instance with multi-connection support
+"""
+
+import os
+import logging
+import asyncio
+import folder_paths
+from aiohttp import web
+from server import PromptServer
+
+# Track active downloads
+active_downloads = {}
+# Download control (for pause/resume)
+download_control = {}
+# Download queue management
+download_queue = []
+current_download_task = None # Only one download at a time
+
+# Configuration optimized for datacenter connections (RunPod)
+CHUNK_SIZE = 32 * 1024 * 1024 # 32MB chunks - balanced for 500MB to 30GB+ files
+NUM_CONNECTIONS = 8 # 8 parallel connections - optimal for DC bandwidth
+
+
+@PromptServer.instance.routes.post("/server_download/start")
+async def start_download(request):
+ """Start downloading a model file to the server"""
+ try:
+ json_data = await request.json()
+ url = json_data.get("url")
+ save_path = json_data.get("save_path") # e.g., "checkpoints"
+ filename = json_data.get("filename") # e.g., "model.safetensors"
+
+ if not url or not save_path or not filename:
+ return web.json_response(
+ {"error": "Missing required parameters: url, save_path, filename"},
+ status=400
+ )
+
+ # Validate save_path
+ if save_path not in folder_paths.folder_names_and_paths:
+ return web.json_response(
+ {"error": f"Invalid save_path: {save_path}. Must be one of: {list(folder_paths.folder_names_and_paths.keys())}"},
+ status=400
+ )
+
+ # Security: Validate filename to prevent path traversal attacks
+ # Check for any directory separators (both Unix and Windows style)
+ if "/" in filename or "\\" in filename or os.path.sep in filename:
+ return web.json_response(
+ {"error": "Invalid filename: must not contain path separators"},
+ status=400
+ )
+
+ # Additional check for various path traversal patterns
+ if ".." in filename or filename.startswith("/") or filename.startswith("~"):
+ return web.json_response(
+ {"error": "Invalid filename: path traversal patterns detected"},
+ status=400
+ )
+
+ # Normalize the filename to remove any potential tricks
+ safe_filename = os.path.basename(filename)
+ if safe_filename != filename:
+ return web.json_response(
+ {"error": "Invalid filename: must be a simple filename without path components"},
+ status=400
+ )
+
+ # Get the first folder path for this model type
+ output_dir = folder_paths.folder_names_and_paths[save_path][0][0]
+ output_path = os.path.join(output_dir, safe_filename)
+
+ # Final security check: ensure the resolved path is within the intended directory
+ output_path = os.path.abspath(output_path)
+ output_dir = os.path.abspath(output_dir)
+ if not output_path.startswith(output_dir + os.sep):
+ return web.json_response(
+ {"error": "Security error: attempted directory escape"},
+ status=400
+ )
+
+ # Check if file already exists
+ if os.path.exists(output_path):
+ return web.json_response(
+ {"error": f"File already exists: {output_path}"},
+ status=400
+ )
+
+ # Create directory if it doesn't exist
+ os.makedirs(os.path.dirname(output_path), exist_ok=True)
+
+ # Mark as queued
+ download_id = f"{save_path}/{safe_filename}"
+ active_downloads[download_id] = {
+ "url": url,
+ "filename": safe_filename,
+ "save_path": save_path,
+ "output_path": output_path,
+ "progress": 0,
+ "status": "queued",
+ "priority": None
+ }
+
+ # Add to queue
+ download_queue.append({
+ "download_id": download_id,
+ "url": url,
+ "output_path": output_path
+ })
+
+ # Process queue (will start download if slot available)
+ asyncio.create_task(process_download_queue())
+
+ return web.json_response({
+ "success": True,
+ "download_id": download_id,
+ "message": "Download queued"
+ })
+
+ except Exception as e:
+ logging.error(f"Error starting download: {e}")
+ return web.json_response(
+ {"error": str(e)},
+ status=500
+ )
+
+
+async def process_download_queue():
+ """Process the download queue - one download at a time"""
+ global download_queue, current_download_task
+
+ # Check if already downloading
+ if current_download_task is not None and not current_download_task.done():
+ logging.info("[RunpodDirect] Download already in progress, waiting...")
+ return # Already downloading
+
+ if len(download_queue) == 0:
+ logging.info("[RunpodDirect] Queue is empty")
+ return # Nothing to process
+
+ # Get next download from queue
+ download_item = download_queue.pop(0)
+ download_id = download_item["download_id"]
+ url = download_item["url"]
+ output_path = download_item["output_path"]
+
+ # Set status to downloading
+ active_downloads[download_id]["status"] = "downloading"
+ active_downloads[download_id]["progress"] = 0
+ active_downloads[download_id]["downloaded"] = 0
+
+ logging.info(f"[RunpodDirect] Starting download {download_id} with {NUM_CONNECTIONS} connections (full speed)")
+
+ # Notify frontend that download is starting
+ await PromptServer.instance.send("server_download_progress", {
+ "download_id": download_id,
+ "progress": 0,
+ "downloaded": 0,
+ "total": 0
+ })
+
+ # Start download task
+ current_download_task = asyncio.create_task(download_file(url, output_path, download_id))
+
+ # Add completion callback to process next in queue
+ current_download_task.add_done_callback(lambda t: on_download_complete(download_id))
+
+
+def on_download_complete(download_id):
+ """Called when a download completes - processes next in queue"""
+ global current_download_task
+
+ current_download_task = None
+ logging.info(f"[RunpodDirect] Download completed: {download_id}, processing next in queue...")
+
+ # Process next in queue
+ asyncio.create_task(process_download_queue())
+
+
+async def download_chunk(session, url, start, end, output_path, chunk_index, download_id):
+ """Download a specific chunk of the file"""
+ headers = {'Range': f'bytes={start}-{end}'}
+
+ try:
+ async with session.get(url, headers=headers) as response:
+ if response.status not in [200, 206]:
+ return None
+
+ chunk_data = await response.read()
+
+ # Write chunk to file at specific position
+ with open(output_path, 'r+b') as f:
+ f.seek(start)
+ f.write(chunk_data)
+
+ return len(chunk_data)
+ except Exception as e:
+ logging.error(f"Error downloading chunk {chunk_index} for {download_id}: {e}")
+ return None
+
+
+async def download_file(url, output_path, download_id):
+ """Download file with multi-connection support and progress tracking"""
+ import aiohttp
+
+ logging.info(f"[RunpodDirect] Download {download_id} using {NUM_CONNECTIONS} connections (full speed)")
+
+ try:
+ # Initialize control for this download
+ download_control[download_id] = {
+ "paused": False,
+ "cancelled": False,
+ "total_downloaded": 0, # Shared counter for all chunks
+ "lock": asyncio.Lock() # Lock for thread-safe updates
+ }
+
+ timeout = aiohttp.ClientTimeout(total=None)
+ async with aiohttp.ClientSession(timeout=timeout) as session:
+ # Get file size - try HEAD first, then fall back to GET with Range
+ total_size = 0
+ supports_range = False
+
+ try:
+ # Try HEAD request first
+ async with session.head(url, allow_redirects=True) as response:
+ if response.status == 200:
+ total_size = int(response.headers.get('content-length', 0))
+ supports_range = response.headers.get('accept-ranges') == 'bytes'
+ except Exception as e:
+ logging.warning(f"HEAD request failed for {download_id}: {e}")
+
+ # If HEAD didn't give us the size, try GET with Range header
+ if total_size == 0:
+ logging.info(f"HEAD request didn't return size, trying GET with Range for {download_id}")
+ try:
+ headers = {'Range': 'bytes=0-0'}
+ async with session.get(url, headers=headers, allow_redirects=True) as response:
+ if response.status in [200, 206]:
+ # Try to get size from Content-Range header first
+ content_range = response.headers.get('content-range', '')
+ if content_range:
+ # Format: "bytes 0-0/12345" where 12345 is total size
+ parts = content_range.split('/')
+ if len(parts) == 2:
+ total_size = int(parts[1])
+ supports_range = True
+
+ # Fallback to Content-Length
+ if total_size == 0:
+ total_size = int(response.headers.get('content-length', 0))
+ except Exception as e:
+ logging.warning(f"GET with Range failed for {download_id}: {e}")
+
+ if total_size == 0:
+ raise Exception("Could not determine file size from server")
+
+ logging.info(f"File size for {download_id}: {total_size} bytes, supports range: {supports_range}")
+
+ # Create file with full size
+ with open(output_path, 'wb') as f:
+ f.seek(total_size - 1)
+ f.write(b'\0')
+
+ active_downloads[download_id]["total"] = total_size
+ active_downloads[download_id]["downloaded"] = 0
+
+ # Use multi-connection download if server supports range requests
+ if supports_range and total_size > CHUNK_SIZE:
+ logging.info(f"Using {NUM_CONNECTIONS} connections for {download_id}")
+
+ # Calculate chunk ranges
+ chunk_size = total_size // NUM_CONNECTIONS
+ tasks = []
+
+ for i in range(NUM_CONNECTIONS):
+ start = i * chunk_size
+ end = start + chunk_size - 1 if i < NUM_CONNECTIONS - 1 else total_size - 1
+
+ tasks.append(download_chunk_with_progress(
+ session, url, start, end, output_path, i, download_id, total_size
+ ))
+
+ # Download all chunks in parallel
+ results = await asyncio.gather(*tasks, return_exceptions=True)
+
+ # Check for errors
+ for result in results:
+ if isinstance(result, Exception):
+ raise result
+
+ else:
+ # Fallback to single connection download
+ logging.info(f"Using single connection for {download_id}")
+ await download_single_connection(session, url, output_path, download_id, total_size)
+
+ # Check if cancelled
+ if download_control[download_id]["cancelled"]:
+ os.remove(output_path)
+ return
+
+ # Mark as complete
+ active_downloads[download_id]["status"] = "completed"
+ active_downloads[download_id]["progress"] = 100
+
+ # Send completion message
+ await PromptServer.instance.send("server_download_complete", {
+ "download_id": download_id,
+ "path": output_path,
+ "size": total_size
+ })
+
+ logging.info(f"Successfully downloaded {download_id} to {output_path}")
+
+ # Cleanup
+ del download_control[download_id]
+
+ except Exception as e:
+ logging.error(f"Error downloading {download_id}: {e}")
+ active_downloads[download_id]["status"] = "error"
+ active_downloads[download_id]["error"] = str(e)
+
+ await PromptServer.instance.send("server_download_error", {
+ "download_id": download_id,
+ "error": str(e)
+ })
+
+ # Cleanup
+ if download_id in download_control:
+ del download_control[download_id]
+
+
+async def download_chunk_with_progress(session, url, start, end, output_path, chunk_index, download_id, total_size):
+ """Download chunk with progress tracking"""
+ headers = {'Range': f'bytes={start}-{end}'}
+ chunk_size = end - start + 1
+ downloaded = 0
+ last_report_time = 0
+
+ try:
+ async with session.get(url, headers=headers) as response:
+ if response.status not in [200, 206]:
+ raise Exception(f"HTTP {response.status} for chunk {chunk_index}")
+
+ with open(output_path, 'r+b') as f:
+ f.seek(start)
+
+ async for chunk in response.content.iter_chunked(CHUNK_SIZE):
+ # Check if paused
+ while download_control.get(download_id, {}).get("paused", False):
+ await asyncio.sleep(0.5)
+
+ # Check if cancelled
+ if download_control.get(download_id, {}).get("cancelled", False):
+ return
+
+ f.write(chunk)
+ chunk_len = len(chunk)
+ downloaded += chunk_len
+
+ # Update shared progress counter with lock
+ async with download_control[download_id]["lock"]:
+ download_control[download_id]["total_downloaded"] += chunk_len
+ total_downloaded = download_control[download_id]["total_downloaded"]
+
+ # Send progress updates every 100ms to avoid spam (only from chunk 0)
+ import time
+ current_time = time.time()
+ if chunk_index == 0 and (current_time - last_report_time) >= 0.1:
+ progress = (total_downloaded / total_size) * 100
+ active_downloads[download_id]["progress"] = progress
+ active_downloads[download_id]["downloaded"] = total_downloaded
+
+ await PromptServer.instance.send("server_download_progress", {
+ "download_id": download_id,
+ "progress": progress,
+ "downloaded": total_downloaded,
+ "total": total_size
+ })
+
+ last_report_time = current_time
+
+ except Exception as e:
+ logging.error(f"Error in chunk {chunk_index} for {download_id}: {e}")
+ raise
+
+
+async def download_single_connection(session, url, output_path, download_id, total_size):
+ """Fallback single connection download"""
+ downloaded_size = 0
+
+ async with session.get(url) as response:
+ if response.status != 200:
+ raise Exception(f"HTTP {response.status}")
+
+ with open(output_path, 'wb') as f:
+ async for chunk in response.content.iter_chunked(CHUNK_SIZE):
+ # Check if paused
+ while download_control.get(download_id, {}).get("paused", False):
+ await asyncio.sleep(0.5)
+
+ # Check if cancelled
+ if download_control.get(download_id, {}).get("cancelled", False):
+ return
+
+ f.write(chunk)
+ downloaded_size += len(chunk)
+
+ # Update progress
+ progress = (downloaded_size / total_size) * 100
+ active_downloads[download_id]["progress"] = progress
+ active_downloads[download_id]["downloaded"] = downloaded_size
+
+ await PromptServer.instance.send("server_download_progress", {
+ "download_id": download_id,
+ "progress": progress,
+ "downloaded": downloaded_size,
+ "total": total_size
+ })
+
+
+@PromptServer.instance.routes.get("/server_download/status")
+async def get_download_status(request):
+ """Get status of all downloads"""
+ return web.json_response(active_downloads)
+
+
+@PromptServer.instance.routes.get("/server_download/status/{download_id:.*}")
+async def get_single_download_status(request):
+ """Get status of a specific download"""
+ download_id = request.match_info.get("download_id", "")
+
+ if download_id in active_downloads:
+ return web.json_response(active_downloads[download_id])
+ else:
+ return web.json_response(
+ {"error": "Download not found"},
+ status=404
+ )
+
+
+@PromptServer.instance.routes.post("/server_download/pause")
+async def pause_download(request):
+ """Pause an active download"""
+ try:
+ json_data = await request.json()
+ download_id = json_data.get("download_id")
+
+ if not download_id:
+ return web.json_response(
+ {"error": "Missing download_id"},
+ status=400
+ )
+
+ if download_id not in download_control:
+ return web.json_response(
+ {"error": "Download not found or already completed"},
+ status=404
+ )
+
+ download_control[download_id]["paused"] = True
+ active_downloads[download_id]["status"] = "paused"
+
+ await PromptServer.instance.send("server_download_paused", {
+ "download_id": download_id
+ })
+
+ return web.json_response({"success": True, "message": "Download paused"})
+
+ except Exception as e:
+ return web.json_response({"error": str(e)}, status=500)
+
+
+@PromptServer.instance.routes.post("/server_download/resume")
+async def resume_download(request):
+ """Resume a paused download"""
+ try:
+ json_data = await request.json()
+ download_id = json_data.get("download_id")
+
+ if not download_id:
+ return web.json_response(
+ {"error": "Missing download_id"},
+ status=400
+ )
+
+ if download_id not in download_control:
+ return web.json_response(
+ {"error": "Download not found or already completed"},
+ status=404
+ )
+
+ download_control[download_id]["paused"] = False
+ active_downloads[download_id]["status"] = "downloading"
+
+ await PromptServer.instance.send("server_download_resumed", {
+ "download_id": download_id
+ })
+
+ return web.json_response({"success": True, "message": "Download resumed"})
+
+ except Exception as e:
+ return web.json_response({"error": str(e)}, status=500)
+
+
+@PromptServer.instance.routes.post("/server_download/cancel")
+async def cancel_download(request):
+ """Cancel an active download"""
+ global download_queue, current_download_task
+
+ try:
+ json_data = await request.json()
+ download_id = json_data.get("download_id")
+
+ if not download_id:
+ return web.json_response(
+ {"error": "Missing download_id"},
+ status=400
+ )
+
+ # Check if download is queued (not started yet)
+ download_queue[:] = [d for d in download_queue if d["download_id"] != download_id]
+
+ # Check if download is active
+ if download_id in download_control:
+ download_control[download_id]["cancelled"] = True
+
+ # Update status
+ if download_id in active_downloads:
+ active_downloads[download_id]["status"] = "cancelled"
+
+ await PromptServer.instance.send("server_download_cancelled", {
+ "download_id": download_id
+ })
+
+ return web.json_response({"success": True, "message": "Download cancelled"})
+
+ except Exception as e:
+ return web.json_response({"error": str(e)}, status=500)
+
+
+@PromptServer.instance.routes.get("/extensions/ComfyUI-RunpodDirect/serverDownload.js")
+async def serve_js_with_version(request):
+ """Serve JS file with cache-busting headers"""
+ js_path = os.path.join(os.path.dirname(__file__), "web", "serverDownload.js")
+
+ response = web.FileResponse(js_path)
+ # Add cache control headers to force revalidation
+ response.headers['Cache-Control'] = 'no-cache, must-revalidate'
+ response.headers['Pragma'] = 'no-cache'
+ response.headers['Expires'] = '0'
+ response.headers['X-Version'] = __version__
+
+ return response
+
+
+# Set the web directory for frontend files
+WEB_DIRECTORY = "./web"
+
+# Version for cache busting - increment this when you update the JS
+__version__ = "1.0.6"
+
+NODE_CLASS_MAPPINGS = {}
+NODE_DISPLAY_NAME_MAPPINGS = {}
+
+__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]
diff --git a/custom_nodes/ComfyUI-RunpodDirect/pyproject.toml b/custom_nodes/ComfyUI-RunpodDirect/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..76bef8548bea07e16fff27a45ed7eb4d0e0d04b2
--- /dev/null
+++ b/custom_nodes/ComfyUI-RunpodDirect/pyproject.toml
@@ -0,0 +1,35 @@
+[project]
+name = "comfyui-runpoddirect"
+description = "Server-side model download extension for ComfyUI on Runpod - Download missing models directly to your pod with multi-connection downloads, queue management, and real-time progress tracking"
+version = "1.0.6"
+license = {file = "LICENSE"}
+authors = [
+ {name = "Madiator2011"},
+]
+readme = "README.md"
+requires-python = ">=3.8"
+dependencies = [
+ "aiohttp>=3.8.0",
+]
+
+classifiers = [
+ # OS independent - works on all operating systems
+ "Operating System :: OS Independent",
+
+ # GPU support - works with any GPU accelerator
+ "Environment :: GPU :: NVIDIA CUDA",
+ "Environment :: GPU :: AMD ROCm",
+ "Environment :: GPU :: Intel Arc",
+ "Environment :: GPU :: Apple Metal",
+]
+
+[project.urls]
+Repository = "https://github.com/MadiatorLabs/ComfyUI-RunpodDirect"
+Documentation = "https://github.com/MadiatorLabs/ComfyUI-RunpodDirect#readme"
+"Bug Tracker" = "https://github.com/MadiatorLabs/ComfyUI-RunpodDirect/issues"
+
+[tool.comfy]
+PublisherId = "madiator2011"
+DisplayName = "Madiator2011"
+Icon = "https://peer.madiator.cloud/lazy-static/avatars/769f014a-9bc4-45e4-8fb5-57512aea2e97.png"
+includes = []
\ No newline at end of file
diff --git a/custom_nodes/ComfyUI-RunpodDirect/web/serverDownload.js b/custom_nodes/ComfyUI-RunpodDirect/web/serverDownload.js
new file mode 100644
index 0000000000000000000000000000000000000000..ba22573fde6403f984412a786beeeb4a2b7cc2b6
--- /dev/null
+++ b/custom_nodes/ComfyUI-RunpodDirect/web/serverDownload.js
@@ -0,0 +1,729 @@
+import { app } from "../../scripts/app.js";
+import { api } from "../../scripts/api.js";
+
+// ComfyUI RunpodDirect Extension
+// Version: 1.0.6
+console.log('[RunpodDirect] v1.0.6');
+
+// Track download states
+const downloadStates = new Map();
+let downloadQueue = [];
+let isDownloadingAll = false;
+let completedDownloads = 0;
+let totalDownloads = 0;
+let downloadStartTimes = new Map();
+
+// Format bytes to human readable
+function formatBytes(bytes) {
+ if (bytes === 0) return '0 B';
+ const k = 1024;
+ const sizes = ['B', 'KB', 'MB', 'GB'];
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
+ return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
+}
+
+// Calculate download speed
+function calculateSpeed(downloadId, downloaded) {
+ const startTime = downloadStartTimes.get(downloadId);
+ if (!startTime) return '0 MB/s';
+
+ const elapsedSeconds = (Date.now() - startTime) / 1000;
+ if (elapsedSeconds < 1) return 'Calculating...';
+
+ const bytesPerSecond = downloaded / elapsedSeconds;
+ return formatBytes(bytesPerSecond) + '/s';
+}
+
+// Listen for server download events
+api.addEventListener("server_download_progress", ({ detail }) => {
+ const { download_id, progress, downloaded, total } = detail;
+
+ if (!downloadStartTimes.has(download_id)) {
+ downloadStartTimes.set(download_id, Date.now());
+ }
+
+ const speed = calculateSpeed(download_id, downloaded);
+
+ downloadStates.set(download_id, {
+ status: 'downloading',
+ progress,
+ downloaded,
+ total,
+ speed
+ });
+
+ // Trigger update event for UI components
+ window.dispatchEvent(new CustomEvent('serverDownloadUpdate', {
+ detail: { download_id, ...downloadStates.get(download_id) }
+ }));
+});
+
+api.addEventListener("server_download_complete", ({ detail }) => {
+ const { download_id, path, size } = detail;
+
+ // Increment counter BEFORE updating UI
+ if (isDownloadingAll) {
+ completedDownloads++;
+ console.log(`[RunpodDirect] Progress: ${completedDownloads}/${totalDownloads} completed`);
+ }
+
+ downloadStates.set(download_id, {
+ status: 'completed',
+ progress: 100,
+ path,
+ size
+ });
+
+ window.dispatchEvent(new CustomEvent('serverDownloadUpdate', {
+ detail: { download_id, ...downloadStates.get(download_id) }
+ }));
+
+ console.log(`Download completed: ${download_id} -> ${path}`);
+
+ // Check if all downloads are done
+ if (isDownloadingAll && completedDownloads >= totalDownloads) {
+ console.log('[RunpodDirect] All downloads completed!');
+ isDownloadingAll = false;
+ showRefreshPrompt();
+ }
+});
+
+api.addEventListener("server_download_error", ({ detail }) => {
+ const { download_id, error } = detail;
+
+ // Increment counter BEFORE updating UI
+ if (isDownloadingAll) {
+ completedDownloads++;
+ console.log(`[RunpodDirect] Progress: ${completedDownloads}/${totalDownloads} completed (1 error)`);
+ }
+
+ downloadStates.set(download_id, {
+ status: 'error',
+ error
+ });
+
+ window.dispatchEvent(new CustomEvent('serverDownloadUpdate', {
+ detail: { download_id, ...downloadStates.get(download_id) }
+ }));
+
+ console.error(`Download error: ${download_id} - ${error}`);
+
+ // Check if all downloads are done (including failed ones)
+ if (isDownloadingAll && completedDownloads >= totalDownloads) {
+ console.log('[RunpodDirect] All downloads completed!');
+ isDownloadingAll = false;
+ showRefreshPrompt();
+ }
+});
+
+// Function to start a server download
+async function startServerDownload(url, savePath, filename, markAsQueued = false) {
+ try {
+ const download_id = `${savePath}/${filename}`;
+
+ // Mark as queued immediately if requested (for Download All)
+ if (markAsQueued) {
+ downloadStates.set(download_id, {
+ status: 'queued',
+ progress: 0
+ });
+
+ window.dispatchEvent(new CustomEvent('serverDownloadUpdate', {
+ detail: { download_id, ...downloadStates.get(download_id) }
+ }));
+ }
+
+ const response = await api.fetchApi("/server_download/start", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ url,
+ save_path: savePath,
+ filename
+ })
+ });
+
+ const result = await response.json();
+
+ if (response.ok) {
+ // If not already marked as queued, set as queued now
+ if (!markAsQueued) {
+ downloadStates.set(download_id, {
+ status: 'queued',
+ progress: 0
+ });
+
+ window.dispatchEvent(new CustomEvent('serverDownloadUpdate', {
+ detail: { download_id, ...downloadStates.get(download_id) }
+ }));
+ }
+
+ return { success: true, download_id };
+ } else {
+ return { success: false, error: result.error };
+ }
+ } catch (error) {
+ console.error("Failed to start download:", error);
+ return { success: false, error: error.message };
+ }
+}
+
+// Get download status
+function getDownloadStatus(downloadId) {
+ return downloadStates.get(downloadId) || null;
+}
+
+// Pause download
+async function pauseDownload(downloadId) {
+ try {
+ const response = await api.fetchApi("/server_download/pause", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ download_id: downloadId })
+ });
+
+ const result = await response.json();
+ return { success: response.ok, ...result };
+ } catch (error) {
+ console.error("Failed to pause download:", error);
+ return { success: false, error: error.message };
+ }
+}
+
+// Resume download
+async function resumeDownload(downloadId) {
+ try {
+ const response = await api.fetchApi("/server_download/resume", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ download_id: downloadId })
+ });
+
+ const result = await response.json();
+ return { success: response.ok, ...result };
+ } catch (error) {
+ console.error("Failed to resume download:", error);
+ return { success: false, error: error.message };
+ }
+}
+
+// Cancel download
+async function cancelDownload(downloadId) {
+ try {
+ const response = await api.fetchApi("/server_download/cancel", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ download_id: downloadId })
+ });
+
+ const result = await response.json();
+ return { success: response.ok, ...result };
+ } catch (error) {
+ console.error("Failed to cancel download:", error);
+ return { success: false, error: error.message };
+ }
+}
+
+// Process download queue - Sends all downloads to backend which handles queue management
+async function processDownloadQueue() {
+ if (downloadQueue.length === 0) {
+ console.log('[RunpodDirect] No downloads in queue');
+ return;
+ }
+
+ // Send all downloads to the backend (backend handles queue and priorities)
+ console.log(`[RunpodDirect] Starting ${downloadQueue.length} downloads (backend will queue and prioritize)`);
+
+ const downloadsToStart = [...downloadQueue];
+ downloadQueue = []; // Clear queue as we're sending all to backend
+
+ // Start all downloads - backend will queue and manage priorities
+ // Pass markAsQueued=true so buttons show "Queued" status immediately
+ for (const download of downloadsToStart) {
+ console.log(`[RunpodDirect] Queuing download ${download.filename}`);
+ await startServerDownload(download.url, download.directory, download.filename, true);
+ }
+
+ console.log(`[RunpodDirect] All ${downloadsToStart.length} downloads queued on backend`);
+}
+
+// Show refresh prompt
+function showRefreshPrompt() {
+ const dialog = document.querySelector('[role="dialog"]');
+ if (!dialog) return;
+
+ // Find the dialog content area
+ const dialogContent = dialog.querySelector('.p-dialog-content');
+ if (!dialogContent) return;
+
+ // Check if prompt already exists
+ if (document.querySelector('.server-download-refresh-prompt')) {
+ console.log('[RunpodDirect] Refresh prompt already shown');
+ return;
+ }
+
+ // Create refresh prompt
+ const refreshPrompt = document.createElement('div');
+ refreshPrompt.className = 'server-download-refresh-prompt';
+ refreshPrompt.style.cssText = `
+ margin-top: 20px;
+ padding: 16px;
+ background: #4caf50;
+ color: white;
+ border-radius: 8px;
+ text-align: center;
+ font-weight: 500;
+ `;
+
+ refreshPrompt.innerHTML = `
+
+ ✅ All models downloaded successfully!
+
+
+ Refresh Page
+
+ `;
+
+ dialogContent.appendChild(refreshPrompt);
+}
+
+// Create global progress area with individual progress bars for each download
+function createProgressArea(listbox) {
+ // Remove existing progress area if any
+ const existing = document.querySelector('.server-download-progress-area');
+ if (existing) existing.remove();
+
+ const progressArea = document.createElement('div');
+ progressArea.className = 'server-download-progress-area';
+ progressArea.style.cssText = `
+ margin-top: 20px;
+ padding: 16px;
+ background: var(--p-content-background, #1e1e1e);
+ border: 1px solid var(--p-content-border-color, #333);
+ border-radius: 8px;
+ `;
+
+ progressArea.innerHTML = `
+
+
+ Download Progress
+
+
+
+ Overall: 0/${totalDownloads} models completed
+
+
+
+
+ `;
+
+ listbox.parentElement.appendChild(progressArea);
+
+ // Listen for updates
+ const updateHandler = (event) => {
+ const { download_id, status, progress, downloaded, total, speed } = event.detail;
+
+ if (!isDownloadingAll) {
+ return;
+ }
+
+ // Update overall progress
+ const overallProgress = document.getElementById('server-download-overall-progress');
+ if (overallProgress) {
+ overallProgress.textContent = `Overall: ${completedDownloads}/${totalDownloads} models completed`;
+ }
+
+ // Update or create individual progress item
+ updateDownloadProgressItem(download_id, status, progress, downloaded, total, speed);
+ };
+
+ window.addEventListener('serverDownloadUpdate', updateHandler);
+}
+
+// Update or create a progress item for a specific download
+function updateDownloadProgressItem(download_id, status, progress, downloaded, total, speed) {
+ // Declare variables at function scope so they're accessible across try blocks
+ let item = null;
+ let container = null;
+ const itemId = `download-item-${download_id.replace(/\//g, '-')}`;
+
+ try {
+ container = document.getElementById('server-download-items-container');
+ if (!container) return;
+
+ item = document.getElementById(itemId);
+
+ // Don't show queued items
+ if (status === 'queued') {
+ if (item) item.remove();
+ return;
+ }
+
+ // Remove completed/error items after a delay
+ if (status === 'completed' || status === 'error') {
+ if (item && !item.dataset.removing) {
+ item.dataset.removing = 'true';
+ setTimeout(() => {
+ try {
+ if (item && item.parentNode) item.remove();
+ } catch (e) {
+ console.error('[RunpodDirect] Error removing progress item:', e);
+ }
+ }, 2000);
+ }
+ }
+
+ // Create new item if it doesn't exist
+ if (!item) {
+ item = document.createElement('div');
+ item.id = itemId;
+ item.style.cssText = `
+ padding: 12px;
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 6px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ `;
+ container.appendChild(item);
+ }
+ } catch (e) {
+ console.error('[RunpodDirect] Error in updateDownloadProgressItem:', e);
+ return;
+ }
+
+ try {
+ // Status icon and color (no priority badge needed - downloading one at a time)
+ let statusIcon = '';
+ let statusColor = '#2196F3';
+ if (status === 'downloading') {
+ statusIcon = ' ';
+ statusColor = '#2196F3';
+ } else if (status === 'completed') {
+ statusIcon = ' ';
+ statusColor = '#4CAF50';
+ } else if (status === 'error') {
+ statusIcon = ' ';
+ statusColor = '#ef4444';
+ } else if (status === 'paused') {
+ statusIcon = ' ';
+ statusColor = '#FF9800';
+ }
+
+ const progressPercent = progress || 0;
+ const speedText = speed || '--';
+ const sizeText = downloaded && total ? `${formatBytes(downloaded)} / ${formatBytes(total)}` : '--';
+
+ if (item) {
+ item.innerHTML = `
+
+
+ ${statusIcon}${download_id}
+
+
+ ${progressPercent.toFixed(1)}%
+
+
+
+
+ Speed: ${speedText}
+ ${sizeText}
+
+ `;
+ }
+ } catch (e) {
+ console.error('[RunpodDirect] Error updating progress item HTML:', e);
+ }
+}
+
+// Export functions for use in other modules
+window.serverDownload = {
+ start: startServerDownload,
+ getStatus: getDownloadStatus,
+ states: downloadStates
+};
+
+// Helper to inject buttons using MutationObserver
+function setupDialogObserver() {
+ console.log('[RunpodDirect] Setting up dialog observer');
+
+ // Watch for the missing models dialog to appear
+ const observer = new MutationObserver((mutations) => {
+ for (const mutation of mutations) {
+ if (mutation.addedNodes.length) {
+ mutation.addedNodes.forEach(node => {
+ if (node.nodeType === Node.ELEMENT_NODE) {
+ // Check if this node or its descendants contain the missing models dialog
+ const hasDialog = node.querySelector && (
+ node.querySelector('.comfy-missing-models') ||
+ node.classList?.contains('comfy-missing-models')
+ );
+
+ if (hasDialog) {
+ console.log('[RunpodDirect] Detected missing models dialog, injecting buttons...');
+ setTimeout(() => {
+ injectServerDownloadButtons();
+ }, 500);
+ }
+ }
+ });
+ }
+ }
+ });
+
+ // Start observing the document body for dialog additions
+ observer.observe(document.body, {
+ childList: true,
+ subtree: true
+ });
+
+ console.log('[RunpodDirect] Observer active');
+}
+
+function injectServerDownloadButtons() {
+ console.log('[RunpodDirect] injectServerDownloadButtons called');
+
+ // Find the missing models listbox
+ const listbox = document.querySelector('.comfy-missing-models');
+ if (!listbox) {
+ console.log('[RunpodDirect] Missing models listbox not found');
+ return;
+ }
+
+ console.log('[RunpodDirect] Found .comfy-missing-models listbox');
+
+ // Check if we already added our UI
+ if (document.querySelector('.server-download-all-btn')) {
+ console.log('[RunpodDirect] Buttons already injected');
+ return;
+ }
+
+ const listItems = listbox.querySelectorAll('.p-listbox-option');
+ console.log(`[RunpodDirect] Found ${listItems.length} list items`);
+
+ if (listItems.length === 0) {
+ console.log('[RunpodDirect] No list items found');
+ return;
+ }
+
+ // Add "Download All" button before the listbox
+ const downloadAllContainer = document.createElement('div');
+ downloadAllContainer.style.cssText = 'margin-bottom: 16px; display: flex; justify-content: center;';
+
+ const downloadAllBtn = document.createElement('button');
+ downloadAllBtn.className = 'server-download-all-btn p-button p-component p-button-sm';
+ downloadAllBtn.type = 'button';
+ downloadAllBtn.style.cssText = 'background: #2196F3; color: white; border: none; padding: 10px 20px; font-weight: 600;';
+
+ const downloadAllLabel = document.createElement('span');
+ downloadAllLabel.className = 'p-button-label';
+ downloadAllLabel.textContent = `Download All Models to Pod (${listItems.length})`;
+ downloadAllBtn.appendChild(downloadAllLabel);
+
+ downloadAllBtn.onclick = async (e) => {
+ e.stopPropagation();
+ downloadAllBtn.disabled = true;
+ downloadAllLabel.textContent = 'Starting downloads...';
+
+ // Collect all models
+ downloadQueue = [];
+ const models = [];
+
+ listItems.forEach((item) => {
+ const labelElement = item.querySelector('[title]');
+ if (!labelElement) return;
+
+ const label = labelElement.textContent.trim();
+ const url = labelElement.getAttribute('title');
+ const parts = label.split('/').map(p => p.trim());
+ if (parts.length !== 2) return;
+
+ const directory = parts[0];
+ const filename = parts[1];
+
+ models.push({ url, directory, filename });
+ });
+
+ downloadQueue = [...models];
+ totalDownloads = models.length;
+ completedDownloads = 0;
+ isDownloadingAll = true;
+
+ // Create progress area
+ createProgressArea(listbox);
+
+ // Start first download
+ if (downloadQueue.length > 0) {
+ processDownloadQueue();
+ }
+ };
+
+ downloadAllContainer.appendChild(downloadAllBtn);
+ listbox.parentElement.insertBefore(downloadAllContainer, listbox);
+
+ listItems.forEach((item, index) => {
+ console.log(`[RunpodDirect] Processing item ${index + 1}`);
+
+ // Check if we already added the button
+ if (item.querySelector('.server-download-btn')) {
+ console.log(`[RunpodDirect] Item ${index + 1} already has server download button, skipping`);
+ return;
+ }
+
+ // The HTML structure is:
+ //
+ // <- main container
+ //
model info
+ //
Download
+ //
Copy URL
+ //
+ //
+
+ // Find the main flex container
+ const mainContainer = item.querySelector('.flex.flex-row.items-center.gap-2');
+ if (!mainContainer) {
+ console.log('[RunpodDirect] Main flex container not found');
+ return;
+ }
+
+ console.log('[RunpodDirect] Found main container');
+
+ // We'll create a new div for our button (following the same pattern)
+ const buttonWrapper = document.createElement('div');
+
+ // Get model info from the item
+ const labelElement = item.querySelector('[title]');
+ if (!labelElement) {
+ console.log('[RunpodDirect] No title element found');
+ return;
+ }
+
+ const label = labelElement.textContent.trim();
+ const url = labelElement.getAttribute('title');
+ console.log(`[RunpodDirect] Model: ${label}, URL: ${url}`);
+
+ // Parse "checkpoints / model.safetensors" format
+ const parts = label.split('/').map(p => p.trim());
+ if (parts.length !== 2) {
+ console.log(`[RunpodDirect] Could not parse label format: ${label}`);
+ return;
+ }
+
+ const directory = parts[0];
+ const filename = parts[1];
+ const download_id = `${directory}/${filename}`;
+ console.log(`[RunpodDirect] Creating button for ${download_id}`);
+
+ // Create server download button
+ const serverDownloadBtn = document.createElement('button');
+ serverDownloadBtn.className = 'server-download-btn p-button p-component p-button-outlined p-button-sm';
+ serverDownloadBtn.type = 'button';
+
+ // Create button content
+ const btnLabel = document.createElement('span');
+ btnLabel.className = 'p-button-label';
+ btnLabel.textContent = 'Download to Pod';
+ serverDownloadBtn.appendChild(btnLabel);
+
+ // Status indicator (icon)
+ const statusIcon = document.createElement('i');
+ statusIcon.style.cssText = 'margin-left: 6px; font-size: 14px; display: none;';
+ serverDownloadBtn.appendChild(statusIcon);
+
+ // Button click handler
+ serverDownloadBtn.onclick = async (e) => {
+ e.stopPropagation();
+ serverDownloadBtn.disabled = true;
+ btnLabel.textContent = 'Starting...';
+
+ const result = await startServerDownload(url, directory, filename);
+
+ if (result.success) {
+ btnLabel.textContent = 'Queued';
+ statusIcon.className = 'pi pi-clock';
+ statusIcon.style.display = 'inline';
+ statusIcon.style.color = '#FF9800';
+ } else {
+ btnLabel.textContent = 'Error';
+ statusIcon.className = 'pi pi-times-circle';
+ statusIcon.style.display = 'inline';
+ statusIcon.style.color = '#ef4444';
+ console.error('Download start failed:', result.error);
+ }
+ };
+
+ // Listen for download updates
+ const updateHandler = (event) => {
+ if (event.detail.download_id === download_id) {
+ const { status, error } = event.detail;
+
+ if (status === 'queued') {
+ serverDownloadBtn.disabled = true;
+ btnLabel.textContent = 'Queued';
+ statusIcon.className = 'pi pi-clock';
+ statusIcon.style.display = 'inline';
+ statusIcon.style.color = '#FF9800';
+ } else if (status === 'downloading') {
+ serverDownloadBtn.disabled = true;
+ btnLabel.textContent = 'Downloading';
+ statusIcon.className = 'pi pi-spin pi-spinner';
+ statusIcon.style.display = 'inline';
+ statusIcon.style.color = '#2196F3';
+ } else if (status === 'completed') {
+ btnLabel.textContent = 'Completed';
+ statusIcon.className = 'pi pi-check-circle';
+ statusIcon.style.display = 'inline';
+ statusIcon.style.color = '#4caf50';
+ serverDownloadBtn.style.borderColor = '#4caf50';
+ } else if (status === 'error') {
+ btnLabel.textContent = 'Failed';
+ statusIcon.className = 'pi pi-times-circle';
+ statusIcon.style.display = 'inline';
+ statusIcon.style.color = '#ef4444';
+ serverDownloadBtn.title = error;
+ }
+ }
+ };
+
+ window.addEventListener('serverDownloadUpdate', updateHandler);
+
+ // Add button to wrapper div
+ buttonWrapper.appendChild(serverDownloadBtn);
+
+ // Add wrapper to main container (alongside Download and Copy URL)
+ mainContainer.appendChild(buttonWrapper);
+ console.log(`[RunpodDirect] Button added to main container for ${download_id}`);
+ });
+
+ console.log('[RunpodDirect] Button injection complete');
+}
+
+// Register the extension
+app.registerExtension({
+ name: "ComfyUI.RunpodDirect",
+
+ async setup() {
+ console.log("[RunpodDirect] Extension setup starting");
+
+ // Set up observer to watch for missing models dialog
+ setupDialogObserver();
+
+ // Also try to inject immediately if dialog already exists
+ setTimeout(() => {
+ console.log('[RunpodDirect] Checking for existing dialog...');
+ injectServerDownloadButtons();
+ }, 1000);
+
+ // Try again after a longer delay
+ setTimeout(() => {
+ console.log('[RunpodDirect] Second check for dialog...');
+ injectServerDownloadButtons();
+ }, 3000);
+
+ console.log("[RunpodDirect] Extension setup complete");
+ }
+});
diff --git a/custom_nodes/comfyui-frame-interpolation/.github/workflows/publish.yml b/custom_nodes/comfyui-frame-interpolation/.github/workflows/publish.yml
new file mode 100644
index 0000000000000000000000000000000000000000..eb5b7d5f5484abc954a89dde2b97d327de44b43b
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/.github/workflows/publish.yml
@@ -0,0 +1,25 @@
+name: Publish to Comfy registry
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - main
+ paths:
+ - "pyproject.toml"
+
+permissions:
+ issues: write
+
+jobs:
+ publish-node:
+ name: Publish Custom Node to registry
+ runs-on: ubuntu-latest
+ if: ${{ github.repository_owner == 'Fannovel16' }}
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ - name: Publish Custom Node
+ uses: Comfy-Org/publish-node-action@v1
+ with:
+ ## Add your own personal access token to your Github Repository secrets and reference it here.
+ personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }}
diff --git a/custom_nodes/comfyui-frame-interpolation/.gitignore b/custom_nodes/comfyui-frame-interpolation/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c16001cc49079aaeba0e41bb39dcbf6c4ac3733d
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/.gitignore
@@ -0,0 +1,3 @@
+ckpts
+__pycache__
+test_result
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/.tracking b/custom_nodes/comfyui-frame-interpolation/.tracking
new file mode 100644
index 0000000000000000000000000000000000000000..5f9940fadb69689f4fe8a83e460898a4d0351a04
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/.tracking
@@ -0,0 +1,82 @@
+.github/workflows/publish.yml
+.gitignore
+All_in_one_v1_3.png
+LICENSE
+README.md
+__init__.py
+config.yaml
+demo_frames/anime0.png
+demo_frames/anime1.png
+demo_frames/bocchi0.jpg
+demo_frames/bocchi1.jpg
+demo_frames/real0.png
+demo_frames/real1.png
+demo_frames/rick/00003.png
+demo_frames/rick/00004.png
+demo_frames/rick/00005.png
+demo_frames/violet0.png
+demo_frames/violet1.png
+example.png
+install-taichi.bat
+install.bat
+install.py
+interpolation_schedule.png
+other_nodes.py
+pyproject.toml
+requirements-no-cupy.txt
+requirements-with-cupy.txt
+test.py
+test_vfi_schedule.gif
+vfi_models/amt/__init__.py
+vfi_models/amt/amt_arch.py
+vfi_models/cain/__init__.py
+vfi_models/cain/cain_arch.py
+vfi_models/cain/cain_encdec_arch.py
+vfi_models/cain/cain_noca_arch.py
+vfi_models/cain/common.py
+vfi_models/eisai/__init__.py
+vfi_models/eisai/eisai_arch.py
+vfi_models/film/__init__.py
+vfi_models/film/film_arch.py
+vfi_models/flavr/__init__.py
+vfi_models/flavr/flavr_arch.py
+vfi_models/flavr/resnet_3D.py
+vfi_models/gmfss_fortuna/GMFSS_Fortuna.py
+vfi_models/gmfss_fortuna/GMFSS_Fortuna_arch.py
+vfi_models/gmfss_fortuna/GMFSS_Fortuna_union.py
+vfi_models/gmfss_fortuna/GMFSS_Fortuna_union_arch.py
+vfi_models/gmfss_fortuna/__init__.py
+vfi_models/ifrnet/IFRNet_L_arch.py
+vfi_models/ifrnet/IFRNet_S_arch.py
+vfi_models/ifrnet/__init__.py
+vfi_models/ifunet/IFUNet_arch.py
+vfi_models/ifunet/__init__.py
+vfi_models/m2m/M2M_arch.py
+vfi_models/m2m/__init__.py
+vfi_models/ops/__init__.py
+vfi_models/ops/cupy_ops/__init__.py
+vfi_models/ops/cupy_ops/adacof.py
+vfi_models/ops/cupy_ops/batch_edt.py
+vfi_models/ops/cupy_ops/correlation.py
+vfi_models/ops/cupy_ops/costvol.py
+vfi_models/ops/cupy_ops/sepconv.py
+vfi_models/ops/cupy_ops/softsplat.py
+vfi_models/ops/cupy_ops/utils.py
+vfi_models/ops/taichi_ops/__init__.py
+vfi_models/ops/taichi_ops/adacof.py
+vfi_models/ops/taichi_ops/batch_edt.py
+vfi_models/ops/taichi_ops/correlation.py
+vfi_models/ops/taichi_ops/costvol.py
+vfi_models/ops/taichi_ops/raw_softsplat.py
+vfi_models/ops/taichi_ops/sepconv.py
+vfi_models/ops/taichi_ops/utils.py
+vfi_models/ops/taichi_ops/worker_process.py
+vfi_models/rife/__init__.py
+vfi_models/rife/rife_arch.py
+vfi_models/sepconv/__init__.py
+vfi_models/sepconv/sepconv_enhanced.py
+vfi_models/stmfnet/__init__.py
+vfi_models/stmfnet/stmfnet_arch.py
+vfi_models/xvfi/__init__.py
+vfi_models/xvfi/xvfi_arch.py
+vfi_utils.py
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/All_in_one_v1_3.png b/custom_nodes/comfyui-frame-interpolation/All_in_one_v1_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..364c54b9001c4a450dc434f9fd310c59a2a98af2
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/All_in_one_v1_3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:90735b644e0c35634642b65f2a8041a9a4da380d27b9bcc4d3bbef47869bd92a
+size 1462273
diff --git a/custom_nodes/comfyui-frame-interpolation/LICENSE b/custom_nodes/comfyui-frame-interpolation/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..2a8000ad9540222a0f8f50ac7fb8b04fa8dd0cd3
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Fannovel16
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/README.md b/custom_nodes/comfyui-frame-interpolation/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..f5d0f3c06b520f1f7a9724e67cc780d8709e2cbb
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/README.md
@@ -0,0 +1,194 @@
+# ComfyUI Frame Interpolation (ComfyUI VFI) (WIP)
+
+A custom node set for Video Frame Interpolation in ComfyUI.
+**UPDATE** Memory management is improved. Now this extension takes less RAM and VRAM than before.
+
+**UPDATE 2** VFI nodes now accept scheduling multipiler values
+
+
+
+
+## Nodes
+* KSampler Gradually Adding More Denoise (efficient)
+* GMFSS Fortuna VFI
+* IFRNet VFI
+* IFUnet VFI
+* M2M VFI
+* RIFE VFI (4.0 - 4.9) (Note that option `fast_mode` won't do anything from v4.5+ as `contextnet` is removed)
+* FILM VFI
+* Sepconv VFI
+* AMT VFI
+* Make Interpolation State List
+* STMFNet VFI (requires at least 4 frames, can only do 2x interpolation for now)
+* FLAVR VFI (same conditions as STMFNet)
+
+## Install
+### ComfyUI Manager
+Incompatibile issue with it is now fixed
+
+Following this guide to install this extension
+
+https://github.com/ltdrdata/ComfyUI-Manager#how-to-use
+### Command-line
+#### Windows
+Run install.bat
+
+For Window users, if you are having trouble with cupy, please run `install.bat` instead of `install-cupy.py` or `python install.py`.
+#### Linux
+Open your shell app and start venv if it is used for ComfyUI. Run:
+```
+python install.py
+```
+## Support for non-CUDA device (experimental)
+If you don't have a NVidia card, you can try `taichi` ops backend powered by [Taichi Lang](https://www.taichi-lang.org/)
+
+On Windows, you can install it by running `install.bat` or `pip install taichi` on Linux
+
+Then change value of `ops_backend` from `cupy` to `taichi` in `config.yaml`
+
+If `NotImplementedError` appears, a VFI node in the workflow isn't supported by taichi
+
+## Usage
+All VFI nodes can be accessed in **category** `ComfyUI-Frame-Interpolation/VFI` if the installation is successful and require a `IMAGE` containing frames (at least 2, or at least 4 for STMF-Net/FLAVR).
+
+Regarding STMFNet and FLAVR, if you only have two or three frames, you should use: Load Images -> Other VFI node (FILM is recommended in this case) with `multiplier=4` -> STMFNet VFI/FLAVR VFI
+
+`clear_cache_after_n_frames` is used to avoid out-of-memory. Decreasing it makes the chance lower but also increases processing time.
+
+It is recommended to use LoadImages (LoadImagesFromDirectory) from [ComfyUI-Advanced-ControlNet](https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet/) and [ComfyUI-VideoHelperSuite](https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite) along side with this extension.
+
+## Example
+### Simple workflow
+Workflow metadata isn't embeded
+Download these two images [anime0.png](./demo_frames/anime0.png) and [anime1.png](./demo_frames/anime0.png) and put them into a folder like `E:\test` in this image.
+
+
+### Complex workflow
+It's used in AnimationDiff (can load workflow metadata)
+
+
+## Credit
+Big thanks for styler00dollar for making [VSGAN-tensorrt-docker](https://github.com/styler00dollar/VSGAN-tensorrt-docker). About 99% the code of this repo comes from it.
+
+Citation for each VFI node:
+### GMFSS Fortuna
+The All-In-One GMFSS: Dedicated for Anime Video Frame Interpolation
+
+https://github.com/98mxr/GMFSS_Fortuna
+
+### IFRNet
+```bibtex
+@InProceedings{Kong_2022_CVPR,
+ author = {Kong, Lingtong and Jiang, Boyuan and Luo, Donghao and Chu, Wenqing and Huang, Xiaoming and Tai, Ying and Wang, Chengjie and Yang, Jie},
+ title = {IFRNet: Intermediate Feature Refine Network for Efficient Frame Interpolation},
+ booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
+ year = {2022}
+}
+```
+
+### IFUnet
+RIFE with IFUNet, FusionNet and RefineNet
+
+https://github.com/98mxr/IFUNet
+### M2M
+```bibtex
+@InProceedings{hu2022m2m,
+ title={Many-to-many Splatting for Efficient Video Frame Interpolation},
+ author={Hu, Ping and Niklaus, Simon and Sclaroff, Stan and Saenko, Kate},
+ journal={CVPR},
+ year={2022}
+ }
+```
+
+### RIFE
+```bibtex
+@inproceedings{huang2022rife,
+ title={Real-Time Intermediate Flow Estimation for Video Frame Interpolation},
+ author={Huang, Zhewei and Zhang, Tianyuan and Heng, Wen and Shi, Boxin and Zhou, Shuchang},
+ booktitle={Proceedings of the European Conference on Computer Vision (ECCV)},
+ year={2022}
+}
+```
+
+### FILM
+[Frame interpolation in PyTorch](https://github.com/dajes/frame-interpolation-pytorch)
+
+```bibtex
+@inproceedings{reda2022film,
+ title = {FILM: Frame Interpolation for Large Motion},
+ author = {Fitsum Reda and Janne Kontkanen and Eric Tabellion and Deqing Sun and Caroline Pantofaru and Brian Curless},
+ booktitle = {European Conference on Computer Vision (ECCV)},
+ year = {2022}
+}
+```
+
+```bibtex
+@misc{film-tf,
+ title = {Tensorflow 2 Implementation of "FILM: Frame Interpolation for Large Motion"},
+ author = {Fitsum Reda and Janne Kontkanen and Eric Tabellion and Deqing Sun and Caroline Pantofaru and Brian Curless},
+ year = {2022},
+ publisher = {GitHub},
+ journal = {GitHub repository},
+ howpublished = {\url{https://github.com/google-research/frame-interpolation}}
+}
+```
+
+### Sepconv
+```bibtex
+[1] @inproceedings{Niklaus_WACV_2021,
+ author = {Simon Niklaus and Long Mai and Oliver Wang},
+ title = {Revisiting Adaptive Convolutions for Video Frame Interpolation},
+ booktitle = {IEEE Winter Conference on Applications of Computer Vision},
+ year = {2021}
+ }
+```
+
+```bibtex
+[2] @inproceedings{Niklaus_ICCV_2017,
+ author = {Simon Niklaus and Long Mai and Feng Liu},
+ title = {Video Frame Interpolation via Adaptive Separable Convolution},
+ booktitle = {IEEE International Conference on Computer Vision},
+ year = {2017}
+ }
+```
+
+```bibtex
+[3] @inproceedings{Niklaus_CVPR_2017,
+ author = {Simon Niklaus and Long Mai and Feng Liu},
+ title = {Video Frame Interpolation via Adaptive Convolution},
+ booktitle = {IEEE Conference on Computer Vision and Pattern Recognition},
+ year = {2017}
+ }
+```
+
+### AMT
+ ```bibtex
+ @inproceedings{licvpr23amt,
+ title={AMT: All-Pairs Multi-Field Transforms for Efficient Frame Interpolation},
+ author={Li, Zhen and Zhu, Zuo-Liang and Han, Ling-Hao and Hou, Qibin and Guo, Chun-Le and Cheng, Ming-Ming},
+ booktitle={IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
+ year={2023}
+ }
+ ```
+
+### ST-MFNet
+```bibtex
+@InProceedings{Danier_2022_CVPR,
+ author = {Danier, Duolikun and Zhang, Fan and Bull, David},
+ title = {ST-MFNet: A Spatio-Temporal Multi-Flow Network for Frame Interpolation},
+ booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
+ month = {June},
+ year = {2022},
+ pages = {3521-3531}
+}
+```
+
+### FLAVR
+```bibtex
+@article{kalluri2021flavr,
+ title={FLAVR: Flow-Agnostic Video Representations for Fast Frame Interpolation},
+ author={Kalluri, Tarun and Pathak, Deepak and Chandraker, Manmohan and Tran, Du},
+ booktitle={arxiv},
+ year={2021}
+}
+```
diff --git a/custom_nodes/comfyui-frame-interpolation/__init__.py b/custom_nodes/comfyui-frame-interpolation/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..b362e2c1dbec391c923bda205c46da3a235d63ee
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/__init__.py
@@ -0,0 +1,42 @@
+import os
+import sys
+sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
+
+from .other_nodes import Gradually_More_Denoise_KSampler
+
+#Some models are commented out because the code is not completed
+#from vfi_models.eisai import EISAI_VFI
+from vfi_models.gmfss_fortuna import GMFSS_Fortuna_VFI
+from vfi_models.ifrnet import IFRNet_VFI
+from vfi_models.ifunet import IFUnet_VFI
+from vfi_models.m2m import M2M_VFI
+from vfi_models.rife import RIFE_VFI
+from vfi_models.sepconv import SepconvVFI
+from vfi_models.amt import AMT_VFI
+from vfi_models.film import FILM_VFI
+from vfi_models.stmfnet import STMFNet_VFI
+from vfi_models.flavr import FLAVR_VFI
+from vfi_models.cain import CAIN_VFI
+from vfi_utils import MakeInterpolationStateList, FloatToInt
+
+NODE_CLASS_MAPPINGS = {
+ "KSampler Gradually Adding More Denoise (efficient)": Gradually_More_Denoise_KSampler,
+# "EISAI VFI": EISAI_VFI,
+ "GMFSS Fortuna VFI": GMFSS_Fortuna_VFI,
+ "IFRNet VFI": IFRNet_VFI,
+ "IFUnet VFI": IFUnet_VFI,
+ "M2M VFI": M2M_VFI,
+ "RIFE VFI": RIFE_VFI,
+ "Sepconv VFI": SepconvVFI,
+ "AMT VFI": AMT_VFI,
+ "FILM VFI": FILM_VFI,
+ "Make Interpolation State List": MakeInterpolationStateList,
+ "STMFNet VFI": STMFNet_VFI,
+ "FLAVR VFI": FLAVR_VFI,
+ "CAIN VFI": CAIN_VFI,
+ "VFI FloatToInt": FloatToInt
+}
+
+NODE_DISPLAY_NAME_MAPPINGS = {
+ "RIFE VFI": "RIFE VFI (recommend rife47 and rife49)"
+}
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/config.yaml b/custom_nodes/comfyui-frame-interpolation/config.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b99d4a76ab08cc1157e349745770dd1f37c9ffca
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/config.yaml
@@ -0,0 +1,3 @@
+#Plz don't delete this file, just edit it when neccessary.
+ckpts_path: "./ckpts"
+ops_backend: "cupy" #Either "taichi" or "cupy"
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/demo_frames/anime0.png b/custom_nodes/comfyui-frame-interpolation/demo_frames/anime0.png
new file mode 100644
index 0000000000000000000000000000000000000000..d42b064bac5f4973f8e0119462fcfe11a53dedea
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/demo_frames/anime0.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:734039ac77a89cf8d52fed8989bd4335392a1d246b099979d1c58a145c629ace
+size 340936
diff --git a/custom_nodes/comfyui-frame-interpolation/demo_frames/anime1.png b/custom_nodes/comfyui-frame-interpolation/demo_frames/anime1.png
new file mode 100644
index 0000000000000000000000000000000000000000..69ffde9dced457a5781aa5ce82e3127bcfc15952
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/demo_frames/anime1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dd24bdafe9a0cfc82eada33c40962e9977ed5b6711ae6d89bf28b07cbded712a
+size 329357
diff --git a/custom_nodes/comfyui-frame-interpolation/demo_frames/bocchi0.jpg b/custom_nodes/comfyui-frame-interpolation/demo_frames/bocchi0.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..2b8c02eb11b949797b3785e10ac5a1c51e63b8ef
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/demo_frames/bocchi0.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c607fae213b83d4c15fa10d6939b612f7f2242afd0b8716b203ace51774f6718
+size 129774
diff --git a/custom_nodes/comfyui-frame-interpolation/demo_frames/bocchi1.jpg b/custom_nodes/comfyui-frame-interpolation/demo_frames/bocchi1.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..432a8d455f504cbfa82ae632d4ab5e8c9605b04d
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/demo_frames/bocchi1.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f03f067142490d4353d3f5af8bd51b0f9f4bdd3d2094dde6a28f4fec062fbe16
+size 139543
diff --git a/custom_nodes/comfyui-frame-interpolation/demo_frames/real0.png b/custom_nodes/comfyui-frame-interpolation/demo_frames/real0.png
new file mode 100644
index 0000000000000000000000000000000000000000..863cfb642782237734eb87916e1f24b25d2bc28b
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/demo_frames/real0.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4792023ccf17c8231c6eb5ee40de528d515e2f8c419b3949985411a122a4de4f
+size 1230238
diff --git a/custom_nodes/comfyui-frame-interpolation/demo_frames/real1.png b/custom_nodes/comfyui-frame-interpolation/demo_frames/real1.png
new file mode 100644
index 0000000000000000000000000000000000000000..beabe73d95c2114baa3b2d4a4d88ef0dbfd6adb3
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/demo_frames/real1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:37c8e6ec527c81895e5a66ea49cdd18b85045f9fed6fdfb75b45f438649235bf
+size 1213845
diff --git a/custom_nodes/comfyui-frame-interpolation/demo_frames/rick/00003.png b/custom_nodes/comfyui-frame-interpolation/demo_frames/rick/00003.png
new file mode 100644
index 0000000000000000000000000000000000000000..dfa698b75547a7da2e5f4a457b60a02f922fa729
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/demo_frames/rick/00003.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:98f5dba7557ba55d13f494425d340ca84af8b56e35f929fab5df39e54015e265
+size 456245
diff --git a/custom_nodes/comfyui-frame-interpolation/demo_frames/rick/00004.png b/custom_nodes/comfyui-frame-interpolation/demo_frames/rick/00004.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf50362fecfdb40e67625d7123f823b01c1b2937
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/demo_frames/rick/00004.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:61bcf7933b192d84870b80910f7f983371c642d5c7100b34e8cc6dbd01cba7e6
+size 354894
diff --git a/custom_nodes/comfyui-frame-interpolation/demo_frames/rick/00005.png b/custom_nodes/comfyui-frame-interpolation/demo_frames/rick/00005.png
new file mode 100644
index 0000000000000000000000000000000000000000..f886e35f4c3705b321336f8d2edad8bbd3be0243
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/demo_frames/rick/00005.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f795d06e93ad4f9c19db578e9378a48b6008cc3df81fb2cd9fbbd5ed91bd8cf7
+size 357224
diff --git a/custom_nodes/comfyui-frame-interpolation/demo_frames/violet0.png b/custom_nodes/comfyui-frame-interpolation/demo_frames/violet0.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1b60f7c60ae594fc5087ef77172f42e414eeaec
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/demo_frames/violet0.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c6844899b551801ee22d4f57993ab66fd4b6fbe00eab916d6b987bdf083eadfe
+size 888543
diff --git a/custom_nodes/comfyui-frame-interpolation/demo_frames/violet1.png b/custom_nodes/comfyui-frame-interpolation/demo_frames/violet1.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b8f96923b006f878ea8f6ab7aa03abed402ce57
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/demo_frames/violet1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:66ee9a9a486f57eb80ba5d41140eaca4ca46f0d946a3cff93eabb0ee3b1e29d0
+size 951287
diff --git a/custom_nodes/comfyui-frame-interpolation/example.png b/custom_nodes/comfyui-frame-interpolation/example.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c949e9406acc3c59d07c95ab96ae8b0b3d4834d
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/example.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9a5e9310bfba63b109990b326402d42477688682858bc64f146ef546e6662ead
+size 182103
diff --git a/custom_nodes/comfyui-frame-interpolation/install-taichi.bat b/custom_nodes/comfyui-frame-interpolation/install-taichi.bat
new file mode 100644
index 0000000000000000000000000000000000000000..d601f71c20e8ea2d768ee710a277666f2bd68643
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/install-taichi.bat
@@ -0,0 +1,11 @@
+@echo off
+echo Installing Taichi lang backend...
+
+if exist "%python_exec%" (
+ %python_exec% -s -m pip install taichi
+) else (
+ echo Installing with system Python
+ pip install taichi
+)
+
+pause
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/install.bat b/custom_nodes/comfyui-frame-interpolation/install.bat
new file mode 100644
index 0000000000000000000000000000000000000000..84e0f7eb536a2c9bfc3313a377086b9cf4aa508f
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/install.bat
@@ -0,0 +1,16 @@
+@echo off
+
+set "requirements_txt=%~dp0\requirements-no-cupy.txt"
+set "python_exec=..\..\..\python_embeded\python.exe"
+
+echo Installing ComfyUI Frame Interpolation..
+
+if exist "%python_exec%" (
+ echo Installing with ComfyUI Portable
+ %python_exec% -s install.py
+) else (
+ echo Installing with system Python
+ python install.py
+)
+
+pause
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/install.py b/custom_nodes/comfyui-frame-interpolation/install.py
new file mode 100644
index 0000000000000000000000000000000000000000..ecbe35da8bd39829134a6ee7759251e0a203d25b
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/install.py
@@ -0,0 +1,59 @@
+import os
+from pathlib import Path
+import sys
+import platform
+
+def get_cuda_ver_from_dir(cuda_home):
+ nvrtc = filter(lambda lib_file: "nvrtc-builtins" in lib_file, os.listdir(cuda_home))
+ nvrtc = list(nvrtc)
+ if len(nvrtc) == 0:
+ return
+ nvrtc = nvrtc[0]
+ if ('102' in nvrtc) or ('10.2' in nvrtc):
+ return '102'
+ if '110' in nvrtc or ('11.0' in nvrtc):
+ return '110'
+ if '111' in nvrtc or ('11.1' in nvrtc):
+ return '111'
+ if '11' in nvrtc:
+ return '11x'
+ if '12' in nvrtc:
+ return '12x'
+
+s_param = '-s' if "python_embeded" in sys.executable else ''
+
+def get_cuda_home_path():
+ if "CUDA_HOME" in os.environ:
+ return os.environ["CUDA_HOME"]
+ import torch
+ torch_lib_path = Path(torch.__file__).parent / "lib"
+ torch_lib_path = str(torch_lib_path.resolve())
+ if os.path.exists(torch_lib_path):
+ nvrtc = filter(lambda lib_file: "nvrtc-builtins" in lib_file, os.listdir(torch_lib_path))
+ nvrtc = list(nvrtc)
+ return torch_lib_path if len(nvrtc) > 0 else None
+
+def install_cupy():
+ cuda_home = get_cuda_home_path()
+ try:
+ if cuda_home is not None:
+ os.environ["CUDA_HOME"] = cuda_home
+ os.environ["CUDA_PATH"] = cuda_home
+ import cupy
+ print("CuPy is already installed.")
+ except:
+ print("Uninstall cupy if existed...")
+ os.system(f'"{sys.executable}" {s_param} -m pip uninstall -y cupy-wheel cupy-cuda102 cupy-cuda110 cupy-cuda111 cupy-cuda11x cupy-cuda12x')
+ print("Installing cupy...")
+ cuda_ver = get_cuda_ver_from_dir(cuda_home)
+ cupy_package = f"cupy-cuda{cuda_ver}" if cuda_ver is not None else "cupy-wheel"
+ os.system(f'"{sys.executable}" {s_param} -m pip install {cupy_package}')
+
+with open(Path(__file__).parent / "requirements-no-cupy.txt", 'r') as f:
+ for package in f.readlines():
+ package = package.strip()
+ print(f"Installing {package}...")
+ os.system(f'"{sys.executable}" {s_param} -m pip install {package}')
+
+print("Checking cupy...")
+install_cupy()
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/interpolation_schedule.png b/custom_nodes/comfyui-frame-interpolation/interpolation_schedule.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c308d6c811936b5f3383ebc8f9243707ed95be6
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/interpolation_schedule.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c6999ee4a5fd6222b7b05adb8afa4994053bfe8e0f9c6b5cccf25992638b586c
+size 378153
diff --git a/custom_nodes/comfyui-frame-interpolation/other_nodes.py b/custom_nodes/comfyui-frame-interpolation/other_nodes.py
new file mode 100644
index 0000000000000000000000000000000000000000..75b76fe109424a389eb4802dc4aa8c59c53329ec
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/other_nodes.py
@@ -0,0 +1,88 @@
+import latent_preview
+import comfy
+import einops
+import torch
+
+def common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent, denoise=1.0, disable_noise=False, start_step=None, last_step=None, force_full_denoise=False):
+ device = comfy.model_management.get_torch_device()
+ latent_image = latent["samples"]
+
+ if disable_noise:
+ noise = torch.zeros(latent_image.size(), dtype=latent_image.dtype, layout=latent_image.layout, device="cpu")
+ else:
+ batch_inds = latent["batch_index"] if "batch_index" in latent else None
+ noise = comfy.sample.prepare_noise(latent_image, seed, batch_inds)
+
+ noise_mask = None
+ if "noise_mask" in latent:
+ noise_mask = latent["noise_mask"]
+
+ preview_format = "JPEG"
+ if preview_format not in ["JPEG", "PNG"]:
+ preview_format = "JPEG"
+
+ previewer = latent_preview.get_previewer(device, model.model.latent_format)
+
+ pbar = comfy.utils.ProgressBar(steps)
+ def callback(step, x0, x, total_steps):
+ preview_bytes = None
+ if previewer:
+ preview_bytes = previewer.decode_latent_to_preview_image(preview_format, x0)
+ pbar.update_absolute(step + 1, total_steps, preview_bytes)
+
+ samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,
+ denoise=denoise, disable_noise=disable_noise, start_step=start_step, last_step=last_step,
+ force_full_denoise=force_full_denoise, noise_mask=noise_mask, callback=callback, seed=seed)
+ out = latent.copy()
+ out["samples"] = samples
+ return (out, )
+
+class Gradually_More_Denoise_KSampler:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {"required":
+ {"model": ("MODEL",),
+ "positive": ("CONDITIONING", ),
+ "negative": ("CONDITIONING", ),
+ "latent_image": ("LATENT", ),
+
+ "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
+ "steps": ("INT", {"default": 20, "min": 1, "max": 10000}),
+ "cfg": ("FLOAT", {"default": 8.0, "min": 0.0, "max": 100.0}),
+ "sampler_name": (comfy.samplers.KSampler.SAMPLERS, ),
+ "scheduler": (comfy.samplers.KSampler.SCHEDULERS, ),
+
+ "start_denoise": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.01}),
+ "denoise_increment": ("FLOAT", {"default": 0.1, "min": 0.0, "max": 1.0, "step": 0.1}),
+ "denoise_increment_steps": ("INT", {"default": 20, "min": 1, "max": 10000})
+ },
+ "optional": { "optional_vae": ("VAE",) }
+ }
+
+ RETURN_TYPES = ("MODEL", "CONDITIONING", "CONDITIONING", "LATENT", "VAE", )
+ RETURN_NAMES = ("MODEL", "CONDITIONING+", "CONDITIONING-", "LATENT", "VAE", )
+ OUTPUT_NODE = True
+ FUNCTION = "sample"
+ CATEGORY = "ComfyUI-Frame-Interpolation/others"
+
+ def sample(self, model, positive, negative, latent_image, optional_vae,
+ seed, steps, cfg, sampler_name, scheduler,start_denoise, denoise_increment, denoise_increment_steps):
+ if start_denoise + denoise_increment * denoise_increment_steps > 1.0:
+ raise Exception(f"Max denoise strength can't over 1.0 (start_denoise={start_denoise}, denoise_increment={denoise_increment}, denoise_increment_steps={denoise_increment_steps}")
+
+ copied_latent = latent_image.copy()
+ out_samples = []
+
+ for latent_sample in copied_latent["samples"]:
+ latent = {"samples": einops.rearrange(latent_sample, "c h w -> 1 c h w")}
+ #Latent's shape is NCHW
+ gradually_denoising_samples = [
+ common_ksampler(
+ model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent, denoise=start_denoise + denoise_increment * i
+ )[0]["samples"]
+ for i in range(denoise_increment_steps)
+ ]
+ out_samples.extend(gradually_denoising_samples)
+
+ copied_latent["samples"] = torch.cat(out_samples, dim=0)
+ return (model, positive, negative, copied_latent, optional_vae)
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/pyproject.toml b/custom_nodes/comfyui-frame-interpolation/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..9878e796c78d0231e7ecb21c7c361a6038bd067f
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/pyproject.toml
@@ -0,0 +1,13 @@
+[project]
+name = "comfyui-frame-interpolation"
+description = "A custom node suite for Video Frame Interpolation in ComfyUI"
+version = "1.0.7"
+license = { file = "LICENSE" }
+
+[project.urls]
+Repository = "https://github.com/Fannovel16/ComfyUI-Frame-Interpolation"
+
+[tool.comfy]
+PublisherId = "fannovel16"
+DisplayName = "ComfyUI-Frame-Interpolation"
+Icon = ""
diff --git a/custom_nodes/comfyui-frame-interpolation/requirements-no-cupy.txt b/custom_nodes/comfyui-frame-interpolation/requirements-no-cupy.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c490ca515d47b6623861b051fd822d24bc2ecd7e
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/requirements-no-cupy.txt
@@ -0,0 +1,9 @@
+torch
+numpy
+einops
+opencv-contrib-python
+kornia
+scipy
+Pillow
+torchvision
+tqdm
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/requirements-with-cupy.txt b/custom_nodes/comfyui-frame-interpolation/requirements-with-cupy.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bdfeb47253006b2897a2dd3ff1e7c91ccb41e1b2
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/requirements-with-cupy.txt
@@ -0,0 +1,10 @@
+torch
+numpy
+einops
+opencv-contrib-python
+kornia
+scipy
+Pillow
+torchvision
+tqdm
+cupy-wheel
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/test.py b/custom_nodes/comfyui-frame-interpolation/test.py
new file mode 100644
index 0000000000000000000000000000000000000000..3c06ae20dc974344ed091dce2e410666a9fdd56f
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/test.py
@@ -0,0 +1,38 @@
+import os
+import sys
+sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
+
+import shutil
+import torch
+import torch.nn.functional as F
+import PIL
+import torchvision.transforms.functional as transform
+from vfi_utils import load_file_from_github_release
+from vfi_models import gmfss_fortuna, ifrnet, ifunet, m2m, rife, sepconv, amt, xvfi, cain, flavr
+import numpy as np
+
+frame_0 = torch.from_numpy(np.array(PIL.Image.open("demo_frames/anime0.png").convert("RGB")).astype(np.float32) / 255.0).unsqueeze(0)
+frame_1 = torch.from_numpy(np.array(PIL.Image.open("demo_frames/anime1.png").convert("RGB")).astype(np.float32) / 255.0).unsqueeze(0)
+
+
+if os.path.exists("test_result"):
+ shutil.rmtree("test_result")
+
+vfi_node_class = gmfss_fortuna.GMFSS_Fortuna_VFI()
+for i, ckpt_name in enumerate(vfi_node_class.INPUT_TYPES()["required"]["ckpt_name"][0][:2]):
+ result = vfi_node_class.vfi(ckpt_name, torch.cat([
+ frame_0,
+ frame_1,
+ frame_0,
+ frame_1
+ ], dim=0).cuda(), multipler=4, batch_size=2)[0]
+ print(result.shape)
+ print(f"Generated {result.size(0)} frames")
+ frames = [PIL.Image.fromarray(np.clip((frame * 255).numpy(), 0, 255).astype(np.uint8)) for frame in result]
+ print(result[0].shape)
+ os.makedirs(f"test_result/video{i}", exist_ok=True)
+ for j, frame in enumerate(frames):
+ frame.save(f"test_result/video{i}/{j}.jpg")
+ frames[0].save(f"test_result/video{i}.gif", save_all=True, append_images=frames[1:], optimize=True, duration=1/3, loop=0)
+ os.startfile(f"test_result{os.path.sep}video{i}.gif")
+#torchvision.io.video.write_video("test.mp4", einops.rearrange(result, "n c h w -> n h w c").cpu(), fps=1)
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/test_vfi_schedule.gif b/custom_nodes/comfyui-frame-interpolation/test_vfi_schedule.gif
new file mode 100644
index 0000000000000000000000000000000000000000..52fabecc38ae3050e723e8b4eb213fd41ad36195
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/test_vfi_schedule.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:931fcd4c2cc84b457cbc1b1c3b8745a2bf292ff7dc43d4f733a2c510ad90353d
+size 8409697
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/amt/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/amt/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..20740c2a4d9d669a625db6f729ef11b18c449e9a
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/amt/__init__.py
@@ -0,0 +1,87 @@
+import pathlib
+import torch
+from torch.utils.data import DataLoader
+import pathlib
+from vfi_utils import load_file_from_direct_url, preprocess_frames, postprocess_frames, generic_frame_loop, InterpolationStateList
+import typing
+from comfy.model_management import get_torch_device
+from .amt_arch import AMT_S, AMT_L, AMT_G, InputPadder
+
+#https://github.com/MCG-NKU/AMT/tree/main/cfgs
+CKPT_CONFIGS = {
+ "amt-s.pth": {
+ "network": AMT_S,
+ "params": { "corr_radius": 3, "corr_lvls": 4, "num_flows": 3 }
+ },
+ "amt-l.pth": {
+ "network": AMT_L,
+ "params": { "corr_radius": 3, "corr_lvls": 4, "num_flows": 5 }
+ },
+ "amt-g.pth": {
+ "network": AMT_G,
+ "params": { "corr_radius": 3, "corr_lvls": 4, "num_flows": 5 }
+ },
+ "gopro_amt-s.pth": {
+ "network": AMT_S,
+ "params": { "corr_radius": 3, "corr_lvls": 4, "num_flows": 3 }
+ }
+}
+
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+
+class AMT_VFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (list(CKPT_CONFIGS.keys()), ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 1, "min": 1, "max": 100}),
+ "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames: typing.SupportsInt = 1,
+ multiplier: typing.SupportsInt = 2,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ model_path = load_file_from_direct_url(MODEL_TYPE, f"https://huggingface.co/lalala125/AMT/resolve/main/{ckpt_name}")
+ ckpt_config = CKPT_CONFIGS[ckpt_name]
+
+ interpolation_model = ckpt_config["network"](**ckpt_config["params"])
+ interpolation_model.load_state_dict(torch.load(model_path)["state_dict"])
+ interpolation_model.eval().to(get_torch_device())
+
+ frames = preprocess_frames(frames)
+ padder = InputPadder(frames.shape, 16)
+ frames = padder.pad(frames)
+
+ def return_middle_frame(frame_0, frame_1, timestep, model):
+ return model(
+ frame_0,
+ frame_1,
+ embt=torch.FloatTensor([timestep] * frame_0.shape[0]).view(frame_0.shape[0], 1, 1, 1).to(get_torch_device()),
+ scale_factor=1.0,
+ eval=True
+ )["imgt_pred"]
+
+ args = [interpolation_model]
+ out = generic_frame_loop(type(self).__name__, frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
+ interpolation_states=optional_interpolation_states, dtype=torch.float32)
+ out = padder.unpad(out)
+ out = postprocess_frames(out)
+ return (out,)
+
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/amt/amt_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/amt/amt_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..448c4d56193a833d3a1c89ea3e8475258f11958a
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/amt/amt_arch.py
@@ -0,0 +1,1590 @@
+"""
+https://github.com/MCG-NKU/AMT/blob/main/utils/dist_utils.py
+https://github.com/MCG-NKU/AMT/blob/main/utils/flow_utils.py
+https://github.com/MCG-NKU/AMT/blob/main/utils/utils.py
+https://github.com/MCG-NKU/AMT/blob/main/networks/blocks/feat_enc.py
+https://github.com/MCG-NKU/AMT/blob/main/networks/blocks/ifrnet.py
+https://github.com/MCG-NKU/AMT/blob/main/networks/blocks/multi_flow.py
+https://github.com/MCG-NKU/AMT/blob/main/networks/blocks/raft.py
+https://github.com/MCG-NKU/AMT/blob/main/networks/AMT-S.py
+https://github.com/MCG-NKU/AMT/blob/main/networks/AMT-L.py
+https://github.com/MCG-NKU/AMT/blob/main/networks/AMT-G.py
+"""
+#Removed imageio by removing readImage, writeImage
+#The model will receive image tensors from other ComfyUI's nodes so they are unneccessary
+
+import torch
+import torch.nn as nn
+import numpy as np
+from PIL import ImageFile
+import torch.nn.functional as F
+ImageFile.LOAD_TRUNCATED_IMAGES = True
+import re
+import sys
+import random
+
+def warp(img, flow):
+ B, _, H, W = flow.shape
+ xx = torch.linspace(-1.0, 1.0, W).view(1, 1, 1, W).expand(B, -1, H, -1)
+ yy = torch.linspace(-1.0, 1.0, H).view(1, 1, H, 1).expand(B, -1, -1, W)
+ grid = torch.cat([xx, yy], 1).to(img)
+ flow_ = torch.cat([flow[:, 0:1, :, :] / ((W - 1.0) / 2.0), flow[:, 1:2, :, :] / ((H - 1.0) / 2.0)], 1)
+ grid_ = (grid + flow_).permute(0, 2, 3, 1)
+ output = F.grid_sample(input=img, grid=grid_, mode='bilinear', padding_mode='border', align_corners=True)
+ return output
+
+
+def make_colorwheel():
+ """
+ Generates a color wheel for optical flow visualization as presented in:
+ Baker et al. "A Database and Evaluation Methodology for Optical Flow" (ICCV, 2007)
+ URL: http://vision.middlebury.edu/flow/flowEval-iccv07.pdf
+ Code follows the original C++ source code of Daniel Scharstein.
+ Code follows the the Matlab source code of Deqing Sun.
+ Returns:
+ np.ndarray: Color wheel
+ """
+
+ RY = 15
+ YG = 6
+ GC = 4
+ CB = 11
+ BM = 13
+ MR = 6
+
+ ncols = RY + YG + GC + CB + BM + MR
+ colorwheel = np.zeros((ncols, 3))
+ col = 0
+
+ # RY
+ colorwheel[0:RY, 0] = 255
+ colorwheel[0:RY, 1] = np.floor(255*np.arange(0,RY)/RY)
+ col = col+RY
+ # YG
+ colorwheel[col:col+YG, 0] = 255 - np.floor(255*np.arange(0,YG)/YG)
+ colorwheel[col:col+YG, 1] = 255
+ col = col+YG
+ # GC
+ colorwheel[col:col+GC, 1] = 255
+ colorwheel[col:col+GC, 2] = np.floor(255*np.arange(0,GC)/GC)
+ col = col+GC
+ # CB
+ colorwheel[col:col+CB, 1] = 255 - np.floor(255*np.arange(CB)/CB)
+ colorwheel[col:col+CB, 2] = 255
+ col = col+CB
+ # BM
+ colorwheel[col:col+BM, 2] = 255
+ colorwheel[col:col+BM, 0] = np.floor(255*np.arange(0,BM)/BM)
+ col = col+BM
+ # MR
+ colorwheel[col:col+MR, 2] = 255 - np.floor(255*np.arange(MR)/MR)
+ colorwheel[col:col+MR, 0] = 255
+ return colorwheel
+
+def flow_uv_to_colors(u, v, convert_to_bgr=False):
+ """
+ Applies the flow color wheel to (possibly clipped) flow components u and v.
+ According to the C++ source code of Daniel Scharstein
+ According to the Matlab source code of Deqing Sun
+ Args:
+ u (np.ndarray): Input horizontal flow of shape [H,W]
+ v (np.ndarray): Input vertical flow of shape [H,W]
+ convert_to_bgr (bool, optional): Convert output image to BGR. Defaults to False.
+ Returns:
+ np.ndarray: Flow visualization image of shape [H,W,3]
+ """
+ flow_image = np.zeros((u.shape[0], u.shape[1], 3), np.uint8)
+ colorwheel = make_colorwheel() # shape [55x3]
+ ncols = colorwheel.shape[0]
+ rad = np.sqrt(np.square(u) + np.square(v))
+ a = np.arctan2(-v, -u)/np.pi
+ fk = (a+1) / 2*(ncols-1)
+ k0 = np.floor(fk).astype(np.int32)
+ k1 = k0 + 1
+ k1[k1 == ncols] = 0
+ f = fk - k0
+ for i in range(colorwheel.shape[1]):
+ tmp = colorwheel[:,i]
+ col0 = tmp[k0] / 255.0
+ col1 = tmp[k1] / 255.0
+ col = (1-f)*col0 + f*col1
+ idx = (rad <= 1)
+ col[idx] = 1 - rad[idx] * (1-col[idx])
+ col[~idx] = col[~idx] * 0.75 # out of range
+ # Note the 2-i => BGR instead of RGB
+ ch_idx = 2-i if convert_to_bgr else i
+ flow_image[:,:,ch_idx] = np.floor(255 * col)
+ return flow_image
+
+def flow_to_image(flow_uv, clip_flow=None, convert_to_bgr=False):
+ """
+ Expects a two dimensional flow image of shape.
+ Args:
+ flow_uv (np.ndarray): Flow UV image of shape [H,W,2]
+ clip_flow (float, optional): Clip maximum of flow values. Defaults to None.
+ convert_to_bgr (bool, optional): Convert output image to BGR. Defaults to False.
+ Returns:
+ np.ndarray: Flow visualization image of shape [H,W,3]
+ """
+ assert flow_uv.ndim == 3, 'input flow must have three dimensions'
+ assert flow_uv.shape[2] == 2, 'input flow must have shape [H,W,2]'
+ if clip_flow is not None:
+ flow_uv = np.clip(flow_uv, 0, clip_flow)
+ u = flow_uv[:,:,0]
+ v = flow_uv[:,:,1]
+ rad = np.sqrt(np.square(u) + np.square(v))
+ rad_max = np.max(rad)
+ epsilon = 1e-5
+ u = u / (rad_max + epsilon)
+ v = v / (rad_max + epsilon)
+ return flow_uv_to_colors(u, v, convert_to_bgr)
+
+
+
+
+
+
+
+
+
+
+
+class AverageMeter():
+ def __init__(self):
+ self.reset()
+
+ def reset(self):
+ self.val = 0.
+ self.avg = 0.
+ self.sum = 0.
+ self.count = 0
+
+ def update(self, val, n=1):
+ self.val = val
+ self.sum += val * n
+ self.count += n
+ self.avg = self.sum / self.count
+
+
+class AverageMeterGroups:
+ def __init__(self) -> None:
+ self.meter_dict = dict()
+
+ def update(self, dict, n=1):
+ for name, val in dict.items():
+ if self.meter_dict.get(name) is None:
+ self.meter_dict[name] = AverageMeter()
+ self.meter_dict[name].update(val, n)
+
+ def reset(self, name=None):
+ if name is None:
+ for v in self.meter_dict.values():
+ v.reset()
+ else:
+ meter = self.meter_dict.get(name)
+ if meter is not None:
+ meter.reset()
+
+ def avg(self, name):
+ meter = self.meter_dict.get(name)
+ if meter is not None:
+ return meter.avg
+
+
+class InputPadder:
+ """ Pads images such that dimensions are divisible by divisor """
+ def __init__(self, dims, divisor=16):
+ self.ht, self.wd = dims[-2:]
+ pad_ht = (((self.ht // divisor) + 1) * divisor - self.ht) % divisor
+ pad_wd = (((self.wd // divisor) + 1) * divisor - self.wd) % divisor
+ self._pad = [pad_wd//2, pad_wd - pad_wd//2, pad_ht//2, pad_ht - pad_ht//2]
+
+ def pad(self, input_tensor):
+ return F.pad(input_tensor, self._pad, mode='replicate')
+
+ def unpad(self, input_tensor):
+ return self._unpad(input_tensor)
+
+ def _unpad(self, x):
+ ht, wd = x.shape[-2:]
+ c = [self._pad[2], ht-self._pad[3], self._pad[0], wd-self._pad[1]]
+ return x[..., c[0]:c[1], c[2]:c[3]]
+
+
+def img2tensor(img):
+ if img.shape[-1] > 3:
+ img = img[:,:,:3]
+ return torch.tensor(img).permute(2, 0, 1).unsqueeze(0) / 255.0
+
+
+def tensor2img(img_t):
+ return (img_t * 255.).detach(
+ ).squeeze(0).permute(1, 2, 0).cpu().numpy(
+ ).clip(0, 255).astype(np.uint8)
+
+def seed_all(seed):
+ random.seed(seed)
+ np.random.seed(seed)
+ torch.manual_seed(seed)
+ torch.cuda.manual_seed_all(seed)
+
+
+def readPFM(file):
+ file = open(file, 'rb')
+
+ color = None
+ width = None
+ height = None
+ scale = None
+ endian = None
+
+ header = file.readline().rstrip()
+ if header.decode("ascii") == 'PF':
+ color = True
+ elif header.decode("ascii") == 'Pf':
+ color = False
+ else:
+ raise Exception('Not a PFM file.')
+
+ dim_match = re.match(r'^(\d+)\s(\d+)\s$', file.readline().decode("ascii"))
+ if dim_match:
+ width, height = list(map(int, dim_match.groups()))
+ else:
+ raise Exception('Malformed PFM header.')
+
+ scale = float(file.readline().decode("ascii").rstrip())
+ if scale < 0:
+ endian = '<'
+ scale = -scale
+ else:
+ endian = '>'
+
+ data = np.fromfile(file, endian + 'f')
+ shape = (height, width, 3) if color else (height, width)
+
+ data = np.reshape(data, shape)
+ data = np.flipud(data)
+ return data, scale
+
+
+def writePFM(file, image, scale=1):
+ file = open(file, 'wb')
+
+ color = None
+
+ if image.dtype.name != 'float32':
+ raise Exception('Image dtype must be float32.')
+
+ image = np.flipud(image)
+
+ if len(image.shape) == 3 and image.shape[2] == 3:
+ color = True
+ elif len(image.shape) == 2 or len(image.shape) == 3 and image.shape[2] == 1:
+ color = False
+ else:
+ raise Exception('Image must have H x W x 3, H x W x 1 or H x W dimensions.')
+
+ file.write('PF\n' if color else 'Pf\n'.encode())
+ file.write('%d %d\n'.encode() % (image.shape[1], image.shape[0]))
+
+ endian = image.dtype.byteorder
+
+ if endian == '<' or endian == '=' and sys.byteorder == 'little':
+ scale = -scale
+
+ file.write('%f\n'.encode() % scale)
+
+ image.tofile(file)
+
+
+def readFlow(name):
+ if name.endswith('.pfm') or name.endswith('.PFM'):
+ return readPFM(name)[0][:,:,0:2]
+
+ f = open(name, 'rb')
+
+ header = f.read(4)
+ if header.decode("utf-8") != 'PIEH':
+ raise Exception('Flow file header does not contain PIEH')
+
+ width = np.fromfile(f, np.int32, 1).squeeze()
+ height = np.fromfile(f, np.int32, 1).squeeze()
+
+ flow = np.fromfile(f, np.float32, width * height * 2).reshape((height, width, 2))
+
+ return flow.astype(np.float32)
+
+def writeFlow(name, flow):
+ f = open(name, 'wb')
+ f.write('PIEH'.encode('utf-8'))
+ np.array([flow.shape[1], flow.shape[0]], dtype=np.int32).tofile(f)
+ flow = flow.astype(np.float32)
+ flow.tofile(f)
+
+
+def readFloat(name):
+ f = open(name, 'rb')
+
+ if(f.readline().decode("utf-8")) != 'float\n':
+ raise Exception('float file %s did not contain keyword' % name)
+
+ dim = int(f.readline())
+
+ dims = []
+ count = 1
+ for i in range(0, dim):
+ d = int(f.readline())
+ dims.append(d)
+ count *= d
+
+ dims = list(reversed(dims))
+
+ data = np.fromfile(f, np.float32, count).reshape(dims)
+ if dim > 2:
+ data = np.transpose(data, (2, 1, 0))
+ data = np.transpose(data, (1, 0, 2))
+
+ return data
+
+
+def writeFloat(name, data):
+ f = open(name, 'wb')
+
+ dim=len(data.shape)
+ if dim>3:
+ raise Exception('bad float file dimension: %d' % dim)
+
+ f.write(('float\n').encode('ascii'))
+ f.write(('%d\n' % dim).encode('ascii'))
+
+ if dim == 1:
+ f.write(('%d\n' % data.shape[0]).encode('ascii'))
+ else:
+ f.write(('%d\n' % data.shape[1]).encode('ascii'))
+ f.write(('%d\n' % data.shape[0]).encode('ascii'))
+ for i in range(2, dim):
+ f.write(('%d\n' % data.shape[i]).encode('ascii'))
+
+ data = data.astype(np.float32)
+ if dim==2:
+ data.tofile(f)
+
+ else:
+ np.transpose(data, (2, 0, 1)).tofile(f)
+
+
+def check_dim_and_resize(tensor_list):
+ shape_list = []
+ for t in tensor_list:
+ shape_list.append(t.shape[2:])
+
+ if len(set(shape_list)) > 1:
+ desired_shape = shape_list[0]
+ print(f'Inconsistent size of input video frames. All frames will be resized to {desired_shape}')
+
+ resize_tensor_list = []
+ for t in tensor_list:
+ resize_tensor_list.append(torch.nn.functional.interpolate(t, size=tuple(desired_shape), mode='bilinear'))
+
+ tensor_list = resize_tensor_list
+
+ return tensor_list
+
+
+
+
+
+
+
+
+
+
+
+class BottleneckBlock(nn.Module):
+ def __init__(self, in_planes, planes, norm_fn='group', stride=1):
+ super(BottleneckBlock, self).__init__()
+
+ self.conv1 = nn.Conv2d(in_planes, planes//4, kernel_size=1, padding=0)
+ self.conv2 = nn.Conv2d(planes//4, planes//4, kernel_size=3, padding=1, stride=stride)
+ self.conv3 = nn.Conv2d(planes//4, planes, kernel_size=1, padding=0)
+ self.relu = nn.ReLU(inplace=True)
+
+ num_groups = planes // 8
+
+ if norm_fn == 'group':
+ self.norm1 = nn.GroupNorm(num_groups=num_groups, num_channels=planes//4)
+ self.norm2 = nn.GroupNorm(num_groups=num_groups, num_channels=planes//4)
+ self.norm3 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
+ if not stride == 1:
+ self.norm4 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
+
+ elif norm_fn == 'batch':
+ self.norm1 = nn.BatchNorm2d(planes//4)
+ self.norm2 = nn.BatchNorm2d(planes//4)
+ self.norm3 = nn.BatchNorm2d(planes)
+ if not stride == 1:
+ self.norm4 = nn.BatchNorm2d(planes)
+
+ elif norm_fn == 'instance':
+ self.norm1 = nn.InstanceNorm2d(planes//4)
+ self.norm2 = nn.InstanceNorm2d(planes//4)
+ self.norm3 = nn.InstanceNorm2d(planes)
+ if not stride == 1:
+ self.norm4 = nn.InstanceNorm2d(planes)
+
+ elif norm_fn == 'none':
+ self.norm1 = nn.Sequential()
+ self.norm2 = nn.Sequential()
+ self.norm3 = nn.Sequential()
+ if not stride == 1:
+ self.norm4 = nn.Sequential()
+
+ if stride == 1:
+ self.downsample = None
+
+ else:
+ self.downsample = nn.Sequential(
+ nn.Conv2d(in_planes, planes, kernel_size=1, stride=stride), self.norm4)
+
+
+ def forward(self, x):
+ y = x
+ y = self.relu(self.norm1(self.conv1(y)))
+ y = self.relu(self.norm2(self.conv2(y)))
+ y = self.relu(self.norm3(self.conv3(y)))
+
+ if self.downsample is not None:
+ x = self.downsample(x)
+
+ return self.relu(x+y)
+
+
+class ResidualBlock(nn.Module):
+ def __init__(self, in_planes, planes, norm_fn='group', stride=1):
+ super(ResidualBlock, self).__init__()
+
+ self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3, padding=1, stride=stride)
+ self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, padding=1)
+ self.relu = nn.ReLU(inplace=True)
+
+ num_groups = planes // 8
+
+ if norm_fn == 'group':
+ self.norm1 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
+ self.norm2 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
+ if not stride == 1:
+ self.norm3 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
+
+ elif norm_fn == 'batch':
+ self.norm1 = nn.BatchNorm2d(planes)
+ self.norm2 = nn.BatchNorm2d(planes)
+ if not stride == 1:
+ self.norm3 = nn.BatchNorm2d(planes)
+
+ elif norm_fn == 'instance':
+ self.norm1 = nn.InstanceNorm2d(planes)
+ self.norm2 = nn.InstanceNorm2d(planes)
+ if not stride == 1:
+ self.norm3 = nn.InstanceNorm2d(planes)
+
+ elif norm_fn == 'none':
+ self.norm1 = nn.Sequential()
+ self.norm2 = nn.Sequential()
+ if not stride == 1:
+ self.norm3 = nn.Sequential()
+
+ if stride == 1:
+ self.downsample = None
+
+ else:
+ self.downsample = nn.Sequential(
+ nn.Conv2d(in_planes, planes, kernel_size=1, stride=stride), self.norm3)
+
+
+ def forward(self, x):
+ y = x
+ y = self.relu(self.norm1(self.conv1(y)))
+ y = self.relu(self.norm2(self.conv2(y)))
+
+ if self.downsample is not None:
+ x = self.downsample(x)
+
+ return self.relu(x+y)
+
+
+class SmallEncoder(nn.Module):
+ def __init__(self, output_dim=128, norm_fn='batch', dropout=0.0):
+ super(SmallEncoder, self).__init__()
+ self.norm_fn = norm_fn
+
+ if self.norm_fn == 'group':
+ self.norm1 = nn.GroupNorm(num_groups=8, num_channels=32)
+
+ elif self.norm_fn == 'batch':
+ self.norm1 = nn.BatchNorm2d(32)
+
+ elif self.norm_fn == 'instance':
+ self.norm1 = nn.InstanceNorm2d(32)
+
+ elif self.norm_fn == 'none':
+ self.norm1 = nn.Sequential()
+
+ self.conv1 = nn.Conv2d(3, 32, kernel_size=7, stride=2, padding=3)
+ self.relu1 = nn.ReLU(inplace=True)
+
+ self.in_planes = 32
+ self.layer1 = self._make_layer(32, stride=1)
+ self.layer2 = self._make_layer(64, stride=2)
+ self.layer3 = self._make_layer(96, stride=2)
+
+ self.dropout = None
+ if dropout > 0:
+ self.dropout = nn.Dropout2d(p=dropout)
+
+ self.conv2 = nn.Conv2d(96, output_dim, kernel_size=1)
+
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
+ elif isinstance(m, (nn.BatchNorm2d, nn.InstanceNorm2d, nn.GroupNorm)):
+ if m.weight is not None:
+ nn.init.constant_(m.weight, 1)
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+
+ def _make_layer(self, dim, stride=1):
+ layer1 = BottleneckBlock(self.in_planes, dim, self.norm_fn, stride=stride)
+ layer2 = BottleneckBlock(dim, dim, self.norm_fn, stride=1)
+ layers = (layer1, layer2)
+
+ self.in_planes = dim
+ return nn.Sequential(*layers)
+
+
+ def forward(self, x):
+
+ # if input is list, combine batch dimension
+ is_list = isinstance(x, tuple) or isinstance(x, list)
+ if is_list:
+ batch_dim = x[0].shape[0]
+ x = torch.cat(x, dim=0)
+
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu1(x)
+
+ x = self.layer1(x)
+ x = self.layer2(x)
+ x = self.layer3(x)
+ x = self.conv2(x)
+
+ if self.training and self.dropout is not None:
+ x = self.dropout(x)
+
+ if is_list:
+ x = torch.split(x, [batch_dim, batch_dim], dim=0)
+
+ return x
+
+class BasicEncoder(nn.Module):
+ def __init__(self, output_dim=128, norm_fn='batch', dropout=0.0):
+ super(BasicEncoder, self).__init__()
+ self.norm_fn = norm_fn
+
+ if self.norm_fn == 'group':
+ self.norm1 = nn.GroupNorm(num_groups=8, num_channels=64)
+
+ elif self.norm_fn == 'batch':
+ self.norm1 = nn.BatchNorm2d(64)
+
+ elif self.norm_fn == 'instance':
+ self.norm1 = nn.InstanceNorm2d(64)
+
+ elif self.norm_fn == 'none':
+ self.norm1 = nn.Sequential()
+
+ self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3)
+ self.relu1 = nn.ReLU(inplace=True)
+
+ self.in_planes = 64
+ self.layer1 = self._make_layer(64, stride=1)
+ self.layer2 = self._make_layer(72, stride=2)
+ self.layer3 = self._make_layer(128, stride=2)
+
+ # output convolution
+ self.conv2 = nn.Conv2d(128, output_dim, kernel_size=1)
+
+ self.dropout = None
+ if dropout > 0:
+ self.dropout = nn.Dropout2d(p=dropout)
+
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
+ elif isinstance(m, (nn.BatchNorm2d, nn.InstanceNorm2d, nn.GroupNorm)):
+ if m.weight is not None:
+ nn.init.constant_(m.weight, 1)
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+
+ def _make_layer(self, dim, stride=1):
+ layer1 = ResidualBlock(self.in_planes, dim, self.norm_fn, stride=stride)
+ layer2 = ResidualBlock(dim, dim, self.norm_fn, stride=1)
+ layers = (layer1, layer2)
+
+ self.in_planes = dim
+ return nn.Sequential(*layers)
+
+
+ def forward(self, x):
+
+ # if input is list, combine batch dimension
+ is_list = isinstance(x, tuple) or isinstance(x, list)
+ if is_list:
+ batch_dim = x[0].shape[0]
+ x = torch.cat(x, dim=0)
+
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu1(x)
+
+ x = self.layer1(x)
+ x = self.layer2(x)
+ x = self.layer3(x)
+
+ x = self.conv2(x)
+
+ if self.training and self.dropout is not None:
+ x = self.dropout(x)
+
+ if is_list:
+ x = torch.split(x, [batch_dim, batch_dim], dim=0)
+
+ return x
+
+class LargeEncoder(nn.Module):
+ def __init__(self, output_dim=128, norm_fn='batch', dropout=0.0):
+ super(LargeEncoder, self).__init__()
+ self.norm_fn = norm_fn
+
+ if self.norm_fn == 'group':
+ self.norm1 = nn.GroupNorm(num_groups=8, num_channels=64)
+
+ elif self.norm_fn == 'batch':
+ self.norm1 = nn.BatchNorm2d(64)
+
+ elif self.norm_fn == 'instance':
+ self.norm1 = nn.InstanceNorm2d(64)
+
+ elif self.norm_fn == 'none':
+ self.norm1 = nn.Sequential()
+
+ self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3)
+ self.relu1 = nn.ReLU(inplace=True)
+
+ self.in_planes = 64
+ self.layer1 = self._make_layer(64, stride=1)
+ self.layer2 = self._make_layer(112, stride=2)
+ self.layer3 = self._make_layer(160, stride=2)
+ self.layer3_2 = self._make_layer(160, stride=1)
+
+ # output convolution
+ self.conv2 = nn.Conv2d(self.in_planes, output_dim, kernel_size=1)
+
+ self.dropout = None
+ if dropout > 0:
+ self.dropout = nn.Dropout2d(p=dropout)
+
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
+ elif isinstance(m, (nn.BatchNorm2d, nn.InstanceNorm2d, nn.GroupNorm)):
+ if m.weight is not None:
+ nn.init.constant_(m.weight, 1)
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+
+ def _make_layer(self, dim, stride=1):
+ layer1 = ResidualBlock(self.in_planes, dim, self.norm_fn, stride=stride)
+ layer2 = ResidualBlock(dim, dim, self.norm_fn, stride=1)
+ layers = (layer1, layer2)
+
+ self.in_planes = dim
+ return nn.Sequential(*layers)
+
+
+ def forward(self, x):
+
+ # if input is list, combine batch dimension
+ is_list = isinstance(x, tuple) or isinstance(x, list)
+ if is_list:
+ batch_dim = x[0].shape[0]
+ x = torch.cat(x, dim=0)
+
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu1(x)
+
+ x = self.layer1(x)
+ x = self.layer2(x)
+ x = self.layer3(x)
+ x = self.layer3_2(x)
+
+ x = self.conv2(x)
+
+ if self.training and self.dropout is not None:
+ x = self.dropout(x)
+
+ if is_list:
+ x = torch.split(x, [batch_dim, batch_dim], dim=0)
+
+ return x
+
+
+
+
+
+
+
+
+
+
+
+def resize(x, scale_factor):
+ return F.interpolate(x, scale_factor=scale_factor, mode="bilinear", align_corners=False)
+
+def convrelu(in_channels, out_channels, kernel_size=3, stride=1, padding=1, dilation=1, groups=1, bias=True):
+ return nn.Sequential(
+ nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, dilation, groups, bias=bias),
+ nn.PReLU(out_channels)
+ )
+
+class ResBlock(nn.Module):
+ def __init__(self, in_channels, side_channels, bias=True):
+ super(ResBlock, self).__init__()
+ self.side_channels = side_channels
+ self.conv1 = nn.Sequential(
+ nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1, bias=bias),
+ nn.PReLU(in_channels)
+ )
+ self.conv2 = nn.Sequential(
+ nn.Conv2d(side_channels, side_channels, kernel_size=3, stride=1, padding=1, bias=bias),
+ nn.PReLU(side_channels)
+ )
+ self.conv3 = nn.Sequential(
+ nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1, bias=bias),
+ nn.PReLU(in_channels)
+ )
+ self.conv4 = nn.Sequential(
+ nn.Conv2d(side_channels, side_channels, kernel_size=3, stride=1, padding=1, bias=bias),
+ nn.PReLU(side_channels)
+ )
+ self.conv5 = nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1, bias=bias)
+ self.prelu = nn.PReLU(in_channels)
+
+ def forward(self, x):
+ out = self.conv1(x)
+
+ res_feat = out[:, :-self.side_channels, ...]
+ side_feat = out[:, -self.side_channels:, :, :]
+ side_feat = self.conv2(side_feat)
+ out = self.conv3(torch.cat([res_feat, side_feat], 1))
+
+ res_feat = out[:, :-self.side_channels, ...]
+ side_feat = out[:, -self.side_channels:, :, :]
+ side_feat = self.conv4(side_feat)
+ out = self.conv5(torch.cat([res_feat, side_feat], 1))
+
+ out = self.prelu(x + out)
+ return out
+
+class Encoder(nn.Module):
+ def __init__(self, channels, large=False):
+ super(Encoder, self).__init__()
+ self.channels = channels
+ prev_ch = 3
+ for idx, ch in enumerate(channels, 1):
+ k = 7 if large and idx == 1 else 3
+ p = 3 if k ==7 else 1
+ self.register_module(f'pyramid{idx}',
+ nn.Sequential(
+ convrelu(prev_ch, ch, k, 2, p),
+ convrelu(ch, ch, 3, 1, 1)
+ ))
+ prev_ch = ch
+
+ def forward(self, in_x):
+ fs = []
+ for idx in range(len(self.channels)):
+ out_x = getattr(self, f'pyramid{idx+1}')(in_x)
+ fs.append(out_x)
+ in_x = out_x
+ return fs
+
+class InitDecoder(nn.Module):
+ def __init__(self, in_ch, out_ch, skip_ch) -> None:
+ super().__init__()
+ self.convblock = nn.Sequential(
+ convrelu(in_ch*2+1, in_ch*2),
+ ResBlock(in_ch*2, skip_ch),
+ nn.ConvTranspose2d(in_ch*2, out_ch+4, 4, 2, 1, bias=True)
+ )
+ def forward(self, f0, f1, embt):
+ h, w = f0.shape[2:]
+ embt = embt.repeat(1, 1, h, w)
+ out = self.convblock(torch.cat([f0, f1, embt], 1))
+ flow0, flow1 = torch.chunk(out[:, :4, ...], 2, 1)
+ ft_ = out[:, 4:, ...]
+ return flow0, flow1, ft_
+
+class IntermediateDecoder(nn.Module):
+ def __init__(self, in_ch, out_ch, skip_ch) -> None:
+ super().__init__()
+ self.convblock = nn.Sequential(
+ convrelu(in_ch*3+4, in_ch*3),
+ ResBlock(in_ch*3, skip_ch),
+ nn.ConvTranspose2d(in_ch*3, out_ch+4, 4, 2, 1, bias=True)
+ )
+ def forward(self, ft_, f0, f1, flow0_in, flow1_in):
+ f0_warp = warp(f0, flow0_in)
+ f1_warp = warp(f1, flow1_in)
+ f_in = torch.cat([ft_, f0_warp, f1_warp, flow0_in, flow1_in], 1)
+ out = self.convblock(f_in)
+ flow0, flow1 = torch.chunk(out[:, :4, ...], 2, 1)
+ ft_ = out[:, 4:, ...]
+ flow0 = flow0 + 2.0 * resize(flow0_in, scale_factor=2.0)
+ flow1 = flow1 + 2.0 * resize(flow1_in, scale_factor=2.0)
+ return flow0, flow1, ft_
+
+
+
+
+
+
+
+
+
+
+
+def multi_flow_combine(comb_block, img0, img1, flow0, flow1,
+ mask=None, img_res=None, mean=None):
+ '''
+ A parallel implementation of multiple flow field warping
+ comb_block: An nn.Seqential object.
+ img shape: [b, c, h, w]
+ flow shape: [b, 2*num_flows, h, w]
+ mask (opt):
+ If 'mask' is None, the function conduct a simple average.
+ img_res (opt):
+ If 'img_res' is None, the function adds zero instead.
+ mean (opt):
+ If 'mean' is None, the function adds zero instead.
+ '''
+ b, c, h, w = flow0.shape
+ num_flows = c // 2
+ flow0 = flow0.reshape(b, num_flows, 2, h, w).reshape(-1, 2, h, w)
+ flow1 = flow1.reshape(b, num_flows, 2, h, w).reshape(-1, 2, h, w)
+
+ mask = mask.reshape(b, num_flows, 1, h, w
+ ).reshape(-1, 1, h, w) if mask is not None else None
+ img_res = img_res.reshape(b, num_flows, 3, h, w
+ ).reshape(-1, 3, h, w) if img_res is not None else 0
+ img0 = torch.stack([img0] * num_flows, 1).reshape(-1, 3, h, w)
+ img1 = torch.stack([img1] * num_flows, 1).reshape(-1, 3, h, w)
+ mean = torch.stack([mean] * num_flows, 1).reshape(-1, 1, 1, 1
+ ) if mean is not None else 0
+
+ img0_warp = warp(img0, flow0)
+ img1_warp = warp(img1, flow1)
+ img_warps = mask * img0_warp + (1 - mask) * img1_warp + mean + img_res
+ img_warps = img_warps.reshape(b, num_flows, 3, h, w)
+ imgt_pred = img_warps.mean(1) + comb_block(img_warps.view(b, -1, h, w))
+ return imgt_pred
+
+
+class MultiFlowDecoder(nn.Module):
+ def __init__(self, in_ch, skip_ch, num_flows=3):
+ super(MultiFlowDecoder, self).__init__()
+ self.num_flows = num_flows
+ self.convblock = nn.Sequential(
+ convrelu(in_ch*3+4, in_ch*3),
+ ResBlock(in_ch*3, skip_ch),
+ nn.ConvTranspose2d(in_ch*3, 8*num_flows, 4, 2, 1, bias=True)
+ )
+
+ def forward(self, ft_, f0, f1, flow0, flow1):
+ n = self.num_flows
+ f0_warp = warp(f0, flow0)
+ f1_warp = warp(f1, flow1)
+ out = self.convblock(torch.cat([ft_, f0_warp, f1_warp, flow0, flow1], 1))
+ delta_flow0, delta_flow1, mask, img_res = torch.split(out, [2*n, 2*n, n, 3*n], 1)
+ mask = torch.sigmoid(mask)
+
+ flow0 = delta_flow0 + 2.0 * resize(flow0, scale_factor=2.0
+ ).repeat(1, self.num_flows, 1, 1)
+ flow1 = delta_flow1 + 2.0 * resize(flow1, scale_factor=2.0
+ ).repeat(1, self.num_flows, 1, 1)
+
+ return flow0, flow1, mask, img_res
+
+
+
+
+
+
+
+
+
+
+
+def resize(x, scale_factor):
+ return F.interpolate(x, scale_factor=scale_factor, mode="bilinear", align_corners=False)
+
+
+def bilinear_sampler(img, coords, mask=False):
+ """ Wrapper for grid_sample, uses pixel coordinates """
+ H, W = img.shape[-2:]
+ xgrid, ygrid = coords.split([1,1], dim=-1)
+ xgrid = 2*xgrid/(W-1) - 1
+ ygrid = 2*ygrid/(H-1) - 1
+
+ grid = torch.cat([xgrid, ygrid], dim=-1)
+ img = F.grid_sample(img, grid, align_corners=True)
+
+ if mask:
+ mask = (xgrid > -1) & (ygrid > -1) & (xgrid < 1) & (ygrid < 1)
+ return img, mask.float()
+
+ return img
+
+
+def coords_grid(batch, ht, wd, device):
+ coords = torch.meshgrid(torch.arange(ht, device=device),
+ torch.arange(wd, device=device),
+ indexing='ij')
+ coords = torch.stack(coords[::-1], dim=0).float()
+ return coords[None].repeat(batch, 1, 1, 1)
+
+
+class SmallUpdateBlock(nn.Module):
+ def __init__(self, cdim, hidden_dim, flow_dim, corr_dim, fc_dim,
+ corr_levels=4, radius=3, scale_factor=None):
+ super(SmallUpdateBlock, self).__init__()
+ cor_planes = corr_levels * (2 * radius + 1) **2
+ self.scale_factor = scale_factor
+
+ self.convc1 = nn.Conv2d(2 * cor_planes, corr_dim, 1, padding=0)
+ self.convf1 = nn.Conv2d(4, flow_dim*2, 7, padding=3)
+ self.convf2 = nn.Conv2d(flow_dim*2, flow_dim, 3, padding=1)
+ self.conv = nn.Conv2d(corr_dim+flow_dim, fc_dim, 3, padding=1)
+
+ self.gru = nn.Sequential(
+ nn.Conv2d(fc_dim+4+cdim, hidden_dim, 3, padding=1),
+ nn.LeakyReLU(negative_slope=0.1, inplace=True),
+ nn.Conv2d(hidden_dim, hidden_dim, 3, padding=1),
+ )
+
+ self.feat_head = nn.Sequential(
+ nn.Conv2d(hidden_dim, hidden_dim, 3, padding=1),
+ nn.LeakyReLU(negative_slope=0.1, inplace=True),
+ nn.Conv2d(hidden_dim, cdim, 3, padding=1),
+ )
+
+ self.flow_head = nn.Sequential(
+ nn.Conv2d(hidden_dim, hidden_dim, 3, padding=1),
+ nn.LeakyReLU(negative_slope=0.1, inplace=True),
+ nn.Conv2d(hidden_dim, 4, 3, padding=1),
+ )
+
+ self.lrelu = nn.LeakyReLU(negative_slope=0.1, inplace=True)
+
+ def forward(self, net, flow, corr):
+ net = resize(net, 1 / self.scale_factor
+ ) if self.scale_factor is not None else net
+ cor = self.lrelu(self.convc1(corr))
+ flo = self.lrelu(self.convf1(flow))
+ flo = self.lrelu(self.convf2(flo))
+ cor_flo = torch.cat([cor, flo], dim=1)
+ inp = self.lrelu(self.conv(cor_flo))
+ inp = torch.cat([inp, flow, net], dim=1)
+
+ out = self.gru(inp)
+ delta_net = self.feat_head(out)
+ delta_flow = self.flow_head(out)
+
+ if self.scale_factor is not None:
+ delta_net = resize(delta_net, scale_factor=self.scale_factor)
+ delta_flow = self.scale_factor * resize(delta_flow, scale_factor=self.scale_factor)
+
+ return delta_net, delta_flow
+
+
+class BasicUpdateBlock(nn.Module):
+ def __init__(self, cdim, hidden_dim, flow_dim, corr_dim, corr_dim2,
+ fc_dim, corr_levels=4, radius=3, scale_factor=None, out_num=1):
+ super(BasicUpdateBlock, self).__init__()
+ cor_planes = corr_levels * (2 * radius + 1) **2
+
+ self.scale_factor = scale_factor
+ self.convc1 = nn.Conv2d(2 * cor_planes, corr_dim, 1, padding=0)
+ self.convc2 = nn.Conv2d(corr_dim, corr_dim2, 3, padding=1)
+ self.convf1 = nn.Conv2d(4, flow_dim*2, 7, padding=3)
+ self.convf2 = nn.Conv2d(flow_dim*2, flow_dim, 3, padding=1)
+ self.conv = nn.Conv2d(flow_dim+corr_dim2, fc_dim, 3, padding=1)
+
+ self.gru = nn.Sequential(
+ nn.Conv2d(fc_dim+4+cdim, hidden_dim, 3, padding=1),
+ nn.LeakyReLU(negative_slope=0.1, inplace=True),
+ nn.Conv2d(hidden_dim, hidden_dim, 3, padding=1),
+ )
+
+ self.feat_head = nn.Sequential(
+ nn.Conv2d(hidden_dim, hidden_dim, 3, padding=1),
+ nn.LeakyReLU(negative_slope=0.1, inplace=True),
+ nn.Conv2d(hidden_dim, cdim, 3, padding=1),
+ )
+
+ self.flow_head = nn.Sequential(
+ nn.Conv2d(hidden_dim, hidden_dim, 3, padding=1),
+ nn.LeakyReLU(negative_slope=0.1, inplace=True),
+ nn.Conv2d(hidden_dim, 4*out_num, 3, padding=1),
+ )
+
+ self.lrelu = nn.LeakyReLU(negative_slope=0.1, inplace=True)
+
+ def forward(self, net, flow, corr):
+ net = resize(net, 1 / self.scale_factor
+ ) if self.scale_factor is not None else net
+ cor = self.lrelu(self.convc1(corr))
+ cor = self.lrelu(self.convc2(cor))
+ flo = self.lrelu(self.convf1(flow))
+ flo = self.lrelu(self.convf2(flo))
+ cor_flo = torch.cat([cor, flo], dim=1)
+ inp = self.lrelu(self.conv(cor_flo))
+ inp = torch.cat([inp, flow, net], dim=1)
+
+ out = self.gru(inp)
+ delta_net = self.feat_head(out)
+ delta_flow = self.flow_head(out)
+
+ if self.scale_factor is not None:
+ delta_net = resize(delta_net, scale_factor=self.scale_factor)
+ delta_flow = self.scale_factor * resize(delta_flow, scale_factor=self.scale_factor)
+ return delta_net, delta_flow
+
+
+class BidirCorrBlock:
+ def __init__(self, fmap1, fmap2, num_levels=4, radius=4):
+ self.num_levels = num_levels
+ self.radius = radius
+ self.corr_pyramid = []
+ self.corr_pyramid_T = []
+
+ corr = BidirCorrBlock.corr(fmap1, fmap2)
+ batch, h1, w1, dim, h2, w2 = corr.shape
+ corr_T = corr.clone().permute(0, 4, 5, 3, 1, 2)
+
+ corr = corr.reshape(batch*h1*w1, dim, h2, w2)
+ corr_T = corr_T.reshape(batch*h2*w2, dim, h1, w1)
+
+ self.corr_pyramid.append(corr)
+ self.corr_pyramid_T.append(corr_T)
+
+ for _ in range(self.num_levels-1):
+ corr = F.avg_pool2d(corr, 2, stride=2)
+ corr_T = F.avg_pool2d(corr_T, 2, stride=2)
+ self.corr_pyramid.append(corr)
+ self.corr_pyramid_T.append(corr_T)
+
+ def __call__(self, coords0, coords1):
+ r = self.radius
+ coords0 = coords0.permute(0, 2, 3, 1)
+ coords1 = coords1.permute(0, 2, 3, 1)
+ assert coords0.shape == coords1.shape, f"coords0 shape: [{coords0.shape}] is not equal to [{coords1.shape}]"
+ batch, h1, w1, _ = coords0.shape
+
+ out_pyramid = []
+ out_pyramid_T = []
+ for i in range(self.num_levels):
+ corr = self.corr_pyramid[i]
+ corr_T = self.corr_pyramid_T[i]
+
+ dx = torch.linspace(-r, r, 2*r+1, device=coords0.device)
+ dy = torch.linspace(-r, r, 2*r+1, device=coords0.device)
+ delta = torch.stack(torch.meshgrid(dy, dx, indexing='ij'), axis=-1)
+ delta_lvl = delta.view(1, 2*r+1, 2*r+1, 2)
+
+ centroid_lvl_0 = coords0.reshape(batch*h1*w1, 1, 1, 2) / 2**i
+ centroid_lvl_1 = coords1.reshape(batch*h1*w1, 1, 1, 2) / 2**i
+ coords_lvl_0 = centroid_lvl_0 + delta_lvl
+ coords_lvl_1 = centroid_lvl_1 + delta_lvl
+
+ corr = bilinear_sampler(corr, coords_lvl_0)
+ corr_T = bilinear_sampler(corr_T, coords_lvl_1)
+ corr = corr.view(batch, h1, w1, -1)
+ corr_T = corr_T.view(batch, h1, w1, -1)
+ out_pyramid.append(corr)
+ out_pyramid_T.append(corr_T)
+
+ out = torch.cat(out_pyramid, dim=-1)
+ out_T = torch.cat(out_pyramid_T, dim=-1)
+ return out.permute(0, 3, 1, 2).contiguous().float(), out_T.permute(0, 3, 1, 2).contiguous().float()
+
+ @staticmethod
+ def corr(fmap1, fmap2):
+ batch, dim, ht, wd = fmap1.shape
+ fmap1 = fmap1.view(batch, dim, ht*wd)
+ fmap2 = fmap2.view(batch, dim, ht*wd)
+
+ corr = torch.matmul(fmap1.transpose(1,2), fmap2)
+ corr = corr.view(batch, ht, wd, 1, ht, wd)
+ return corr / torch.sqrt(torch.tensor(dim).float())
+
+
+
+
+
+
+
+
+
+
+
+class AMT_S(nn.Module):
+ def __init__(self,
+ corr_radius=3,
+ corr_lvls=4,
+ num_flows=3,
+ channels=[20, 32, 44, 56],
+ skip_channels=20):
+ super(AMT_S, self).__init__()
+ self.radius = corr_radius
+ self.corr_levels = corr_lvls
+ self.num_flows = num_flows
+ self.channels = channels
+ self.skip_channels = skip_channels
+
+ self.feat_encoder = SmallEncoder(output_dim=84, norm_fn='instance', dropout=0.)
+ self.encoder = Encoder(channels)
+
+ self.decoder4 = InitDecoder(channels[3], channels[2], skip_channels)
+ self.decoder3 = IntermediateDecoder(channels[2], channels[1], skip_channels)
+ self.decoder2 = IntermediateDecoder(channels[1], channels[0], skip_channels)
+ self.decoder1 = MultiFlowDecoder(channels[0], skip_channels, num_flows)
+
+ self.update4 = self._get_updateblock(44)
+ self.update3 = self._get_updateblock(32, 2)
+ self.update2 = self._get_updateblock(20, 4)
+
+ self.comb_block = nn.Sequential(
+ nn.Conv2d(3*num_flows, 6*num_flows, 3, 1, 1),
+ nn.PReLU(6*num_flows),
+ nn.Conv2d(6*num_flows, 3, 3, 1, 1),
+ )
+
+ def _get_updateblock(self, cdim, scale_factor=None):
+ return SmallUpdateBlock(cdim=cdim, hidden_dim=76, flow_dim=20, corr_dim=64,
+ fc_dim=68, scale_factor=scale_factor,
+ corr_levels=self.corr_levels, radius=self.radius)
+
+ def _corr_scale_lookup(self, corr_fn, coord, flow0, flow1, embt, downsample=1):
+ # convert t -> 0 to 0 -> 1 | convert t -> 1 to 1 -> 0
+ # based on linear assumption
+ t1_scale = 1. / embt
+ t0_scale = 1. / (1. - embt)
+ if downsample != 1:
+ inv = 1 / downsample
+ flow0 = inv * resize(flow0, scale_factor=inv)
+ flow1 = inv * resize(flow1, scale_factor=inv)
+
+ corr0, corr1 = corr_fn(coord + flow1 * t1_scale, coord + flow0 * t0_scale)
+ corr = torch.cat([corr0, corr1], dim=1)
+ flow = torch.cat([flow0, flow1], dim=1)
+ return corr, flow
+
+ def forward(self, img0, img1, embt, scale_factor=1.0, eval=False, **kwargs):
+ mean_ = torch.cat([img0, img1], 2).mean(1, keepdim=True).mean(2, keepdim=True).mean(3, keepdim=True)
+ img0 = img0 - mean_
+ img1 = img1 - mean_
+ img0_ = resize(img0, scale_factor) if scale_factor != 1.0 else img0
+ img1_ = resize(img1, scale_factor) if scale_factor != 1.0 else img1
+ b, _, h, w = img0_.shape
+ coord = coords_grid(b, h // 8, w // 8, img0.device)
+
+ fmap0, fmap1 = self.feat_encoder([img0_, img1_]) # [1, 128, H//8, W//8]
+ corr_fn = BidirCorrBlock(fmap0, fmap1, radius=self.radius, num_levels=self.corr_levels)
+
+ # f0_1: [1, c0, H//2, W//2] | f0_2: [1, c1, H//4, W//4]
+ # f0_3: [1, c2, H//8, W//8] | f0_4: [1, c3, H//16, W//16]
+ f0_1, f0_2, f0_3, f0_4 = self.encoder(img0_)
+ f1_1, f1_2, f1_3, f1_4 = self.encoder(img1_)
+
+ ######################################### the 4th decoder #########################################
+ up_flow0_4, up_flow1_4, ft_3_ = self.decoder4(f0_4, f1_4, embt)
+ corr_4, flow_4 = self._corr_scale_lookup(corr_fn, coord,
+ up_flow0_4, up_flow1_4,
+ embt, downsample=1)
+
+ # residue update with lookup corr
+ delta_ft_3_, delta_flow_4 = self.update4(ft_3_, flow_4, corr_4)
+ delta_flow0_4, delta_flow1_4 = torch.chunk(delta_flow_4, 2, 1)
+ up_flow0_4 = up_flow0_4 + delta_flow0_4
+ up_flow1_4 = up_flow1_4 + delta_flow1_4
+ ft_3_ = ft_3_ + delta_ft_3_
+
+ ######################################### the 3rd decoder #########################################
+ up_flow0_3, up_flow1_3, ft_2_ = self.decoder3(ft_3_, f0_3, f1_3, up_flow0_4, up_flow1_4)
+ corr_3, flow_3 = self._corr_scale_lookup(corr_fn,
+ coord, up_flow0_3, up_flow1_3,
+ embt, downsample=2)
+
+ # residue update with lookup corr
+ delta_ft_2_, delta_flow_3 = self.update3(ft_2_, flow_3, corr_3)
+ delta_flow0_3, delta_flow1_3 = torch.chunk(delta_flow_3, 2, 1)
+ up_flow0_3 = up_flow0_3 + delta_flow0_3
+ up_flow1_3 = up_flow1_3 + delta_flow1_3
+ ft_2_ = ft_2_ + delta_ft_2_
+
+ ######################################### the 2nd decoder #########################################
+ up_flow0_2, up_flow1_2, ft_1_ = self.decoder2(ft_2_, f0_2, f1_2, up_flow0_3, up_flow1_3)
+ corr_2, flow_2 = self._corr_scale_lookup(corr_fn,
+ coord, up_flow0_2, up_flow1_2,
+ embt, downsample=4)
+
+ # residue update with lookup corr
+ delta_ft_1_, delta_flow_2 = self.update2(ft_1_, flow_2, corr_2)
+ delta_flow0_2, delta_flow1_2 = torch.chunk(delta_flow_2, 2, 1)
+ up_flow0_2 = up_flow0_2 + delta_flow0_2
+ up_flow1_2 = up_flow1_2 + delta_flow1_2
+ ft_1_ = ft_1_ + delta_ft_1_
+
+ ######################################### the 1st decoder #########################################
+ up_flow0_1, up_flow1_1, mask, img_res = self.decoder1(ft_1_, f0_1, f1_1, up_flow0_2, up_flow1_2)
+
+ if scale_factor != 1.0:
+ up_flow0_1 = resize(up_flow0_1, scale_factor=(1.0/scale_factor)) * (1.0/scale_factor)
+ up_flow1_1 = resize(up_flow1_1, scale_factor=(1.0/scale_factor)) * (1.0/scale_factor)
+ mask = resize(mask, scale_factor=(1.0/scale_factor))
+ img_res = resize(img_res, scale_factor=(1.0/scale_factor))
+
+ # Merge multiple predictions
+ imgt_pred = multi_flow_combine(self.comb_block, img0, img1, up_flow0_1, up_flow1_1,
+ mask, img_res, mean_)
+ imgt_pred = torch.clamp(imgt_pred, 0, 1)
+
+ if eval:
+ return { 'imgt_pred': imgt_pred, }
+ else:
+ up_flow0_1 = up_flow0_1.reshape(b, self.num_flows, 2, h, w)
+ up_flow1_1 = up_flow1_1.reshape(b, self.num_flows, 2, h, w)
+ return {
+ 'imgt_pred': imgt_pred,
+ 'flow0_pred': [up_flow0_1, up_flow0_2, up_flow0_3, up_flow0_4],
+ 'flow1_pred': [up_flow1_1, up_flow1_2, up_flow1_3, up_flow1_4],
+ 'ft_pred': [ft_1_, ft_2_, ft_3_],
+ }
+
+
+
+
+
+
+
+
+
+
+
+class AMT_L(nn.Module):
+ def __init__(self,
+ corr_radius=3,
+ corr_lvls=4,
+ num_flows=5,
+ channels=[48, 64, 72, 128],
+ skip_channels=48
+ ):
+ super(AMT_L, self).__init__()
+ self.radius = corr_radius
+ self.corr_levels = corr_lvls
+ self.num_flows = num_flows
+
+ self.feat_encoder = BasicEncoder(output_dim=128, norm_fn='instance', dropout=0.)
+ self.encoder = Encoder([48, 64, 72, 128], large=True)
+
+ self.decoder4 = InitDecoder(channels[3], channels[2], skip_channels)
+ self.decoder3 = IntermediateDecoder(channels[2], channels[1], skip_channels)
+ self.decoder2 = IntermediateDecoder(channels[1], channels[0], skip_channels)
+ self.decoder1 = MultiFlowDecoder(channels[0], skip_channels, num_flows)
+
+ self.update4 = self._get_updateblock(72, None)
+ self.update3 = self._get_updateblock(64, 2.0)
+ self.update2 = self._get_updateblock(48, 4.0)
+
+ self.comb_block = nn.Sequential(
+ nn.Conv2d(3*self.num_flows, 6*self.num_flows, 7, 1, 3),
+ nn.PReLU(6*self.num_flows),
+ nn.Conv2d(6*self.num_flows, 3, 7, 1, 3),
+ )
+
+ def _get_updateblock(self, cdim, scale_factor=None):
+ return BasicUpdateBlock(cdim=cdim, hidden_dim=128, flow_dim=48,
+ corr_dim=256, corr_dim2=160, fc_dim=124,
+ scale_factor=scale_factor, corr_levels=self.corr_levels,
+ radius=self.radius)
+
+ def _corr_scale_lookup(self, corr_fn, coord, flow0, flow1, embt, downsample=1):
+ # convert t -> 0 to 0 -> 1 | convert t -> 1 to 1 -> 0
+ # based on linear assumption
+ t1_scale = 1. / embt
+ t0_scale = 1. / (1. - embt)
+ if downsample != 1:
+ inv = 1 / downsample
+ flow0 = inv * resize(flow0, scale_factor=inv)
+ flow1 = inv * resize(flow1, scale_factor=inv)
+
+ corr0, corr1 = corr_fn(coord + flow1 * t1_scale, coord + flow0 * t0_scale)
+ corr = torch.cat([corr0, corr1], dim=1)
+ flow = torch.cat([flow0, flow1], dim=1)
+ return corr, flow
+
+ def forward(self, img0, img1, embt, scale_factor=1.0, eval=False, **kwargs):
+ mean_ = torch.cat([img0, img1], 2).mean(1, keepdim=True).mean(2, keepdim=True).mean(3, keepdim=True)
+ img0 = img0 - mean_
+ img1 = img1 - mean_
+ img0_ = resize(img0, scale_factor) if scale_factor != 1.0 else img0
+ img1_ = resize(img1, scale_factor) if scale_factor != 1.0 else img1
+ b, _, h, w = img0_.shape
+ coord = coords_grid(b, h // 8, w // 8, img0.device)
+
+ fmap0, fmap1 = self.feat_encoder([img0_, img1_]) # [1, 128, H//8, W//8]
+ corr_fn = BidirCorrBlock(fmap0, fmap1, radius=self.radius, num_levels=self.corr_levels)
+
+ # f0_1: [1, c0, H//2, W//2] | f0_2: [1, c1, H//4, W//4]
+ # f0_3: [1, c2, H//8, W//8] | f0_4: [1, c3, H//16, W//16]
+ f0_1, f0_2, f0_3, f0_4 = self.encoder(img0_)
+ f1_1, f1_2, f1_3, f1_4 = self.encoder(img1_)
+
+ ######################################### the 4th decoder #########################################
+ up_flow0_4, up_flow1_4, ft_3_ = self.decoder4(f0_4, f1_4, embt)
+ corr_4, flow_4 = self._corr_scale_lookup(corr_fn, coord,
+ up_flow0_4, up_flow1_4,
+ embt, downsample=1)
+
+ # residue update with lookup corr
+ delta_ft_3_, delta_flow_4 = self.update4(ft_3_, flow_4, corr_4)
+ delta_flow0_4, delta_flow1_4 = torch.chunk(delta_flow_4, 2, 1)
+ up_flow0_4 = up_flow0_4 + delta_flow0_4
+ up_flow1_4 = up_flow1_4 + delta_flow1_4
+ ft_3_ = ft_3_ + delta_ft_3_
+
+ ######################################### the 3rd decoder #########################################
+ up_flow0_3, up_flow1_3, ft_2_ = self.decoder3(ft_3_, f0_3, f1_3, up_flow0_4, up_flow1_4)
+ corr_3, flow_3 = self._corr_scale_lookup(corr_fn,
+ coord, up_flow0_3, up_flow1_3,
+ embt, downsample=2)
+
+ # residue update with lookup corr
+ delta_ft_2_, delta_flow_3 = self.update3(ft_2_, flow_3, corr_3)
+ delta_flow0_3, delta_flow1_3 = torch.chunk(delta_flow_3, 2, 1)
+ up_flow0_3 = up_flow0_3 + delta_flow0_3
+ up_flow1_3 = up_flow1_3 + delta_flow1_3
+ ft_2_ = ft_2_ + delta_ft_2_
+
+ ######################################### the 2nd decoder #########################################
+ up_flow0_2, up_flow1_2, ft_1_ = self.decoder2(ft_2_, f0_2, f1_2, up_flow0_3, up_flow1_3)
+ corr_2, flow_2 = self._corr_scale_lookup(corr_fn,
+ coord, up_flow0_2, up_flow1_2,
+ embt, downsample=4)
+
+ # residue update with lookup corr
+ delta_ft_1_, delta_flow_2 = self.update2(ft_1_, flow_2, corr_2)
+ delta_flow0_2, delta_flow1_2 = torch.chunk(delta_flow_2, 2, 1)
+ up_flow0_2 = up_flow0_2 + delta_flow0_2
+ up_flow1_2 = up_flow1_2 + delta_flow1_2
+ ft_1_ = ft_1_ + delta_ft_1_
+
+ ######################################### the 1st decoder #########################################
+ up_flow0_1, up_flow1_1, mask, img_res = self.decoder1(ft_1_, f0_1, f1_1, up_flow0_2, up_flow1_2)
+
+ if scale_factor != 1.0:
+ up_flow0_1 = resize(up_flow0_1, scale_factor=(1.0/scale_factor)) * (1.0/scale_factor)
+ up_flow1_1 = resize(up_flow1_1, scale_factor=(1.0/scale_factor)) * (1.0/scale_factor)
+ mask = resize(mask, scale_factor=(1.0/scale_factor))
+ img_res = resize(img_res, scale_factor=(1.0/scale_factor))
+
+ # Merge multiple predictions
+ imgt_pred = multi_flow_combine(self.comb_block, img0, img1, up_flow0_1, up_flow1_1,
+ mask, img_res, mean_)
+ imgt_pred = torch.clamp(imgt_pred, 0, 1)
+
+ if eval:
+ return { 'imgt_pred': imgt_pred, }
+ else:
+ up_flow0_1 = up_flow0_1.reshape(b, self.num_flows, 2, h, w)
+ up_flow1_1 = up_flow1_1.reshape(b, self.num_flows, 2, h, w)
+ return {
+ 'imgt_pred': imgt_pred,
+ 'flow0_pred': [up_flow0_1, up_flow0_2, up_flow0_3, up_flow0_4],
+ 'flow1_pred': [up_flow1_1, up_flow1_2, up_flow1_3, up_flow1_4],
+ 'ft_pred': [ft_1_, ft_2_, ft_3_],
+ }
+
+
+
+
+
+
+
+
+
+
+
+class AMT_G(nn.Module):
+ def __init__(self,
+ corr_radius=3,
+ corr_lvls=4,
+ num_flows=5,
+ channels=[84, 96, 112, 128],
+ skip_channels=84):
+ super(AMT_G, self).__init__()
+ self.radius = corr_radius
+ self.corr_levels = corr_lvls
+ self.num_flows = num_flows
+
+ self.feat_encoder = LargeEncoder(output_dim=128, norm_fn='instance', dropout=0.)
+ self.encoder = Encoder(channels, large=True)
+ self.decoder4 = InitDecoder(channels[3], channels[2], skip_channels)
+ self.decoder3 = IntermediateDecoder(channels[2], channels[1], skip_channels)
+ self.decoder2 = IntermediateDecoder(channels[1], channels[0], skip_channels)
+ self.decoder1 = MultiFlowDecoder(channels[0], skip_channels, num_flows)
+
+ self.update4 = self._get_updateblock(112, None)
+ self.update3_low = self._get_updateblock(96, 2.0)
+ self.update2_low = self._get_updateblock(84, 4.0)
+
+ self.update3_high = self._get_updateblock(96, None)
+ self.update2_high = self._get_updateblock(84, None)
+
+ self.comb_block = nn.Sequential(
+ nn.Conv2d(3*self.num_flows, 6*self.num_flows, 7, 1, 3),
+ nn.PReLU(6*self.num_flows),
+ nn.Conv2d(6*self.num_flows, 3, 7, 1, 3),
+ )
+
+ def _get_updateblock(self, cdim, scale_factor=None):
+ return BasicUpdateBlock(cdim=cdim, hidden_dim=192, flow_dim=64,
+ corr_dim=256, corr_dim2=192, fc_dim=188,
+ scale_factor=scale_factor, corr_levels=self.corr_levels,
+ radius=self.radius)
+
+ def _corr_scale_lookup(self, corr_fn, coord, flow0, flow1, embt, downsample=1):
+ # convert t -> 0 to 0 -> 1 | convert t -> 1 to 1 -> 0
+ # based on linear assumption
+ t1_scale = 1. / embt
+ t0_scale = 1. / (1. - embt)
+ if downsample != 1:
+ inv = 1 / downsample
+ flow0 = inv * resize(flow0, scale_factor=inv)
+ flow1 = inv * resize(flow1, scale_factor=inv)
+
+ corr0, corr1 = corr_fn(coord + flow1 * t1_scale, coord + flow0 * t0_scale)
+ corr = torch.cat([corr0, corr1], dim=1)
+ flow = torch.cat([flow0, flow1], dim=1)
+ return corr, flow
+
+ def forward(self, img0, img1, embt, scale_factor=1.0, eval=False, **kwargs):
+ mean_ = torch.cat([img0, img1], 2).mean(1, keepdim=True).mean(2, keepdim=True).mean(3, keepdim=True)
+ img0 = img0 - mean_
+ img1 = img1 - mean_
+ img0_ = resize(img0, scale_factor) if scale_factor != 1.0 else img0
+ img1_ = resize(img1, scale_factor) if scale_factor != 1.0 else img1
+ b, _, h, w = img0_.shape
+ coord = coords_grid(b, h // 8, w // 8, img0.device)
+
+ fmap0, fmap1 = self.feat_encoder([img0_, img1_]) # [1, 128, H//8, W//8]
+ corr_fn = BidirCorrBlock(fmap0, fmap1, radius=self.radius, num_levels=self.corr_levels)
+
+ # f0_1: [1, c0, H//2, W//2] | f0_2: [1, c1, H//4, W//4]
+ # f0_3: [1, c2, H//8, W//8] | f0_4: [1, c3, H//16, W//16]
+ f0_1, f0_2, f0_3, f0_4 = self.encoder(img0_)
+ f1_1, f1_2, f1_3, f1_4 = self.encoder(img1_)
+
+ ######################################### the 4th decoder #########################################
+ up_flow0_4, up_flow1_4, ft_3_ = self.decoder4(f0_4, f1_4, embt)
+ corr_4, flow_4 = self._corr_scale_lookup(corr_fn, coord,
+ up_flow0_4, up_flow1_4,
+ embt, downsample=1)
+
+ # residue update with lookup corr
+ delta_ft_3_, delta_flow_4 = self.update4(ft_3_, flow_4, corr_4)
+ delta_flow0_4, delta_flow1_4 = torch.chunk(delta_flow_4, 2, 1)
+ up_flow0_4 = up_flow0_4 + delta_flow0_4
+ up_flow1_4 = up_flow1_4 + delta_flow1_4
+ ft_3_ = ft_3_ + delta_ft_3_
+
+ ######################################### the 3rd decoder #########################################
+ up_flow0_3, up_flow1_3, ft_2_ = self.decoder3(ft_3_, f0_3, f1_3, up_flow0_4, up_flow1_4)
+ corr_3, flow_3 = self._corr_scale_lookup(corr_fn,
+ coord, up_flow0_3, up_flow1_3,
+ embt, downsample=2)
+
+ # residue update with lookup corr
+ delta_ft_2_, delta_flow_3 = self.update3_low(ft_2_, flow_3, corr_3)
+ delta_flow0_3, delta_flow1_3 = torch.chunk(delta_flow_3, 2, 1)
+ up_flow0_3 = up_flow0_3 + delta_flow0_3
+ up_flow1_3 = up_flow1_3 + delta_flow1_3
+ ft_2_ = ft_2_ + delta_ft_2_
+
+ # residue update with lookup corr (hr)
+ corr_3 = resize(corr_3, scale_factor=2.0)
+ up_flow_3 = torch.cat([up_flow0_3, up_flow1_3], dim=1)
+ delta_ft_2_, delta_up_flow_3 = self.update3_high(ft_2_, up_flow_3, corr_3)
+ ft_2_ += delta_ft_2_
+ up_flow0_3 += delta_up_flow_3[:, 0:2]
+ up_flow1_3 += delta_up_flow_3[:, 2:4]
+
+ ######################################### the 2nd decoder #########################################
+ up_flow0_2, up_flow1_2, ft_1_ = self.decoder2(ft_2_, f0_2, f1_2, up_flow0_3, up_flow1_3)
+ corr_2, flow_2 = self._corr_scale_lookup(corr_fn,
+ coord, up_flow0_2, up_flow1_2,
+ embt, downsample=4)
+
+ # residue update with lookup corr
+ delta_ft_1_, delta_flow_2 = self.update2_low(ft_1_, flow_2, corr_2)
+ delta_flow0_2, delta_flow1_2 = torch.chunk(delta_flow_2, 2, 1)
+ up_flow0_2 = up_flow0_2 + delta_flow0_2
+ up_flow1_2 = up_flow1_2 + delta_flow1_2
+ ft_1_ = ft_1_ + delta_ft_1_
+
+ # residue update with lookup corr (hr)
+ corr_2 = resize(corr_2, scale_factor=4.0)
+ up_flow_2 = torch.cat([up_flow0_2, up_flow1_2], dim=1)
+ delta_ft_1_, delta_up_flow_2 = self.update2_high(ft_1_, up_flow_2, corr_2)
+ ft_1_ += delta_ft_1_
+ up_flow0_2 += delta_up_flow_2[:, 0:2]
+ up_flow1_2 += delta_up_flow_2[:, 2:4]
+
+ ######################################### the 1st decoder #########################################
+ up_flow0_1, up_flow1_1, mask, img_res = self.decoder1(ft_1_, f0_1, f1_1, up_flow0_2, up_flow1_2)
+
+ if scale_factor != 1.0:
+ up_flow0_1 = resize(up_flow0_1, scale_factor=(1.0/scale_factor)) * (1.0/scale_factor)
+ up_flow1_1 = resize(up_flow1_1, scale_factor=(1.0/scale_factor)) * (1.0/scale_factor)
+ mask = resize(mask, scale_factor=(1.0/scale_factor))
+ img_res = resize(img_res, scale_factor=(1.0/scale_factor))
+
+ # Merge multiple predictions
+ imgt_pred = multi_flow_combine(self.comb_block, img0, img1, up_flow0_1, up_flow1_1,
+ mask, img_res, mean_)
+ imgt_pred = torch.clamp(imgt_pred, 0, 1)
+
+ if eval:
+ return { 'imgt_pred': imgt_pred, }
+ else:
+ up_flow0_1 = up_flow0_1.reshape(b, self.num_flows, 2, h, w)
+ up_flow1_1 = up_flow1_1.reshape(b, self.num_flows, 2, h, w)
+ return {
+ 'imgt_pred': imgt_pred,
+ 'flow0_pred': [up_flow0_1, up_flow0_2, up_flow0_3, up_flow0_4],
+ 'flow1_pred': [up_flow1_1, up_flow1_2, up_flow1_3, up_flow1_4],
+ 'ft_pred': [ft_1_, ft_2_, ft_3_],
+ }
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..8d1166d1fad2639bb9ce49a2e2ff3471ef6a6415
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/__init__.py
@@ -0,0 +1,64 @@
+import torch
+from torch.utils.data import DataLoader
+import pathlib
+from vfi_utils import load_file_from_github_release, preprocess_frames, postprocess_frames, generic_frame_loop, InterpolationStateList
+import typing
+from comfy.model_management import get_torch_device
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+CKPT_NAMES = ["pretrained_cain.pth"]
+
+
+class CAIN_VFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (CKPT_NAMES, ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 10, "min": 1, "max": 1000}),
+ "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames: typing.SupportsInt = 1,
+ multiplier: typing.SupportsInt = 2,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ from .cain_arch import CAIN
+ model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
+ sd = torch.load(model_path)["state_dict"]
+ sd = {key.replace('module.', ''): value for key, value in sd.items()}
+
+
+ global interpolation_model
+ interpolation_model = CAIN(depth=3)
+ interpolation_model.load_state_dict(sd)
+ interpolation_model.eval().to(get_torch_device())
+ del sd
+
+ frames = preprocess_frames(frames)
+
+
+ def return_middle_frame(frame_0, frame_1, timestep, model):
+ #CAIN does some direct modifications to input frame tensors so we need to clone them
+ return model(frame_0.detach().clone(), frame_1.detach().clone())[0]
+
+ args = [interpolation_model]
+ out = postprocess_frames(
+ generic_frame_loop(type(self).__name__, frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
+ interpolation_states=optional_interpolation_states, use_timestep=False, dtype=torch.float32)
+ )
+ return (out,)
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/cain_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/cain_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..abd8db30b7f4260ea847da249d4d4114f8091d95
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/cain_arch.py
@@ -0,0 +1,74 @@
+import math
+import numpy as np
+
+import torch
+import torch.nn as nn
+
+from .common import *
+
+
+class Encoder(nn.Module):
+ def __init__(self, in_channels=3, depth=3):
+ super(Encoder, self).__init__()
+
+ # Shuffle pixels to expand in channel dimension
+ # shuffler_list = [PixelShuffle(0.5) for i in range(depth)]
+ # self.shuffler = nn.Sequential(*shuffler_list)
+ self.shuffler = PixelShuffle(1 / 2**depth)
+
+ relu = nn.LeakyReLU(0.2, True)
+
+ # FF_RCAN or FF_Resblocks
+ self.interpolate = Interpolation(5, 12, in_channels * (4**depth), act=relu)
+
+ def forward(self, x1, x2):
+ """
+ Encoder: Shuffle-spread --> Feature Fusion --> Return fused features
+ """
+ feats1 = self.shuffler(x1)
+ feats2 = self.shuffler(x2)
+
+ feats = self.interpolate(feats1, feats2)
+
+ return feats
+
+
+class Decoder(nn.Module):
+ def __init__(self, depth=3):
+ super(Decoder, self).__init__()
+
+ # shuffler_list = [PixelShuffle(2) for i in range(depth)]
+ # self.shuffler = nn.Sequential(*shuffler_list)
+ self.shuffler = PixelShuffle(2**depth)
+
+ def forward(self, feats):
+ out = self.shuffler(feats)
+ return out
+
+
+class CAIN(nn.Module):
+ def __init__(self, depth=3):
+ super(CAIN, self).__init__()
+
+ self.encoder = Encoder(in_channels=3, depth=depth)
+ self.decoder = Decoder(depth=depth)
+
+ def forward(self, x1, x2):
+ x1, m1 = sub_mean(x1)
+ x2, m2 = sub_mean(x2)
+
+ if not self.training:
+ paddingInput, paddingOutput = InOutPaddings(x1)
+ x1 = paddingInput(x1)
+ x2 = paddingInput(x2)
+
+ feats = self.encoder(x1, x2)
+ out = self.decoder(feats)
+
+ if not self.training:
+ out = paddingOutput(out)
+
+ mi = (m1 + m2) / 2
+ out += mi
+
+ return out, feats
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/cain_encdec_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/cain_encdec_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..ea10ed87e38bee995f435bb4305e221e4c13a4a6
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/cain_encdec_arch.py
@@ -0,0 +1,95 @@
+import math
+import numpy as np
+
+import torch
+import torch.nn as nn
+
+from .common import *
+from comfy.model_management import get_torch_device
+
+class Encoder(nn.Module):
+ def __init__(self, in_channels=3, depth=3, nf_start=32, norm=False):
+ super(Encoder, self).__init__()
+ self.device = get_torch_device()
+
+ nf = nf_start
+ relu = nn.LeakyReLU(negative_slope=0.2, inplace=True)
+
+ self.body = nn.Sequential(
+ ConvNorm(in_channels, nf * 1, 7, stride=1, norm=norm),
+ relu,
+ ConvNorm(nf * 1, nf * 2, 5, stride=2, norm=norm),
+ relu,
+ ConvNorm(nf * 2, nf * 4, 5, stride=2, norm=norm),
+ relu,
+ ConvNorm(nf * 4, nf * 6, 5, stride=2, norm=norm)
+ )
+
+ self.interpolate = Interpolation(5, 12, nf * 6, reduction=16, act=relu)
+
+ def forward(self, x1, x2):
+ """
+ Encoder: Feature Extraction --> Feature Fusion --> Return
+ """
+ feats1 = self.body(x1)
+ feats2 = self.body(x2)
+
+ feats = self.interpolate(feats1, feats2)
+
+ return feats
+
+
+class Decoder(nn.Module):
+ def __init__(self, in_channels=192, out_channels=3, depth=3, norm=False, up_mode='shuffle'):
+ super(Decoder, self).__init__()
+ self.device = get_torch_device()
+
+ relu = nn.LeakyReLU(negative_slope=0.2, inplace=True)
+
+ nf = [in_channels, (in_channels*2)//3, in_channels//3, in_channels//6]
+ #nf = [192, 128, 64, 32]
+ #nf = [186, 124, 62, 31]
+ self.body = nn.Sequential(
+ UpConvNorm(nf[0], nf[1], mode=up_mode, norm=norm),
+ ResBlock(nf[1], nf[1], norm=norm, act=relu),
+ UpConvNorm(nf[1], nf[2], mode=up_mode, norm=norm),
+ ResBlock(nf[2], nf[2], norm=norm, act=relu),
+ UpConvNorm(nf[2], nf[3], mode=up_mode, norm=norm),
+ ResBlock(nf[3], nf[3], norm=norm, act=relu),
+ conv7x7(nf[3], out_channels)
+ )
+
+ def forward(self, feats):
+ out = self.body(feats)
+ #out = self.conv_final(out)
+
+ return out
+
+
+class CAIN_EncDec(nn.Module):
+ def __init__(self, depth=3, n_resblocks=3, start_filts=32, up_mode='shuffle'):
+ super(CAIN_EncDec, self).__init__()
+ self.depth = depth
+
+ self.encoder = Encoder(in_channels=3, depth=depth, norm=False)
+ self.decoder = Decoder(in_channels=start_filts*6, depth=depth, norm=False, up_mode=up_mode)
+
+ def forward(self, x1, x2):
+ x1, m1 = sub_mean(x1)
+ x2, m2 = sub_mean(x2)
+
+ if not self.training:
+ paddingInput, paddingOutput = InOutPaddings(x1)
+ x1 = paddingInput(x1)
+ x2 = paddingInput(x2)
+
+ feats = self.encoder(x1, x2)
+ out = self.decoder(feats)
+
+ if not self.training:
+ out = paddingOutput(out)
+
+ mi = (m1 + m2)/2
+ out += mi
+
+ return out, feats
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/cain_noca_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/cain_noca_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..08fbb117e9acef30d49627d5c906622b13197623
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/cain_noca_arch.py
@@ -0,0 +1,73 @@
+import math
+import numpy as np
+
+import torch
+import torch.nn as nn
+
+from .common import *
+from comfy.model_management import get_torch_device
+
+class Encoder(nn.Module):
+ def __init__(self, in_channels=3, depth=3):
+ super(Encoder, self).__init__()
+ self.device = get_torch_device()
+
+ self.shuffler = PixelShuffle(1/2**depth)
+ # self.shuffler = nn.Sequential(
+ # PixelShuffle(1/2),
+ # PixelShuffle(1/2),
+ # PixelShuffle(1/2))
+ self.interpolate = Interpolation_res(5, 12, in_channels * (4**depth))
+
+ def forward(self, x1, x2):
+ feats1 = self.shuffler(x1)
+ feats2 = self.shuffler(x2)
+
+ feats = self.interpolate(feats1, feats2)
+
+ return feats
+
+
+class Decoder(nn.Module):
+ def __init__(self, depth=3):
+ super(Decoder, self).__init__()
+ self.device = get_torch_device()
+
+ self.shuffler = PixelShuffle(2**depth)
+ # self.shuffler = nn.Sequential(
+ # PixelShuffle(2),
+ # PixelShuffle(2),
+ # PixelShuffle(2))
+
+ def forward(self, feats):
+ out = self.shuffler(feats)
+ return out
+
+
+class CAIN_NoCA(nn.Module):
+ def __init__(self, depth=3):
+ super(CAIN_NoCA, self).__init__()
+ self.depth = depth
+
+ self.encoder = Encoder(in_channels=3, depth=depth)
+ self.decoder = Decoder(depth=depth)
+
+ def forward(self, x1, x2):
+ x1, m1 = sub_mean(x1)
+ x2, m2 = sub_mean(x2)
+
+ if not self.training:
+ paddingInput, paddingOutput = InOutPaddings(x1)
+ x1 = paddingInput(x1)
+ x2 = paddingInput(x2)
+
+ feats = self.encoder(x1, x2)
+ out = self.decoder(feats)
+
+ if not self.training:
+ out = paddingOutput(out)
+
+ mi = (m1 + m2) / 2
+ out += mi
+
+ return out, feats
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/common.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/common.py
new file mode 100644
index 0000000000000000000000000000000000000000..aa1600a231d32eec39785883cb26b93fd9c64e62
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/cain/common.py
@@ -0,0 +1,361 @@
+import math
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+
+def sub_mean(x):
+ mean = x.mean(2, keepdim=True).mean(3, keepdim=True)
+ x -= mean
+ return x, mean
+
+def InOutPaddings(x):
+ w, h = x.size(3), x.size(2)
+ padding_width, padding_height = 0, 0
+ if w != ((w >> 7) << 7):
+ padding_width = (((w >> 7) + 1) << 7) - w
+ if h != ((h >> 7) << 7):
+ padding_height = (((h >> 7) + 1) << 7) - h
+ paddingInput = nn.ReflectionPad2d(padding=[padding_width // 2, padding_width - padding_width // 2,
+ padding_height // 2, padding_height - padding_height // 2])
+ paddingOutput = nn.ReflectionPad2d(padding=[0 - padding_width // 2, padding_width // 2 - padding_width,
+ 0 - padding_height // 2, padding_height // 2 - padding_height])
+ return paddingInput, paddingOutput
+
+
+class ConvNorm(nn.Module):
+ def __init__(self, in_feat, out_feat, kernel_size, stride=1, norm=False):
+ super(ConvNorm, self).__init__()
+
+ reflection_padding = kernel_size // 2
+ self.reflection_pad = nn.ReflectionPad2d(reflection_padding)
+ self.conv = nn.Conv2d(in_feat, out_feat, stride=stride, kernel_size=kernel_size, bias=True)
+
+ self.norm = norm
+ if norm == 'IN':
+ self.norm = nn.InstanceNorm2d(out_feat, track_running_stats=True)
+ elif norm == 'BN':
+ self.norm = nn.BatchNorm2d(out_feat)
+
+ def forward(self, x):
+ out = self.reflection_pad(x)
+ out = self.conv(out)
+ if self.norm:
+ out = self.norm(out)
+ return out
+
+
+class UpConvNorm(nn.Module):
+ def __init__(self, in_channels, out_channels, mode='transpose', norm=False):
+ super(UpConvNorm, self).__init__()
+
+ if mode == 'transpose':
+ self.upconv = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=4, stride=2, padding=1)
+ elif mode == 'shuffle':
+ self.upconv = nn.Sequential(
+ ConvNorm(in_channels, 4*out_channels, kernel_size=3, stride=1, norm=norm),
+ PixelShuffle(2))
+ else:
+ # out_channels is always going to be the same as in_channels
+ self.upconv = nn.Sequential(
+ nn.Upsample(mode='bilinear', scale_factor=2, align_corners=False),
+ ConvNorm(in_channels, out_channels, kernel_size=1, stride=1, norm=norm))
+
+ def forward(self, x):
+ out = self.upconv(x)
+ return out
+
+
+
+class meanShift(nn.Module):
+ def __init__(self, rgbRange, rgbMean, sign, nChannel=3):
+ super(meanShift, self).__init__()
+ if nChannel == 1:
+ l = rgbMean[0] * rgbRange * float(sign)
+
+ self.shifter = nn.Conv2d(1, 1, kernel_size=1, stride=1, padding=0)
+ self.shifter.weight.data = torch.eye(1).view(1, 1, 1, 1)
+ self.shifter.bias.data = torch.Tensor([l])
+ elif nChannel == 3:
+ r = rgbMean[0] * rgbRange * float(sign)
+ g = rgbMean[1] * rgbRange * float(sign)
+ b = rgbMean[2] * rgbRange * float(sign)
+
+ self.shifter = nn.Conv2d(3, 3, kernel_size=1, stride=1, padding=0)
+ self.shifter.weight.data = torch.eye(3).view(3, 3, 1, 1)
+ self.shifter.bias.data = torch.Tensor([r, g, b])
+ else:
+ r = rgbMean[0] * rgbRange * float(sign)
+ g = rgbMean[1] * rgbRange * float(sign)
+ b = rgbMean[2] * rgbRange * float(sign)
+ self.shifter = nn.Conv2d(6, 6, kernel_size=1, stride=1, padding=0)
+ self.shifter.weight.data = torch.eye(6).view(6, 6, 1, 1)
+ self.shifter.bias.data = torch.Tensor([r, g, b, r, g, b])
+
+ # Freeze the meanShift layer
+ for params in self.shifter.parameters():
+ params.requires_grad = False
+
+ def forward(self, x):
+ x = self.shifter(x)
+
+ return x
+
+
+""" CONV - (BN) - RELU - CONV - (BN) """
+class ResBlock(nn.Module):
+ def __init__(self, in_feat, out_feat, kernel_size=3, reduction=False, bias=True, # 'reduction' is just for placeholder
+ norm=False, act=nn.ReLU(True), downscale=False):
+ super(ResBlock, self).__init__()
+
+ self.body = nn.Sequential(
+ ConvNorm(in_feat, out_feat, kernel_size=kernel_size, stride=2 if downscale else 1),
+ act,
+ ConvNorm(out_feat, out_feat, kernel_size=kernel_size, stride=1)
+ )
+
+ self.downscale = None
+ if downscale:
+ self.downscale = nn.Conv2d(in_feat, out_feat, kernel_size=1, stride=2)
+
+ def forward(self, x):
+ res = x
+ out = self.body(x)
+ if self.downscale is not None:
+ res = self.downscale(res)
+ out += res
+
+ return out
+
+
+## Channel Attention (CA) Layer
+class CALayer(nn.Module):
+ def __init__(self, channel, reduction=16):
+ super(CALayer, self).__init__()
+ # global average pooling: feature --> point
+ self.avg_pool = nn.AdaptiveAvgPool2d(1)
+ # feature channel downscale and upscale --> channel weight
+ self.conv_du = nn.Sequential(
+ nn.Conv2d(channel, channel // reduction, 1, padding=0, bias=True),
+ nn.ReLU(inplace=True),
+ nn.Conv2d(channel // reduction, channel, 1, padding=0, bias=True),
+ nn.Sigmoid()
+ )
+
+ def forward(self, x):
+ y = self.avg_pool(x)
+ y = self.conv_du(y)
+ return x * y, y
+
+
+## Residual Channel Attention Block (RCAB)
+class RCAB(nn.Module):
+ def __init__(self, in_feat, out_feat, kernel_size, reduction, bias=True,
+ norm=False, act=nn.ReLU(True), downscale=False, return_ca=False):
+ super(RCAB, self).__init__()
+
+ self.body = nn.Sequential(
+ ConvNorm(in_feat, out_feat, kernel_size, stride=2 if downscale else 1, norm=norm),
+ act,
+ ConvNorm(out_feat, out_feat, kernel_size, stride=1, norm=norm),
+ CALayer(out_feat, reduction)
+ )
+ self.downscale = downscale
+ if downscale:
+ self.downConv = nn.Conv2d(in_feat, out_feat, kernel_size=3, stride=2, padding=1)
+ self.return_ca = return_ca
+
+ def forward(self, x):
+ res = x
+ out, ca = self.body(x)
+ if self.downscale:
+ res = self.downConv(res)
+ out += res
+
+ if self.return_ca:
+ return out, ca
+ else:
+ return out
+
+
+## Residual Group (RG)
+class ResidualGroup(nn.Module):
+ def __init__(self, Block, n_resblocks, n_feat, kernel_size, reduction, act, norm=False):
+ super(ResidualGroup, self).__init__()
+
+ modules_body = [Block(n_feat, n_feat, kernel_size, reduction, bias=True, norm=norm, act=act)
+ for _ in range(n_resblocks)]
+ modules_body.append(ConvNorm(n_feat, n_feat, kernel_size, stride=1, norm=norm))
+ self.body = nn.Sequential(*modules_body)
+
+ def forward(self, x):
+ res = self.body(x)
+ res += x
+ return res
+
+
+def pixel_shuffle(input, scale_factor):
+ batch_size, channels, in_height, in_width = input.size()
+
+ out_channels = int(int(channels / scale_factor) / scale_factor)
+ out_height = int(in_height * scale_factor)
+ out_width = int(in_width * scale_factor)
+
+ if scale_factor >= 1:
+ input_view = input.contiguous().view(batch_size, out_channels, scale_factor, scale_factor, in_height, in_width)
+ shuffle_out = input_view.permute(0, 1, 4, 2, 5, 3).contiguous()
+ else:
+ block_size = int(1 / scale_factor)
+ input_view = input.contiguous().view(batch_size, channels, out_height, block_size, out_width, block_size)
+ shuffle_out = input_view.permute(0, 1, 3, 5, 2, 4).contiguous()
+
+ return shuffle_out.view(batch_size, out_channels, out_height, out_width)
+
+
+class PixelShuffle(nn.Module):
+ def __init__(self, scale_factor):
+ super(PixelShuffle, self).__init__()
+ self.scale_factor = scale_factor
+
+ def forward(self, x):
+ return pixel_shuffle(x, self.scale_factor)
+ def extra_repr(self):
+ return 'scale_factor={}'.format(self.scale_factor)
+
+
+def conv(in_channels, out_channels, kernel_size,
+ stride=1, bias=True, groups=1):
+ return nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size=kernel_size,
+ padding=kernel_size//2,
+ stride=1,
+ bias=bias,
+ groups=groups)
+
+
+def conv1x1(in_channels, out_channels, stride=1, bias=True, groups=1):
+ return nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size=1,
+ stride=stride,
+ bias=bias,
+ groups=groups)
+
+def conv3x3(in_channels, out_channels, stride=1,
+ padding=1, bias=True, groups=1):
+ return nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size=3,
+ stride=stride,
+ padding=padding,
+ bias=bias,
+ groups=groups)
+
+def conv5x5(in_channels, out_channels, stride=1,
+ padding=2, bias=True, groups=1):
+ return nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size=5,
+ stride=stride,
+ padding=padding,
+ bias=bias,
+ groups=groups)
+
+def conv7x7(in_channels, out_channels, stride=1,
+ padding=3, bias=True, groups=1):
+ return nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size=7,
+ stride=stride,
+ padding=padding,
+ bias=bias,
+ groups=groups)
+
+def upconv2x2(in_channels, out_channels, mode='shuffle'):
+ if mode == 'transpose':
+ return nn.ConvTranspose2d(
+ in_channels,
+ out_channels,
+ kernel_size=4,
+ stride=2,
+ padding=1)
+ elif mode == 'shuffle':
+ return nn.Sequential(
+ conv3x3(in_channels, 4*out_channels),
+ PixelShuffle(2))
+ else:
+ # out_channels is always going to be the same as in_channels
+ return nn.Sequential(
+ nn.Upsample(mode='bilinear', scale_factor=2, align_corners=False),
+ conv1x1(in_channels, out_channels))
+
+
+
+class Interpolation(nn.Module):
+ def __init__(self, n_resgroups, n_resblocks, n_feats,
+ reduction=16, act=nn.LeakyReLU(0.2, True), norm=False):
+ super(Interpolation, self).__init__()
+
+ # define modules: head, body, tail
+ self.headConv = conv3x3(n_feats * 2, n_feats)
+
+ modules_body = [
+ ResidualGroup(
+ RCAB,
+ n_resblocks=n_resblocks,
+ n_feat=n_feats,
+ kernel_size=3,
+ reduction=reduction,
+ act=act,
+ norm=norm)
+ for _ in range(n_resgroups)]
+ self.body = nn.Sequential(*modules_body)
+
+ self.tailConv = conv3x3(n_feats, n_feats)
+
+ def forward(self, x0, x1):
+ # Build input tensor
+ x = torch.cat([x0, x1], dim=1)
+ x = self.headConv(x)
+
+ res = self.body(x)
+ res += x
+
+ out = self.tailConv(res)
+ return out
+
+
+class Interpolation_res(nn.Module):
+ def __init__(self, n_resgroups, n_resblocks, n_feats,
+ act=nn.LeakyReLU(0.2, True), norm=False):
+ super(Interpolation_res, self).__init__()
+
+ # define modules: head, body, tail (reduces concatenated inputs to n_feat)
+ self.headConv = conv3x3(n_feats * 2, n_feats)
+
+ modules_body = [ResidualGroup(ResBlock, n_resblocks=n_resblocks, n_feat=n_feats, kernel_size=3,
+ reduction=0, act=act, norm=norm)
+ for _ in range(n_resgroups)]
+ self.body = nn.Sequential(*modules_body)
+
+ self.tailConv = conv3x3(n_feats, n_feats)
+
+ def forward(self, x0, x1):
+ # Build input tensor
+ x = torch.cat([x0, x1], dim=1)
+ x = self.headConv(x)
+
+ res = x
+ for m in self.body:
+ res = m(res)
+ res += x
+
+ x = self.tailConv(res)
+
+ return x
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/eisai/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/eisai/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3602505192621731e00acde67489c6a51360adb8
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/eisai/__init__.py
@@ -0,0 +1,84 @@
+import pathlib
+from vfi_utils import load_file_from_github_release, preprocess_frames, postprocess_frames, generic_frame_loop, InterpolationStateList
+import typing
+import torch
+import torch.nn as nn
+from comfy.model_management import soft_empty_cache, get_torch_device
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+MODEL_FILE_NAMES = {
+ "ssl": "eisai_ssl.pt",
+ "dtm": "eisai_dtm.pt",
+ "raft": "eisai_anime_interp_full.ckpt"
+}
+
+class EISAI(nn.Module):
+ def __init__(self, model_file_names) -> None:
+ from .eisai_arch import SoftsplatLite, DTM, RAFT
+ super(EISAI, self).__init__()
+ self.raft = RAFT(load_file_from_github_release(MODEL_TYPE, model_file_names["raft"]))
+ self.raft.to(get_torch_device()).eval()
+
+ self.ssl = SoftsplatLite()
+ self.ssl.load_state_dict(torch.load(load_file_from_github_release(MODEL_TYPE, model_file_names["ssl"])))
+ self.ssl.to(get_torch_device()).eval()
+
+ self.dtm = DTM()
+ self.dtm.load_state_dict(torch.load(load_file_from_github_release(MODEL_TYPE, model_file_names["dtm"])))
+ self.dtm.to(get_torch_device()).eval()
+
+ def forward(self, img0, img1, t):
+ with torch.no_grad():
+ flow0, _ = self.raft(img0, img1)
+ flow1, _ = self.raft(img1, img0)
+ x = {
+ "images": torch.stack([img0, img1], dim=1),
+ "flows": torch.stack([flow0, flow1], dim=1),
+ }
+ out_ssl, _ = self.ssl(x, t=t, return_more=True)
+ out_dtm, _ = self.dtm(x, out_ssl, _, return_more=False)
+ return out_dtm[:, :3]
+
+class EISAI_VFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (["eisai"], ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 10, "min": 1, "max": 1000}),
+ "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames = 10,
+ multiplier: typing.SupportsInt = 2,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ interpolation_model = EISAI(MODEL_FILE_NAMES)
+ interpolation_model.eval().to(get_torch_device())
+ frames = preprocess_frames(frames)
+
+ def return_middle_frame(frame_0, frame_1, timestep, model):
+ return model(frame_0, frame_1, t=timestep)
+
+ scale = 1
+
+ args = [interpolation_model, scale]
+ out = postprocess_frames(
+ generic_frame_loop(type(self).__name__, frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
+ interpolation_states=optional_interpolation_states, dtype=torch.float32)
+ )
+ return (out,)
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/eisai/eisai_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/eisai/eisai_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..4a3abae7187b26fedd86219058a7e8e024e59e30
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/eisai/eisai_arch.py
@@ -0,0 +1,2586 @@
+"""
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_scripts/interpolate.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_train/frame_interpolation/models/ssldtm.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_util/util_v0.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_util/twodee_v0.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_util/pytorch_v0.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_util/distance_transform_v0.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_util/sketchers_v1.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_train/frame_interpolation/helpers/interpolator_v0.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_train/frame_interpolation/helpers/gridnet_v1.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_util/flow_v0.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_util/softsplat_v0.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_train/frame_interpolation/helpers/raft_v1/rfr_new.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_train/frame_interpolation/helpers/raft_v1/extractor.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_train/frame_interpolation/helpers/raft_v1/update.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_train/frame_interpolation/helpers/raft_v1/corr.py
+https://github.com/ShuhongChen/eisai-anime-interpolator/blob/master/_train/frame_interpolation/helpers/raft_v1/utils.py
+"""
+
+import copy
+import cv2
+import torch.nn.functional as F
+import torchvision.transforms.functional as F
+import gc
+from PIL import Image, ImageFile, ImageFont, ImageDraw
+import inspect
+from scipy import interpolate
+import kornia
+import math
+from argparse import Namespace
+import torch.nn as nn
+import numpy as np
+import os
+from functools import partial
+import pathlib
+import PIL
+import re
+import requests
+from scipy.spatial.transform import Rotation
+import scipy
+import shutil
+import torchvision.transforms as T
+import time
+import torch
+import torchvision as tv
+import zlib
+import numpy as np
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from tqdm.auto import tqdm as std_tqdm
+from tqdm.auto import trange as std_trange
+from vfi_models.ops import FunctionSoftsplat, batch_edt
+from comfy.model_management import get_torch_device
+
+device = get_torch_device()
+autocast = torch.autocast
+tqdm = partial(std_tqdm, dynamic_ncols=True)
+trange = partial(std_trange, dynamic_ncols=True)
+ImageFile.LOAD_TRUNCATED_IMAGES = True
+
+
+def pixel_ij(x, rounding=True):
+ if isinstance(x, np.ndarray):
+ x = x.tolist()
+ return tuple(
+ pixel_rounder(i, rounding)
+ for i in (x if isinstance(x, tuple) or isinstance(x, list) else (x, x))
+ )
+
+
+def rescale_dry(x, factor):
+ h, w = x[-2:] if isinstance(x, tuple) or isinstance(x, list) else I(x).size
+ return (h * factor, w * factor)
+
+
+def pixel_rounder(n, mode):
+ if mode == True or mode == "round":
+ return round(n)
+ elif mode == "ceil":
+ return math.ceil(n)
+ elif mode == "floor":
+ return math.floor(n)
+ else:
+ return n
+
+
+def diam(x):
+ if isinstance(x, tuple) or isinstance(x, list):
+ h, w = x[-2:]
+ elif isinstance(x, I):
+ h, w = x.size
+ else:
+ h, w = x.shape[-2:]
+ return np.sqrt(h**2 + w**2)
+
+
+def pixel_logit(x, pixel_margin=1):
+ x = (x * (255 - 2 * pixel_margin) + pixel_margin) / 255
+ return torch.log(x / (1 - x))
+
+
+class InputPadder:
+ """Pads images such that dimensions are divisible by 8"""
+
+ def __init__(self, dims):
+ self.ht, self.wd = dims[-2:]
+ pad_ht = (((self.ht // 8) + 1) * 8 - self.ht) % 8
+ pad_wd = (((self.wd // 8) + 1) * 8 - self.wd) % 8
+ self._pad = [pad_wd // 2, pad_wd - pad_wd // 2, 0, pad_ht]
+
+ def pad(self, *inputs):
+ return [F.pad(x, self._pad, mode="replicate") for x in inputs]
+
+ def unpad(self, x):
+ ht, wd = x.shape[-2:]
+ c = [self._pad[2], ht - self._pad[3], self._pad[0], wd - self._pad[1]]
+ return x[..., c[0] : c[1], c[2] : c[3]]
+
+
+def forward_interpolate(flow):
+ flow = flow.detach().cpu().numpy()
+ dx, dy = flow[0], flow[1]
+
+ ht, wd = dx.shape
+ x0, y0 = np.meshgrid(np.arange(wd), np.arange(ht))
+
+ x1 = x0 + dx
+ y1 = y0 + dy
+
+ x1 = x1.reshape(-1)
+ y1 = y1.reshape(-1)
+ dx = dx.reshape(-1)
+ dy = dy.reshape(-1)
+
+ valid = (x1 > 0) & (x1 < wd) & (y1 > 0) & (y1 < ht)
+ x1 = x1[valid]
+ y1 = y1[valid]
+ dx = dx[valid]
+ dy = dy[valid]
+
+ flow_x = interpolate.griddata((x1, y1), dx, (x0, y0), method="cubic", fill_value=0)
+
+ flow_y = interpolate.griddata((x1, y1), dy, (x0, y0), method="cubic", fill_value=0)
+
+ flow = np.stack([flow_x, flow_y], axis=0)
+ return torch.from_numpy(flow).float()
+
+
+def bilinear_sampler(img, coords, mode="bilinear", mask=False):
+ """Wrapper for grid_sample, uses pixel coordinates"""
+ H, W = img.shape[-2:]
+ xgrid, ygrid = coords.split([1, 1], dim=-1)
+ xgrid = 2 * xgrid / (W - 1) - 1
+ ygrid = 2 * ygrid / (H - 1) - 1
+
+ grid = torch.cat([xgrid, ygrid], dim=-1)
+ # print(img.size())
+ img = F.grid_sample(img, grid, align_corners=True)
+
+ if mask:
+ mask = (xgrid > -1) & (ygrid > -1) & (xgrid < 1) & (ygrid < 1)
+ return img, mask.float()
+
+ return img
+
+
+def coords_grid(batch, ht, wd):
+ coords = torch.meshgrid(torch.arange(ht), torch.arange(wd))
+ coords = torch.stack(coords[::-1], dim=0).float()
+ return coords[None].repeat(batch, 1, 1, 1)
+
+
+def upflow8(flow, mode="bilinear"):
+ new_size = (8 * flow.shape[2], 8 * flow.shape[3])
+ return 8 * F.interpolate(flow, size=new_size, mode=mode, align_corners=True)
+
+
+class CorrBlock:
+ def __init__(self, fmap1, fmap2, num_levels=4, radius=4):
+ self.num_levels = num_levels
+ self.radius = radius
+ self.corr_pyramid = []
+
+ # all pairs correlation
+ corr = CorrBlock.corr(fmap1, fmap2)
+
+ batch, h1, w1, dim, h2, w2 = corr.shape
+ corr = corr.reshape(batch * h1 * w1, dim, h2, w2)
+
+ self.corr_pyramid.append(corr)
+ for i in range(self.num_levels - 1):
+ corr = F.avg_pool2d(corr, 2, stride=2)
+ self.corr_pyramid.append(corr)
+
+ def __call__(self, coords):
+ r = self.radius
+ coords = coords.permute(0, 2, 3, 1)
+ batch, h1, w1, _ = coords.shape
+
+ out_pyramid = []
+ for i in range(self.num_levels):
+ corr = self.corr_pyramid[i]
+ dx = torch.linspace(-r, r, 2 * r + 1)
+ dy = torch.linspace(-r, r, 2 * r + 1)
+ delta = torch.stack(torch.meshgrid(dy, dx), dim=-1).to(coords.device)
+
+ centroid_lvl = coords.reshape(batch * h1 * w1, 1, 1, 2) / 2**i
+ delta_lvl = delta.view(1, 2 * r + 1, 2 * r + 1, 2)
+ coords_lvl = centroid_lvl + delta_lvl
+
+ corr = bilinear_sampler(corr, coords_lvl)
+ corr = corr.view(batch, h1, w1, -1)
+ out_pyramid.append(corr)
+
+ out = torch.cat(out_pyramid, dim=-1)
+ return out.permute(0, 3, 1, 2).contiguous().float()
+
+ @staticmethod
+ def corr(fmap1, fmap2):
+ batch, dim, ht, wd = fmap1.shape
+ fmap1 = fmap1.view(batch, dim, ht * wd)
+ fmap2 = fmap2.view(batch, dim, ht * wd)
+
+ corr = torch.matmul(fmap1.transpose(1, 2), fmap2)
+ corr = corr.view(batch, ht, wd, 1, ht, wd)
+ return corr / torch.sqrt(torch.tensor(dim).float())
+
+
+class FlowHead(nn.Module):
+ def __init__(self, input_dim=128, hidden_dim=256):
+ super(FlowHead, self).__init__()
+ self.conv1 = nn.Conv2d(input_dim, hidden_dim, 3, padding=1)
+ self.conv2 = nn.Conv2d(hidden_dim, 2, 3, padding=1)
+ self.relu = nn.ReLU(inplace=True)
+
+ def forward(self, x):
+ return self.conv2(self.relu(self.conv1(x)))
+
+
+class ConvGRU(nn.Module):
+ def __init__(self, hidden_dim=128, input_dim=192 + 128):
+ super(ConvGRU, self).__init__()
+ self.convz = nn.Conv2d(hidden_dim + input_dim, hidden_dim, 3, padding=1)
+ self.convr = nn.Conv2d(hidden_dim + input_dim, hidden_dim, 3, padding=1)
+ self.convq = nn.Conv2d(hidden_dim + input_dim, hidden_dim, 3, padding=1)
+
+ def forward(self, h, x):
+ hx = torch.cat([h, x], dim=1)
+
+ z = torch.sigmoid(self.convz(hx))
+ r = torch.sigmoid(self.convr(hx))
+ q = torch.tanh(self.convq(torch.cat([r * h, x], dim=1)))
+
+ h = (1 - z) * h + z * q
+ return h
+
+
+class SepConvGRU(nn.Module):
+ def __init__(self, hidden_dim=128, input_dim=192 + 128):
+ super(SepConvGRU, self).__init__()
+ self.convz1 = nn.Conv2d(
+ hidden_dim + input_dim, hidden_dim, (1, 5), padding=(0, 2)
+ )
+ self.convr1 = nn.Conv2d(
+ hidden_dim + input_dim, hidden_dim, (1, 5), padding=(0, 2)
+ )
+ self.convq1 = nn.Conv2d(
+ hidden_dim + input_dim, hidden_dim, (1, 5), padding=(0, 2)
+ )
+
+ self.convz2 = nn.Conv2d(
+ hidden_dim + input_dim, hidden_dim, (5, 1), padding=(2, 0)
+ )
+ self.convr2 = nn.Conv2d(
+ hidden_dim + input_dim, hidden_dim, (5, 1), padding=(2, 0)
+ )
+ self.convq2 = nn.Conv2d(
+ hidden_dim + input_dim, hidden_dim, (5, 1), padding=(2, 0)
+ )
+
+ def forward(self, h, x):
+ # horizontal
+ hx = torch.cat([h, x], dim=1)
+ z = torch.sigmoid(self.convz1(hx))
+ r = torch.sigmoid(self.convr1(hx))
+ q = torch.tanh(self.convq1(torch.cat([r * h, x], dim=1)))
+ h = (1 - z) * h + z * q
+
+ # vertical
+ hx = torch.cat([h, x], dim=1)
+ z = torch.sigmoid(self.convz2(hx))
+ r = torch.sigmoid(self.convr2(hx))
+ q = torch.tanh(self.convq2(torch.cat([r * h, x], dim=1)))
+ h = (1 - z) * h + z * q
+
+ return h
+
+
+class SmallMotionEncoder(nn.Module):
+ def __init__(self, args):
+ super(SmallMotionEncoder, self).__init__()
+ cor_planes = args.corr_levels * (2 * args.corr_radius + 1) ** 2
+ self.convc1 = nn.Conv2d(cor_planes, 96, 1, padding=0)
+ self.convf1 = nn.Conv2d(2, 64, 7, padding=3)
+ self.convf2 = nn.Conv2d(64, 32, 3, padding=1)
+ self.conv = nn.Conv2d(128, 80, 3, padding=1)
+
+ def forward(self, flow, corr):
+ cor = F.relu(self.convc1(corr))
+ flo = F.relu(self.convf1(flow))
+ flo = F.relu(self.convf2(flo))
+ cor_flo = torch.cat([cor, flo], dim=1)
+ out = F.relu(self.conv(cor_flo))
+ return torch.cat([out, flow], dim=1)
+
+
+class BasicMotionEncoder(nn.Module):
+ def __init__(self, args):
+ super(BasicMotionEncoder, self).__init__()
+ cor_planes = args.corr_levels * (2 * args.corr_radius + 1) ** 2
+ self.convc1 = nn.Conv2d(cor_planes, 256, 1, padding=0)
+ self.convc2 = nn.Conv2d(256, 192, 3, padding=1)
+ self.convf1 = nn.Conv2d(2, 128, 7, padding=3)
+ self.convf2 = nn.Conv2d(128, 64, 3, padding=1)
+ self.conv = nn.Conv2d(64 + 192, 128 - 2, 3, padding=1)
+
+ def forward(self, flow, corr):
+ cor = F.relu(self.convc1(corr))
+ cor = F.relu(self.convc2(cor))
+ flo = F.relu(self.convf1(flow))
+ flo = F.relu(self.convf2(flo))
+
+ cor_flo = torch.cat([cor, flo], dim=1)
+ out = F.relu(self.conv(cor_flo))
+ return torch.cat([out, flow], dim=1)
+
+
+class SmallUpdateBlock(nn.Module):
+ def __init__(self, args, hidden_dim=96):
+ super(SmallUpdateBlock, self).__init__()
+ self.encoder = SmallMotionEncoder(args)
+ self.gru = ConvGRU(hidden_dim=hidden_dim, input_dim=82 + 64)
+ self.flow_head = FlowHead(hidden_dim, hidden_dim=128)
+
+ def forward(self, net, inp, corr, flow):
+ motion_features = self.encoder(flow, corr)
+ inp = torch.cat([inp, motion_features], dim=1)
+ net = self.gru(net, inp)
+ delta_flow = self.flow_head(net)
+
+ return net, None, delta_flow
+
+
+class BasicUpdateBlock(nn.Module):
+ def __init__(self, args, hidden_dim=128, input_dim=128):
+ super(BasicUpdateBlock, self).__init__()
+ self.args = args
+ self.encoder = BasicMotionEncoder(args)
+ self.gru = SepConvGRU(hidden_dim=hidden_dim, input_dim=128 + hidden_dim)
+ self.flow_head = FlowHead(hidden_dim, hidden_dim=256)
+
+ self.mask = nn.Sequential(
+ nn.Conv2d(128, 256, 3, padding=1),
+ nn.ReLU(inplace=True),
+ nn.Conv2d(256, 64 * 9, 1, padding=0),
+ )
+
+ def forward(self, net, inp, corr, flow, upsample=True):
+ motion_features = self.encoder(flow, corr)
+ inp = torch.cat([inp, motion_features], dim=1)
+
+ net = self.gru(net, inp)
+ delta_flow = self.flow_head(net)
+
+ # scale mask to balence gradients
+ mask = 0.25 * self.mask(net)
+ return net, mask, delta_flow
+
+
+class ResidualBlock(nn.Module):
+ def __init__(self, in_planes, planes, norm_fn="group", stride=1):
+ super(ResidualBlock, self).__init__()
+
+ self.conv1 = nn.Conv2d(
+ in_planes, planes, kernel_size=3, padding=1, stride=stride
+ )
+ self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, padding=1)
+ self.relu = nn.ReLU(inplace=True)
+
+ num_groups = planes // 8
+
+ if norm_fn == "group":
+ self.norm1 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
+ self.norm2 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
+ if not stride == 1:
+ self.norm3 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
+
+ elif norm_fn == "batch":
+ self.norm1 = nn.BatchNorm2d(planes)
+ self.norm2 = nn.BatchNorm2d(planes)
+ if not stride == 1:
+ self.norm3 = nn.BatchNorm2d(planes)
+
+ elif norm_fn == "instance":
+ self.norm1 = nn.InstanceNorm2d(planes)
+ self.norm2 = nn.InstanceNorm2d(planes)
+ if not stride == 1:
+ self.norm3 = nn.InstanceNorm2d(planes)
+
+ elif norm_fn == "none":
+ self.norm1 = nn.Sequential()
+ self.norm2 = nn.Sequential()
+ if not stride == 1:
+ self.norm3 = nn.Sequential()
+
+ if stride == 1:
+ self.downsample = None
+
+ else:
+ self.downsample = nn.Sequential(
+ nn.Conv2d(in_planes, planes, kernel_size=1, stride=stride), self.norm3
+ )
+
+ def forward(self, x):
+ y = x
+ y = self.relu(self.norm1(self.conv1(y)))
+ y = self.relu(self.norm2(self.conv2(y)))
+
+ if self.downsample is not None:
+ x = self.downsample(x)
+
+ return self.relu(x + y)
+
+
+class BottleneckBlock(nn.Module):
+ def __init__(self, in_planes, planes, norm_fn="group", stride=1):
+ super(BottleneckBlock, self).__init__()
+
+ self.conv1 = nn.Conv2d(in_planes, planes // 4, kernel_size=1, padding=0)
+ self.conv2 = nn.Conv2d(
+ planes // 4, planes // 4, kernel_size=3, padding=1, stride=stride
+ )
+ self.conv3 = nn.Conv2d(planes // 4, planes, kernel_size=1, padding=0)
+ self.relu = nn.ReLU(inplace=True)
+
+ num_groups = planes // 8
+
+ if norm_fn == "group":
+ self.norm1 = nn.GroupNorm(num_groups=num_groups, num_channels=planes // 4)
+ self.norm2 = nn.GroupNorm(num_groups=num_groups, num_channels=planes // 4)
+ self.norm3 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
+ if not stride == 1:
+ self.norm4 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
+
+ elif norm_fn == "batch":
+ self.norm1 = nn.BatchNorm2d(planes // 4)
+ self.norm2 = nn.BatchNorm2d(planes // 4)
+ self.norm3 = nn.BatchNorm2d(planes)
+ if not stride == 1:
+ self.norm4 = nn.BatchNorm2d(planes)
+
+ elif norm_fn == "instance":
+ self.norm1 = nn.InstanceNorm2d(planes // 4)
+ self.norm2 = nn.InstanceNorm2d(planes // 4)
+ self.norm3 = nn.InstanceNorm2d(planes)
+ if not stride == 1:
+ self.norm4 = nn.InstanceNorm2d(planes)
+
+ elif norm_fn == "none":
+ self.norm1 = nn.Sequential()
+ self.norm2 = nn.Sequential()
+ self.norm3 = nn.Sequential()
+ if not stride == 1:
+ self.norm4 = nn.Sequential()
+
+ if stride == 1:
+ self.downsample = None
+
+ else:
+ self.downsample = nn.Sequential(
+ nn.Conv2d(in_planes, planes, kernel_size=1, stride=stride), self.norm4
+ )
+
+ def forward(self, x):
+ y = x
+ y = self.relu(self.norm1(self.conv1(y)))
+ y = self.relu(self.norm2(self.conv2(y)))
+ y = self.relu(self.norm3(self.conv3(y)))
+
+ if self.downsample is not None:
+ x = self.downsample(x)
+
+ return self.relu(x + y)
+
+
+class BasicEncoder(nn.Module):
+ def __init__(self, output_dim=128, norm_fn="batch", dropout=0.0):
+ super(BasicEncoder, self).__init__()
+ self.norm_fn = norm_fn
+
+ if self.norm_fn == "group":
+ self.norm1 = nn.GroupNorm(num_groups=8, num_channels=64)
+
+ elif self.norm_fn == "batch":
+ self.norm1 = nn.BatchNorm2d(64)
+
+ elif self.norm_fn == "instance":
+ self.norm1 = nn.InstanceNorm2d(64)
+
+ elif self.norm_fn == "none":
+ self.norm1 = nn.Sequential()
+
+ self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3)
+ self.relu1 = nn.ReLU(inplace=True)
+
+ self.in_planes = 64
+ self.layer1 = self._make_layer(64, stride=1)
+ self.layer2 = self._make_layer(96, stride=2)
+ self.layer3 = self._make_layer(128, stride=2)
+
+ # output convolution
+ self.conv2 = nn.Conv2d(128, output_dim, kernel_size=1)
+
+ self.dropout = None
+ if dropout > 0:
+ self.dropout = nn.Dropout2d(p=dropout)
+
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")
+ elif isinstance(m, (nn.BatchNorm2d, nn.InstanceNorm2d, nn.GroupNorm)):
+ if m.weight is not None:
+ nn.init.constant_(m.weight, 1)
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+
+ def _make_layer(self, dim, stride=1):
+ layer1 = ResidualBlock(self.in_planes, dim, self.norm_fn, stride=stride)
+ layer2 = ResidualBlock(dim, dim, self.norm_fn, stride=1)
+ layers = (layer1, layer2)
+
+ self.in_planes = dim
+ return nn.Sequential(*layers)
+
+ def forward(self, x):
+ # if input is list, combine batch dimension
+ is_list = isinstance(x, tuple) or isinstance(x, list)
+ if is_list:
+ batch_dim = x[0].shape[0]
+ x = torch.cat(x, dim=0)
+
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu1(x)
+
+ x = self.layer1(x)
+ x = self.layer2(x)
+ x = self.layer3(x)
+
+ x = self.conv2(x)
+
+ if self.training and self.dropout is not None:
+ x = self.dropout(x)
+
+ if is_list:
+ x = torch.split(x, [batch_dim, batch_dim], dim=0)
+
+ return x
+
+
+class BasicEncoder1(nn.Module):
+ def __init__(self, output_dim=128, norm_fn="batch", dropout=0.0):
+ super(BasicEncoder1, self).__init__()
+ self.norm_fn = norm_fn
+
+ if self.norm_fn == "group":
+ self.norm1 = nn.GroupNorm(num_groups=8, num_channels=64)
+
+ elif self.norm_fn == "batch":
+ self.norm1 = nn.BatchNorm2d(64)
+
+ elif self.norm_fn == "instance":
+ self.norm1 = nn.InstanceNorm2d(64)
+
+ elif self.norm_fn == "none":
+ self.norm1 = nn.Sequential()
+
+ self.conv1 = nn.Conv2d(2, 64, kernel_size=7, stride=2, padding=3)
+ self.relu1 = nn.ReLU(inplace=True)
+
+ self.in_planes = 64
+ self.layer1 = self._make_layer(64, stride=1)
+ self.layer2 = self._make_layer(96, stride=2)
+ self.layer3 = self._make_layer(128, stride=2)
+
+ # output convolution
+ self.conv2 = nn.Conv2d(128, output_dim, kernel_size=1)
+
+ self.dropout = None
+ if dropout > 0:
+ self.dropout = nn.Dropout2d(p=dropout)
+
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")
+ elif isinstance(m, (nn.BatchNorm2d, nn.InstanceNorm2d, nn.GroupNorm)):
+ if m.weight is not None:
+ nn.init.constant_(m.weight, 1)
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+
+ def _make_layer(self, dim, stride=1):
+ layer1 = ResidualBlock(self.in_planes, dim, self.norm_fn, stride=stride)
+ layer2 = ResidualBlock(dim, dim, self.norm_fn, stride=1)
+ layers = (layer1, layer2)
+
+ self.in_planes = dim
+ return nn.Sequential(*layers)
+
+ def forward(self, x):
+ # if input is list, combine batch dimension
+ is_list = isinstance(x, tuple) or isinstance(x, list)
+ if is_list:
+ batch_dim = x[0].shape[0]
+ x = torch.cat(x, dim=0)
+
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu1(x)
+
+ x = self.layer1(x)
+ x = self.layer2(x)
+ x = self.layer3(x)
+
+ x = self.conv2(x)
+
+ if self.training and self.dropout is not None:
+ x = self.dropout(x)
+
+ if is_list:
+ x = torch.split(x, [batch_dim, batch_dim], dim=0)
+
+ return x
+
+
+class SmallEncoder(nn.Module):
+ def __init__(self, output_dim=128, norm_fn="batch", dropout=0.0):
+ super(SmallEncoder, self).__init__()
+ self.norm_fn = norm_fn
+
+ if self.norm_fn == "group":
+ self.norm1 = nn.GroupNorm(num_groups=8, num_channels=32)
+
+ elif self.norm_fn == "batch":
+ self.norm1 = nn.BatchNorm2d(32)
+
+ elif self.norm_fn == "instance":
+ self.norm1 = nn.InstanceNorm2d(32)
+
+ elif self.norm_fn == "none":
+ self.norm1 = nn.Sequential()
+
+ self.conv1 = nn.Conv2d(3, 32, kernel_size=7, stride=2, padding=3)
+ self.relu1 = nn.ReLU(inplace=True)
+
+ self.in_planes = 32
+ self.layer1 = self._make_layer(32, stride=1)
+ self.layer2 = self._make_layer(64, stride=2)
+ self.layer3 = self._make_layer(96, stride=2)
+
+ self.dropout = None
+ if dropout > 0:
+ self.dropout = nn.Dropout2d(p=dropout)
+
+ self.conv2 = nn.Conv2d(96, output_dim, kernel_size=1)
+
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")
+ elif isinstance(m, (nn.BatchNorm2d, nn.InstanceNorm2d, nn.GroupNorm)):
+ if m.weight is not None:
+ nn.init.constant_(m.weight, 1)
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+
+ def _make_layer(self, dim, stride=1):
+ layer1 = BottleneckBlock(self.in_planes, dim, self.norm_fn, stride=stride)
+ layer2 = BottleneckBlock(dim, dim, self.norm_fn, stride=1)
+ layers = (layer1, layer2)
+
+ self.in_planes = dim
+ return nn.Sequential(*layers)
+
+ def forward(self, x):
+ # if input is list, combine batch dimension
+ is_list = isinstance(x, tuple) or isinstance(x, list)
+ if is_list:
+ batch_dim = x[0].shape[0]
+ x = torch.cat(x, dim=0)
+
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu1(x)
+
+ x = self.layer1(x)
+ x = self.layer2(x)
+ x = self.layer3(x)
+ x = self.conv2(x)
+
+ if self.training and self.dropout is not None:
+ x = self.dropout(x)
+
+ if is_list:
+ x = torch.split(x, [batch_dim, batch_dim], dim=0)
+
+ return x
+
+
+##################################################
+# RFR is implemented based on RAFT optical flow #
+##################################################
+
+
+def backwarp(img, flow):
+ _, _, H, W = img.size()
+
+ u = flow[:, 0, :, :]
+ v = flow[:, 1, :, :]
+
+ gridX, gridY = np.meshgrid(np.arange(W), np.arange(H))
+
+ gridX = torch.tensor(
+ gridX,
+ requires_grad=False,
+ ).cuda()
+ gridY = torch.tensor(
+ gridY,
+ requires_grad=False,
+ ).cuda()
+ x = gridX.unsqueeze(0).expand_as(u).float() + u
+ y = gridY.unsqueeze(0).expand_as(v).float() + v
+ # range -1 to 1
+ x = 2 * (x / (W - 1) - 0.5)
+ y = 2 * (y / (H - 1) - 0.5)
+ # stacking X and Y
+ grid = torch.stack((x, y), dim=3)
+ # Sample pixels using bilinear interpolation.
+ imgOut = torch.nn.functional.grid_sample(img, grid, align_corners=True)
+
+ return imgOut
+
+
+class ErrorAttention(nn.Module):
+ """A three-layer network for predicting mask"""
+
+ def __init__(self, input, output):
+ super(ErrorAttention, self).__init__()
+ self.conv1 = nn.Conv2d(input, 32, 5, padding=2)
+ self.conv2 = nn.Conv2d(32, 32, 3, padding=1)
+ self.conv3 = nn.Conv2d(38, output, 3, padding=1)
+ self.prelu1 = nn.PReLU()
+ self.prelu2 = nn.PReLU()
+
+ def forward(self, x1):
+ x = self.prelu1(self.conv1(x1))
+ x = self.prelu2(torch.cat([self.conv2(x), x1], dim=1))
+ x = self.conv3(x)
+ return x
+
+
+class RFR(nn.Module):
+ def __init__(self, args):
+ super(RFR, self).__init__()
+ self.attention2 = ErrorAttention(6, 1)
+ self.hidden_dim = hdim = 128
+ self.context_dim = cdim = 128
+ args.corr_levels = 4
+ args.corr_radius = 4
+ args.dropout = 0
+ self.args = args
+
+ # feature network, context network, and update block
+ self.fnet = BasicEncoder(output_dim=256, norm_fn="none", dropout=args.dropout)
+ # self.cnet = BasicEncoder(output_dim=hdim+cdim, norm_fn='none', dropout=args.dropout)
+ self.update_block = BasicUpdateBlock(self.args, hidden_dim=hdim)
+
+ def freeze_bn(self):
+ for m in self.modules():
+ if isinstance(m, nn.BatchNorm2d):
+ m.eval()
+
+ def initialize_flow(self, img):
+ """Flow is represented as difference between two coordinate grids flow = coords1 - coords0"""
+ N, C, H, W = img.shape
+ coords0 = coords_grid(N, H // 8, W // 8).to(img.device)
+ coords1 = coords_grid(N, H // 8, W // 8).to(img.device)
+
+ # optical flow computed as difference: flow = coords1 - coords0
+ return coords0, coords1
+
+ def upsample_flow(self, flow, mask):
+ """Upsample flow field [H/8, W/8, 2] -> [H, W, 2] using convex combination"""
+ N, _, H, W = flow.shape
+ mask = mask.view(N, 1, 9, 8, 8, H, W)
+ mask = torch.softmax(mask, dim=2)
+
+ up_flow = F.unfold(8 * flow, [3, 3], padding=1)
+ up_flow = up_flow.view(N, 2, 9, 1, 1, H, W)
+
+ up_flow = torch.sum(mask * up_flow, dim=2)
+ up_flow = up_flow.permute(0, 1, 4, 2, 5, 3)
+ return up_flow.reshape(N, 2, 8 * H, 8 * W)
+
+ def forward(
+ self, image1, image2, iters=12, flow_init=None, upsample=True, test_mode=False
+ ):
+ H, W = image1.size()[2:4]
+ H8 = H // 8 * 8
+ W8 = W // 8 * 8
+
+ if flow_init is not None:
+ flow_init_resize = F.interpolate(
+ flow_init, size=(H8 // 8, W8 // 8), mode="nearest"
+ )
+
+ flow_init_resize[:, :1] = (
+ flow_init_resize[:, :1].clone() * (W8 // 8 * 1.0) / flow_init.size()[3]
+ )
+ flow_init_resize[:, 1:] = (
+ flow_init_resize[:, 1:].clone() * (H8 // 8 * 1.0) / flow_init.size()[2]
+ )
+
+ if not hasattr(self.args, "not_use_rfr_mask") or (
+ hasattr(self.args, "not_use_rfr_mask")
+ and (not self.args.not_use_rfr_mask)
+ ):
+ im18 = F.interpolate(image1, size=(H8 // 8, W8 // 8), mode="bilinear")
+ im28 = F.interpolate(image2, size=(H8 // 8, W8 // 8), mode="bilinear")
+
+ warp21 = backwarp(im28, flow_init_resize)
+ error21 = torch.sum(torch.abs(warp21 - im18), dim=1, keepdim=True)
+ # print('errormin', error21.min(), error21.max())
+ f12init = (
+ torch.exp(
+ -self.attention2(
+ torch.cat([im18, error21, flow_init_resize], dim=1)
+ )
+ ** 2
+ )
+ * flow_init_resize
+ )
+ else:
+ flow_init_resize = None
+ flow_init = torch.zeros(
+ image1.size()[0], 2, image1.size()[2] // 8, image1.size()[3] // 8
+ ).cuda()
+ error21 = torch.zeros(
+ image1.size()[0], 1, image1.size()[2] // 8, image1.size()[3] // 8
+ ).cuda()
+
+ f12_init = flow_init
+ # print('None inital flow!')
+
+ image1 = F.interpolate(image1, size=(H8, W8), mode="bilinear")
+ image2 = F.interpolate(image2, size=(H8, W8), mode="bilinear")
+
+ f12s, f12, f12_init = self.forward_pred(
+ image1, image2, iters, flow_init_resize, upsample, test_mode
+ )
+
+ if hasattr(self.args, "requires_sq_flow") and self.args.requires_sq_flow:
+ for ii in range(len(f12s)):
+ f12s[ii] = F.interpolate(f12s[ii], size=(H, W), mode="bilinear")
+ f12s[ii][:, :1] = f12s[ii][:, :1].clone() / (1.0 * W8) * W
+ f12s[ii][:, 1:] = f12s[ii][:, 1:].clone() / (1.0 * H8) * H
+ if self.training:
+ return f12s
+ else:
+ return [f12s[-1]], f12_init
+ else:
+ f12[:, :1] = f12[:, :1].clone() / (1.0 * W8) * W
+ f12[:, 1:] = f12[:, 1:].clone() / (1.0 * H8) * H
+
+ f12 = F.interpolate(f12, size=(H, W), mode="bilinear")
+ # print('wo!!')
+ return (
+ f12,
+ f12_init,
+ error21,
+ )
+
+ def forward_pred(
+ self, image1, image2, iters=12, flow_init=None, upsample=True, test_mode=False
+ ):
+ """Estimate optical flow between pair of frames"""
+
+ image1 = image1.contiguous()
+ image2 = image2.contiguous()
+
+ hdim = self.hidden_dim
+ cdim = self.context_dim
+
+ # run the feature network
+ with autocast(device.type, enabled=self.args.mixed_precision):
+ fmap1, fmap2 = self.fnet([image1, image2])
+ fmap1 = fmap1.float()
+ fmap2 = fmap2.float()
+ corr_fn = CorrBlock(fmap1, fmap2, radius=self.args.corr_radius)
+
+ # run the context network
+ with autocast(device.type, enabled=self.args.mixed_precision):
+ cnet = self.fnet(image1)
+ net, inp = torch.split(cnet, [hdim, cdim], dim=1)
+ net = torch.tanh(net)
+ inp = torch.relu(inp)
+
+ coords0, coords1 = self.initialize_flow(image1)
+
+ if flow_init is not None:
+ coords1 = coords1 + flow_init
+
+ flow_predictions = []
+ for itr in range(iters):
+ coords1 = coords1.detach()
+ if itr == 0:
+ if flow_init is not None:
+ coords1 = coords1 + flow_init
+ corr = corr_fn(coords1) # index correlation volume
+
+ flow = coords1 - coords0
+ with autocast(device.type, enabled=self.args.mixed_precision):
+ net, up_mask, delta_flow = self.update_block(net, inp, corr, flow)
+
+ # F(t+1) = F(t) + \Delta(t)
+ coords1 = coords1 + delta_flow
+
+ # upsample predictions
+ if up_mask is None:
+ flow_up = upflow8(coords1 - coords0)
+ else:
+ flow_up = self.upsample_flow(coords1 - coords0, up_mask)
+
+ flow_predictions.append(flow_up)
+
+ return flow_predictions, flow_up, flow_init
+
+####################### WARPING #######################
+
+
+# expects batched tensors, considered low-level operation
+# img: bs, ch, h, w
+# flow: bs, xy (pix displace), h, w
+def flow_backwarp(
+ img, flow, resample="bilinear", padding_mode="border", align_corners=False
+):
+ if len(img.shape) != 4:
+ img = img[None,]
+ if len(flow.shape) != 4:
+ flow = flow[None,]
+ q = (
+ 2
+ * flow
+ / torch.tensor(
+ [
+ flow.shape[-2],
+ flow.shape[-1],
+ ],
+ device=flow.device,
+ dtype=torch.float,
+ )[None, :, None, None]
+ )
+ q = q + torch.stack(
+ torch.meshgrid(
+ torch.linspace(-1, 1, flow.shape[-2]),
+ torch.linspace(-1, 1, flow.shape[-1]),
+ )
+ )[
+ None,
+ ].to(
+ flow.device
+ )
+ if img.dtype != q.dtype:
+ img = img.type(q.dtype)
+
+ return nn.functional.grid_sample(
+ img,
+ q.flip(dims=(1,)).permute(0, 2, 3, 1),
+ mode=resample, # nearest, bicubic, bilinear
+ padding_mode=padding_mode, # border, zeros, reflection
+ align_corners=align_corners,
+ )
+
+
+backwarp = flow_warp = flow_backwarp
+
+
+# mode: sum, avg, lin, softmax
+# lin/softmax w/out metric defaults to avg
+# must use gpu, move back to cpu if retain_device
+# typical metric: -20 * | img0 - backwarp(img1,flow) |
+# From Fannovel16: Changed mode params for common ops.
+def flow_forewarp(
+ img, flow, mode="average", metric=None, mask=False, retain_device=True
+):
+ # setup
+ #if mode == "sum":
+ # mode = "summation"
+ #elif mode == "avg":
+ # mode = "average"
+ if mode in ["lin", "linear"]:
+ #mode = "linear" if metric is not None else "average"
+ mode = "linear" if metric is not None else "avg"
+ elif mode in ["sm", "softmax"]:
+ #mode = "softmax" if metric is not None else "average"
+ mode = "soft" if metric is not None else "avg"
+ if len(img.shape) != 4:
+ img = img[None,]
+ if len(flow.shape) != 4:
+ flow = flow[None,]
+ if metric is not None and len(metric.shape) != 4:
+ metric = metric[None,]
+ flow = flow.flip(dims=(1,))
+ if img.dtype != torch.float32:
+ img = img.type(torch.float32)
+ if flow.dtype != torch.float32:
+ flow = flow.type(torch.float32)
+ if metric is not None and metric.dtype != torch.float32:
+ metric = metric.type(torch.float32)
+
+ # move to gpu if necessary
+ assert img.device == flow.device
+ if metric is not None:
+ assert img.device == metric.device
+ was_cpu = img.device.type == "cpu"
+ if was_cpu:
+ img = img.to("cuda")
+ flow = flow.to("cuda")
+ if metric is not None:
+ metric = metric.to("cuda")
+
+ # add mask
+ if mask:
+ bs, ch, h, w = img.shape
+ img = torch.cat(
+ [img, torch.ones(bs, 1, h, w, dtype=img.dtype, device=img.device)], dim=1
+ )
+
+ # forward, move back to cpu if desired
+ ans = FunctionSoftsplat(img, flow, metric, mode)
+ if was_cpu and retain_device:
+ ans = ans.cpu()
+ return ans
+
+
+forewarp = flow_forewarp
+
+
+# resizing utility
+def flow_resize(flow, size, mode="nearest", align_corners=False):
+ # flow: bs,xy,h,w
+ size = pixel_ij(size, rounding=True)
+ if flow.dtype != torch.float:
+ flow = flow.float()
+ if len(flow.shape) == 3:
+ flow = flow[None,]
+ if flow.shape[-2:] == size:
+ return flow
+ return (
+ nn.functional.interpolate(
+ flow,
+ size=size,
+ mode=mode,
+ align_corners=align_corners if mode != "nearest" else None,
+ )
+ * torch.tensor(
+ [b / a for a, b in zip(flow.shape[-2:], size)],
+ device=flow.device,
+ )[None, :, None, None]
+ )
+
+
+####################### TRADITIONAL #######################
+
+# dense
+_lucaskanade = lambda a, b: np.moveaxis(
+ cv2.optflow.calcOpticalFlowSparseToDense(
+ a,
+ b, # grid_step=5, sigma=0.5,
+ ),
+ 2,
+ 0,
+)[
+ None,
+]
+_farneback = lambda a, b: np.moveaxis(
+ cv2.calcOpticalFlowFarneback(
+ a,
+ b,
+ None,
+ 0.6,
+ 3,
+ 25,
+ 7,
+ 5,
+ 1.2,
+ cv2.OPTFLOW_FARNEBACK_GAUSSIAN,
+ ),
+ 2,
+ 0,
+)[
+ None,
+]
+_dtvl1_ = cv2.optflow.createOptFlow_DualTVL1()
+_dtvl1 = lambda a, b: np.moveaxis(
+ _dtvl1_.calc(
+ a,
+ b,
+ None,
+ ),
+ 2,
+ 0,
+)[
+ None,
+]
+_simple = lambda a, b: np.moveaxis(
+ cv2.optflow.calcOpticalFlowSF(
+ a,
+ b,
+ 3,
+ 5,
+ 5,
+ ),
+ 2,
+ 0,
+)[
+ None,
+]
+_pca_ = cv2.optflow.createOptFlow_PCAFlow()
+_pca = lambda a, b: np.moveaxis(
+ _pca_.calc(
+ a,
+ b,
+ None,
+ ),
+ 2,
+ 0,
+)[
+ None,
+]
+_drlof = lambda a, b: np.moveaxis(
+ cv2.optflow.calcOpticalFlowDenseRLOF(
+ a,
+ b,
+ None,
+ ),
+ 2,
+ 0,
+)[
+ None,
+]
+_deepflow_ = cv2.optflow.createOptFlow_DeepFlow()
+_deepflow = lambda a, b: np.moveaxis(
+ _deepflow_.calc(
+ a,
+ b,
+ None,
+ ),
+ 2,
+ 0,
+)[
+ None,
+]
+
+
+def cv2flow(a, b, method="lucaskanade", back=False):
+ if method == "lucaskanade":
+ f = _lucaskanade
+ a = a.convert("L").cv2()
+ b = b.convert("L").cv2()
+ elif method == "farneback":
+ f = _farneback
+ a = a.convert("L").cv2()
+ b = b.convert("L").cv2()
+ elif method == "dtvl1":
+ f = _dtvl1
+ a = a.convert("L").cv2()
+ b = b.convert("L").cv2()
+ elif method == "simple":
+ f = _simple
+ a = a.convert("RGB").cv2()
+ b = b.convert("RGB").cv2()
+ elif method == "pca":
+ f = _pca
+ a = a.convert("L").cv2()
+ b = b.convert("L").cv2()
+ elif method == "drlof":
+ f = _drlof
+ a = a.convert("RGB").cv2()
+ b = b.convert("RGB").cv2()
+ elif method == "deepflow":
+ f = _deepflow
+ a = a.convert("L").cv2()
+ b = b.convert("L").cv2()
+ else:
+ assert 0
+ ans = f(b, a)
+ if back:
+ ans = np.concatenate(
+ [
+ ans,
+ f(a, b),
+ ]
+ )
+ return torch.tensor(ans).flip(dims=(1,))
+
+
+####################### FLOWNET2 #######################
+
+
+def flownet2(img_a, img_b, mode="shm", back=False):
+ # package
+ url = f"http://localhost:8109/get-flow"
+ if mode == "shm":
+ t = time.time()
+ fn_a = img_a.save(mkfile(f"/dev/shm/_flownet2/{t}/img_a.png"))
+ fn_b = img_b.save(mkfile(f"/dev/shm/_flownet2/{t}/img_b.png"))
+ elif mode == "net":
+ assert False, "not impl"
+ q = u2d.img2uri(img.pil("RGB"))
+ q.decode()
+ resp = requests.get(
+ url,
+ params={
+ "img_a": fn_a,
+ "img_b": fn_b,
+ "mode": mode,
+ "back": back,
+ # 'vis': vis,
+ },
+ )
+
+ # return
+ ans = {"response": resp}
+ if resp.status_code == 200:
+ j = resp.json()
+ ans["time"] = j["time"]
+ ans["output"] = {
+ "flow": torch.tensor(load(j["fn_flow"])),
+ }
+ # if vis:
+ # ans['output']['vis'] = I(j['fn_vis'])
+ if mode == "shm":
+ shutil.rmtree(f"/dev/shm/_flownet2/{t}")
+ return ans
+
+
+####################### VISUALIZATION #######################
+
+
+class Gridnet(nn.Module):
+ def __init__(self, channels_0, channels_1, channels_2, total_dropout_p, depth):
+ super().__init__()
+ self.channels_0 = ch0 = channels_0
+ self.channels_1 = ch1 = channels_1
+ self.channels_2 = ch2 = channels_2
+ self.total_dropout_p = p = total_dropout_p
+ self.depth = depth
+ self.encoders = nn.ModuleList(
+ [GridnetEncoder(ch0, ch1, ch2) for i in range(self.depth)]
+ )
+ self.decoders = nn.ModuleList(
+ [GridnetDecoder(ch0, ch1, ch2) for i in range(self.depth)]
+ )
+ self.total_dropout = GridnetTotalDropout(p)
+ return
+
+ def forward(self, x):
+ for e, enc in enumerate(self.encoders):
+ t = [self.total_dropout(i) for i in t] if e != 0 else x
+ t = enc(t)
+ for d, dec in enumerate(self.decoders):
+ t = [self.total_dropout(i) for i in t]
+ t = dec(t)
+ return t
+
+
+class GridnetEncoder(nn.Module):
+ def __init__(self, channels_0, channels_1, channels_2):
+ super().__init__()
+ self.channels_0 = ch0 = channels_0
+ self.channels_1 = ch1 = channels_1
+ self.channels_2 = ch2 = channels_2
+ self.resnet_0 = GridnetResnet(ch0)
+ self.resnet_1 = GridnetResnet(ch1)
+ self.resnet_2 = GridnetResnet(ch2)
+ self.downsample_01 = GridnetDownsample(ch0, ch1)
+ self.downsample_12 = GridnetDownsample(ch1, ch2)
+ return
+
+ def forward(self, x):
+ out = [
+ None,
+ ] * 3
+ out[0] = self.resnet_0(x[0])
+ out[1] = self.resnet_1(x[1]) + self.downsample_01(out[0])
+ out[2] = self.resnet_2(x[2]) + self.downsample_12(out[1])
+ return out
+
+
+class GridnetDecoder(nn.Module):
+ def __init__(self, channels_0, channels_1, channels_2):
+ super().__init__()
+ self.channels_0 = ch0 = channels_0
+ self.channels_1 = ch1 = channels_1
+ self.channels_2 = ch2 = channels_2
+ self.resnet_0 = GridnetResnet(ch0)
+ self.resnet_1 = GridnetResnet(ch1)
+ self.resnet_2 = GridnetResnet(ch2)
+ self.upsample_10 = GridnetUpsample(ch1, ch0)
+ self.upsample_21 = GridnetUpsample(ch2, ch1)
+ return
+
+ def forward(self, x):
+ out = [
+ None,
+ ] * 3
+ out[2] = self.resnet_2(x[2])
+ out[1] = self.resnet_1(x[1]) + self.upsample_21(out[2])
+ out[0] = self.resnet_0(x[0]) + self.upsample_10(out[1])
+ return out
+
+
+class GridnetConverter(nn.Module):
+ def __init__(self, channels_in, channels_out):
+ super().__init__()
+ self.channels_in = cin = channels_in
+ self.channels_out = cout = channels_out
+ self.nets = nn.ModuleList(
+ [
+ nn.Sequential(
+ nn.PReLU(a),
+ nn.Conv2d(a, b, kernel_size=1, padding=0),
+ nn.BatchNorm2d(b),
+ )
+ for a, b in zip(cin, cout)
+ ]
+ )
+ return
+
+ def forward(self, x):
+ return [m(q) for m, q in zip(self.nets, x)]
+
+
+class GridnetResnet(nn.Module):
+ def __init__(self, channels):
+ super().__init__()
+ self.channels = ch = channels
+ self.net = nn.Sequential(
+ nn.PReLU(ch),
+ nn.Conv2d(ch, ch, kernel_size=3, padding=1),
+ nn.BatchNorm2d(ch),
+ nn.PReLU(ch),
+ nn.Conv2d(ch, ch, kernel_size=3, padding=1),
+ nn.BatchNorm2d(ch),
+ )
+ return
+
+ def forward(self, x):
+ return x + self.net(x)
+
+
+class GridnetDownsample(nn.Module):
+ def __init__(self, channels_in, channels_out):
+ super().__init__()
+ self.channels_in = chin = channels_in
+ self.channels_out = chout = channels_out
+ self.net = nn.Sequential(
+ nn.PReLU(chin),
+ nn.Conv2d(chin, chin, kernel_size=3, padding=1, stride=2),
+ nn.BatchNorm2d(chin),
+ nn.PReLU(chin),
+ nn.Conv2d(chin, chout, kernel_size=3, padding=1),
+ nn.BatchNorm2d(chout),
+ )
+ return
+
+ def forward(self, x):
+ return self.net(x)
+
+
+class GridnetUpsample(nn.Module):
+ def __init__(self, channels_in, channels_out):
+ super().__init__()
+ self.channels_in = chin = channels_in
+ self.channels_out = chout = channels_out
+ self.net = nn.Sequential(
+ nn.Upsample(scale_factor=2, mode="nearest"),
+ nn.PReLU(chin),
+ nn.Conv2d(chin, chout, kernel_size=3, padding=1),
+ nn.BatchNorm2d(chout),
+ nn.PReLU(chout),
+ nn.Conv2d(chout, chout, kernel_size=3, padding=1),
+ nn.BatchNorm2d(chout),
+ )
+ return
+
+ def forward(self, x):
+ return self.net(x)
+
+
+class GridnetTotalDropout(nn.Module):
+ def __init__(self, p):
+ super().__init__()
+ assert 0 <= p < 1
+ self.p = p
+ self.weight = 1 / (1 - p)
+ return
+
+ def get_drop(self, x):
+ d = torch.rand(len(x))[:, None, None, None] < self.p
+ d = (1 - d.float()).to(x.device) * self.weight
+ return d
+
+ def forward(self, x, force_drop=None):
+ if force_drop is True:
+ ans = x * self.get_drop(x)
+ elif force_drop is False:
+ ans = x
+ else:
+ if self.training:
+ ans = x * self.get_drop(x)
+ else:
+ ans = x
+ return ans
+
+
+class Interpolator(nn.Module):
+ def __init__(self, size, mode="bilinear"):
+ super().__init__()
+ self.size = size
+ self.mode = mode
+ return
+
+ def forward(self, x, is_flow=False):
+ if x.shape[-2] == self.size:
+ return x
+ if len(x.shape) == 4:
+ # bs,ch,h,w
+ bs, ch, h, w = x.shape
+ ans = nn.functional.interpolate(
+ x,
+ size=self.size,
+ mode=self.mode,
+ align_corners=(False, None)[self.mode == "nearest"],
+ )
+ if is_flow:
+ ans = (
+ ans
+ * torch.tensor(
+ [b / a for a, b in zip((h, w), self.size)],
+ device=ans.device,
+ )[None, :, None, None]
+ )
+ return ans
+ elif len(x.shape) == 5:
+ # bs,k,ch,h,w (merge bs and k)
+ bs, k, ch, h, w = x.shape
+ return self.forward(
+ x.view(bs * k, ch, h, w),
+ is_flow=is_flow,
+ ).view(bs, k, ch, *self.size)
+ else:
+ assert 0
+
+
+###################### CANNY ######################
+
+
+def canny(img, a=100, b=200):
+ img = I(img).convert("L")
+ return I(cv2.Canny(img.cv2(), a, b))
+
+
+# https://www.pyimagesearch.com/2015/04/06/zero-parameter-automatic-canny-edge-detection-with-python-and-opencv/
+def canny_pis(img, sigma=0.33):
+ # compute the median of the single channel pixel intensities
+ img = I(img).convert("L").uint8(ch_last=False)
+ v = np.median(img)
+ # apply automatic Canny edge detection using the computed median
+ lower = int(max(0, (1.0 - sigma) * v))
+ upper = int(min(255, (1.0 + sigma) * v))
+ edged = cv2.Canny(img[0], lower, upper)
+ # return the edged image
+ return I(edged)
+
+
+# https://en.wikipedia.org/wiki/Otsu%27s_method
+def canny_otsu(img):
+ img = I(img).convert("L").uint8(ch_last=False)
+ high, _ = cv2.threshold(img[0], 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
+ low = 0.5 * high
+ return I(cv2.Canny(img[0], low, high))
+
+
+def xdog(img, t=1.0, epsilon=0.04, phi=100, sigma=3, k=1.6):
+ img = I(img).convert("L").uint8(ch_last=False)
+ grey = np.asarray(img, dtype=np.float32)
+ g0 = scipy.ndimage.gaussian_filter(grey, sigma)
+ g1 = scipy.ndimage.gaussian_filter(grey, sigma * k)
+
+ # ans = ((1+p) * g0 - p * g1) / 255
+ ans = (g0 - t * g1) / 255
+ ans = 1 + np.tanh(phi * (ans - epsilon)) * (ans < epsilon)
+ return ans
+
+
+def dog(img, t=1.0, sigma=1.0, k=1.6, epsilon=0.01, kernel_factor=4, clip=True):
+ img = I(img).convert("L").tensor()[None]
+ kern0 = max(2 * int(sigma * kernel_factor) + 1, 3)
+ kern1 = max(2 * int(sigma * k * kernel_factor) + 1, 3)
+ g0 = kornia.filters.gaussian_blur2d(
+ img,
+ (kern0, kern0),
+ (sigma, sigma),
+ border_type="replicate",
+ )
+ g1 = kornia.filters.gaussian_blur2d(
+ img,
+ (kern1, kern1),
+ (sigma * k, sigma * k),
+ border_type="replicate",
+ )
+ ans = 0.5 + t * (g1 - g0) - epsilon
+ ans = ans.clip(0, 1) if clip else ans
+ return ans[0].numpy()
+
+
+# input: (bs,rgb(a),h,w) or (bs,1,h,w)
+# returns: (bs,1,h,w)
+def batch_dog(img, t=1.0, sigma=1.0, k=1.6, epsilon=0.01, kernel_factor=4, clip=True):
+ # to grayscale if needed
+ bs, ch, h, w = img.shape
+ if ch in [3, 4]:
+ img = kornia.color.rgb_to_grayscale(img[:, :3])
+ else:
+ assert ch == 1
+
+ # calculate dog
+ kern0 = max(2 * int(sigma * kernel_factor) + 1, 3)
+ kern1 = max(2 * int(sigma * k * kernel_factor) + 1, 3)
+ g0 = kornia.filters.gaussian_blur2d(
+ img,
+ (kern0, kern0),
+ (sigma, sigma),
+ border_type="replicate",
+ )
+ g1 = kornia.filters.gaussian_blur2d(
+ img,
+ (kern1, kern1),
+ (sigma * k, sigma * k),
+ border_type="replicate",
+ )
+ ans = 0.5 + t * (g1 - g0) - epsilon
+ ans = ans.clip(0, 1) if clip else ans
+ return ans
+
+
+############### DERIVED DISTANCES ###############
+
+# input: (bs,h,w) or (bs,1,h,w)
+# returns: (bs,)
+# normalized s.t. metric is same across proportional image scales
+
+
+# average of two asymmetric distances
+# normalized by diameter and area
+def batch_chamfer_distance(gt, pred, block=1024, return_more=False):
+ t = batch_chamfer_distance_t(gt, pred, block=block)
+ p = batch_chamfer_distance_p(gt, pred, block=block)
+ cd = (t + p) / 2
+ return cd
+
+
+def batch_chamfer_distance_t(gt, pred, block=1024, return_more=False):
+ assert gt.device == pred.device and gt.shape == pred.shape
+ bs, h, w = gt.shape[0], gt.shape[-2], gt.shape[-1]
+ dpred = batch_edt(pred, block=block)
+ cd = (gt * dpred).float().mean((-2, -1)) / np.sqrt(h**2 + w**2)
+ if len(cd.shape) == 2:
+ assert cd.shape[1] == 1
+ cd = cd.squeeze(1)
+ return cd
+
+
+def batch_chamfer_distance_p(gt, pred, block=1024, return_more=False):
+ assert gt.device == pred.device and gt.shape == pred.shape
+ bs, h, w = gt.shape[0], gt.shape[-2], gt.shape[-1]
+ dgt = batch_edt(gt, block=block)
+ cd = (pred * dgt).float().mean((-2, -1)) / np.sqrt(h**2 + w**2)
+ if len(cd.shape) == 2:
+ assert cd.shape[1] == 1
+ cd = cd.squeeze(1)
+ return cd
+
+
+# normalized by diameter
+# always between [0,1]
+def batch_hausdorff_distance(gt, pred, block=1024, return_more=False):
+ assert gt.device == pred.device and gt.shape == pred.shape
+ bs, h, w = gt.shape[0], gt.shape[-2], gt.shape[-1]
+ dgt = batch_edt(gt, block=block)
+ dpred = batch_edt(pred, block=block)
+ hd = torch.stack(
+ [
+ (dgt * pred).amax(dim=(-2, -1)),
+ (dpred * gt).amax(dim=(-2, -1)),
+ ]
+ ).amax(dim=0).float() / np.sqrt(h**2 + w**2)
+ if len(hd.shape) == 2:
+ assert hd.shape[1] == 1
+ hd = hd.squeeze(1)
+ return hd
+
+
+#################### UTILITIES ####################
+
+
+def reset_parameters(model):
+ for layer in model.children():
+ if hasattr(layer, "reset_parameters"):
+ layer.reset_parameters()
+ return model
+
+
+def channel_squeeze(x, dim=1):
+ a = x.shape[:dim]
+ b = x.shape[dim + 2 :]
+ return x.reshape(*a, -1, *b)
+
+
+def channel_unsqueeze(x, shape, dim=1):
+ a = x.shape[:dim]
+ b = x.shape[dim + 1 :]
+ return x.reshape(*a, *shape, *b)
+
+
+def default_collate(items, device=None):
+ return to(dict(torch.utils.data.dataloader.default_collate(items)), device)
+
+
+def to(x, device):
+ if device is None:
+ return x
+ if issubclass(x.__class__, dict):
+ return dict(
+ {
+ k: v.to(device) if isinstance(v, torch.Tensor) else v
+ for k, v in x.items()
+ }
+ )
+ if isinstance(x, torch.Tensor):
+ return x.to(device)
+ if isinstance(x, np.ndarray):
+ return torch.tensor(x).to(device)
+ assert 0, "data not understood"
+
+
+################ PARSING ################
+
+from argparse import Namespace
+
+# args: all args
+# bargs: base args
+# pargs: data processing args
+# largs: data loading args
+# margs: model args
+# targs: training args
+
+
+# typically used to read dataset filters
+def read_filter(fn, cast=None, sort=True, sort_key=None):
+ if cast is None:
+ cast = lambda x: x
+ ans = [cast(line) for line in read(fn).split("\n") if line != ""]
+ if sort:
+ return sorted(ans, key=sort_key)
+ else:
+ return ans
+
+
+################ FILE MANAGEMENT ################
+
+
+def mkfile(fn, parents=True, exist_ok=True):
+ dn = "/".join(fn.split("/")[:-1])
+ mkdir(dn, parents=parents, exist_ok=exist_ok)
+ return fn
+
+
+def mkdir(dn, parents=True, exist_ok=True):
+ pathlib.Path(dn).mkdir(parents=parents, exist_ok=exist_ok)
+ return dn if (not dn[-1] == "/" or dn == "/") else dn[:-1]
+
+
+def fstrip(fn, return_more=False):
+ dspl = fn.split("/")
+ dn = "/".join(dspl[:-1]) if len(dspl) > 1 else "."
+ fn = dspl[-1]
+ fspl = fn.split(".")
+ if len(fspl) == 1:
+ bn = fspl[0]
+ ext = ""
+ else:
+ bn = ".".join(fspl[:-1])
+ ext = fspl[-1]
+ if return_more:
+ return Namespace(
+ dn=dn,
+ fn=fn,
+ path=f"{dn}/{fn}",
+ bn_path=f"{dn}/{bn}",
+ bn=bn,
+ ext=ext,
+ )
+ else:
+ return bn
+
+
+def read(fn, mode="r"):
+ with open(fn, mode) as handle:
+ return handle.read()
+
+
+def write(text, fn, mode="w"):
+ mkfile(fn, parents=True, exist_ok=True)
+ with open(fn, mode) as handle:
+ return handle.write(text)
+
+
+import pickle
+
+
+def dump(obj, fn, mode="wb"):
+ mkfile(fn, parents=True, exist_ok=True)
+ with open(fn, mode) as handle:
+ return pickle.dump(obj, handle)
+
+
+def load(fn, mode="rb"):
+ with open(fn, mode) as handle:
+ return pickle.load(handle)
+
+
+import json
+
+
+def jwrite(x, fn, mode="w", indent="\t", sort_keys=False):
+ mkfile(fn, parents=True, exist_ok=True)
+ with open(fn, mode) as handle:
+ return json.dump(x, handle, indent=indent, sort_keys=sort_keys)
+
+
+def jread(fn, mode="r"):
+ with open(fn, mode) as handle:
+ return json.load(handle)
+
+
+try:
+ import yaml
+
+ def ywrite(x, fn, mode="w", default_flow_style=False):
+ mkfile(fn, parents=True, exist_ok=True)
+ with open(fn, mode) as handle:
+ return yaml.dump(x, handle, default_flow_style=default_flow_style)
+
+ def yread(fn, mode="r"):
+ with open(fn, mode) as handle:
+ return yaml.safe_load(handle)
+
+except:
+ pass
+
+try:
+ import pyunpack
+except:
+ pass
+
+try:
+ import mysql
+ import mysql.connector
+except:
+ pass
+
+
+################ MISC ################
+
+hakase = "./env/__hakase__.jpg"
+if not os.path.isfile(hakase):
+ hakase = "./__env__/__hakase__.jpg"
+
+
+def mem(units="m"):
+ return (
+ psProcess(os.getpid()).memory_info().rss
+ / {
+ "b": 1,
+ "k": 1e3,
+ "m": 1e6,
+ "g": 1e9,
+ "t": 1e12,
+ }[units[0].lower()]
+ )
+
+
+def chunk(array, length, colwise=True):
+ if colwise:
+ return [array[i : i + length] for i in range(0, len(array), length)]
+ else:
+ return chunk(array, int(math.ceil(len(array) / length)), colwise=True)
+
+
+def classtree(x):
+ return inspect.getclasstree(inspect.getmro(x))
+
+
+################ AESTHETIC ################
+
+
+class Table:
+ def __init__(
+ self,
+ table,
+ delimiter=" ",
+ orientation="br",
+ double_colon=True,
+ ):
+ self.delimiter = delimiter
+ self.orientation = orientation
+ self.t = Table.parse(table, delimiter, orientation, double_colon)
+ return
+
+ # rendering
+ def __str__(self):
+ return self.render()
+
+ def __repr__(self):
+ return self.render()
+
+ def render(self):
+ # set up empty entry
+ empty = ("", Table._spec(self.orientation, transpose=False))
+
+ # calculate table size
+ t = copy.deepcopy(self.t)
+ totalrows = len(t)
+ totalcols = [len(r) for r in t]
+ assert min(totalcols) == max(totalcols)
+ totalcols = totalcols[0]
+
+ # string-ify
+ for i in range(totalrows):
+ for j in range(totalcols):
+ x, s = t[i][j]
+ sp = s[11]
+ if sp:
+ x = eval(f'f"{{{x}{sp}}}"')
+ Table._put((str(x), s), t, (i, j), empty)
+
+ # expand delimiters
+ _repl = (
+ lambda s: s[:2] + (1, 0, 0, 0, 0) + s[7:10] + (1,) + s[11:]
+ if s[2]
+ else s[:2] + (0, 0, 0, 0, 0) + s[7:10] + (1,) + s[11:]
+ )
+ for i, row in enumerate(t):
+ for j, (x, s_own) in enumerate(row):
+ # expand delim_up(^)
+ if s_own[3]:
+ u, v = i, j
+ while 0 <= u:
+ _, s = t[u][v]
+ if (i, j) != (u, v) and (s[2] and not s[10]):
+ break
+ Table._put((x, _repl(s)), t, (u, v), empty)
+ u -= 1
+
+ # expand delim_down(v)
+ if s_own[4]:
+ u, v = i, j
+ while u < totalrows:
+ _, s = t[u][v]
+ if (i, j) != (u, v) and (s[2] and not s[10]):
+ break
+ Table._put((x, _repl(s)), t, (u, v), empty)
+ u += 1
+
+ # expand delim_right(>)
+ if s_own[5]:
+ u, v = i, j
+ while v < totalcols:
+ _, s = t[u][v]
+ if (i, j) != (u, v) and (s[2] and not s[10]):
+ break
+ Table._put((x, _repl(s)), t, (u, v), empty)
+ v += 1
+
+ # expand delim_left(<)
+ if s_own[6]:
+ u, v = i, j
+ while 0 <= v:
+ _, s = t[u][v]
+ if (i, j) != (u, v) and (s[2] and not s[10]):
+ break
+ Table._put((x, _repl(s)), t, (u, v), empty)
+ v -= 1
+
+ # justification calculation
+ widths = [
+ 0,
+ ] * totalcols # j
+ heights = [
+ 0,
+ ] * totalrows # i
+ for i, row in enumerate(t):
+ for j, (x, s) in enumerate(row):
+ # height caclulation
+ heights[i] = max(heights[i], x.count("\n"))
+
+ # width calculation; non-delim fillers no contribution
+ if s[2] or not s[10]:
+ w = max(len(q) for q in x.split("\n"))
+ widths[j] = max(widths[j], w)
+ # no newline ==> height=1
+ heights = [h + 1 for h in heights]
+
+ # render table
+ rend = []
+ roff = 0
+ for i, row in enumerate(t):
+ for j, (x, s) in enumerate(row):
+ w, h = widths[j], heights[i]
+
+ # expand fillers and delimiters
+ if s[2] or s[10]:
+ xs = x.split("\n")
+ xw0 = min(len(l) for l in xs)
+ xw1 = max(len(l) for l in xs)
+ xh = len(xs)
+ if (xw0 == xw1 == w) and (xh == h):
+ pass
+ elif xw0 == xw1 == w:
+ x = "\n".join(
+ [
+ xs[0],
+ ]
+ * h
+ )
+ elif xh == h:
+ x = "\n".join([(l[0] if l else "") * w for l in xs])
+ else:
+ x = x[0] if x else " "
+ x = "\n".join(
+ [
+ x * w,
+ ]
+ * h
+ )
+
+ # justify horizontally
+ x = [l.rjust(w) if s[0] else l.ljust(w) for l in x.split("\n")]
+
+ # justify vertically
+ plus = [
+ " " * w,
+ ] * (h - len(x))
+ x = plus + x if not s[1] else x + plus
+
+ # input to table
+ for r, xline in enumerate(x):
+ Table._put(xline, rend, (roff + r, j), None)
+ roff += h
+
+ # return rendered string
+ return "\n".join(["".join(r) for r in rend])
+
+ # parsing
+ def _spec(s, transpose=False):
+ if ":" in s:
+ i = s.index(":")
+ sp = s[i:]
+ s = s[:i]
+ else:
+ sp = ""
+ s = s.lower()
+ return (
+ int("r" in s), # 0:: 0:left(l) 1:right(r)
+ int("t" in s), # 1:: 0:bottom(b) 1:top(t)
+ int(any([i in s for i in [".", "<", ">", "^", "v"]])), # 2:: delim_here(.)
+ int("^" in s if not transpose else "<" in s), # 3:: delim_up(^)
+ int("v" in s if not transpose else ">" in s), # 4:: delim_down(v)
+ int(">" in s if not transpose else "v" in s), # 5:: delim_right(>)
+ int("<" in s if not transpose else "^" in s), # 6:: delim_left(<)
+ int("+" in s), # 7:: subtable(+)
+ int("-" in s if not transpose else "|" in s), # 8:: subtable_horiz(-)
+ int("|" in s if not transpose else "-" in s), # 9:: subtable_vert(|)
+ int("_" in s), # 10:: fill(_); if delim, overwrite; else fit
+ sp, # 11:: special(:) f-string for numbers
+ )
+
+ def _put(obj, t, ij, empty):
+ i, j = ij
+ while i >= len(t):
+ t.append([])
+ while j >= len(t[i]):
+ t[i].append(empty)
+ t[i][j] = obj
+ return
+
+ def parse(
+ table,
+ delimiter=" ",
+ orientation="br",
+ double_colon=True,
+ ):
+ # disabling transpose
+ transpose = False
+
+ # set up empty entry
+ empty = ("", Table._spec(orientation, transpose))
+
+ # transpose
+ t = []
+ for i, row in enumerate(table):
+ for j, item in enumerate(row):
+ ij = (i, j) if not transpose else (j, i)
+ if type(item) == tuple and len(item) == 2 and type(item[1]) == str:
+ item = (item[0], Table._spec(item[1], transpose))
+ elif double_colon and type(item) == str and "::" in item:
+ x, s = item.split("::")
+ item = (x, Table._spec(s, transpose))
+ else:
+ item = (item, Table._spec(orientation, transpose))
+ Table._put(item, t, ij, empty)
+
+ # normalization
+ maxcol = 0
+ maxrow = len(t)
+ for i, row in enumerate(t):
+ # take element number into account
+ maxcol = max(maxcol, len([i for i in row if not i[1][2]]))
+
+ # take subtables into account
+ for j, (x, s) in enumerate(row):
+ if s[7]:
+ r = len(x)
+ maxrow = max(maxrow, i + r)
+ c = max(len(q) for q in x)
+ maxcol = max(maxcol, j + c)
+ elif s[8]:
+ c = len(x)
+ maxcol = max(maxcol, j + c)
+ elif s[9]:
+ r = len(x)
+ maxrow = max(maxrow, i + r)
+ totalcols = 2 * maxcol + 1
+ totalrows = maxrow
+ t += [[]] * (totalrows - len(t))
+ newt = []
+ delim = (delimiter, Table._spec("._" + orientation, transpose))
+ for i, row in enumerate(t):
+ wasd = False
+ tcount = 0
+ for j in range(totalcols):
+ item = t[i][tcount] if tcount < len(t[i]) else empty
+ isd = item[1][2]
+ if wasd and isd:
+ Table._put(empty, newt, (i, j), empty)
+ wasd = False
+ elif wasd and not isd:
+ Table._put(item, newt, (i, j), empty)
+ tcount += 1
+ wasd = False
+ elif not wasd and isd:
+ Table._put(item, newt, (i, j), empty)
+ tcount += 1
+ wasd = True
+ elif not wasd and not isd:
+ Table._put(delim, newt, (i, j), empty)
+ wasd = True
+ t = newt
+
+ # normalization: add dummy last column for delimiter
+ for row in t:
+ row.append(empty)
+
+ # expand subtables
+ delim_cols = [i for i in range(totalcols) if i % 2 == 0]
+ while True:
+ # find a table
+ ij = None
+ for i, row in enumerate(t):
+ for j, item in enumerate(row):
+ st, s = item
+ if s[7]:
+ ij = i, j, 7, st, s
+ break
+ elif s[8]:
+ ij = i, j, 8, st, s
+ break
+ elif s[9]:
+ ij = i, j, 9, st, s
+ break
+ if ij is not None:
+ break
+ if ij is None:
+ break
+
+ # replace its specs
+ i, j, k, st, s = ij
+ s = list(s)
+ s[7] = s[8] = s[9] = 0
+ s = tuple(s)
+
+ # expand it
+ if k == 7: # 2d table
+ for x, row in enumerate(st):
+ for y, obj in enumerate(row):
+ a = i + x if not transpose else i + y
+ b = j + 2 * y if not transpose else j + 2 * x
+ Table._put((obj, s), t, (a, b), None)
+ if k == 8: # subtable_horiz
+ for y, obj in enumerate(st):
+ Table._put((obj, s), t, (i, j + 2 * y), None)
+ if k == 9: # subtable_vert
+ for x, obj in enumerate(st):
+ Table._put((obj, s), t, (i + x, j), None)
+
+ # return, finally
+ return t
+
+
+class Resnet(nn.Module):
+ def __init__(self, channels):
+ super().__init__()
+ self.channels = ch = channels
+ self.net = nn.Sequential(
+ nn.PReLU(ch),
+ nn.Conv2d(ch, ch, kernel_size=3, padding=1),
+ nn.BatchNorm2d(ch),
+ nn.PReLU(ch),
+ nn.Conv2d(ch, ch, kernel_size=3, padding=1),
+ nn.BatchNorm2d(ch),
+ )
+ return
+
+ def forward(self, x):
+ return x + self.net(x)
+
+
+class Synthesizer(nn.Module):
+ def __init__(
+ self, size, channels_image, channels_flow, channels_mask, channels_feature
+ ):
+ super().__init__()
+ self.size = size
+ self.diam = diam(self.size)
+ self.channels_image = cimg = channels_image
+ self.channels_flow = cflow = channels_flow
+ self.channels_mask = cmask = channels_mask
+ self.channels_feature = cfeat = channels_feature
+ self.channels = ch = cimg + cflow // 2 + cmask + cfeat
+ self.interpolator = Interpolator(self.size, mode="bilinear")
+ self.net = nn.Sequential(
+ nn.Conv2d(ch + 3, 64, kernel_size=1, padding=0),
+ Resnet(64),
+ nn.Sequential(
+ nn.PReLU(64),
+ nn.Conv2d(64, 32, kernel_size=3, padding=1),
+ nn.BatchNorm2d(32),
+ ),
+ Resnet(32),
+ nn.Sequential(
+ nn.PReLU(32),
+ nn.Conv2d(32, 16, kernel_size=3, padding=1),
+ nn.BatchNorm2d(16),
+ ),
+ Resnet(16),
+ nn.Sequential(
+ nn.PReLU(16),
+ nn.Conv2d(16, 3, kernel_size=3, padding=1),
+ ),
+ )
+ return
+
+ def forward(self, images, flows, masks, features, return_more=False):
+ itp = self.interpolator
+ images = [
+ (images[0] + images[1]) / 2,
+ ] + images
+ logimgs = [itp(pixel_logit(i[:, :3])) for i in images]
+ cat = torch.cat(
+ [
+ *logimgs,
+ *[itp(f).norm(dim=1, keepdim=True) / self.diam for f in flows],
+ *[itp(m) for m in masks],
+ *[itp(f) for f in features],
+ ],
+ dim=1,
+ )
+ residual = self.net(cat)
+ return torch.sigmoid(logimgs[0] + 0.5 * residual), (
+ locals() if return_more else None
+ )
+
+
+class FlowZMetric(nn.Module):
+ def __init__(self):
+ super().__init__()
+ return
+
+ def forward(self, img0, img1, flow0, flow1, return_more=False):
+ # B(i0,f0) = i1
+ # B(i1,f1) = i0
+ # F(x,f0,z0)
+ # F(x,f1,z1)
+ img0 = kornia.color.rgb_to_lab(img0[:, :3])
+ img1 = kornia.color.rgb_to_lab(img1[:, :3])
+ return [
+ -0.1 * (img1 - flow_backwarp(img0, flow0)).norm(dim=1, keepdim=True), # z0
+ -0.1 * (img0 - flow_backwarp(img1, flow1)).norm(dim=1, keepdim=True), # z1
+ ], (locals() if return_more else None)
+
+
+class NEDT(nn.Module):
+ def __init__(self):
+ super().__init__()
+ return
+
+ def forward(
+ self,
+ img,
+ t=2.0,
+ sigma_factor=1 / 540,
+ k=1.6,
+ epsilon=0.01,
+ kernel_factor=4,
+ exp_factor=540 / 15,
+ return_more=False,
+ ):
+ with torch.no_grad():
+ dog = batch_dog(
+ img,
+ t=t,
+ sigma=img.shape[-2] * sigma_factor,
+ k=k,
+ epsilon=epsilon,
+ kernel_factor=kernel_factor,
+ clip=False,
+ )
+ edt = batch_edt((dog > 0.5).float())
+ ans = 1 - (-edt * exp_factor / max(edt.shape[-2:])).exp()
+ return ans, (locals() if return_more else None)
+
+
+class HalfWarper(nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.channels_image = 4 * 3
+ self.channels_flow = 2 * 2
+ self.channels_mask = 2 * 1
+ self.channels = self.channels_image + self.channels_flow + self.channels_mask
+
+ def morph_open(self, x, k):
+ if k == 0:
+ return x
+ else:
+ with torch.no_grad():
+ return kornia.morphology.opening(x, torch.ones(k, k, device=x.device))
+
+ def forward(self, img0, img1, flow0, flow1, z0, z1, k, t=0.5, return_more=False):
+ # forewarps
+ flow0_ = (1 - t) * flow0
+ flow1_ = t * flow1
+ f01 = forewarp(img0, flow1_, mode="sm", metric=z1, mask=True)
+ f10 = forewarp(img1, flow0_, mode="sm", metric=z0, mask=True)
+ f01i, f01m = f01[:, :-1], self.morph_open(f01[:, -1:], k=k)
+ f10i, f10m = f10[:, :-1], self.morph_open(f10[:, -1:], k=k)
+
+ # base guess
+ base0 = f01m * f01i + (1 - f01m) * f10i
+ base1 = f10m * f10i + (1 - f10m) * f01i
+ ans = [
+ [ # images
+ base0,
+ base1,
+ f01i,
+ f10i,
+ ],
+ [ # flows
+ flow0_,
+ flow1_,
+ ],
+ [ # masks
+ f01m,
+ f10m,
+ ],
+ ]
+ return ans, (locals() if return_more else None)
+
+
+class ResnetFeatureExtractor(nn.Module):
+ def __init__(self, inferserve_query, size_in=None):
+ super().__init__()
+ self.inferserve_query = iq = inferserve_query
+ self.size_in = si = size_in
+ if iq[0] == "torchvision":
+ # use pytorch pretrained resnet50
+ self.base_hparams = None
+ resnet = tv.models.resnet50(pretrained=True)
+
+ self.resize = T.Resize(256)
+ self.resnet_preprocess = T.Normalize(
+ mean=[0.485, 0.456, 0.406],
+ std=[0.229, 0.224, 0.225],
+ )
+ self.conv1 = resnet.conv1
+ self.bn1 = resnet.bn1
+ self.relu = resnet.relu # 64ch, 128p (assuming 256p input)
+ self.maxpool = resnet.maxpool
+ self.layer1 = resnet.layer1 # 256ch, 64p
+ self.layer2 = resnet.layer2 # 512ch, 32p
+ else:
+ base = userving.infer_model_load(*iq).eval()
+ self.base_hparams = base.hparams
+
+ self.resize = T.Resize(base.hparams.largs.size)
+ self.resnet_preprocess = base.resnet_preprocess
+ self.conv1 = base.resnet.conv1
+ self.bn1 = base.resnet.bn1
+ self.relu = base.resnet.relu # 64ch, 128p (assuming 256p input)
+ self.maxpool = base.resnet.maxpool
+ self.layer1 = base.resnet.layer1 # 256ch, 64p
+ self.layer2 = base.resnet.layer2 # 512ch, 32p
+ if self.size_in is None:
+ self.sizes_out = None
+ else:
+ s = self.resize.size
+ self.sizes_out = [
+ pixel_ij(
+ rescale_dry(si, (s // 2) / si[0]), rounding="ceil"
+ ), # conv1, 128p
+ pixel_ij(
+ rescale_dry(si, (s // 4) / si[0]), rounding="ceil"
+ ), # layer1, 64p
+ pixel_ij(
+ rescale_dry(si, (s // 8) / si[0]), rounding="ceil"
+ ), # layer2, 32p
+ ]
+ self.channels = [
+ 64,
+ 256,
+ 512,
+ ]
+ return
+
+ def forward(self, x, force_sizes_out=False, return_more=False):
+ ans = []
+ x = x[:, :3]
+ x = self.resize(x)
+ x = self.resnet_preprocess(x)
+ x = self.conv1(x)
+ x = self.bn1(x)
+ x = self.relu(x)
+ ans.append(x) # conv1
+ x = self.maxpool(x)
+ x = self.layer1(x)
+ ans.append(x) # layer1
+ x = self.layer2(x)
+ ans.append(x) # layer2
+ if force_sizes_out or (self.sizes_out is None):
+ self.sizes_out = [tuple(q.shape[-2:]) for q in ans]
+ return ans, (locals() if return_more else None)
+
+
+class NetNedt(nn.Module):
+ def __init__(self):
+ super().__init__()
+ chin = 3 + 1 + 4 + 4 + 1 + 1
+ ch = 16
+ chout = 1
+ self.net = nn.Sequential(
+ nn.PReLU(chin),
+ nn.Conv2d(chin, ch, kernel_size=3, padding=1),
+ nn.BatchNorm2d(ch),
+ nn.PReLU(ch),
+ nn.Conv2d(ch, ch, kernel_size=3, padding=1),
+ nn.BatchNorm2d(ch),
+ nn.PReLU(ch),
+ nn.Conv2d(ch, chout, kernel_size=3, padding=1),
+ )
+ return
+
+ def forward(self, out_base, out_base_nedt, hw_imgs, hw_masks, return_more=False):
+ cat = torch.cat(
+ [
+ out_base, # 3
+ out_base_nedt, # 1
+ hw_imgs[0], # 4
+ hw_imgs[1], # 4
+ hw_masks[0], # 1
+ hw_masks[1], # 1
+ ],
+ dim=1,
+ )
+ log = pixel_logit(cat.clip(0, 1))
+ ans = torch.sigmoid(self.net(log))
+ return ans, (locals() if return_more else None)
+
+
+class NetTail(nn.Module):
+ def __init__(self):
+ super().__init__()
+ chin = 3 + 1 + 1
+ ch = 16
+ chout = 3
+ self.net = nn.Sequential(
+ nn.PReLU(chin),
+ nn.Conv2d(chin, ch, kernel_size=3, padding=1),
+ nn.BatchNorm2d(ch),
+ nn.PReLU(ch),
+ nn.Conv2d(ch, ch, kernel_size=3, padding=1),
+ nn.BatchNorm2d(ch),
+ nn.PReLU(ch),
+ nn.Conv2d(ch, ch, kernel_size=3, padding=1),
+ nn.BatchNorm2d(ch),
+ nn.PReLU(ch),
+ nn.Conv2d(ch, chout, kernel_size=3, padding=1),
+ )
+ return
+
+ def forward(self, out_base, out_base_nedt, pred_nedt, return_more=False):
+ cat = torch.cat(
+ [
+ out_base, # 3
+ out_base_nedt, # 1
+ pred_nedt, # 1
+ ],
+ dim=1,
+ )
+ log = pixel_logit(cat.clip(0, 1))
+ ans = torch.sigmoid(log[:, :3] + self.net(log))
+ return ans, (locals() if return_more else None)
+
+
+class SoftsplatLite(nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.feature_extractor = ResnetFeatureExtractor(
+ ("torchvision", "resnet50"),
+ (540, 960),
+ )
+ self.z_metric = FlowZMetric()
+ self.flow_downsamplers = [
+ Interpolator(s, mode="bilinear") for s in self.feature_extractor.sizes_out
+ ]
+ self.gridnet_converter = GridnetConverter(
+ self.feature_extractor.channels,
+ [32, 64, 128],
+ )
+ self.gridnet = Gridnet(
+ *[32, 64, 128],
+ total_dropout_p=0.0,
+ depth=1, # equivalent to u-net
+ )
+ self.nedt = NEDT()
+ self.half_warper = HalfWarper()
+ self.synthesizer = Synthesizer(
+ (540, 960),
+ self.half_warper.channels_image,
+ self.half_warper.channels_flow,
+ self.half_warper.channels_mask,
+ self.gridnet.channels_0,
+ )
+ return
+
+ def forward(self, x, t=0.5, k=5, return_more=False):
+ rm = return_more
+ flow0, flow1 = x["flows"].swapaxes(0, 1)
+ img0, img1 = x["images"][:, 0], x["images"][:, -1]
+ (z0, z1), locs_z = self.z_metric(img0, img1, flow0, flow1, return_more=rm)
+ img0 = torch.cat([img0, self.nedt(img0)[0]], dim=1)
+ img1 = torch.cat([img1, self.nedt(img1)[0]], dim=1)
+
+ # images and flows
+ (hw_imgs, hw_flows, hw_masks), locs_hw = self.half_warper(
+ img0,
+ img1,
+ flow0,
+ flow1,
+ z0,
+ z1,
+ k,
+ t=t,
+ return_more=rm,
+ )
+
+ # features
+ feats0, locs_fe0 = self.feature_extractor(img0, return_more=rm)
+ feats1, locs_fe1 = self.feature_extractor(img1, return_more=rm)
+ warps = []
+ for ft0, ft1, ds in zip(feats0, feats1, self.flow_downsamplers):
+ (w, _, _), _ = self.half_warper(
+ ft0,
+ ft1,
+ ds(flow0, 1),
+ ds(flow1, 1),
+ ds(z0),
+ ds(z1),
+ k,
+ t=t,
+ )
+ warps.append((w[0] + w[1]) / 2)
+ feats = self.gridnet(self.gridnet_converter(warps))
+
+ # synthesis
+ pred, locs_synth = self.synthesizer(
+ hw_imgs,
+ hw_flows,
+ hw_masks,
+ [
+ feats[0],
+ ],
+ return_more=rm,
+ )
+ return pred, (locals() if rm else None)
+
+
+class DTM(nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.net_nedt = NetNedt()
+ self.net_tail = NetTail()
+ self.nedt = NEDT()
+ return
+
+ def forward(self, x, out_base, locs_base, return_more=False):
+ rm = return_more
+ with torch.no_grad():
+ out_base_nedt, locs_base_nedt = self.nedt(out_base, return_more=rm)
+ hw_imgs, hw_masks = locs_base["hw_imgs"], locs_base["hw_masks"]
+ pred_nedt, locs_nedt = self.net_nedt(
+ out_base, out_base_nedt, hw_imgs, hw_masks, return_more=rm
+ )
+ pred, locs_tail = self.net_tail(
+ out_base, out_base_nedt, pred_nedt.clone().detach(), return_more=rm
+ )
+ return torch.cat([pred, pred_nedt], dim=1), (locals() if rm else None)
+
+
+class RAFT(nn.Module):
+ def __init__(self, path="/workspace/tensorrt/models/anime_interp_full.ckpt"):
+ super().__init__()
+ self.raft = RFR(
+ Namespace(
+ small=False,
+ mixed_precision=False,
+ )
+ )
+ if path is not None:
+ sd = torch.load(path)["model_state_dict"]
+ self.raft.load_state_dict(
+ {
+ k[len("module.flownet.") :]: v
+ for k, v in sd.items()
+ if k.startswith("module.flownet.")
+ },
+ strict=False,
+ )
+ return
+
+ def forward(self, img0, img1, flow0=None, iters=12, return_more=False):
+ if flow0 is not None:
+ flow0 = flow0.flip(dims=(1,))
+ out = self.raft(img1, img0, iters=iters, flow_init=flow0)
+ return out[0].flip(dims=(1,)), (locals() if return_more else None)
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/film/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/film/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1f89f1bdc63d149a36c72614b3f1c7ed7ffa7962
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/film/__init__.py
@@ -0,0 +1,113 @@
+import torch
+from comfy.model_management import get_torch_device, soft_empty_cache
+import bisect
+import numpy as np
+import typing
+from vfi_utils import InterpolationStateList, load_file_from_github_release, preprocess_frames, postprocess_frames
+import pathlib
+import gc
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+DEVICE = get_torch_device()
+def inference(model, img_batch_1, img_batch_2, inter_frames):
+ results = [
+ img_batch_1,
+ img_batch_2
+ ]
+
+ idxes = [0, inter_frames + 1]
+ remains = list(range(1, inter_frames + 1))
+
+ splits = torch.linspace(0, 1, inter_frames + 2)
+
+ for _ in range(len(remains)):
+ starts = splits[idxes[:-1]]
+ ends = splits[idxes[1:]]
+ distances = ((splits[None, remains] - starts[:, None]) / (ends[:, None] - starts[:, None]) - .5).abs()
+ matrix = torch.argmin(distances).item()
+ start_i, step = np.unravel_index(matrix, distances.shape)
+ end_i = start_i + 1
+
+ x0 = results[start_i].to(DEVICE)
+ x1 = results[end_i].to(DEVICE)
+ dt = x0.new_full((1, 1), (splits[remains[step]] - splits[idxes[start_i]])) / (splits[idxes[end_i]] - splits[idxes[start_i]])
+
+ with torch.no_grad():
+ prediction = model(x0, x1, dt)
+ insert_position = bisect.bisect_left(idxes, remains[step])
+ idxes.insert(insert_position, remains[step])
+ results.insert(insert_position, prediction.clamp(0, 1).float())
+ del remains[step]
+
+ return [tensor.flip(0) for tensor in results]
+
+class FILM_VFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (["film_net_fp32.pt"], ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 10, "min": 1, "max": 1000}),
+ "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames = 10,
+ multiplier: typing.SupportsInt = 2,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ interpolation_states = optional_interpolation_states
+ model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
+ model = torch.jit.load(model_path, map_location='cpu')
+ model.eval()
+ model = model.to(DEVICE)
+ dtype = torch.float32
+
+ frames = preprocess_frames(frames)
+ number_of_frames_processed_since_last_cleared_cuda_cache = 0
+ output_frames = []
+
+ if type(multiplier) == int:
+ multipliers = [multiplier] * len(frames)
+ else:
+ multipliers = list(map(int, multiplier))
+ multipliers += [2] * (len(frames) - len(multipliers) - 1)
+ for frame_itr in range(len(frames) - 1): # Skip the final frame since there are no frames after it
+ if interpolation_states is not None and interpolation_states.is_frame_skipped(frame_itr):
+ continue
+ #Ensure that input frames are in fp32 - the same dtype as model
+ frame_0 = frames[frame_itr:frame_itr+1].to(DEVICE).float()
+ frame_1 = frames[frame_itr+1:frame_itr+2].to(DEVICE).float()
+ relust = inference(model, frame_0, frame_1, multipliers[frame_itr] - 1)
+ output_frames.extend([frame.detach().cpu().to(dtype=dtype) for frame in relust[:-1]])
+
+ number_of_frames_processed_since_last_cleared_cuda_cache += 1
+ # Try to avoid a memory overflow by clearing cuda cache regularly
+ if number_of_frames_processed_since_last_cleared_cuda_cache >= clear_cache_after_n_frames:
+ print("Comfy-VFI: Clearing cache...", end = ' ')
+ soft_empty_cache()
+ number_of_frames_processed_since_last_cleared_cuda_cache = 0
+ print("Done cache clearing")
+ gc.collect()
+
+ output_frames.append(frames[-1:].to(dtype=dtype)) # Append final frame
+ output_frames = [frame.cpu() for frame in output_frames] #Ensure all frames are in cpu
+ out = torch.cat(output_frames, dim=0)
+ # clear cache for courtesy
+ print("Comfy-VFI: Final clearing cache...", end = ' ')
+ soft_empty_cache()
+ print("Done cache clearing")
+ return (postprocess_frames(out), )
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/film/film_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/film/film_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..a527e842f8e97d2c0f2c6997d8fa4d3134e59167
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/film/film_arch.py
@@ -0,0 +1,798 @@
+"""
+https://github.com/dajes/frame-interpolation-pytorch/blob/main/feature_extractor.py
+https://github.com/dajes/frame-interpolation-pytorch/blob/main/fusion.py
+https://github.com/dajes/frame-interpolation-pytorch/blob/main/interpolator.py
+https://github.com/dajes/frame-interpolation-pytorch/blob/main/pyramid_flow_estimator.py
+https://github.com/dajes/frame-interpolation-pytorch/blob/main/util.py
+"""
+
+"""PyTorch layer for extracting image features for the film_net interpolator.
+
+The feature extractor implemented here converts an image pyramid into a pyramid
+of deep features. The feature pyramid serves a similar purpose as U-Net
+architecture's encoder, but we use a special cascaded architecture described in
+Multi-view Image Fusion [1].
+
+For comprehensiveness, below is a short description of the idea. While the
+description is a bit involved, the cascaded feature pyramid can be used just
+like any image feature pyramid.
+
+Why cascaded architeture?
+=========================
+To understand the concept it is worth reviewing a traditional feature pyramid
+first: *A traditional feature pyramid* as in U-net or in many optical flow
+networks is built by alternating between convolutions and pooling, starting
+from the input image.
+
+It is well known that early features of such architecture correspond to low
+level concepts such as edges in the image whereas later layers extract
+semantically higher level concepts such as object classes etc. In other words,
+the meaning of the filters in each resolution level is different. For problems
+such as semantic segmentation and many others this is a desirable property.
+
+However, the asymmetric features preclude sharing weights across resolution
+levels in the feature extractor itself and in any subsequent neural networks
+that follow. This can be a downside, since optical flow prediction, for
+instance is symmetric across resolution levels. The cascaded feature
+architecture addresses this shortcoming.
+
+How is it built?
+================
+The *cascaded* feature pyramid contains feature vectors that have constant
+length and meaning on each resolution level, except few of the finest ones. The
+advantage of this is that the subsequent optical flow layer can learn
+synergically from many resolutions. This means that coarse level prediction can
+benefit from finer resolution training examples, which can be useful with
+moderately sized datasets to avoid overfitting.
+
+The cascaded feature pyramid is built by extracting shallower subtree pyramids,
+each one of them similar to the traditional architecture. Each subtree
+pyramid S_i is extracted starting from each resolution level:
+
+image resolution 0 -> S_0
+image resolution 1 -> S_1
+image resolution 2 -> S_2
+...
+
+If we denote the features at level j of subtree i as S_i_j, the cascaded pyramid
+is constructed by concatenating features as follows (assuming subtree depth=3):
+
+lvl
+feat_0 = concat( S_0_0 )
+feat_1 = concat( S_1_0 S_0_1 )
+feat_2 = concat( S_2_0 S_1_1 S_0_2 )
+feat_3 = concat( S_3_0 S_2_1 S_1_2 )
+feat_4 = concat( S_4_0 S_3_1 S_2_2 )
+feat_5 = concat( S_5_0 S_4_1 S_3_2 )
+ ....
+
+In above, all levels except feat_0 and feat_1 have the same number of features
+with similar semantic meaning. This enables training a single optical flow
+predictor module shared by levels 2,3,4,5... . For more details and evaluation
+see [1].
+
+[1] Multi-view Image Fusion, Trinidad et al. 2019
+"""
+from typing import List
+
+import torch
+from torch import nn
+from torch.nn import functional as F
+
+
+class SubTreeExtractor(nn.Module):
+ """Extracts a hierarchical set of features from an image.
+
+ This is a conventional, hierarchical image feature extractor, that extracts
+ [k, k*2, k*4... ] filters for the image pyramid where k=options.sub_levels.
+ Each level is followed by average pooling.
+ """
+
+ def __init__(self, in_channels=3, channels=64, n_layers=4):
+ super().__init__()
+ convs = []
+ for i in range(n_layers):
+ convs.append(nn.Sequential(
+ conv(in_channels, (channels << i), 3),
+ conv((channels << i), (channels << i), 3)
+ ))
+ in_channels = channels << i
+ self.convs = nn.ModuleList(convs)
+
+ def forward(self, image: torch.Tensor, n: int) -> List[torch.Tensor]:
+ """Extracts a pyramid of features from the image.
+
+ Args:
+ image: TORCH.Tensor with shape BATCH_SIZE x HEIGHT x WIDTH x CHANNELS.
+ n: number of pyramid levels to extract. This can be less or equal to
+ options.sub_levels given in the __init__.
+ Returns:
+ The pyramid of features, starting from the finest level. Each element
+ contains the output after the last convolution on the corresponding
+ pyramid level.
+ """
+ head = image
+ pyramid = []
+ for i, layer in enumerate(self.convs):
+ head = layer(head)
+ pyramid.append(head)
+ if i < n - 1:
+ head = F.avg_pool2d(head, kernel_size=2, stride=2)
+ return pyramid
+
+
+class FeatureExtractor(nn.Module):
+ """Extracts features from an image pyramid using a cascaded architecture.
+ """
+
+ def __init__(self, in_channels=3, channels=64, sub_levels=4):
+ super().__init__()
+ self.extract_sublevels = SubTreeExtractor(in_channels, channels, sub_levels)
+ self.sub_levels = sub_levels
+
+ def forward(self, image_pyramid: List[torch.Tensor]) -> List[torch.Tensor]:
+ """Extracts a cascaded feature pyramid.
+
+ Args:
+ image_pyramid: Image pyramid as a list, starting from the finest level.
+ Returns:
+ A pyramid of cascaded features.
+ """
+ sub_pyramids: List[List[torch.Tensor]] = []
+ for i in range(len(image_pyramid)):
+ # At each level of the image pyramid, creates a sub_pyramid of features
+ # with 'sub_levels' pyramid levels, re-using the same SubTreeExtractor.
+ # We use the same instance since we want to share the weights.
+ #
+ # However, we cap the depth of the sub_pyramid so we don't create features
+ # that are beyond the coarsest level of the cascaded feature pyramid we
+ # want to generate.
+ capped_sub_levels = min(len(image_pyramid) - i, self.sub_levels)
+ sub_pyramids.append(self.extract_sublevels(image_pyramid[i], capped_sub_levels))
+ # Below we generate the cascades of features on each level of the feature
+ # pyramid. Assuming sub_levels=3, The layout of the features will be
+ # as shown in the example on file documentation above.
+ feature_pyramid: List[torch.Tensor] = []
+ for i in range(len(image_pyramid)):
+ features = sub_pyramids[i][0]
+ for j in range(1, self.sub_levels):
+ if j <= i:
+ features = torch.cat([features, sub_pyramids[i - j][j]], dim=1)
+ feature_pyramid.append(features)
+ return feature_pyramid
+
+
+
+
+
+
+
+
+
+
+
+"""The final fusion stage for the film_net frame interpolator.
+
+The inputs to this module are the warped input images, image features and
+flow fields, all aligned to the target frame (often midway point between the
+two original inputs). The output is the final image. FILM has no explicit
+occlusion handling -- instead using the abovementioned information this module
+automatically decides how to best blend the inputs together to produce content
+in areas where the pixels can only be borrowed from one of the inputs.
+
+Similarly, this module also decides on how much to blend in each input in case
+of fractional timestep that is not at the halfway point. For example, if the two
+inputs images are at t=0 and t=1, and we were to synthesize a frame at t=0.1,
+it often makes most sense to favor the first input. However, this is not
+always the case -- in particular in occluded pixels.
+
+The architecture of the Fusion module follows U-net [1] architecture's decoder
+side, e.g. each pyramid level consists of concatenation with upsampled coarser
+level output, and two 3x3 convolutions.
+
+The upsampling is implemented as 'resize convolution', e.g. nearest neighbor
+upsampling followed by 2x2 convolution as explained in [2]. The classic U-net
+uses max-pooling which has a tendency to create checkerboard artifacts.
+
+[1] Ronneberger et al. U-Net: Convolutional Networks for Biomedical Image
+ Segmentation, 2015, https://arxiv.org/pdf/1505.04597.pdf
+[2] https://distill.pub/2016/deconv-checkerboard/
+"""
+from typing import List
+
+import torch
+from torch import nn
+from torch.nn import functional as F
+
+
+_NUMBER_OF_COLOR_CHANNELS = 3
+
+
+def get_channels_at_level(level, filters):
+ n_images = 2
+ channels = _NUMBER_OF_COLOR_CHANNELS
+ flows = 2
+
+ return (sum(filters << i for i in range(level)) + channels + flows) * n_images
+
+
+class Fusion(nn.Module):
+ """The decoder."""
+
+ def __init__(self, n_layers=4, specialized_layers=3, filters=64):
+ """
+ Args:
+ m: specialized levels
+ """
+ super().__init__()
+
+ # The final convolution that outputs RGB:
+ self.output_conv = nn.Conv2d(filters, 3, kernel_size=1)
+
+ # Each item 'convs[i]' will contain the list of convolutions to be applied
+ # for pyramid level 'i'.
+ self.convs = nn.ModuleList()
+
+ # Create the convolutions. Roughly following the feature extractor, we
+ # double the number of filters when the resolution halves, but only up to
+ # the specialized_levels, after which we use the same number of filters on
+ # all levels.
+ #
+ # We create the convs in fine-to-coarse order, so that the array index
+ # for the convs will correspond to our normal indexing (0=finest level).
+ # in_channels: tuple = (128, 202, 256, 522, 512, 1162, 1930, 2442)
+
+ in_channels = get_channels_at_level(n_layers, filters)
+ increase = 0
+ for i in range(n_layers)[::-1]:
+ num_filters = (filters << i) if i < specialized_layers else (filters << specialized_layers)
+ convs = nn.ModuleList([
+ conv(in_channels, num_filters, size=2, activation=None),
+ conv(in_channels + (increase or num_filters), num_filters, size=3),
+ conv(num_filters, num_filters, size=3)]
+ )
+ self.convs.append(convs)
+ in_channels = num_filters
+ increase = get_channels_at_level(i, filters) - num_filters // 2
+
+ def forward(self, pyramid: List[torch.Tensor]) -> torch.Tensor:
+ """Runs the fusion module.
+
+ Args:
+ pyramid: The input feature pyramid as list of tensors. Each tensor being
+ in (B x H x W x C) format, with finest level tensor first.
+
+ Returns:
+ A batch of RGB images.
+ Raises:
+ ValueError, if len(pyramid) != config.fusion_pyramid_levels as provided in
+ the constructor.
+ """
+
+ # As a slight difference to a conventional decoder (e.g. U-net), we don't
+ # apply any extra convolutions to the coarsest level, but just pass it
+ # to finer levels for concatenation. This choice has not been thoroughly
+ # evaluated, but is motivated by the educated guess that the fusion part
+ # probably does not need large spatial context, because at this point the
+ # features are spatially aligned by the preceding warp.
+ net = pyramid[-1]
+
+ # Loop starting from the 2nd coarsest level:
+ # for i in reversed(range(0, len(pyramid) - 1)):
+ for k, layers in enumerate(self.convs):
+ i = len(self.convs) - 1 - k
+ # Resize the tensor from coarser level to match for concatenation.
+ level_size = pyramid[i].shape[2:4]
+ net = F.interpolate(net, size=level_size, mode='nearest')
+ net = layers[0](net)
+ net = torch.cat([pyramid[i], net], dim=1)
+ net = layers[1](net)
+ net = layers[2](net)
+ net = self.output_conv(net)
+ return net
+
+
+
+
+
+
+
+
+
+
+
+"""The film_net frame interpolator main model code.
+
+Basics
+======
+The film_net is an end-to-end learned neural frame interpolator implemented as
+a PyTorch model. It has the following inputs and outputs:
+
+Inputs:
+ x0: image A.
+ x1: image B.
+ time: desired sub-frame time.
+
+Outputs:
+ image: the predicted in-between image at the chosen time in range [0, 1].
+
+Additional outputs include forward and backward warped image pyramids, flow
+pyramids, etc., that can be visualized for debugging and analysis.
+
+Note that many training sets only contain triplets with ground truth at
+time=0.5. If a model has been trained with such training set, it will only work
+well for synthesizing frames at time=0.5. Such models can only generate more
+in-between frames using recursion.
+
+Architecture
+============
+The inference consists of three main stages: 1) feature extraction 2) warping
+3) fusion. On high-level, the architecture has similarities to Context-aware
+Synthesis for Video Frame Interpolation [1], but the exact architecture is
+closer to Multi-view Image Fusion [2] with some modifications for the frame
+interpolation use-case.
+
+Feature extraction stage employs the cascaded multi-scale architecture described
+in [2]. The advantage of this architecture is that coarse level flow prediction
+can be learned from finer resolution image samples. This is especially useful
+to avoid overfitting with moderately sized datasets.
+
+The warping stage uses a residual flow prediction idea that is similar to
+PWC-Net [3], Multi-view Image Fusion [2] and many others.
+
+The fusion stage is similar to U-Net's decoder where the skip connections are
+connected to warped image and feature pyramids. This is described in [2].
+
+Implementation Conventions
+====================
+Pyramids
+--------
+Throughtout the model, all image and feature pyramids are stored as python lists
+with finest level first followed by downscaled versions obtained by successively
+halving the resolution. The depths of all pyramids are determined by
+options.pyramid_levels. The only exception to this is internal to the feature
+extractor, where smaller feature pyramids are temporarily constructed with depth
+options.sub_levels.
+
+Color ranges & gamma
+--------------------
+The model code makes no assumptions on whether the images are in gamma or
+linearized space or what is the range of RGB color values. So a model can be
+trained with different choices. This does not mean that all the choices lead to
+similar results. In practice the model has been proven to work well with RGB
+scale = [0,1] with gamma-space images (i.e. not linearized).
+
+[1] Context-aware Synthesis for Video Frame Interpolation, Niklaus and Liu, 2018
+[2] Multi-view Image Fusion, Trinidad et al, 2019
+[3] PWC-Net: CNNs for Optical Flow Using Pyramid, Warping, and Cost Volume
+"""
+from typing import Dict, List
+
+import torch
+from torch import nn
+
+
+
+class Interpolator(nn.Module):
+ def __init__(
+ self,
+ pyramid_levels=7,
+ fusion_pyramid_levels=5,
+ specialized_levels=3,
+ sub_levels=4,
+ filters=64,
+ flow_convs=(3, 3, 3, 3),
+ flow_filters=(32, 64, 128, 256),
+ ):
+ super().__init__()
+ self.pyramid_levels = pyramid_levels
+ self.fusion_pyramid_levels = fusion_pyramid_levels
+
+ self.extract = FeatureExtractor(3, filters, sub_levels)
+ self.predict_flow = PyramidFlowEstimator(filters, flow_convs, flow_filters)
+ self.fuse = Fusion(sub_levels, specialized_levels, filters)
+
+ def shuffle_images(self, x0, x1):
+ return [
+ build_image_pyramid(x0, self.pyramid_levels),
+ build_image_pyramid(x1, self.pyramid_levels)
+ ]
+
+ def debug_forward(self, x0, x1, batch_dt) -> Dict[str, List[torch.Tensor]]:
+ image_pyramids = self.shuffle_images(x0, x1)
+
+ # Siamese feature pyramids:
+ feature_pyramids = [self.extract(image_pyramids[0]), self.extract(image_pyramids[1])]
+
+ # Predict forward flow.
+ forward_residual_flow_pyramid = self.predict_flow(feature_pyramids[0], feature_pyramids[1])
+
+ # Predict backward flow.
+ backward_residual_flow_pyramid = self.predict_flow(feature_pyramids[1], feature_pyramids[0])
+
+ # Concatenate features and images:
+
+ # Note that we keep up to 'fusion_pyramid_levels' levels as only those
+ # are used by the fusion module.
+
+ forward_flow_pyramid = flow_pyramid_synthesis(forward_residual_flow_pyramid)[:self.fusion_pyramid_levels]
+
+ backward_flow_pyramid = flow_pyramid_synthesis(backward_residual_flow_pyramid)[:self.fusion_pyramid_levels]
+
+ # We multiply the flows with t and 1-t to warp to the desired fractional time.
+ #
+ # Note: In film_net we fix time to be 0.5, and recursively invoke the interpo-
+ # lator for multi-frame interpolation. Below, we create a constant tensor of
+ # shape [B]. We use the `time` tensor to infer the batch size.
+ mid_time = torch.full_like(batch_dt, .5)
+ backward_flow = multiply_pyramid(backward_flow_pyramid, mid_time[:, 0])
+ forward_flow = multiply_pyramid(forward_flow_pyramid, 1 - mid_time[:, 0])
+
+ pyramids_to_warp = [
+ concatenate_pyramids(image_pyramids[0][:self.fusion_pyramid_levels],
+ feature_pyramids[0][:self.fusion_pyramid_levels]),
+ concatenate_pyramids(image_pyramids[1][:self.fusion_pyramid_levels],
+ feature_pyramids[1][:self.fusion_pyramid_levels])
+ ]
+
+ # Warp features and images using the flow. Note that we use backward warping
+ # and backward flow is used to read from image 0 and forward flow from
+ # image 1.
+ forward_warped_pyramid = pyramid_warp(pyramids_to_warp[0], backward_flow)
+ backward_warped_pyramid = pyramid_warp(pyramids_to_warp[1], forward_flow)
+
+ aligned_pyramid = concatenate_pyramids(forward_warped_pyramid,
+ backward_warped_pyramid)
+ aligned_pyramid = concatenate_pyramids(aligned_pyramid, backward_flow)
+ aligned_pyramid = concatenate_pyramids(aligned_pyramid, forward_flow)
+
+ return {
+ 'image': [self.fuse(aligned_pyramid)],
+ 'forward_residual_flow_pyramid': forward_residual_flow_pyramid,
+ 'backward_residual_flow_pyramid': backward_residual_flow_pyramid,
+ 'forward_flow_pyramid': forward_flow_pyramid,
+ 'backward_flow_pyramid': backward_flow_pyramid,
+ }
+
+
+ def forward(self, x0, x1, batch_dt) -> torch.Tensor:
+ return self.debug_forward(x0, x1, batch_dt)['image'][0]
+
+
+
+
+
+
+
+
+
+
+"""PyTorch layer for estimating optical flow by a residual flow pyramid.
+
+This approach of estimating optical flow between two images can be traced back
+to [1], but is also used by later neural optical flow computation methods such
+as SpyNet [2] and PWC-Net [3].
+
+The basic idea is that the optical flow is first estimated in a coarse
+resolution, then the flow is upsampled to warp the higher resolution image and
+then a residual correction is computed and added to the estimated flow. This
+process is repeated in a pyramid on coarse to fine order to successively
+increase the resolution of both optical flow and the warped image.
+
+In here, the optical flow predictor is used as an internal component for the
+film_net frame interpolator, to warp the two input images into the inbetween,
+target frame.
+
+[1] F. Glazer, Hierarchical motion detection. PhD thesis, 1987.
+[2] A. Ranjan and M. J. Black, Optical Flow Estimation using a Spatial Pyramid
+ Network. 2016
+[3] D. Sun X. Yang, M-Y. Liu and J. Kautz, PWC-Net: CNNs for Optical Flow Using
+ Pyramid, Warping, and Cost Volume, 2017
+"""
+from typing import List
+
+import torch
+from torch import nn
+from torch.nn import functional as F
+
+
+
+class FlowEstimator(nn.Module):
+ """Small-receptive field predictor for computing the flow between two images.
+
+ This is used to compute the residual flow fields in PyramidFlowEstimator.
+
+ Note that while the number of 3x3 convolutions & filters to apply is
+ configurable, two extra 1x1 convolutions are appended to extract the flow in
+ the end.
+
+ Attributes:
+ name: The name of the layer
+ num_convs: Number of 3x3 convolutions to apply
+ num_filters: Number of filters in each 3x3 convolution
+ """
+
+ def __init__(self, in_channels: int, num_convs: int, num_filters: int):
+ super(FlowEstimator, self).__init__()
+
+ self._convs = nn.ModuleList()
+ for i in range(num_convs):
+ self._convs.append(conv(in_channels=in_channels, out_channels=num_filters, size=3))
+ in_channels = num_filters
+ self._convs.append(conv(in_channels, num_filters // 2, size=1))
+ in_channels = num_filters // 2
+ # For the final convolution, we want no activation at all to predict the
+ # optical flow vector values. We have done extensive testing on explicitly
+ # bounding these values using sigmoid, but it turned out that having no
+ # activation gives better results.
+ self._convs.append(conv(in_channels, 2, size=1, activation=None))
+
+ def forward(self, features_a: torch.Tensor, features_b: torch.Tensor) -> torch.Tensor:
+ """Estimates optical flow between two images.
+
+ Args:
+ features_a: per pixel feature vectors for image A (B x H x W x C)
+ features_b: per pixel feature vectors for image B (B x H x W x C)
+
+ Returns:
+ A tensor with optical flow from A to B
+ """
+ net = torch.cat([features_a, features_b], dim=1)
+ for conv in self._convs:
+ net = conv(net)
+ return net
+
+
+class PyramidFlowEstimator(nn.Module):
+ """Predicts optical flow by coarse-to-fine refinement.
+ """
+
+ def __init__(self, filters: int = 64,
+ flow_convs: tuple = (3, 3, 3, 3),
+ flow_filters: tuple = (32, 64, 128, 256)):
+ super(PyramidFlowEstimator, self).__init__()
+
+ in_channels = filters << 1
+ predictors = []
+ for i in range(len(flow_convs)):
+ predictors.append(
+ FlowEstimator(
+ in_channels=in_channels,
+ num_convs=flow_convs[i],
+ num_filters=flow_filters[i]))
+ in_channels += filters << (i + 2)
+ self._predictor = predictors[-1]
+ self._predictors = nn.ModuleList(predictors[:-1][::-1])
+
+ def forward(self, feature_pyramid_a: List[torch.Tensor],
+ feature_pyramid_b: List[torch.Tensor]) -> List[torch.Tensor]:
+ """Estimates residual flow pyramids between two image pyramids.
+
+ Each image pyramid is represented as a list of tensors in fine-to-coarse
+ order. Each individual image is represented as a tensor where each pixel is
+ a vector of image features.
+
+ flow_pyramid_synthesis can be used to convert the residual flow
+ pyramid returned by this method into a flow pyramid, where each level
+ encodes the flow instead of a residual correction.
+
+ Args:
+ feature_pyramid_a: image pyramid as a list in fine-to-coarse order
+ feature_pyramid_b: image pyramid as a list in fine-to-coarse order
+
+ Returns:
+ List of flow tensors, in fine-to-coarse order, each level encoding the
+ difference against the bilinearly upsampled version from the coarser
+ level. The coarsest flow tensor, e.g. the last element in the array is the
+ 'DC-term', e.g. not a residual (alternatively you can think of it being a
+ residual against zero).
+ """
+ levels = len(feature_pyramid_a)
+ v = self._predictor(feature_pyramid_a[-1], feature_pyramid_b[-1])
+ residuals = [v]
+ for i in range(levels - 2, len(self._predictors) - 1, -1):
+ # Upsamples the flow to match the current pyramid level. Also, scales the
+ # magnitude by two to reflect the new size.
+ level_size = feature_pyramid_a[i].shape[2:4]
+ v = F.interpolate(2 * v, size=level_size, mode='bilinear')
+ # Warp feature_pyramid_b[i] image based on the current flow estimate.
+ warped = warp(feature_pyramid_b[i], v)
+ # Estimate the residual flow between pyramid_a[i] and warped image:
+ v_residual = self._predictor(feature_pyramid_a[i], warped)
+ residuals.insert(0, v_residual)
+ v = v_residual + v
+
+ for k, predictor in enumerate(self._predictors):
+ i = len(self._predictors) - 1 - k
+ # Upsamples the flow to match the current pyramid level. Also, scales the
+ # magnitude by two to reflect the new size.
+ level_size = feature_pyramid_a[i].shape[2:4]
+ v = F.interpolate(2 * v, size=level_size, mode='bilinear')
+ # Warp feature_pyramid_b[i] image based on the current flow estimate.
+ warped = warp(feature_pyramid_b[i], v)
+ # Estimate the residual flow between pyramid_a[i] and warped image:
+ v_residual = predictor(feature_pyramid_a[i], warped)
+ residuals.insert(0, v_residual)
+ v = v_residual + v
+ return residuals
+
+
+
+
+
+
+
+
+
+
+"""Various utilities used in the film_net frame interpolator model."""
+from typing import List, Optional
+
+import cv2
+import numpy as np
+import torch
+from torch import nn
+from torch.nn import functional as F
+
+
+def pad_batch(batch, align):
+ height, width = batch.shape[1:3]
+ height_to_pad = (align - height % align) if height % align != 0 else 0
+ width_to_pad = (align - width % align) if width % align != 0 else 0
+
+ crop_region = [height_to_pad >> 1, width_to_pad >> 1, height + (height_to_pad >> 1), width + (width_to_pad >> 1)]
+ batch = np.pad(batch, ((0, 0), (height_to_pad >> 1, height_to_pad - (height_to_pad >> 1)),
+ (width_to_pad >> 1, width_to_pad - (width_to_pad >> 1)), (0, 0)), mode='constant')
+ return batch, crop_region
+
+
+def load_image(path, align=64):
+ image = cv2.cvtColor(cv2.imread(path), cv2.COLOR_BGR2RGB).astype(np.float32) / np.float32(255)
+ image_batch, crop_region = pad_batch(np.expand_dims(image, axis=0), align)
+ return image_batch, crop_region
+
+
+def build_image_pyramid(image: torch.Tensor, pyramid_levels: int = 3) -> List[torch.Tensor]:
+ """Builds an image pyramid from a given image.
+
+ The original image is included in the pyramid and the rest are generated by
+ successively halving the resolution.
+
+ Args:
+ image: the input image.
+ options: film_net options object
+
+ Returns:
+ A list of images starting from the finest with options.pyramid_levels items
+ """
+
+ pyramid = []
+ for i in range(pyramid_levels):
+ pyramid.append(image)
+ if i < pyramid_levels - 1:
+ image = F.avg_pool2d(image, 2, 2)
+ return pyramid
+
+
+def warp(image: torch.Tensor, flow: torch.Tensor) -> torch.Tensor:
+ """Backward warps the image using the given flow.
+
+ Specifically, the output pixel in batch b, at position x, y will be computed
+ as follows:
+ (flowed_y, flowed_x) = (y+flow[b, y, x, 1], x+flow[b, y, x, 0])
+ output[b, y, x] = bilinear_lookup(image, b, flowed_y, flowed_x)
+
+ Note that the flow vectors are expected as [x, y], e.g. x in position 0 and
+ y in position 1.
+
+ Args:
+ image: An image with shape BxHxWxC.
+ flow: A flow with shape BxHxWx2, with the two channels denoting the relative
+ offset in order: (dx, dy).
+ Returns:
+ A warped image.
+ """
+ flow = -flow.flip(1)
+
+ dtype = flow.dtype
+ device = flow.device
+
+ # warped = tfa_image.dense_image_warp(image, flow)
+ # Same as above but with pytorch
+ ls1 = 1 - 1 / flow.shape[3]
+ ls2 = 1 - 1 / flow.shape[2]
+
+ normalized_flow2 = flow.permute(0, 2, 3, 1) / torch.tensor(
+ [flow.shape[2] * .5, flow.shape[3] * .5], dtype=dtype, device=device)[None, None, None]
+ normalized_flow2 = torch.stack([
+ torch.linspace(-ls1, ls1, flow.shape[3], dtype=dtype, device=device)[None, None, :] - normalized_flow2[..., 1],
+ torch.linspace(-ls2, ls2, flow.shape[2], dtype=dtype, device=device)[None, :, None] - normalized_flow2[..., 0],
+ ], dim=3)
+
+ padding_mode = "border"
+ if device.type == "mps":
+ # https://github.com/pytorch/pytorch/issues/125098
+ padding_mode = "zeros"
+ normalized_flow2 = normalized_flow2.clamp(-1, 1)
+ warped = F.grid_sample(
+ input=image,
+ grid=normalized_flow2,
+ mode='bilinear',
+ padding_mode=padding_mode,
+ align_corners=False,
+ )
+ return warped.reshape(image.shape)
+
+
+def multiply_pyramid(pyramid: List[torch.Tensor],
+ scalar: torch.Tensor) -> List[torch.Tensor]:
+ """Multiplies all image batches in the pyramid by a batch of scalars.
+
+ Args:
+ pyramid: Pyramid of image batches.
+ scalar: Batch of scalars.
+
+ Returns:
+ An image pyramid with all images multiplied by the scalar.
+ """
+ # To multiply each image with its corresponding scalar, we first transpose
+ # the batch of images from BxHxWxC-format to CxHxWxB. This can then be
+ # multiplied with a batch of scalars, then we transpose back to the standard
+ # BxHxWxC form.
+ return [image * scalar for image in pyramid]
+
+
+def flow_pyramid_synthesis(
+ residual_pyramid: List[torch.Tensor]) -> List[torch.Tensor]:
+ """Converts a residual flow pyramid into a flow pyramid."""
+ flow = residual_pyramid[-1]
+ flow_pyramid: List[torch.Tensor] = [flow]
+ for residual_flow in residual_pyramid[:-1][::-1]:
+ level_size = residual_flow.shape[2:4]
+ flow = F.interpolate(2 * flow, size=level_size, mode='bilinear')
+ flow = residual_flow + flow
+ flow_pyramid.insert(0, flow)
+ return flow_pyramid
+
+
+def pyramid_warp(feature_pyramid: List[torch.Tensor],
+ flow_pyramid: List[torch.Tensor]) -> List[torch.Tensor]:
+ """Warps the feature pyramid using the flow pyramid.
+
+ Args:
+ feature_pyramid: feature pyramid starting from the finest level.
+ flow_pyramid: flow fields, starting from the finest level.
+
+ Returns:
+ Reverse warped feature pyramid.
+ """
+ warped_feature_pyramid = []
+ for features, flow in zip(feature_pyramid, flow_pyramid):
+ warped_feature_pyramid.append(warp(features, flow))
+ return warped_feature_pyramid
+
+
+def concatenate_pyramids(pyramid1: List[torch.Tensor],
+ pyramid2: List[torch.Tensor]) -> List[torch.Tensor]:
+ """Concatenates each pyramid level together in the channel dimension."""
+ result = []
+ for features1, features2 in zip(pyramid1, pyramid2):
+ result.append(torch.cat([features1, features2], dim=1))
+ return result
+
+
+def conv(in_channels, out_channels, size, activation: Optional[str] = 'relu'):
+ # Since PyTorch doesn't have an in-built activation in Conv2d, we use a
+ # Sequential layer to combine Conv2d and Leaky ReLU in one module.
+ _conv = nn.Conv2d(
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=size,
+ padding='same')
+ if activation is None:
+ return _conv
+ assert activation == 'relu'
+ return nn.Sequential(
+ _conv,
+ nn.LeakyReLU(.2)
+ )
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/flavr/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/flavr/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..64a4b6bed3ba40712317708b175214bd773633fd
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/flavr/__init__.py
@@ -0,0 +1,115 @@
+import torch
+from comfy.model_management import get_torch_device, soft_empty_cache
+import numpy as np
+import typing
+from vfi_utils import InterpolationStateList, load_file_from_github_release, preprocess_frames, postprocess_frames, assert_batch_size
+import pathlib
+import warnings
+from .flavr_arch import UNet_3D_3D, InputPadder
+import gc
+
+device = get_torch_device()
+NBR_FRAME = 4
+
+def build_flavr(model_path):
+ sd = torch.load(model_path)['state_dict']
+ sd = {k.partition("module.")[-1]:v for k,v in sd.items()}
+
+ #Ref: Class UNet_3D_3D
+ model = UNet_3D_3D("unet_18", n_inputs=NBR_FRAME, n_outputs=sd["outconv.1.weight"].shape[0] // 3, joinType="concat" , upmode="transpose")
+ model.load_state_dict(sd)
+ model.to(device).eval()
+ del sd
+ return model
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+CKPT_NAMES = ["FLAVR_2x.pth", "FLAVR_4x.pth", "FLAVR_8x.pth"]
+
+class FLAVR_VFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (CKPT_NAMES, ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 10, "min": 1, "max": 1000}),
+ "multiplier": ("INT", {"default": 2, "min": 2, "max": 2}), #TODO: Implement recursively invoking interpolator for multi-frame interpolation
+ "duplicate_first_last_frames": ("BOOLEAN", {"default": False})
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ #Reference: https://github.com/danier97/ST-MFNet/blob/main/interpolate_yuv.py#L93
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames = 10,
+ multiplier: typing.SupportsInt = 2,
+ duplicate_first_last_frames: bool = False,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ if multiplier != 2:
+ warnings.warn("Currently, FLAVR only supports 2x interpolation. The process will continue but please set multiplier=2 afterward")
+
+ assert_batch_size(frames, batch_size=4, vfi_name="ST-MFNet")
+ interpolation_states = optional_interpolation_states
+ model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
+ model = build_flavr(model_path)
+ frames = preprocess_frames(frames)
+ padder = InputPadder(frames.shape, 16)
+ frames = padder.pad(frames)
+
+ number_of_frames_processed_since_last_cleared_cuda_cache = 0
+ output_frames = []
+ for frame_itr in range(len(frames) - 3):
+ #Does skipping frame i+1 make sanse in this case?
+ if interpolation_states is not None and interpolation_states.is_frame_skipped(frame_itr) and interpolation_states.is_frame_skipped(frame_itr + 1):
+ continue
+
+ #Ensure that input frames are in fp32 - the same dtype as model
+ frame0, frame1, frame2, frame3 = (
+ frames[frame_itr:frame_itr+1].float(),
+ frames[frame_itr+1:frame_itr+2].float(),
+ frames[frame_itr+2:frame_itr+3].float(),
+ frames[frame_itr+3:frame_itr+4].float()
+ )
+ new_frame = model([frame0.to(device), frame1.to(device), frame2.to(device), frame3.to(device)])[0].detach().cpu()
+ number_of_frames_processed_since_last_cleared_cuda_cache += 2
+
+ if frame_itr == 0:
+ output_frames.append(frame0)
+ if duplicate_first_last_frames:
+ output_frames.append(frame0) # repeat the first frame
+ output_frames.append(frame1)
+ output_frames.append(new_frame)
+ output_frames.append(frame2)
+ if frame_itr == len(frames) - 4:
+ output_frames.append(frame3)
+ if duplicate_first_last_frames:
+ output_frames.append(frame3) # repeat the last frame
+
+ # Try to avoid a memory overflow by clearing cuda cache regularly
+ if number_of_frames_processed_since_last_cleared_cuda_cache >= clear_cache_after_n_frames:
+ print("Comfy-VFI: Clearing cache...", end = ' ')
+ soft_empty_cache()
+ number_of_frames_processed_since_last_cleared_cuda_cache = 0
+ print("Done cache clearing")
+ gc.collect()
+
+ dtype = torch.float32
+ output_frames = [frame.cpu().to(dtype=dtype) for frame in output_frames] #Ensure all frames are in cpu
+ out = torch.cat(output_frames, dim=0)
+ out = padder.unpad(out)
+ # clear cache for courtesy
+ print("Comfy-VFI: Final clearing cache...", end=' ')
+ soft_empty_cache()
+ print("Done cache clearing")
+ return (postprocess_frames(out), )
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/flavr/flavr_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/flavr/flavr_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..3f26be0968f1192a95005900a081ac84b229323e
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/flavr/flavr_arch.py
@@ -0,0 +1,217 @@
+"""
+https://github.com/tarun005/FLAVR/blob/main/model/FLAVR_arch.py
+https://github.com/tarun005/FLAVR/blob/main/model/resnet_3D.py (only SEGating)
+"""
+import math
+import numpy as np
+import importlib
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+
+class SEGating(nn.Module):
+
+ def __init__(self , inplanes , reduction=16):
+
+ super().__init__()
+
+ self.pool = nn.AdaptiveAvgPool3d(1)
+ self.attn_layer = nn.Sequential(
+ nn.Conv3d(inplanes , inplanes , kernel_size=1 , stride=1 , bias=True),
+ nn.Sigmoid()
+ )
+
+ def forward(self , x):
+
+ out = self.pool(x)
+ y = self.attn_layer(out)
+ return x * y
+
+def joinTensors(X1 , X2 , type="concat"):
+
+ if type == "concat":
+ return torch.cat([X1 , X2] , dim=1)
+ elif type == "add":
+ return X1 + X2
+ else:
+ return X1
+
+
+class Conv_2d(nn.Module):
+
+ def __init__(self, in_ch, out_ch, kernel_size, stride=1, padding=0, bias=False, batchnorm=False):
+
+ super().__init__()
+ self.conv = [nn.Conv2d(in_ch, out_ch, kernel_size=kernel_size, stride=stride, padding=padding, bias=bias)]
+
+ if batchnorm:
+ self.conv += [nn.BatchNorm2d(out_ch)]
+
+ self.conv = nn.Sequential(*self.conv)
+
+ def forward(self, x):
+
+ return self.conv(x)
+
+class upConv3D(nn.Module):
+
+ def __init__(self, in_ch, out_ch, kernel_size, stride, padding, upmode="transpose" , batchnorm=False):
+
+ super().__init__()
+
+ self.upmode = upmode
+
+ if self.upmode=="transpose":
+ self.upconv = nn.ModuleList(
+ [nn.ConvTranspose3d(in_ch, out_ch, kernel_size=kernel_size, stride=stride, padding=padding),
+ SEGating(out_ch)
+ ]
+ )
+
+ else:
+ self.upconv = nn.ModuleList(
+ [nn.Upsample(mode='trilinear', scale_factor=(1,2,2), align_corners=False),
+ nn.Conv3d(in_ch, out_ch , kernel_size=1 , stride=1),
+ SEGating(out_ch)
+ ]
+ )
+
+ if batchnorm:
+ self.upconv += [nn.BatchNorm3d(out_ch)]
+
+ self.upconv = nn.Sequential(*self.upconv)
+
+ def forward(self, x):
+
+ return self.upconv(x)
+
+class Conv_3d(nn.Module):
+
+ def __init__(self, in_ch, out_ch, kernel_size, stride=1, padding=0, bias=True, batchnorm=False):
+
+ super().__init__()
+ self.conv = [nn.Conv3d(in_ch, out_ch, kernel_size=kernel_size, stride=stride, padding=padding, bias=bias),
+ SEGating(out_ch)
+ ]
+
+ if batchnorm:
+ self.conv += [nn.BatchNorm3d(out_ch)]
+
+ self.conv = nn.Sequential(*self.conv)
+
+ def forward(self, x):
+
+ return self.conv(x)
+
+class upConv2D(nn.Module):
+
+ def __init__(self, in_ch, out_ch, kernel_size, stride, padding, upmode="transpose" , batchnorm=False):
+
+ super().__init__()
+
+ self.upmode = upmode
+
+ if self.upmode=="transpose":
+ self.upconv = [nn.ConvTranspose2d(in_ch, out_ch, kernel_size=kernel_size, stride=stride, padding=padding)]
+
+ else:
+ self.upconv = [
+ nn.Upsample(mode='bilinear', scale_factor=2, align_corners=False),
+ nn.Conv2d(in_ch, out_ch , kernel_size=1 , stride=1)
+ ]
+
+ if batchnorm:
+ self.upconv += [nn.BatchNorm2d(out_ch)]
+
+ self.upconv = nn.Sequential(*self.upconv)
+
+ def forward(self, x):
+
+ return self.upconv(x)
+
+
+class UNet_3D_3D(nn.Module):
+ def __init__(self, block , n_inputs, n_outputs, batchnorm=False , joinType="concat" , upmode="transpose"):
+ super().__init__()
+
+ nf = [512 , 256 , 128 , 64]
+ out_channels = 3*n_outputs
+ self.joinType = joinType
+ self.n_outputs = n_outputs
+
+ growth = 2 if joinType == "concat" else 1
+ self.lrelu = nn.LeakyReLU(0.2, True)
+
+ unet_3D = importlib.import_module(".resnet_3D", "vfi_models.flavr")
+ if n_outputs > 1:
+ unet_3D.useBias = True
+ self.encoder = getattr(unet_3D , block)(pretrained=False , bn=batchnorm)
+
+ self.decoder = nn.Sequential(
+ Conv_3d(nf[0], nf[1] , kernel_size=3, padding=1, bias=True, batchnorm=batchnorm),
+ upConv3D(nf[1]*growth, nf[2], kernel_size=(3,4,4), stride=(1,2,2), padding=(1,1,1) , upmode=upmode, batchnorm=batchnorm),
+ upConv3D(nf[2]*growth, nf[3], kernel_size=(3,4,4), stride=(1,2,2), padding=(1,1,1) , upmode=upmode, batchnorm=batchnorm),
+ Conv_3d(nf[3]*growth, nf[3] , kernel_size=3, padding=1, bias=True, batchnorm=batchnorm),
+ upConv3D(nf[3]*growth , nf[3], kernel_size=(3,4,4), stride=(1,2,2), padding=(1,1,1) , upmode=upmode, batchnorm=batchnorm)
+ )
+
+ self.feature_fuse = Conv_2d(nf[3]*n_inputs , nf[3] , kernel_size=1 , stride=1, batchnorm=batchnorm)
+
+ self.outconv = nn.Sequential(
+ nn.ReflectionPad2d(3),
+ nn.Conv2d(nf[3], out_channels , kernel_size=7 , stride=1, padding=0)
+ )
+
+ def forward(self, images):
+
+ images = torch.stack(images , dim=2)
+
+ ## Batch mean normalization works slightly better than global mean normalization, thanks to https://github.com/myungsub/CAIN
+ mean_ = images.mean(2, keepdim=True).mean(3, keepdim=True).mean(4,keepdim=True)
+ images = images-mean_
+
+ x_0 , x_1 , x_2 , x_3 , x_4 = self.encoder(images)
+
+ dx_3 = self.lrelu(self.decoder[0](x_4))
+ dx_3 = joinTensors(dx_3 , x_3 , type=self.joinType)
+
+ dx_2 = self.lrelu(self.decoder[1](dx_3))
+ dx_2 = joinTensors(dx_2 , x_2 , type=self.joinType)
+
+ dx_1 = self.lrelu(self.decoder[2](dx_2))
+ dx_1 = joinTensors(dx_1 , x_1 , type=self.joinType)
+
+ dx_0 = self.lrelu(self.decoder[3](dx_1))
+ dx_0 = joinTensors(dx_0 , x_0 , type=self.joinType)
+
+ dx_out = self.lrelu(self.decoder[4](dx_0))
+ dx_out = torch.cat(torch.unbind(dx_out , 2) , 1)
+
+ out = self.lrelu(self.feature_fuse(dx_out))
+ out = self.outconv(out)
+
+ out = torch.split(out, dim=1, split_size_or_sections=3)
+ mean_ = mean_.squeeze(2)
+ out = [o+mean_ for o in out]
+
+ return out
+
+class InputPadder:
+ """ Pads images such that dimensions are divisible by divisor """
+ def __init__(self, dims, divisor=16):
+ self.ht, self.wd = dims[-2:]
+ pad_ht = (((self.ht // divisor) + 1) * divisor - self.ht) % divisor
+ pad_wd = (((self.wd // divisor) + 1) * divisor - self.wd) % divisor
+ self._pad = [pad_wd//2, pad_wd - pad_wd//2, pad_ht//2, pad_ht - pad_ht//2]
+
+ def pad(self, input_tensor):
+ return F.pad(input_tensor, self._pad, mode='replicate')
+
+ def unpad(self, input_tensor):
+ return self._unpad(input_tensor)
+
+ def _unpad(self, x):
+ ht, wd = x.shape[-2:]
+ c = [self._pad[2], ht-self._pad[3], self._pad[0], wd-self._pad[1]]
+ return x[..., c[0]:c[1], c[2]:c[3]]
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/flavr/resnet_3D.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/flavr/resnet_3D.py
new file mode 100644
index 0000000000000000000000000000000000000000..ba8b9a85a9edcf24ed8ff685c667dbcdbff55e69
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/flavr/resnet_3D.py
@@ -0,0 +1,288 @@
+# Modified from https://github.com/pytorch/vision/tree/master/torchvision/models/video
+
+import torch
+import torch.nn as nn
+
+__all__ = ['unet_18', 'unet_34']
+
+useBias = False
+
+class identity(nn.Module):
+
+ def __init__(self , *args , **kwargs):
+
+ super().__init__()
+
+ def forward(self , x):
+ return x
+
+class Conv3DSimple(nn.Conv3d):
+ def __init__(self,
+ in_planes,
+ out_planes,
+ midplanes=None,
+ stride=1,
+ padding=1):
+
+ super(Conv3DSimple, self).__init__(
+ in_channels=in_planes,
+ out_channels=out_planes,
+ kernel_size=(3, 3, 3),
+ stride=stride,
+ padding=padding,
+ bias=useBias)
+
+ @staticmethod
+ def get_downsample_stride(stride , temporal_stride):
+ if temporal_stride:
+ return (temporal_stride, stride, stride)
+ else:
+ return (stride , stride , stride)
+
+class BasicStem(nn.Sequential):
+ """The default conv-batchnorm-relu stem
+ """
+ def __init__(self):
+ super().__init__(
+ nn.Conv3d(3, 64, kernel_size=(3, 7, 7), stride=(1, 2, 2),
+ padding=(1, 3, 3), bias=useBias),
+ batchnorm(64),
+ nn.ReLU(inplace=False))
+
+
+class Conv2Plus1D(nn.Sequential):
+
+ def __init__(self,
+ in_planes,
+ out_planes,
+ midplanes,
+ stride=1,
+ padding=1):
+ if not isinstance(stride , int):
+ temporal_stride , stride , stride = stride
+ else:
+ temporal_stride = stride
+
+ super(Conv2Plus1D, self).__init__(
+ nn.Conv3d(in_planes, midplanes, kernel_size=(1, 3, 3),
+ stride=(1, stride, stride), padding=(0, padding, padding),
+ bias=False),
+ # batchnorm(midplanes),
+ nn.ReLU(inplace=True),
+ nn.Conv3d(midplanes, out_planes, kernel_size=(3, 1, 1),
+ stride=(temporal_stride, 1, 1), padding=(padding, 0, 0),
+ bias=False))
+
+ @staticmethod
+ def get_downsample_stride(stride , temporal_stride):
+ if temporal_stride:
+ return (temporal_stride, stride, stride)
+ else:
+ return (stride , stride , stride)
+
+class R2Plus1dStem(nn.Sequential):
+ """R(2+1)D stem is different than the default one as it uses separated 3D convolution
+ """
+ def __init__(self):
+ super().__init__(
+ nn.Conv3d(3, 45, kernel_size=(1, 7, 7),
+ stride=(1, 2, 2), padding=(0, 3, 3),
+ bias=False),
+ batchnorm(45),
+ nn.ReLU(inplace=True),
+ nn.Conv3d(45, 64, kernel_size=(3, 1, 1),
+ stride=(1, 1, 1), padding=(1, 0, 0),
+ bias=False),
+ batchnorm(64),
+ nn.ReLU(inplace=True))
+
+
+class SEGating(nn.Module):
+
+ def __init__(self , inplanes , reduction=16):
+
+ super().__init__()
+
+ self.pool = nn.AdaptiveAvgPool3d(1)
+ self.attn_layer = nn.Sequential(
+ nn.Conv3d(inplanes , inplanes , kernel_size=1 , stride=1 , bias=True),
+ nn.Sigmoid()
+ )
+
+ def forward(self , x):
+
+ out = self.pool(x)
+ y = self.attn_layer(out)
+ return x * y
+
+class BasicBlock(nn.Module):
+
+ expansion = 1
+
+ def __init__(self, inplanes, planes, conv_builder, stride=1, downsample=None):
+ midplanes = (inplanes * planes * 3 * 3 * 3) // (inplanes * 3 * 3 + 3 * planes)
+
+ super(BasicBlock, self).__init__()
+ self.conv1 = nn.Sequential(
+ conv_builder(inplanes, planes, midplanes, stride),
+ batchnorm(planes),
+ nn.ReLU(inplace=True)
+ )
+ self.conv2 = nn.Sequential(
+ conv_builder(planes, planes, midplanes),
+ batchnorm(planes)
+ )
+ self.fg = SEGating(planes) ## Feature Gating
+ self.relu = nn.ReLU(inplace=True)
+ self.downsample = downsample
+ self.stride = stride
+
+ def forward(self, x):
+ residual = x
+ out = self.conv1(x)
+ out = self.conv2(out)
+ out = self.fg(out)
+ if self.downsample is not None:
+ residual = self.downsample(x)
+
+ out += residual
+ out = self.relu(out)
+
+ return out
+
+class VideoResNet(nn.Module):
+
+ def __init__(self, block, conv_makers, layers,
+ stem, zero_init_residual=False):
+ """Generic resnet video generator.
+
+ Args:
+ block (nn.Module): resnet building block
+ conv_makers (list(functions)): generator function for each layer
+ layers (List[int]): number of blocks per layer
+ stem (nn.Module, optional): Resnet stem, if None, defaults to conv-bn-relu. Defaults to None.
+ """
+ super(VideoResNet, self).__init__()
+ self.inplanes = 64
+
+ self.stem = stem()
+
+ self.layer1 = self._make_layer(block, conv_makers[0], 64, layers[0], stride=1 )
+ self.layer2 = self._make_layer(block, conv_makers[1], 128, layers[1], stride=2 , temporal_stride=1)
+ self.layer3 = self._make_layer(block, conv_makers[2], 256, layers[2], stride=2 , temporal_stride=1)
+ self.layer4 = self._make_layer(block, conv_makers[3], 512, layers[3], stride=1, temporal_stride=1)
+
+ # init weights
+ self._initialize_weights()
+
+ if zero_init_residual:
+ for m in self.modules():
+ if isinstance(m, Bottleneck):
+ nn.init.constant_(m.bn3.weight, 0)
+
+ def forward(self, x):
+ x_0 = self.stem(x)
+ x_1 = self.layer1(x_0)
+ x_2 = self.layer2(x_1)
+ x_3 = self.layer3(x_2)
+ x_4 = self.layer4(x_3)
+ return x_0 , x_1 , x_2 , x_3 , x_4
+
+ def _make_layer(self, block, conv_builder, planes, blocks, stride=1, temporal_stride=None):
+ downsample = None
+
+ if stride != 1 or self.inplanes != planes * block.expansion:
+ ds_stride = conv_builder.get_downsample_stride(stride , temporal_stride)
+ downsample = nn.Sequential(
+ nn.Conv3d(self.inplanes, planes * block.expansion,
+ kernel_size=1, stride=ds_stride, bias=False),
+ batchnorm(planes * block.expansion)
+ )
+ stride = ds_stride
+
+ layers = []
+ layers.append(block(self.inplanes, planes, conv_builder, stride, downsample ))
+
+ self.inplanes = planes * block.expansion
+ for i in range(1, blocks):
+ layers.append(block(self.inplanes, planes, conv_builder ))
+
+ return nn.Sequential(*layers)
+
+ def _initialize_weights(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv3d):
+ nn.init.kaiming_normal_(m.weight, mode='fan_out',
+ nonlinearity='relu')
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+ elif isinstance(m, nn.BatchNorm3d):
+ nn.init.constant_(m.weight, 1)
+ nn.init.constant_(m.bias, 0)
+ elif isinstance(m, nn.Linear):
+ nn.init.normal_(m.weight, 0, 0.01)
+ nn.init.constant_(m.bias, 0)
+
+
+def _video_resnet(arch, pretrained=False, progress=True, **kwargs):
+ model = VideoResNet(**kwargs)
+ ## TODO: Other 3D resnet models, like S3D, r(2+1)D.
+
+ if pretrained:
+ state_dict = load_state_dict_from_url(model_urls[arch],
+ progress=progress)
+ model.load_state_dict(state_dict)
+ return model
+
+
+def unet_18(pretrained=False, bn=False, progress=True, **kwargs):
+ """
+ Construct 18 layer Unet3D model as in
+ https://arxiv.org/abs/1711.11248
+
+ Args:
+ pretrained (bool): If True, returns a model pre-trained on Kinetics-400
+ progress (bool): If True, displays a progress bar of the download to stderr
+
+ Returns:
+ nn.Module: R3D-18 encoder
+ """
+ global batchnorm
+ if bn:
+ batchnorm = nn.BatchNorm3d
+ else:
+ batchnorm = identity
+
+ return _video_resnet('r3d_18',
+ pretrained, progress,
+ block=BasicBlock,
+ conv_makers=[Conv3DSimple] * 4,
+ layers=[2, 2, 2, 2],
+ stem=BasicStem, **kwargs)
+
+def unet_34(pretrained=False, bn=False, progress=True, **kwargs):
+ """
+ Construct 34 layer Unet3D model as in
+ https://arxiv.org/abs/1711.11248
+
+ Args:
+ pretrained (bool): If True, returns a model pre-trained on Kinetics-400
+ progress (bool): If True, displays a progress bar of the download to stderr
+
+ Returns:
+ nn.Module: R3D-18 encoder
+ """
+ global batchnorm
+ # bn = False
+ if bn:
+ batchnorm = nn.BatchNorm3d
+ else:
+ batchnorm = identity
+
+
+ return _video_resnet('r3d_34',
+ pretrained, progress,
+ block=BasicBlock,
+ conv_makers=[Conv3DSimple] * 4,
+ layers=[3, 4, 6, 3],
+ stem=BasicStem, **kwargs)
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna.py
new file mode 100644
index 0000000000000000000000000000000000000000..949e5130c59b3cf090666dff229bfa9a2be3a072
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna.py
@@ -0,0 +1,24 @@
+import itertools
+import numpy as np
+import vapoursynth as vs
+from .GMFSS_Fortuna_arch import Model_inference
+import torch
+import traceback
+
+
+class GMFSS_Fortuna:
+ def __init__(self):
+ self.cache = False
+ self.amount_input_img = 2
+
+ torch.set_grad_enabled(False)
+ torch.backends.cudnn.enabled = True
+ torch.backends.cudnn.benchmark = True
+
+ self.model = Model_inference()
+ self.model.eval()
+
+ def execute(self, I0, I1, timestep):
+ with torch.inference_mode():
+ middle = self.model(I0, I1, timestep).cpu()
+ return middle
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..062489675ef58d541c0311a8a88f3510a737075f
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna_arch.py
@@ -0,0 +1,1850 @@
+"""
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/GMFSS_infer_b.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/softsplat.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/FusionNet_b.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/FeatureNet.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/MetricNet.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/IFNet_HDv3.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/gmflow.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/utils.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/position.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/geometry.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/matching.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/transformer.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/backbone.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/trident_conv.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/warplayer.py
+"""
+
+from torch import nn
+from torch.nn import functional as F
+from torch.nn.modules.utils import _pair
+import numpy as np
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch
+import math
+from vfi_models.rife.rife_arch import IFNet
+from vfi_models.ops import softsplat
+from comfy.model_management import get_torch_device
+
+device = get_torch_device()
+backwarp_tenGrid = {}
+
+
+def warp(tenInput, tenFlow):
+ k = (str(tenFlow.device), str(tenFlow.size()))
+ if k not in backwarp_tenGrid:
+ tenHorizontal = (
+ torch.linspace(-1.0, 1.0, tenFlow.shape[3], device=device)
+ .view(1, 1, 1, tenFlow.shape[3])
+ .expand(tenFlow.shape[0], -1, tenFlow.shape[2], -1)
+ )
+ tenVertical = (
+ torch.linspace(-1.0, 1.0, tenFlow.shape[2], device=device)
+ .view(1, 1, tenFlow.shape[2], 1)
+ .expand(tenFlow.shape[0], -1, -1, tenFlow.shape[3])
+ )
+ backwarp_tenGrid[k] = torch.cat([tenHorizontal, tenVertical], 1).to(device)
+
+ tenFlow = torch.cat(
+ [
+ tenFlow[:, 0:1, :, :] / ((tenInput.shape[3] - 1.0) / 2.0),
+ tenFlow[:, 1:2, :, :] / ((tenInput.shape[2] - 1.0) / 2.0),
+ ],
+ 1,
+ )
+
+ g = (backwarp_tenGrid[k] + tenFlow).permute(0, 2, 3, 1)
+ return torch.nn.functional.grid_sample(
+ input=tenInput,
+ grid=g,
+ mode="bilinear",
+ padding_mode="border",
+ align_corners=True,
+ )
+
+
+class MultiScaleTridentConv(nn.Module):
+ def __init__(
+ self,
+ in_channels,
+ out_channels,
+ kernel_size,
+ stride=1,
+ strides=1,
+ paddings=0,
+ dilations=1,
+ dilation=1,
+ groups=1,
+ num_branch=1,
+ test_branch_idx=-1,
+ bias=False,
+ norm=None,
+ activation=None,
+ ):
+ super(MultiScaleTridentConv, self).__init__()
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.kernel_size = _pair(kernel_size)
+ self.num_branch = num_branch
+ self.stride = _pair(stride)
+ self.groups = groups
+ self.with_bias = bias
+ self.dilation = dilation
+ if isinstance(paddings, int):
+ paddings = [paddings] * self.num_branch
+ if isinstance(dilations, int):
+ dilations = [dilations] * self.num_branch
+ if isinstance(strides, int):
+ strides = [strides] * self.num_branch
+ self.paddings = [_pair(padding) for padding in paddings]
+ self.dilations = [_pair(dilation) for dilation in dilations]
+ self.strides = [_pair(stride) for stride in strides]
+ self.test_branch_idx = test_branch_idx
+ self.norm = norm
+ self.activation = activation
+
+ assert len({self.num_branch, len(self.paddings), len(self.strides)}) == 1
+
+ self.weight = nn.Parameter(
+ torch.Tensor(out_channels, in_channels // groups, *self.kernel_size)
+ )
+ if bias:
+ self.bias = nn.Parameter(torch.Tensor(out_channels))
+ else:
+ self.bias = None
+
+ nn.init.kaiming_uniform_(self.weight, nonlinearity="relu")
+ if self.bias is not None:
+ nn.init.constant_(self.bias, 0)
+
+ def forward(self, inputs):
+ num_branch = (
+ self.num_branch if self.training or self.test_branch_idx == -1 else 1
+ )
+ assert len(inputs) == num_branch
+
+ if self.training or self.test_branch_idx == -1:
+ outputs = [
+ F.conv2d(
+ input,
+ self.weight,
+ self.bias,
+ stride,
+ padding,
+ self.dilation,
+ self.groups,
+ )
+ for input, stride, padding in zip(inputs, self.strides, self.paddings)
+ ]
+ else:
+ outputs = [
+ F.conv2d(
+ inputs[0],
+ self.weight,
+ self.bias,
+ self.strides[self.test_branch_idx]
+ if self.test_branch_idx == -1
+ else self.strides[-1],
+ self.paddings[self.test_branch_idx]
+ if self.test_branch_idx == -1
+ else self.paddings[-1],
+ self.dilation,
+ self.groups,
+ )
+ ]
+
+ if self.norm is not None:
+ outputs = [self.norm(x) for x in outputs]
+ if self.activation is not None:
+ outputs = [self.activation(x) for x in outputs]
+ return outputs
+
+
+class ResidualBlock_class(nn.Module):
+ def __init__(
+ self,
+ in_planes,
+ planes,
+ norm_layer=nn.InstanceNorm2d,
+ stride=1,
+ dilation=1,
+ ):
+ super(ResidualBlock_class, self).__init__()
+
+ self.conv1 = nn.Conv2d(
+ in_planes,
+ planes,
+ kernel_size=3,
+ dilation=dilation,
+ padding=dilation,
+ stride=stride,
+ bias=False,
+ )
+ self.conv2 = nn.Conv2d(
+ planes,
+ planes,
+ kernel_size=3,
+ dilation=dilation,
+ padding=dilation,
+ bias=False,
+ )
+ self.relu = nn.ReLU(inplace=True)
+
+ self.norm1 = norm_layer(planes)
+ self.norm2 = norm_layer(planes)
+ if not stride == 1 or in_planes != planes:
+ self.norm3 = norm_layer(planes)
+
+ if stride == 1 and in_planes == planes:
+ self.downsample = None
+ else:
+ self.downsample = nn.Sequential(
+ nn.Conv2d(in_planes, planes, kernel_size=1, stride=stride), self.norm3
+ )
+
+ def forward(self, x):
+ y = x
+ y = self.relu(self.norm1(self.conv1(y)))
+ y = self.relu(self.norm2(self.conv2(y)))
+
+ if self.downsample is not None:
+ x = self.downsample(x)
+
+ return self.relu(x + y)
+
+
+class CNNEncoder(nn.Module):
+ def __init__(
+ self,
+ output_dim=128,
+ norm_layer=nn.InstanceNorm2d,
+ num_output_scales=1,
+ **kwargs,
+ ):
+ super(CNNEncoder, self).__init__()
+ self.num_branch = num_output_scales
+
+ feature_dims = [64, 96, 128]
+
+ self.conv1 = nn.Conv2d(
+ 3, feature_dims[0], kernel_size=7, stride=2, padding=3, bias=False
+ ) # 1/2
+ self.norm1 = norm_layer(feature_dims[0])
+ self.relu1 = nn.ReLU(inplace=True)
+
+ self.in_planes = feature_dims[0]
+ self.layer1 = self._make_layer(
+ feature_dims[0], stride=1, norm_layer=norm_layer
+ ) # 1/2
+ self.layer2 = self._make_layer(
+ feature_dims[1], stride=2, norm_layer=norm_layer
+ ) # 1/4
+
+ # highest resolution 1/4 or 1/8
+ stride = 2 if num_output_scales == 1 else 1
+ self.layer3 = self._make_layer(
+ feature_dims[2],
+ stride=stride,
+ norm_layer=norm_layer,
+ ) # 1/4 or 1/8
+
+ self.conv2 = nn.Conv2d(feature_dims[2], output_dim, 1, 1, 0)
+
+ if self.num_branch > 1:
+ if self.num_branch == 4:
+ strides = (1, 2, 4, 8)
+ elif self.num_branch == 3:
+ strides = (1, 2, 4)
+ elif self.num_branch == 2:
+ strides = (1, 2)
+ else:
+ raise ValueError
+
+ self.trident_conv = MultiScaleTridentConv(
+ output_dim,
+ output_dim,
+ kernel_size=3,
+ strides=strides,
+ paddings=1,
+ num_branch=self.num_branch,
+ )
+
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")
+ elif isinstance(m, (nn.BatchNorm2d, nn.InstanceNorm2d, nn.GroupNorm)):
+ if m.weight is not None:
+ nn.init.constant_(m.weight, 1)
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+
+ def _make_layer(self, dim, stride=1, dilation=1, norm_layer=nn.InstanceNorm2d):
+ layer1 = ResidualBlock_class(
+ self.in_planes, dim, norm_layer=norm_layer, stride=stride, dilation=dilation
+ )
+ layer2 = ResidualBlock_class(
+ dim, dim, norm_layer=norm_layer, stride=1, dilation=dilation
+ )
+
+ layers = (layer1, layer2)
+
+ self.in_planes = dim
+ return nn.Sequential(*layers)
+
+ def forward(self, x):
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu1(x)
+
+ x = self.layer1(x) # 1/2
+ x = self.layer2(x) # 1/4
+ x = self.layer3(x) # 1/8 or 1/4
+
+ x = self.conv2(x)
+
+ if self.num_branch > 1:
+ out = self.trident_conv([x] * self.num_branch) # high to low res
+ else:
+ out = [x]
+
+ return out
+
+
+def single_head_full_attention(q, k, v):
+ # q, k, v: [B, L, C]
+ assert q.dim() == k.dim() == v.dim() == 3
+
+ scores = torch.matmul(q, k.permute(0, 2, 1)) / (q.size(2) ** 0.5) # [B, L, L]
+ attn = torch.softmax(scores, dim=2) # [B, L, L]
+ out = torch.matmul(attn, v) # [B, L, C]
+
+ return out
+
+
+def generate_shift_window_attn_mask(
+ input_resolution,
+ window_size_h,
+ window_size_w,
+ shift_size_h,
+ shift_size_w,
+ device=get_torch_device(),
+):
+ # Ref: https://github.com/microsoft/Swin-Transformer/blob/main/models/swin_transformer.py
+ # calculate attention mask for SW-MSA
+ h, w = input_resolution
+ img_mask = torch.zeros((1, h, w, 1)).to(device) # 1 H W 1
+ h_slices = (
+ slice(0, -window_size_h),
+ slice(-window_size_h, -shift_size_h),
+ slice(-shift_size_h, None),
+ )
+ w_slices = (
+ slice(0, -window_size_w),
+ slice(-window_size_w, -shift_size_w),
+ slice(-shift_size_w, None),
+ )
+ cnt = 0
+ for h in h_slices:
+ for w in w_slices:
+ img_mask[:, h, w, :] = cnt
+ cnt += 1
+
+ mask_windows = split_feature(
+ img_mask, num_splits=input_resolution[-1] // window_size_w, channel_last=True
+ )
+
+ mask_windows = mask_windows.view(-1, window_size_h * window_size_w)
+ attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2)
+ attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill(
+ attn_mask == 0, float(0.0)
+ )
+
+ return attn_mask
+
+
+def single_head_split_window_attention(
+ q,
+ k,
+ v,
+ num_splits=1,
+ with_shift=False,
+ h=None,
+ w=None,
+ attn_mask=None,
+):
+ # Ref: https://github.com/microsoft/Swin-Transformer/blob/main/models/swin_transformer.py
+ # q, k, v: [B, L, C]
+ assert q.dim() == k.dim() == v.dim() == 3
+
+ assert h is not None and w is not None
+ assert q.size(1) == h * w
+
+ b, _, c = q.size()
+
+ b_new = b * num_splits * num_splits
+
+ window_size_h = h // num_splits
+ window_size_w = w // num_splits
+
+ q = q.view(b, h, w, c) # [B, H, W, C]
+ k = k.view(b, h, w, c)
+ v = v.view(b, h, w, c)
+
+ scale_factor = c**0.5
+
+ if with_shift:
+ assert attn_mask is not None # compute once
+ shift_size_h = window_size_h // 2
+ shift_size_w = window_size_w // 2
+
+ q = torch.roll(q, shifts=(-shift_size_h, -shift_size_w), dims=(1, 2))
+ k = torch.roll(k, shifts=(-shift_size_h, -shift_size_w), dims=(1, 2))
+ v = torch.roll(v, shifts=(-shift_size_h, -shift_size_w), dims=(1, 2))
+
+ q = split_feature(
+ q, num_splits=num_splits, channel_last=True
+ ) # [B*K*K, H/K, W/K, C]
+ k = split_feature(k, num_splits=num_splits, channel_last=True)
+ v = split_feature(v, num_splits=num_splits, channel_last=True)
+
+ scores = (
+ torch.matmul(q.view(b_new, -1, c), k.view(b_new, -1, c).permute(0, 2, 1))
+ / scale_factor
+ ) # [B*K*K, H/K*W/K, H/K*W/K]
+
+ if with_shift:
+ scores += attn_mask.repeat(b, 1, 1)
+
+ attn = torch.softmax(scores, dim=-1)
+
+ out = torch.matmul(attn, v.view(b_new, -1, c)) # [B*K*K, H/K*W/K, C]
+
+ out = merge_splits(
+ out.view(b_new, h // num_splits, w // num_splits, c),
+ num_splits=num_splits,
+ channel_last=True,
+ ) # [B, H, W, C]
+
+ # shift back
+ if with_shift:
+ out = torch.roll(out, shifts=(shift_size_h, shift_size_w), dims=(1, 2))
+
+ out = out.view(b, -1, c)
+
+ return out
+
+
+class TransformerLayer(nn.Module):
+ def __init__(
+ self,
+ d_model=256,
+ nhead=1,
+ attention_type="swin",
+ no_ffn=False,
+ ffn_dim_expansion=4,
+ with_shift=False,
+ **kwargs,
+ ):
+ super(TransformerLayer, self).__init__()
+
+ self.dim = d_model
+ self.nhead = nhead
+ self.attention_type = attention_type
+ self.no_ffn = no_ffn
+
+ self.with_shift = with_shift
+
+ # multi-head attention
+ self.q_proj = nn.Linear(d_model, d_model, bias=False)
+ self.k_proj = nn.Linear(d_model, d_model, bias=False)
+ self.v_proj = nn.Linear(d_model, d_model, bias=False)
+
+ self.merge = nn.Linear(d_model, d_model, bias=False)
+
+ self.norm1 = nn.LayerNorm(d_model)
+
+ # no ffn after self-attn, with ffn after cross-attn
+ if not self.no_ffn:
+ in_channels = d_model * 2
+ self.mlp = nn.Sequential(
+ nn.Linear(in_channels, in_channels * ffn_dim_expansion, bias=False),
+ nn.GELU(),
+ nn.Linear(in_channels * ffn_dim_expansion, d_model, bias=False),
+ )
+
+ self.norm2 = nn.LayerNorm(d_model)
+
+ def forward(
+ self,
+ source,
+ target,
+ height=None,
+ width=None,
+ shifted_window_attn_mask=None,
+ attn_num_splits=None,
+ **kwargs,
+ ):
+ # source, target: [B, L, C]
+ query, key, value = source, target, target
+
+ # single-head attention
+ query = self.q_proj(query) # [B, L, C]
+ key = self.k_proj(key) # [B, L, C]
+ value = self.v_proj(value) # [B, L, C]
+
+ if self.attention_type == "swin" and attn_num_splits > 1:
+ if self.nhead > 1:
+ # we observe that multihead attention slows down the speed and increases the memory consumption
+ # without bringing obvious performance gains and thus the implementation is removed
+ raise NotImplementedError
+ else:
+ message = single_head_split_window_attention(
+ query,
+ key,
+ value,
+ num_splits=attn_num_splits,
+ with_shift=self.with_shift,
+ h=height,
+ w=width,
+ attn_mask=shifted_window_attn_mask,
+ )
+ else:
+ message = single_head_full_attention(query, key, value) # [B, L, C]
+
+ message = self.merge(message) # [B, L, C]
+ message = self.norm1(message)
+
+ if not self.no_ffn:
+ message = self.mlp(torch.cat([source, message], dim=-1))
+ message = self.norm2(message)
+
+ return source + message
+
+
+class TransformerBlock(nn.Module):
+ """self attention + cross attention + FFN"""
+
+ def __init__(
+ self,
+ d_model=256,
+ nhead=1,
+ attention_type="swin",
+ ffn_dim_expansion=4,
+ with_shift=False,
+ **kwargs,
+ ):
+ super(TransformerBlock, self).__init__()
+
+ self.self_attn = TransformerLayer(
+ d_model=d_model,
+ nhead=nhead,
+ attention_type=attention_type,
+ no_ffn=True,
+ ffn_dim_expansion=ffn_dim_expansion,
+ with_shift=with_shift,
+ )
+
+ self.cross_attn_ffn = TransformerLayer(
+ d_model=d_model,
+ nhead=nhead,
+ attention_type=attention_type,
+ ffn_dim_expansion=ffn_dim_expansion,
+ with_shift=with_shift,
+ )
+
+ def forward(
+ self,
+ source,
+ target,
+ height=None,
+ width=None,
+ shifted_window_attn_mask=None,
+ attn_num_splits=None,
+ **kwargs,
+ ):
+ # source, target: [B, L, C]
+
+ # self attention
+ source = self.self_attn(
+ source,
+ source,
+ height=height,
+ width=width,
+ shifted_window_attn_mask=shifted_window_attn_mask,
+ attn_num_splits=attn_num_splits,
+ )
+
+ # cross attention and ffn
+ source = self.cross_attn_ffn(
+ source,
+ target,
+ height=height,
+ width=width,
+ shifted_window_attn_mask=shifted_window_attn_mask,
+ attn_num_splits=attn_num_splits,
+ )
+
+ return source
+
+
+class FeatureTransformer(nn.Module):
+ def __init__(
+ self,
+ num_layers=6,
+ d_model=128,
+ nhead=1,
+ attention_type="swin",
+ ffn_dim_expansion=4,
+ **kwargs,
+ ):
+ super(FeatureTransformer, self).__init__()
+
+ self.attention_type = attention_type
+
+ self.d_model = d_model
+ self.nhead = nhead
+
+ self.layers = nn.ModuleList(
+ [
+ TransformerBlock(
+ d_model=d_model,
+ nhead=nhead,
+ attention_type=attention_type,
+ ffn_dim_expansion=ffn_dim_expansion,
+ with_shift=True
+ if attention_type == "swin" and i % 2 == 1
+ else False,
+ )
+ for i in range(num_layers)
+ ]
+ )
+
+ for p in self.parameters():
+ if p.dim() > 1:
+ nn.init.xavier_uniform_(p)
+
+ def forward(
+ self,
+ feature0,
+ feature1,
+ attn_num_splits=None,
+ **kwargs,
+ ):
+ b, c, h, w = feature0.shape
+ assert self.d_model == c
+
+ feature0 = feature0.flatten(-2).permute(0, 2, 1) # [B, H*W, C]
+ feature1 = feature1.flatten(-2).permute(0, 2, 1) # [B, H*W, C]
+
+ if self.attention_type == "swin" and attn_num_splits > 1:
+ # global and refine use different number of splits
+ window_size_h = h // attn_num_splits
+ window_size_w = w // attn_num_splits
+
+ # compute attn mask once
+ shifted_window_attn_mask = generate_shift_window_attn_mask(
+ input_resolution=(h, w),
+ window_size_h=window_size_h,
+ window_size_w=window_size_w,
+ shift_size_h=window_size_h // 2,
+ shift_size_w=window_size_w // 2,
+ device=feature0.device,
+ ) # [K*K, H/K*W/K, H/K*W/K]
+ else:
+ shifted_window_attn_mask = None
+
+ # concat feature0 and feature1 in batch dimension to compute in parallel
+ concat0 = torch.cat((feature0, feature1), dim=0) # [2B, H*W, C]
+ concat1 = torch.cat((feature1, feature0), dim=0) # [2B, H*W, C]
+
+ for layer in self.layers:
+ concat0 = layer(
+ concat0,
+ concat1,
+ height=h,
+ width=w,
+ shifted_window_attn_mask=shifted_window_attn_mask,
+ attn_num_splits=attn_num_splits,
+ )
+
+ # update feature1
+ concat1 = torch.cat(concat0.chunk(chunks=2, dim=0)[::-1], dim=0)
+
+ feature0, feature1 = concat0.chunk(chunks=2, dim=0) # [B, H*W, C]
+
+ # reshape back
+ feature0 = (
+ feature0.view(b, h, w, c).permute(0, 3, 1, 2).contiguous()
+ ) # [B, C, H, W]
+ feature1 = (
+ feature1.view(b, h, w, c).permute(0, 3, 1, 2).contiguous()
+ ) # [B, C, H, W]
+
+ return feature0, feature1
+
+
+class FeatureFlowAttention(nn.Module):
+ """
+ flow propagation with self-attention on feature
+ query: feature0, key: feature0, value: flow
+ """
+
+ def __init__(
+ self,
+ in_channels,
+ **kwargs,
+ ):
+ super(FeatureFlowAttention, self).__init__()
+
+ self.q_proj = nn.Linear(in_channels, in_channels)
+ self.k_proj = nn.Linear(in_channels, in_channels)
+
+ for p in self.parameters():
+ if p.dim() > 1:
+ nn.init.xavier_uniform_(p)
+
+ def forward(
+ self,
+ feature0,
+ flow,
+ local_window_attn=False,
+ local_window_radius=1,
+ **kwargs,
+ ):
+ # q, k: feature [B, C, H, W], v: flow [B, 2, H, W]
+ if local_window_attn:
+ return self.forward_local_window_attn(
+ feature0, flow, local_window_radius=local_window_radius
+ )
+
+ b, c, h, w = feature0.size()
+
+ query = feature0.view(b, c, h * w).permute(0, 2, 1) # [B, H*W, C]
+
+ # a note: the ``correct'' implementation should be:
+ # ``query = self.q_proj(query), key = self.k_proj(query)''
+ # this problem is observed while cleaning up the code
+ # however, this doesn't affect the performance since the projection is a linear operation,
+ # thus the two projection matrices for key can be merged
+ # so I just leave it as is in order to not re-train all models :)
+ query = self.q_proj(query) # [B, H*W, C]
+ key = self.k_proj(query) # [B, H*W, C]
+
+ value = flow.view(b, flow.size(1), h * w).permute(0, 2, 1) # [B, H*W, 2]
+
+ scores = torch.matmul(query, key.permute(0, 2, 1)) / (c**0.5) # [B, H*W, H*W]
+ prob = torch.softmax(scores, dim=-1)
+
+ out = torch.matmul(prob, value) # [B, H*W, 2]
+ out = out.view(b, h, w, value.size(-1)).permute(0, 3, 1, 2) # [B, 2, H, W]
+
+ return out
+
+ def forward_local_window_attn(
+ self,
+ feature0,
+ flow,
+ local_window_radius=1,
+ ):
+ assert flow.size(1) == 2
+ assert local_window_radius > 0
+
+ b, c, h, w = feature0.size()
+
+ feature0_reshape = self.q_proj(
+ feature0.view(b, c, -1).permute(0, 2, 1)
+ ).reshape(
+ b * h * w, 1, c
+ ) # [B*H*W, 1, C]
+
+ kernel_size = 2 * local_window_radius + 1
+
+ feature0_proj = (
+ self.k_proj(feature0.view(b, c, -1).permute(0, 2, 1))
+ .permute(0, 2, 1)
+ .reshape(b, c, h, w)
+ )
+
+ feature0_window = F.unfold(
+ feature0_proj, kernel_size=kernel_size, padding=local_window_radius
+ ) # [B, C*(2R+1)^2), H*W]
+
+ feature0_window = (
+ feature0_window.view(b, c, kernel_size**2, h, w)
+ .permute(0, 3, 4, 1, 2)
+ .reshape(b * h * w, c, kernel_size**2)
+ ) # [B*H*W, C, (2R+1)^2]
+
+ flow_window = F.unfold(
+ flow, kernel_size=kernel_size, padding=local_window_radius
+ ) # [B, 2*(2R+1)^2), H*W]
+
+ flow_window = (
+ flow_window.view(b, 2, kernel_size**2, h, w)
+ .permute(0, 3, 4, 2, 1)
+ .reshape(b * h * w, kernel_size**2, 2)
+ ) # [B*H*W, (2R+1)^2, 2]
+
+ scores = torch.matmul(feature0_reshape, feature0_window) / (
+ c**0.5
+ ) # [B*H*W, 1, (2R+1)^2]
+
+ prob = torch.softmax(scores, dim=-1)
+
+ out = (
+ torch.matmul(prob, flow_window)
+ .view(b, h, w, 2)
+ .permute(0, 3, 1, 2)
+ .contiguous()
+ ) # [B, 2, H, W]
+
+ return out
+
+
+def global_correlation_softmax(
+ feature0,
+ feature1,
+ pred_bidir_flow=False,
+):
+ # global correlation
+ b, c, h, w = feature0.shape
+ feature0 = feature0.view(b, c, -1).permute(0, 2, 1) # [B, H*W, C]
+ feature1 = feature1.view(b, c, -1) # [B, C, H*W]
+
+ correlation = torch.matmul(feature0, feature1).view(b, h, w, h, w) / (
+ c**0.5
+ ) # [B, H, W, H, W]
+
+ # flow from softmax
+ init_grid = coords_grid(b, h, w).to(correlation.device) # [B, 2, H, W]
+ grid = init_grid.view(b, 2, -1).permute(0, 2, 1) # [B, H*W, 2]
+
+ correlation = correlation.view(b, h * w, h * w) # [B, H*W, H*W]
+
+ if pred_bidir_flow:
+ correlation = torch.cat(
+ (correlation, correlation.permute(0, 2, 1)), dim=0
+ ) # [2*B, H*W, H*W]
+ init_grid = init_grid.repeat(2, 1, 1, 1) # [2*B, 2, H, W]
+ grid = grid.repeat(2, 1, 1) # [2*B, H*W, 2]
+ b = b * 2
+
+ prob = F.softmax(correlation, dim=-1) # [B, H*W, H*W]
+
+ correspondence = (
+ torch.matmul(prob, grid).view(b, h, w, 2).permute(0, 3, 1, 2)
+ ) # [B, 2, H, W]
+
+ # when predicting bidirectional flow, flow is the concatenation of forward flow and backward flow
+ flow = correspondence - init_grid
+
+ return flow, prob
+
+
+def local_correlation_softmax(
+ feature0,
+ feature1,
+ local_radius,
+ padding_mode="zeros",
+):
+ b, c, h, w = feature0.size()
+ coords_init = coords_grid(b, h, w).to(feature0.device) # [B, 2, H, W]
+ coords = coords_init.view(b, 2, -1).permute(0, 2, 1) # [B, H*W, 2]
+
+ local_h = 2 * local_radius + 1
+ local_w = 2 * local_radius + 1
+
+ window_grid = generate_window_grid(
+ -local_radius,
+ local_radius,
+ -local_radius,
+ local_radius,
+ local_h,
+ local_w,
+ device=feature0.device,
+ ) # [2R+1, 2R+1, 2]
+ window_grid = window_grid.reshape(-1, 2).repeat(b, 1, 1, 1) # [B, 1, (2R+1)^2, 2]
+ sample_coords = coords.unsqueeze(-2) + window_grid # [B, H*W, (2R+1)^2, 2]
+
+ sample_coords_softmax = sample_coords
+
+ # exclude coords that are out of image space
+ valid_x = (sample_coords[:, :, :, 0] >= 0) & (
+ sample_coords[:, :, :, 0] < w
+ ) # [B, H*W, (2R+1)^2]
+ valid_y = (sample_coords[:, :, :, 1] >= 0) & (
+ sample_coords[:, :, :, 1] < h
+ ) # [B, H*W, (2R+1)^2]
+
+ valid = (
+ valid_x & valid_y
+ ) # [B, H*W, (2R+1)^2], used to mask out invalid values when softmax
+
+ # normalize coordinates to [-1, 1]
+ sample_coords_norm = normalize_coords(sample_coords, h, w) # [-1, 1]
+ window_feature = F.grid_sample(
+ feature1, sample_coords_norm, padding_mode=padding_mode, align_corners=True
+ ).permute(
+ 0, 2, 1, 3
+ ) # [B, H*W, C, (2R+1)^2]
+ feature0_view = feature0.permute(0, 2, 3, 1).view(b, h * w, 1, c) # [B, H*W, 1, C]
+
+ corr = torch.matmul(feature0_view, window_feature).view(b, h * w, -1) / (
+ c**0.5
+ ) # [B, H*W, (2R+1)^2]
+
+ # mask invalid locations
+ corr[~valid] = -1e9
+
+ prob = F.softmax(corr, -1) # [B, H*W, (2R+1)^2]
+
+ correspondence = (
+ torch.matmul(prob.unsqueeze(-2), sample_coords_softmax)
+ .squeeze(-2)
+ .view(b, h, w, 2)
+ .permute(0, 3, 1, 2)
+ ) # [B, 2, H, W]
+
+ flow = correspondence - coords_init
+ match_prob = prob
+
+ return flow, match_prob
+
+
+def coords_grid(b, h, w, homogeneous=False, device=None):
+ y, x = torch.meshgrid(torch.arange(h), torch.arange(w)) # [H, W]
+
+ stacks = [x, y]
+
+ if homogeneous:
+ ones = torch.ones_like(x) # [H, W]
+ stacks.append(ones)
+
+ grid = torch.stack(stacks, dim=0).float() # [2, H, W] or [3, H, W]
+
+ grid = grid[None].repeat(b, 1, 1, 1) # [B, 2, H, W] or [B, 3, H, W]
+
+ if device is not None:
+ grid = grid.to(device)
+
+ return grid
+
+
+def generate_window_grid(h_min, h_max, w_min, w_max, len_h, len_w, device=None):
+ assert device is not None
+
+ x, y = torch.meshgrid(
+ [
+ torch.linspace(w_min, w_max, len_w, device=device),
+ torch.linspace(h_min, h_max, len_h, device=device),
+ ],
+ )
+ grid = torch.stack((x, y), -1).transpose(0, 1).float() # [H, W, 2]
+
+ return grid
+
+
+def normalize_coords(coords, h, w):
+ # coords: [B, H, W, 2]
+ c = torch.Tensor([(w - 1) / 2.0, (h - 1) / 2.0]).float().to(coords.device)
+ return (coords - c) / c # [-1, 1]
+
+
+def bilinear_sample(
+ img, sample_coords, mode="bilinear", padding_mode="zeros", return_mask=False
+):
+ # img: [B, C, H, W]
+ # sample_coords: [B, 2, H, W] in image scale
+ if sample_coords.size(1) != 2: # [B, H, W, 2]
+ sample_coords = sample_coords.permute(0, 3, 1, 2)
+
+ b, _, h, w = sample_coords.shape
+
+ # Normalize to [-1, 1]
+ x_grid = 2 * sample_coords[:, 0] / (w - 1) - 1
+ y_grid = 2 * sample_coords[:, 1] / (h - 1) - 1
+
+ grid = torch.stack([x_grid, y_grid], dim=-1) # [B, H, W, 2]
+
+ img = F.grid_sample(
+ img, grid, mode=mode, padding_mode=padding_mode, align_corners=True
+ )
+
+ if return_mask:
+ mask = (
+ (x_grid >= -1) & (y_grid >= -1) & (x_grid <= 1) & (y_grid <= 1)
+ ) # [B, H, W]
+
+ return img, mask
+
+ return img
+
+
+def flow_warp(feature, flow, mask=False, padding_mode="zeros"):
+ b, c, h, w = feature.size()
+ assert flow.size(1) == 2
+
+ grid = coords_grid(b, h, w).to(flow.device) + flow # [B, 2, H, W]
+
+ return bilinear_sample(feature, grid, padding_mode=padding_mode, return_mask=mask)
+
+
+def forward_backward_consistency_check(fwd_flow, bwd_flow, alpha=0.01, beta=0.5):
+ # fwd_flow, bwd_flow: [B, 2, H, W]
+ # alpha and beta values are following UnFlow (https://arxiv.org/abs/1711.07837)
+ assert fwd_flow.dim() == 4 and bwd_flow.dim() == 4
+ assert fwd_flow.size(1) == 2 and bwd_flow.size(1) == 2
+ flow_mag = torch.norm(fwd_flow, dim=1) + torch.norm(bwd_flow, dim=1) # [B, H, W]
+
+ warped_bwd_flow = flow_warp(bwd_flow, fwd_flow) # [B, 2, H, W]
+ warped_fwd_flow = flow_warp(fwd_flow, bwd_flow) # [B, 2, H, W]
+
+ diff_fwd = torch.norm(fwd_flow + warped_bwd_flow, dim=1) # [B, H, W]
+ diff_bwd = torch.norm(bwd_flow + warped_fwd_flow, dim=1)
+
+ threshold = alpha * flow_mag + beta
+
+ fwd_occ = (diff_fwd > threshold).float() # [B, H, W]
+ bwd_occ = (diff_bwd > threshold).float()
+
+ return fwd_occ, bwd_occ
+
+
+class PositionEmbeddingSine(nn.Module):
+ """
+ This is a more standard version of the position embedding, very similar to the one
+ used by the Attention is all you need paper, generalized to work on images.
+ """
+
+ def __init__(self, num_pos_feats=64, temperature=10000, normalize=True, scale=None):
+ super().__init__()
+ self.num_pos_feats = num_pos_feats
+ self.temperature = temperature
+ self.normalize = normalize
+ if scale is not None and normalize is False:
+ raise ValueError("normalize should be True if scale is passed")
+ if scale is None:
+ scale = 2 * math.pi
+ self.scale = scale
+
+ def forward(self, x):
+ # x = tensor_list.tensors # [B, C, H, W]
+ # mask = tensor_list.mask # [B, H, W], input with padding, valid as 0
+ b, c, h, w = x.size()
+ mask = torch.ones((b, h, w), device=x.device) # [B, H, W]
+ y_embed = mask.cumsum(1, dtype=torch.float32)
+ x_embed = mask.cumsum(2, dtype=torch.float32)
+ if self.normalize:
+ eps = 1e-6
+ y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale
+ x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale
+
+ dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device)
+ dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats)
+
+ pos_x = x_embed[:, :, :, None] / dim_t
+ pos_y = y_embed[:, :, :, None] / dim_t
+ pos_x = torch.stack(
+ (pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4
+ ).flatten(3)
+ pos_y = torch.stack(
+ (pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4
+ ).flatten(3)
+ pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2)
+ return pos
+
+
+def split_feature(
+ feature,
+ num_splits=2,
+ channel_last=False,
+):
+ if channel_last: # [B, H, W, C]
+ b, h, w, c = feature.size()
+ assert h % num_splits == 0 and w % num_splits == 0
+
+ b_new = b * num_splits * num_splits
+ h_new = h // num_splits
+ w_new = w // num_splits
+
+ feature = (
+ feature.view(b, num_splits, h // num_splits, num_splits, w // num_splits, c)
+ .permute(0, 1, 3, 2, 4, 5)
+ .reshape(b_new, h_new, w_new, c)
+ ) # [B*K*K, H/K, W/K, C]
+ else: # [B, C, H, W]
+ b, c, h, w = feature.size()
+ assert h % num_splits == 0 and w % num_splits == 0
+
+ b_new = b * num_splits * num_splits
+ h_new = h // num_splits
+ w_new = w // num_splits
+
+ feature = (
+ feature.view(b, c, num_splits, h // num_splits, num_splits, w // num_splits)
+ .permute(0, 2, 4, 1, 3, 5)
+ .reshape(b_new, c, h_new, w_new)
+ ) # [B*K*K, C, H/K, W/K]
+
+ return feature
+
+
+def merge_splits(
+ splits,
+ num_splits=2,
+ channel_last=False,
+):
+ if channel_last: # [B*K*K, H/K, W/K, C]
+ b, h, w, c = splits.size()
+ new_b = b // num_splits // num_splits
+
+ splits = splits.view(new_b, num_splits, num_splits, h, w, c)
+ merge = (
+ splits.permute(0, 1, 3, 2, 4, 5)
+ .contiguous()
+ .view(new_b, num_splits * h, num_splits * w, c)
+ ) # [B, H, W, C]
+ else: # [B*K*K, C, H/K, W/K]
+ b, c, h, w = splits.size()
+ new_b = b // num_splits // num_splits
+
+ splits = splits.view(new_b, num_splits, num_splits, c, h, w)
+ merge = (
+ splits.permute(0, 3, 1, 4, 2, 5)
+ .contiguous()
+ .view(new_b, c, num_splits * h, num_splits * w)
+ ) # [B, C, H, W]
+
+ return merge
+
+
+def normalize_img(img0, img1):
+ # loaded images are in [0, 255]
+ # normalize by ImageNet mean and std
+ mean = torch.tensor([0.485, 0.456, 0.406]).view(1, 3, 1, 1).to(img1.device)
+ std = torch.tensor([0.229, 0.224, 0.225]).view(1, 3, 1, 1).to(img1.device)
+ img0 = (img0 - mean) / std
+ img1 = (img1 - mean) / std
+
+ return img0, img1
+
+
+def feature_add_position(feature0, feature1, attn_splits, feature_channels):
+ pos_enc = PositionEmbeddingSine(num_pos_feats=feature_channels // 2)
+
+ if attn_splits > 1: # add position in splited window
+ feature0_splits = split_feature(feature0, num_splits=attn_splits)
+ feature1_splits = split_feature(feature1, num_splits=attn_splits)
+
+ position = pos_enc(feature0_splits)
+
+ feature0_splits = feature0_splits + position
+ feature1_splits = feature1_splits + position
+
+ feature0 = merge_splits(feature0_splits, num_splits=attn_splits)
+ feature1 = merge_splits(feature1_splits, num_splits=attn_splits)
+ else:
+ position = pos_enc(feature0)
+
+ feature0 = feature0 + position
+ feature1 = feature1 + position
+
+ return feature0, feature1
+
+
+class GMFlow(nn.Module):
+ def __init__(
+ self,
+ num_scales=2,
+ upsample_factor=4,
+ feature_channels=128,
+ attention_type="swin",
+ num_transformer_layers=6,
+ ffn_dim_expansion=4,
+ num_head=1,
+ **kwargs,
+ ):
+ super(GMFlow, self).__init__()
+
+ self.num_scales = num_scales
+ self.feature_channels = feature_channels
+ self.upsample_factor = upsample_factor
+ self.attention_type = attention_type
+ self.num_transformer_layers = num_transformer_layers
+
+ # CNN backbone
+ self.backbone = CNNEncoder(
+ output_dim=feature_channels, num_output_scales=num_scales
+ )
+
+ # Transformer
+ self.transformer = FeatureTransformer(
+ num_layers=num_transformer_layers,
+ d_model=feature_channels,
+ nhead=num_head,
+ attention_type=attention_type,
+ ffn_dim_expansion=ffn_dim_expansion,
+ )
+
+ # flow propagation with self-attn
+ self.feature_flow_attn = FeatureFlowAttention(in_channels=feature_channels)
+
+ # convex upsampling: concat feature0 and flow as input
+ self.upsampler = nn.Sequential(
+ nn.Conv2d(2 + feature_channels, 256, 3, 1, 1),
+ nn.ReLU(inplace=True),
+ nn.Conv2d(256, upsample_factor**2 * 9, 1, 1, 0),
+ )
+
+ def extract_feature(self, img0, img1):
+ concat = torch.cat((img0, img1), dim=0) # [2B, C, H, W]
+ features = self.backbone(
+ concat
+ ) # list of [2B, C, H, W], resolution from high to low
+
+ # reverse: resolution from low to high
+ features = features[::-1]
+
+ feature0, feature1 = [], []
+
+ for i in range(len(features)):
+ feature = features[i]
+ chunks = torch.chunk(feature, 2, 0) # tuple
+ feature0.append(chunks[0])
+ feature1.append(chunks[1])
+
+ return feature0, feature1
+
+ def upsample_flow(
+ self,
+ flow,
+ feature,
+ bilinear=False,
+ upsample_factor=8,
+ ):
+ if bilinear:
+ up_flow = (
+ F.interpolate(
+ flow,
+ scale_factor=upsample_factor,
+ mode="bilinear",
+ align_corners=True,
+ )
+ * upsample_factor
+ )
+
+ else:
+ # convex upsampling
+ concat = torch.cat((flow, feature), dim=1)
+
+ mask = self.upsampler(concat)
+ b, flow_channel, h, w = flow.shape
+ mask = mask.view(
+ b, 1, 9, self.upsample_factor, self.upsample_factor, h, w
+ ) # [B, 1, 9, K, K, H, W]
+ mask = torch.softmax(mask, dim=2)
+
+ up_flow = F.unfold(self.upsample_factor * flow, [3, 3], padding=1)
+ up_flow = up_flow.view(
+ b, flow_channel, 9, 1, 1, h, w
+ ) # [B, 2, 9, 1, 1, H, W]
+
+ up_flow = torch.sum(mask * up_flow, dim=2) # [B, 2, K, K, H, W]
+ up_flow = up_flow.permute(0, 1, 4, 2, 5, 3) # [B, 2, K, H, K, W]
+ up_flow = up_flow.reshape(
+ b, flow_channel, self.upsample_factor * h, self.upsample_factor * w
+ ) # [B, 2, K*H, K*W]
+
+ return up_flow
+
+ def forward(
+ self,
+ img0,
+ img1,
+ attn_splits_list=[2, 8],
+ corr_radius_list=[-1, 4],
+ prop_radius_list=[-1, 1],
+ pred_bidir_flow=False,
+ **kwargs,
+ ):
+ img0, img1 = normalize_img(img0, img1) # [B, 3, H, W]
+
+ # resolution low to high
+ feature0_list, feature1_list = self.extract_feature(
+ img0, img1
+ ) # list of features
+
+ flow = None
+
+ assert (
+ len(attn_splits_list)
+ == len(corr_radius_list)
+ == len(prop_radius_list)
+ == self.num_scales
+ )
+
+ for scale_idx in range(self.num_scales):
+ feature0, feature1 = feature0_list[scale_idx], feature1_list[scale_idx]
+
+ if pred_bidir_flow and scale_idx > 0:
+ # predicting bidirectional flow with refinement
+ feature0, feature1 = torch.cat((feature0, feature1), dim=0), torch.cat(
+ (feature1, feature0), dim=0
+ )
+
+ upsample_factor = self.upsample_factor * (
+ 2 ** (self.num_scales - 1 - scale_idx)
+ )
+
+ if scale_idx > 0:
+ flow = (
+ F.interpolate(
+ flow, scale_factor=2, mode="bilinear", align_corners=True
+ )
+ * 2
+ )
+
+ if flow is not None:
+ flow = flow.detach()
+ feature1 = flow_warp(feature1, flow) # [B, C, H, W]
+
+ attn_splits = attn_splits_list[scale_idx]
+ corr_radius = corr_radius_list[scale_idx]
+ prop_radius = prop_radius_list[scale_idx]
+
+ # add position to features
+ feature0, feature1 = feature_add_position(
+ feature0, feature1, attn_splits, self.feature_channels
+ )
+
+ # Transformer
+ feature0, feature1 = self.transformer(
+ feature0, feature1, attn_num_splits=attn_splits
+ )
+
+ # correlation and softmax
+ if corr_radius == -1: # global matching
+ flow_pred = global_correlation_softmax(
+ feature0, feature1, pred_bidir_flow
+ )[0]
+ else: # local matching
+ flow_pred = local_correlation_softmax(feature0, feature1, corr_radius)[
+ 0
+ ]
+
+ # flow or residual flow
+ flow = flow + flow_pred if flow is not None else flow_pred
+
+ # upsample to the original resolution for supervison
+ if (
+ self.training
+ ): # only need to upsample intermediate flow predictions at training time
+ flow_bilinear = self.upsample_flow(
+ flow, None, bilinear=True, upsample_factor=upsample_factor
+ )
+
+ # flow propagation with self-attn
+ if pred_bidir_flow and scale_idx == 0:
+ feature0 = torch.cat(
+ (feature0, feature1), dim=0
+ ) # [2*B, C, H, W] for propagation
+ flow = self.feature_flow_attn(
+ feature0,
+ flow.detach(),
+ local_window_attn=prop_radius > 0,
+ local_window_radius=prop_radius,
+ )
+
+ # bilinear upsampling at training time except the last one
+ if self.training and scale_idx < self.num_scales - 1:
+ flow_up = self.upsample_flow(
+ flow, feature0, bilinear=True, upsample_factor=upsample_factor
+ )
+
+ if scale_idx == self.num_scales - 1:
+ flow_up = self.upsample_flow(flow, feature0)
+
+ return flow_up
+
+
+backwarp_tenGrid = {}
+
+
+def backwarp(tenIn, tenflow):
+ if str(tenflow.shape) not in backwarp_tenGrid:
+ tenHor = (
+ torch.linspace(
+ start=-1.0,
+ end=1.0,
+ steps=tenflow.shape[3],
+ dtype=tenflow.dtype,
+ device=tenflow.device,
+ )
+ .view(1, 1, 1, -1)
+ .repeat(1, 1, tenflow.shape[2], 1)
+ )
+ tenVer = (
+ torch.linspace(
+ start=-1.0,
+ end=1.0,
+ steps=tenflow.shape[2],
+ dtype=tenflow.dtype,
+ device=tenflow.device,
+ )
+ .view(1, 1, -1, 1)
+ .repeat(1, 1, 1, tenflow.shape[3])
+ )
+
+ backwarp_tenGrid[str(tenflow.shape)] = torch.cat([tenHor, tenVer], 1).to(get_torch_device())
+ # end
+
+ tenflow = torch.cat(
+ [
+ tenflow[:, 0:1, :, :] / ((tenIn.shape[3] - 1.0) / 2.0),
+ tenflow[:, 1:2, :, :] / ((tenIn.shape[2] - 1.0) / 2.0),
+ ],
+ 1,
+ )
+
+ return torch.nn.functional.grid_sample(
+ input=tenIn,
+ grid=(backwarp_tenGrid[str(tenflow.shape)] + tenflow).permute(0, 2, 3, 1),
+ mode="bilinear",
+ padding_mode="zeros",
+ align_corners=True,
+ )
+
+
+class MetricNet(nn.Module):
+ def __init__(self):
+ super(MetricNet, self).__init__()
+ self.metric_in = nn.Conv2d(14, 64, 3, 1, 1)
+ self.metric_net1 = nn.Sequential(nn.PReLU(), nn.Conv2d(64, 64, 3, 1, 1))
+ self.metric_net2 = nn.Sequential(nn.PReLU(), nn.Conv2d(64, 64, 3, 1, 1))
+ self.metric_net3 = nn.Sequential(nn.PReLU(), nn.Conv2d(64, 64, 3, 1, 1))
+ self.metric_out = nn.Sequential(nn.PReLU(), nn.Conv2d(64, 2, 3, 1, 1))
+
+ def forward(self, img0, img1, flow01, flow10):
+ metric0 = F.l1_loss(img0, backwarp(img1, flow01), reduction="none").mean(
+ [1], True
+ )
+ metric1 = F.l1_loss(img1, backwarp(img0, flow10), reduction="none").mean(
+ [1], True
+ )
+
+ fwd_occ, bwd_occ = forward_backward_consistency_check(flow01, flow10)
+
+ flow01 = torch.cat(
+ [
+ flow01[:, 0:1, :, :] / ((flow01.shape[3] - 1.0) / 2.0),
+ flow01[:, 1:2, :, :] / ((flow01.shape[2] - 1.0) / 2.0),
+ ],
+ 1,
+ )
+ flow10 = torch.cat(
+ [
+ flow10[:, 0:1, :, :] / ((flow10.shape[3] - 1.0) / 2.0),
+ flow10[:, 1:2, :, :] / ((flow10.shape[2] - 1.0) / 2.0),
+ ],
+ 1,
+ )
+
+ img = torch.cat((img0, img1), 1)
+ metric = torch.cat((-metric0, -metric1), 1)
+ flow = torch.cat((flow01, flow10), 1)
+ occ = torch.cat((fwd_occ.unsqueeze(1), bwd_occ.unsqueeze(1)), 1)
+
+ feat = self.metric_in(torch.cat((img, metric, flow, occ), 1))
+ feat = self.metric_net1(feat) + feat
+ feat = self.metric_net2(feat) + feat
+ feat = self.metric_net3(feat) + feat
+ metric = self.metric_out(feat)
+
+ metric = torch.tanh(metric) * 10
+
+ return metric[:, :1], metric[:, 1:2]
+
+
+class FeatureNet(nn.Module):
+ """The quadratic model"""
+
+ def __init__(self):
+ super(FeatureNet, self).__init__()
+ self.block1 = nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(3, 64, 3, 2, 1),
+ nn.PReLU(),
+ nn.Conv2d(64, 64, 3, 1, 1),
+ )
+ self.block2 = nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(64, 128, 3, 2, 1),
+ nn.PReLU(),
+ nn.Conv2d(128, 128, 3, 1, 1),
+ )
+ self.block3 = nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(128, 192, 3, 2, 1),
+ nn.PReLU(),
+ nn.Conv2d(192, 192, 3, 1, 1),
+ )
+
+ def forward(self, x):
+ x1 = self.block1(x)
+ x2 = self.block2(x1)
+ x3 = self.block3(x2)
+
+ return x1, x2, x3
+
+
+# Residual Block
+def ResidualBlock(in_channels, out_channels, stride=1):
+ return torch.nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size=3,
+ stride=stride,
+ padding=1,
+ bias=True,
+ ),
+ nn.PReLU(),
+ nn.Conv2d(
+ out_channels,
+ out_channels,
+ kernel_size=3,
+ stride=stride,
+ padding=1,
+ bias=True,
+ ),
+ )
+
+
+# downsample block
+def DownsampleBlock(in_channels, out_channels, stride=2):
+ return torch.nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size=3,
+ stride=stride,
+ padding=1,
+ bias=True,
+ ),
+ nn.PReLU(),
+ nn.Conv2d(
+ out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=True
+ ),
+ )
+
+
+# upsample block
+def UpsampleBlock(in_channels, out_channels, stride=2):
+ return torch.nn.Sequential(
+ nn.PReLU(),
+ nn.ConvTranspose2d(
+ in_channels,
+ out_channels,
+ kernel_size=4,
+ stride=stride,
+ padding=1,
+ bias=True,
+ ),
+ nn.PReLU(),
+ nn.Conv2d(
+ out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=True
+ ),
+ )
+
+
+class PixelShuffleBlcok(nn.Module):
+ def __init__(self, in_feat, num_feat, num_out_ch):
+ super(PixelShuffleBlcok, self).__init__()
+ self.conv_before_upsample = nn.Sequential(
+ nn.Conv2d(in_feat, num_feat, 3, 1, 1), nn.PReLU()
+ )
+ self.upsample = nn.Sequential(
+ nn.Conv2d(num_feat, 4 * num_feat, 3, 1, 1), nn.PixelShuffle(2)
+ )
+ self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1)
+
+ def forward(self, x):
+ x = self.conv_before_upsample(x)
+ x = self.conv_last(self.upsample(x))
+ return x
+
+
+# grid network
+class GridNet(nn.Module):
+ def __init__(
+ self,
+ in_channels=12,
+ in_channels1=128,
+ in_channels2=256,
+ in_channels3=384,
+ out_channels=3,
+ ):
+ super(GridNet, self).__init__()
+
+ self.residual_model_head = ResidualBlock(in_channels, 64)
+ self.residual_model_head1 = ResidualBlock(in_channels1, 64)
+ self.residual_model_head2 = ResidualBlock(in_channels2, 128)
+ self.residual_model_head3 = ResidualBlock(in_channels3, 192)
+
+ self.residual_model_01 = ResidualBlock(64, 64)
+ # self.residual_model_02=ResidualBlock(64, 64)
+ # self.residual_model_03=ResidualBlock(64, 64)
+ self.residual_model_04 = ResidualBlock(64, 64)
+ self.residual_model_05 = ResidualBlock(64, 64)
+ self.residual_model_tail = PixelShuffleBlcok(64, 64, out_channels)
+
+ self.residual_model_11 = ResidualBlock(128, 128)
+ # self.residual_model_12=ResidualBlock(128, 128)
+ # self.residual_model_13=ResidualBlock(128, 128)
+ self.residual_model_14 = ResidualBlock(128, 128)
+ self.residual_model_15 = ResidualBlock(128, 128)
+
+ self.residual_model_21 = ResidualBlock(192, 192)
+ # self.residual_model_22=ResidualBlock(192, 192)
+ # self.residual_model_23=ResidualBlock(192, 192)
+ self.residual_model_24 = ResidualBlock(192, 192)
+ self.residual_model_25 = ResidualBlock(192, 192)
+
+ #
+
+ self.downsample_model_10 = DownsampleBlock(64, 128)
+ self.downsample_model_20 = DownsampleBlock(128, 192)
+
+ self.downsample_model_11 = DownsampleBlock(64, 128)
+ self.downsample_model_21 = DownsampleBlock(128, 192)
+
+ # self.downsample_model_12=DownsampleBlock(64, 128)
+ # self.downsample_model_22=DownsampleBlock(128, 192)
+
+ #
+
+ # self.upsample_model_03=UpsampleBlock(128, 64)
+ # self.upsample_model_13=UpsampleBlock(192, 128)
+
+ self.upsample_model_04 = UpsampleBlock(128, 64)
+ self.upsample_model_14 = UpsampleBlock(192, 128)
+
+ self.upsample_model_05 = UpsampleBlock(128, 64)
+ self.upsample_model_15 = UpsampleBlock(192, 128)
+
+ def forward(self, x, x1, x2, x3):
+ X00 = self.residual_model_head(x) + self.residual_model_head1(
+ x1
+ ) # --- 182 ~ 185
+ # X10 = self.residual_model_head1(x1)
+
+ X01 = self.residual_model_01(X00) + X00 # --- 208 ~ 211 ,AddBackward1213
+
+ X10 = self.downsample_model_10(X00) + self.residual_model_head2(
+ x2
+ ) # --- 186 ~ 189
+ X20 = self.downsample_model_20(X10) + self.residual_model_head3(
+ x3
+ ) # --- 190 ~ 193
+
+ residual_11 = (
+ self.residual_model_11(X10) + X10
+ ) # 201 ~ 204 , sum AddBackward1206
+ downsample_11 = self.downsample_model_11(X01) # 214 ~ 217
+ X11 = residual_11 + downsample_11 # --- AddBackward1218
+
+ residual_21 = (
+ self.residual_model_21(X20) + X20
+ ) # 194 ~ 197 , sum AddBackward1199
+ downsample_21 = self.downsample_model_21(X11) # 219 ~ 222
+ X21 = residual_21 + downsample_21 # AddBackward1223
+
+ X24 = self.residual_model_24(X21) + X21 # --- 224 ~ 227 , AddBackward1229
+ X25 = self.residual_model_25(X24) + X24 # --- 230 ~ 233 , AddBackward1235
+
+ upsample_14 = self.upsample_model_14(X24) # 242 ~ 246
+ residual_14 = self.residual_model_14(X11) + X11 # 248 ~ 251, AddBackward1253
+ X14 = upsample_14 + residual_14 # --- AddBackward1254
+
+ upsample_04 = self.upsample_model_04(X14) # 268 ~ 272
+ residual_04 = self.residual_model_04(X01) + X01 # 274 ~ 277, AddBackward1279
+ X04 = upsample_04 + residual_04 # --- AddBackward1280
+
+ upsample_15 = self.upsample_model_15(X25) # 236 ~ 240
+ residual_15 = self.residual_model_15(X14) + X14 # 255 ~ 258, AddBackward1260
+ X15 = upsample_15 + residual_15 # AddBackward1261
+
+ upsample_05 = self.upsample_model_05(X15) # 262 ~ 266
+ residual_05 = self.residual_model_05(X04) + X04 # 281 ~ 284,AddBackward1286
+ X05 = upsample_05 + residual_05 # AddBackward1287
+
+ X_tail = self.residual_model_tail(X05) # 288 ~ 291
+
+ return X_tail
+# end
+
+class Model:
+ def __init__(self):
+ self.flownet = GMFlow()
+ self.metricnet = MetricNet()
+ self.feat_ext = FeatureNet()
+ self.fusionnet = GridNet()
+ self.version = 3.9
+
+ def eval(self):
+ self.flownet.eval()
+ self.metricnet.eval()
+ self.feat_ext.eval()
+ self.fusionnet.eval()
+
+ def device(self):
+ self.flownet.to(device)
+ self.metricnet.to(device)
+ self.feat_ext.to(device)
+ self.fusionnet.to(device)
+
+ def load_model(self, path_dict):
+ #models/GMFSS_fortuna_flownet.pkl
+ self.flownet.load_state_dict(torch.load(path_dict["flownet"]))
+ #models/GMFSS_fortuna_metric.pkl
+ self.metricnet.load_state_dict(torch.load(path_dict["metricnet"]))
+ #models/GMFSS_fortuna_feat.pkl
+ self.feat_ext.load_state_dict(torch.load(path_dict["feat_ext"]))
+ #models/GMFSS_fortuna_fusionnet.pkl
+ self.fusionnet.load_state_dict(torch.load(path_dict["fusionnet"]))
+
+ def reuse(self, img0, img1, scale):
+ feat11, feat12, feat13 = self.feat_ext(img0)
+ feat21, feat22, feat23 = self.feat_ext(img1)
+
+ img0 = F.interpolate(
+ img0, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ img1 = F.interpolate(
+ img1, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+
+ if scale != 1.0:
+ imgf0 = F.interpolate(
+ img0, scale_factor=scale, mode="bilinear", align_corners=False
+ )
+ imgf1 = F.interpolate(
+ img1, scale_factor=scale, mode="bilinear", align_corners=False
+ )
+ else:
+ imgf0 = img0
+ imgf1 = img1
+ flow01 = self.flownet(imgf0, imgf1, return_flow=True)
+ flow10 = self.flownet(imgf1, imgf0, return_flow=True)
+ if scale != 1.0:
+ flow01 = (
+ F.interpolate(
+ flow01,
+ scale_factor=1.0 / scale,
+ mode="bilinear",
+ align_corners=False,
+ )
+ / scale
+ )
+ flow10 = (
+ F.interpolate(
+ flow10,
+ scale_factor=1.0 / scale,
+ mode="bilinear",
+ align_corners=False,
+ )
+ / scale
+ )
+
+ metric0, metric1 = self.metricnet(img0, img1, flow01, flow10)
+
+ return (
+ flow01,
+ flow10,
+ metric0,
+ metric1,
+ feat11,
+ feat12,
+ feat13,
+ feat21,
+ feat22,
+ feat23,
+ )
+
+ def inference(
+ self,
+ img0,
+ img1,
+ flow01,
+ flow10,
+ metric0,
+ metric1,
+ feat11,
+ feat12,
+ feat13,
+ feat21,
+ feat22,
+ feat23,
+ timestep,
+ ):
+ F1t = timestep * flow01
+ F2t = (1 - timestep) * flow10
+
+ Z1t = timestep * metric0
+ Z2t = (1 - timestep) * metric1
+
+ img0 = F.interpolate(
+ img0, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ I1t = softsplat(img0, F1t, Z1t, strMode="soft")
+ img1 = F.interpolate(
+ img1, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ I2t = softsplat(img1, F2t, Z2t, strMode="soft")
+
+ feat1t1 = softsplat(feat11, F1t, Z1t, strMode="soft")
+ feat2t1 = softsplat(feat21, F2t, Z2t, strMode="soft")
+
+ F1td = (
+ F.interpolate(F1t, scale_factor=0.5, mode="bilinear", align_corners=False)
+ * 0.5
+ )
+ Z1d = F.interpolate(Z1t, scale_factor=0.5, mode="bilinear", align_corners=False)
+ feat1t2 = softsplat(feat12, F1td, Z1d, strMode="soft")
+ F2td = (
+ F.interpolate(F2t, scale_factor=0.5, mode="bilinear", align_corners=False)
+ * 0.5
+ )
+ Z2d = F.interpolate(Z2t, scale_factor=0.5, mode="bilinear", align_corners=False)
+ feat2t2 = softsplat(feat22, F2td, Z2d, strMode="soft")
+
+ F1tdd = (
+ F.interpolate(F1t, scale_factor=0.25, mode="bilinear", align_corners=False)
+ * 0.25
+ )
+ Z1dd = F.interpolate(
+ Z1t, scale_factor=0.25, mode="bilinear", align_corners=False
+ )
+ feat1t3 = softsplat(feat13, F1tdd, Z1dd, strMode="soft")
+ F2tdd = (
+ F.interpolate(F2t, scale_factor=0.25, mode="bilinear", align_corners=False)
+ * 0.25
+ )
+ Z2dd = F.interpolate(
+ Z2t, scale_factor=0.25, mode="bilinear", align_corners=False
+ )
+ feat2t3 = softsplat(feat23, F2tdd, Z2dd, strMode="soft")
+
+ out = self.fusionnet(
+ torch.cat([img0, I1t, I2t, img1], dim=1),
+ torch.cat([feat1t1, feat2t1], dim=1),
+ torch.cat([feat1t2, feat2t2], dim=1),
+ torch.cat([feat1t3, feat2t3], dim=1),
+ )
+
+ return torch.clamp(out, 0, 1)
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna_union.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna_union.py
new file mode 100644
index 0000000000000000000000000000000000000000..41e92ddfa62fae5877eb12b43677d28ee9d3e29e
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna_union.py
@@ -0,0 +1,23 @@
+import itertools
+import numpy as np
+import vapoursynth as vs
+from .GMFSS_Fortuna_union_arch import Model_inference
+import torch
+
+
+class GMFSS_Fortuna_union:
+ def __init__(self):
+ self.cache = False
+ self.amount_input_img = 2
+
+ torch.set_grad_enabled(False)
+ torch.backends.cudnn.enabled = True
+ torch.backends.cudnn.benchmark = True
+
+ self.model = Model_inference()
+ self.model.eval()
+
+ def execute(self, I0, I1, timestep):
+ with torch.inference_mode():
+ middle = self.model(I0, I1, timestep).cpu()
+ return middle
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna_union_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna_union_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..665e56534b647fe884d236693833f12060daa148
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/GMFSS_Fortuna_union_arch.py
@@ -0,0 +1,1857 @@
+"""
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/GMFSS_infer_u.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/softsplat.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/FusionNet_u.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/FeatureNet.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/MetricNet.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/IFNet_HDv3.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/gmflow.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/utils.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/position.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/geometry.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/matching.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/transformer.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/backbone.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/gmflow/trident_conv.py
+https://github.com/98mxr/GMFSS_Fortuna/blob/b5d0bd544e3f1eee6a059e49c69bcd3124c8343c/model/warplayer.py
+"""
+
+from torch import nn
+from torch.nn import functional as F
+from torch.nn.modules.utils import _pair
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch
+import math
+from vfi_models.rife.rife_arch import IFNet
+from vfi_models.ops import softsplat
+from comfy.model_management import get_torch_device
+
+device = get_torch_device()
+backwarp_tenGrid = {}
+
+
+def warp(tenInput, tenFlow):
+ k = (str(tenFlow.device), str(tenFlow.size()))
+ if k not in backwarp_tenGrid:
+ tenHorizontal = (
+ torch.linspace(-1.0, 1.0, tenFlow.shape[3], device=device)
+ .view(1, 1, 1, tenFlow.shape[3])
+ .expand(tenFlow.shape[0], -1, tenFlow.shape[2], -1)
+ )
+ tenVertical = (
+ torch.linspace(-1.0, 1.0, tenFlow.shape[2], device=device)
+ .view(1, 1, tenFlow.shape[2], 1)
+ .expand(tenFlow.shape[0], -1, -1, tenFlow.shape[3])
+ )
+ backwarp_tenGrid[k] = torch.cat([tenHorizontal, tenVertical], 1).to(device)
+
+ tenFlow = torch.cat(
+ [
+ tenFlow[:, 0:1, :, :] / ((tenInput.shape[3] - 1.0) / 2.0),
+ tenFlow[:, 1:2, :, :] / ((tenInput.shape[2] - 1.0) / 2.0),
+ ],
+ 1,
+ )
+
+ g = (backwarp_tenGrid[k] + tenFlow).permute(0, 2, 3, 1)
+ return torch.nn.functional.grid_sample(
+ input=tenInput,
+ grid=g,
+ mode="bilinear",
+ padding_mode="border",
+ align_corners=True,
+ )
+
+
+class MultiScaleTridentConv(nn.Module):
+ def __init__(
+ self,
+ in_channels,
+ out_channels,
+ kernel_size,
+ stride=1,
+ strides=1,
+ paddings=0,
+ dilations=1,
+ dilation=1,
+ groups=1,
+ num_branch=1,
+ test_branch_idx=-1,
+ bias=False,
+ norm=None,
+ activation=None,
+ ):
+ super(MultiScaleTridentConv, self).__init__()
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.kernel_size = _pair(kernel_size)
+ self.num_branch = num_branch
+ self.stride = _pair(stride)
+ self.groups = groups
+ self.with_bias = bias
+ self.dilation = dilation
+ if isinstance(paddings, int):
+ paddings = [paddings] * self.num_branch
+ if isinstance(dilations, int):
+ dilations = [dilations] * self.num_branch
+ if isinstance(strides, int):
+ strides = [strides] * self.num_branch
+ self.paddings = [_pair(padding) for padding in paddings]
+ self.dilations = [_pair(dilation) for dilation in dilations]
+ self.strides = [_pair(stride) for stride in strides]
+ self.test_branch_idx = test_branch_idx
+ self.norm = norm
+ self.activation = activation
+
+ assert len({self.num_branch, len(self.paddings), len(self.strides)}) == 1
+
+ self.weight = nn.Parameter(
+ torch.Tensor(out_channels, in_channels // groups, *self.kernel_size)
+ )
+ if bias:
+ self.bias = nn.Parameter(torch.Tensor(out_channels))
+ else:
+ self.bias = None
+
+ nn.init.kaiming_uniform_(self.weight, nonlinearity="relu")
+ if self.bias is not None:
+ nn.init.constant_(self.bias, 0)
+
+ def forward(self, inputs):
+ num_branch = (
+ self.num_branch if self.training or self.test_branch_idx == -1 else 1
+ )
+ assert len(inputs) == num_branch
+
+ if self.training or self.test_branch_idx == -1:
+ outputs = [
+ F.conv2d(
+ input,
+ self.weight,
+ self.bias,
+ stride,
+ padding,
+ self.dilation,
+ self.groups,
+ )
+ for input, stride, padding in zip(inputs, self.strides, self.paddings)
+ ]
+ else:
+ outputs = [
+ F.conv2d(
+ inputs[0],
+ self.weight,
+ self.bias,
+ self.strides[self.test_branch_idx]
+ if self.test_branch_idx == -1
+ else self.strides[-1],
+ self.paddings[self.test_branch_idx]
+ if self.test_branch_idx == -1
+ else self.paddings[-1],
+ self.dilation,
+ self.groups,
+ )
+ ]
+
+ if self.norm is not None:
+ outputs = [self.norm(x) for x in outputs]
+ if self.activation is not None:
+ outputs = [self.activation(x) for x in outputs]
+ return outputs
+
+
+class ResidualBlock_class(nn.Module):
+ def __init__(
+ self,
+ in_planes,
+ planes,
+ norm_layer=nn.InstanceNorm2d,
+ stride=1,
+ dilation=1,
+ ):
+ super(ResidualBlock_class, self).__init__()
+
+ self.conv1 = nn.Conv2d(
+ in_planes,
+ planes,
+ kernel_size=3,
+ dilation=dilation,
+ padding=dilation,
+ stride=stride,
+ bias=False,
+ )
+ self.conv2 = nn.Conv2d(
+ planes,
+ planes,
+ kernel_size=3,
+ dilation=dilation,
+ padding=dilation,
+ bias=False,
+ )
+ self.relu = nn.ReLU(inplace=True)
+
+ self.norm1 = norm_layer(planes)
+ self.norm2 = norm_layer(planes)
+ if not stride == 1 or in_planes != planes:
+ self.norm3 = norm_layer(planes)
+
+ if stride == 1 and in_planes == planes:
+ self.downsample = None
+ else:
+ self.downsample = nn.Sequential(
+ nn.Conv2d(in_planes, planes, kernel_size=1, stride=stride), self.norm3
+ )
+
+ def forward(self, x):
+ y = x
+ y = self.relu(self.norm1(self.conv1(y)))
+ y = self.relu(self.norm2(self.conv2(y)))
+
+ if self.downsample is not None:
+ x = self.downsample(x)
+
+ return self.relu(x + y)
+
+
+class CNNEncoder(nn.Module):
+ def __init__(
+ self,
+ output_dim=128,
+ norm_layer=nn.InstanceNorm2d,
+ num_output_scales=1,
+ **kwargs,
+ ):
+ super(CNNEncoder, self).__init__()
+ self.num_branch = num_output_scales
+
+ feature_dims = [64, 96, 128]
+
+ self.conv1 = nn.Conv2d(
+ 3, feature_dims[0], kernel_size=7, stride=2, padding=3, bias=False
+ ) # 1/2
+ self.norm1 = norm_layer(feature_dims[0])
+ self.relu1 = nn.ReLU(inplace=True)
+
+ self.in_planes = feature_dims[0]
+ self.layer1 = self._make_layer(
+ feature_dims[0], stride=1, norm_layer=norm_layer
+ ) # 1/2
+ self.layer2 = self._make_layer(
+ feature_dims[1], stride=2, norm_layer=norm_layer
+ ) # 1/4
+
+ # highest resolution 1/4 or 1/8
+ stride = 2 if num_output_scales == 1 else 1
+ self.layer3 = self._make_layer(
+ feature_dims[2],
+ stride=stride,
+ norm_layer=norm_layer,
+ ) # 1/4 or 1/8
+
+ self.conv2 = nn.Conv2d(feature_dims[2], output_dim, 1, 1, 0)
+
+ if self.num_branch > 1:
+ if self.num_branch == 4:
+ strides = (1, 2, 4, 8)
+ elif self.num_branch == 3:
+ strides = (1, 2, 4)
+ elif self.num_branch == 2:
+ strides = (1, 2)
+ else:
+ raise ValueError
+
+ self.trident_conv = MultiScaleTridentConv(
+ output_dim,
+ output_dim,
+ kernel_size=3,
+ strides=strides,
+ paddings=1,
+ num_branch=self.num_branch,
+ )
+
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")
+ elif isinstance(m, (nn.BatchNorm2d, nn.InstanceNorm2d, nn.GroupNorm)):
+ if m.weight is not None:
+ nn.init.constant_(m.weight, 1)
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+
+ def _make_layer(self, dim, stride=1, dilation=1, norm_layer=nn.InstanceNorm2d):
+ layer1 = ResidualBlock_class(
+ self.in_planes, dim, norm_layer=norm_layer, stride=stride, dilation=dilation
+ )
+ layer2 = ResidualBlock_class(
+ dim, dim, norm_layer=norm_layer, stride=1, dilation=dilation
+ )
+
+ layers = (layer1, layer2)
+
+ self.in_planes = dim
+ return nn.Sequential(*layers)
+
+ def forward(self, x):
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu1(x)
+
+ x = self.layer1(x) # 1/2
+ x = self.layer2(x) # 1/4
+ x = self.layer3(x) # 1/8 or 1/4
+
+ x = self.conv2(x)
+
+ if self.num_branch > 1:
+ out = self.trident_conv([x] * self.num_branch) # high to low res
+ else:
+ out = [x]
+
+ return out
+
+
+def single_head_full_attention(q, k, v):
+ # q, k, v: [B, L, C]
+ assert q.dim() == k.dim() == v.dim() == 3
+
+ scores = torch.matmul(q, k.permute(0, 2, 1)) / (q.size(2) ** 0.5) # [B, L, L]
+ attn = torch.softmax(scores, dim=2) # [B, L, L]
+ out = torch.matmul(attn, v) # [B, L, C]
+
+ return out
+
+
+def generate_shift_window_attn_mask(
+ input_resolution,
+ window_size_h,
+ window_size_w,
+ shift_size_h,
+ shift_size_w,
+ device=get_torch_device(),
+):
+ # Ref: https://github.com/microsoft/Swin-Transformer/blob/main/models/swin_transformer.py
+ # calculate attention mask for SW-MSA
+ h, w = input_resolution
+ img_mask = torch.zeros((1, h, w, 1)).to(device) # 1 H W 1
+ h_slices = (
+ slice(0, -window_size_h),
+ slice(-window_size_h, -shift_size_h),
+ slice(-shift_size_h, None),
+ )
+ w_slices = (
+ slice(0, -window_size_w),
+ slice(-window_size_w, -shift_size_w),
+ slice(-shift_size_w, None),
+ )
+ cnt = 0
+ for h in h_slices:
+ for w in w_slices:
+ img_mask[:, h, w, :] = cnt
+ cnt += 1
+
+ mask_windows = split_feature(
+ img_mask, num_splits=input_resolution[-1] // window_size_w, channel_last=True
+ )
+
+ mask_windows = mask_windows.view(-1, window_size_h * window_size_w)
+ attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2)
+ attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill(
+ attn_mask == 0, float(0.0)
+ )
+
+ return attn_mask
+
+
+def single_head_split_window_attention(
+ q,
+ k,
+ v,
+ num_splits=1,
+ with_shift=False,
+ h=None,
+ w=None,
+ attn_mask=None,
+):
+ # Ref: https://github.com/microsoft/Swin-Transformer/blob/main/models/swin_transformer.py
+ # q, k, v: [B, L, C]
+ assert q.dim() == k.dim() == v.dim() == 3
+
+ assert h is not None and w is not None
+ assert q.size(1) == h * w
+
+ b, _, c = q.size()
+
+ b_new = b * num_splits * num_splits
+
+ window_size_h = h // num_splits
+ window_size_w = w // num_splits
+
+ q = q.view(b, h, w, c) # [B, H, W, C]
+ k = k.view(b, h, w, c)
+ v = v.view(b, h, w, c)
+
+ scale_factor = c**0.5
+
+ if with_shift:
+ assert attn_mask is not None # compute once
+ shift_size_h = window_size_h // 2
+ shift_size_w = window_size_w // 2
+
+ q = torch.roll(q, shifts=(-shift_size_h, -shift_size_w), dims=(1, 2))
+ k = torch.roll(k, shifts=(-shift_size_h, -shift_size_w), dims=(1, 2))
+ v = torch.roll(v, shifts=(-shift_size_h, -shift_size_w), dims=(1, 2))
+
+ q = split_feature(
+ q, num_splits=num_splits, channel_last=True
+ ) # [B*K*K, H/K, W/K, C]
+ k = split_feature(k, num_splits=num_splits, channel_last=True)
+ v = split_feature(v, num_splits=num_splits, channel_last=True)
+
+ scores = (
+ torch.matmul(q.view(b_new, -1, c), k.view(b_new, -1, c).permute(0, 2, 1))
+ / scale_factor
+ ) # [B*K*K, H/K*W/K, H/K*W/K]
+
+ if with_shift:
+ scores += attn_mask.repeat(b, 1, 1)
+
+ attn = torch.softmax(scores, dim=-1)
+
+ out = torch.matmul(attn, v.view(b_new, -1, c)) # [B*K*K, H/K*W/K, C]
+
+ out = merge_splits(
+ out.view(b_new, h // num_splits, w // num_splits, c),
+ num_splits=num_splits,
+ channel_last=True,
+ ) # [B, H, W, C]
+
+ # shift back
+ if with_shift:
+ out = torch.roll(out, shifts=(shift_size_h, shift_size_w), dims=(1, 2))
+
+ out = out.view(b, -1, c)
+
+ return out
+
+
+class TransformerLayer(nn.Module):
+ def __init__(
+ self,
+ d_model=256,
+ nhead=1,
+ attention_type="swin",
+ no_ffn=False,
+ ffn_dim_expansion=4,
+ with_shift=False,
+ **kwargs,
+ ):
+ super(TransformerLayer, self).__init__()
+
+ self.dim = d_model
+ self.nhead = nhead
+ self.attention_type = attention_type
+ self.no_ffn = no_ffn
+
+ self.with_shift = with_shift
+
+ # multi-head attention
+ self.q_proj = nn.Linear(d_model, d_model, bias=False)
+ self.k_proj = nn.Linear(d_model, d_model, bias=False)
+ self.v_proj = nn.Linear(d_model, d_model, bias=False)
+
+ self.merge = nn.Linear(d_model, d_model, bias=False)
+
+ self.norm1 = nn.LayerNorm(d_model)
+
+ # no ffn after self-attn, with ffn after cross-attn
+ if not self.no_ffn:
+ in_channels = d_model * 2
+ self.mlp = nn.Sequential(
+ nn.Linear(in_channels, in_channels * ffn_dim_expansion, bias=False),
+ nn.GELU(),
+ nn.Linear(in_channels * ffn_dim_expansion, d_model, bias=False),
+ )
+
+ self.norm2 = nn.LayerNorm(d_model)
+
+ def forward(
+ self,
+ source,
+ target,
+ height=None,
+ width=None,
+ shifted_window_attn_mask=None,
+ attn_num_splits=None,
+ **kwargs,
+ ):
+ # source, target: [B, L, C]
+ query, key, value = source, target, target
+
+ # single-head attention
+ query = self.q_proj(query) # [B, L, C]
+ key = self.k_proj(key) # [B, L, C]
+ value = self.v_proj(value) # [B, L, C]
+
+ if self.attention_type == "swin" and attn_num_splits > 1:
+ if self.nhead > 1:
+ # we observe that multihead attention slows down the speed and increases the memory consumption
+ # without bringing obvious performance gains and thus the implementation is removed
+ raise NotImplementedError
+ else:
+ message = single_head_split_window_attention(
+ query,
+ key,
+ value,
+ num_splits=attn_num_splits,
+ with_shift=self.with_shift,
+ h=height,
+ w=width,
+ attn_mask=shifted_window_attn_mask,
+ )
+ else:
+ message = single_head_full_attention(query, key, value) # [B, L, C]
+
+ message = self.merge(message) # [B, L, C]
+ message = self.norm1(message)
+
+ if not self.no_ffn:
+ message = self.mlp(torch.cat([source, message], dim=-1))
+ message = self.norm2(message)
+
+ return source + message
+
+
+class TransformerBlock(nn.Module):
+ """self attention + cross attention + FFN"""
+
+ def __init__(
+ self,
+ d_model=256,
+ nhead=1,
+ attention_type="swin",
+ ffn_dim_expansion=4,
+ with_shift=False,
+ **kwargs,
+ ):
+ super(TransformerBlock, self).__init__()
+
+ self.self_attn = TransformerLayer(
+ d_model=d_model,
+ nhead=nhead,
+ attention_type=attention_type,
+ no_ffn=True,
+ ffn_dim_expansion=ffn_dim_expansion,
+ with_shift=with_shift,
+ )
+
+ self.cross_attn_ffn = TransformerLayer(
+ d_model=d_model,
+ nhead=nhead,
+ attention_type=attention_type,
+ ffn_dim_expansion=ffn_dim_expansion,
+ with_shift=with_shift,
+ )
+
+ def forward(
+ self,
+ source,
+ target,
+ height=None,
+ width=None,
+ shifted_window_attn_mask=None,
+ attn_num_splits=None,
+ **kwargs,
+ ):
+ # source, target: [B, L, C]
+
+ # self attention
+ source = self.self_attn(
+ source,
+ source,
+ height=height,
+ width=width,
+ shifted_window_attn_mask=shifted_window_attn_mask,
+ attn_num_splits=attn_num_splits,
+ )
+
+ # cross attention and ffn
+ source = self.cross_attn_ffn(
+ source,
+ target,
+ height=height,
+ width=width,
+ shifted_window_attn_mask=shifted_window_attn_mask,
+ attn_num_splits=attn_num_splits,
+ )
+
+ return source
+
+
+class FeatureTransformer(nn.Module):
+ def __init__(
+ self,
+ num_layers=6,
+ d_model=128,
+ nhead=1,
+ attention_type="swin",
+ ffn_dim_expansion=4,
+ **kwargs,
+ ):
+ super(FeatureTransformer, self).__init__()
+
+ self.attention_type = attention_type
+
+ self.d_model = d_model
+ self.nhead = nhead
+
+ self.layers = nn.ModuleList(
+ [
+ TransformerBlock(
+ d_model=d_model,
+ nhead=nhead,
+ attention_type=attention_type,
+ ffn_dim_expansion=ffn_dim_expansion,
+ with_shift=True
+ if attention_type == "swin" and i % 2 == 1
+ else False,
+ )
+ for i in range(num_layers)
+ ]
+ )
+
+ for p in self.parameters():
+ if p.dim() > 1:
+ nn.init.xavier_uniform_(p)
+
+ def forward(
+ self,
+ feature0,
+ feature1,
+ attn_num_splits=None,
+ **kwargs,
+ ):
+ b, c, h, w = feature0.shape
+ assert self.d_model == c
+
+ feature0 = feature0.flatten(-2).permute(0, 2, 1) # [B, H*W, C]
+ feature1 = feature1.flatten(-2).permute(0, 2, 1) # [B, H*W, C]
+
+ if self.attention_type == "swin" and attn_num_splits > 1:
+ # global and refine use different number of splits
+ window_size_h = h // attn_num_splits
+ window_size_w = w // attn_num_splits
+
+ # compute attn mask once
+ shifted_window_attn_mask = generate_shift_window_attn_mask(
+ input_resolution=(h, w),
+ window_size_h=window_size_h,
+ window_size_w=window_size_w,
+ shift_size_h=window_size_h // 2,
+ shift_size_w=window_size_w // 2,
+ device=feature0.device,
+ ) # [K*K, H/K*W/K, H/K*W/K]
+ else:
+ shifted_window_attn_mask = None
+
+ # concat feature0 and feature1 in batch dimension to compute in parallel
+ concat0 = torch.cat((feature0, feature1), dim=0) # [2B, H*W, C]
+ concat1 = torch.cat((feature1, feature0), dim=0) # [2B, H*W, C]
+
+ for layer in self.layers:
+ concat0 = layer(
+ concat0,
+ concat1,
+ height=h,
+ width=w,
+ shifted_window_attn_mask=shifted_window_attn_mask,
+ attn_num_splits=attn_num_splits,
+ )
+
+ # update feature1
+ concat1 = torch.cat(concat0.chunk(chunks=2, dim=0)[::-1], dim=0)
+
+ feature0, feature1 = concat0.chunk(chunks=2, dim=0) # [B, H*W, C]
+
+ # reshape back
+ feature0 = (
+ feature0.view(b, h, w, c).permute(0, 3, 1, 2).contiguous()
+ ) # [B, C, H, W]
+ feature1 = (
+ feature1.view(b, h, w, c).permute(0, 3, 1, 2).contiguous()
+ ) # [B, C, H, W]
+
+ return feature0, feature1
+
+
+class FeatureFlowAttention(nn.Module):
+ """
+ flow propagation with self-attention on feature
+ query: feature0, key: feature0, value: flow
+ """
+
+ def __init__(
+ self,
+ in_channels,
+ **kwargs,
+ ):
+ super(FeatureFlowAttention, self).__init__()
+
+ self.q_proj = nn.Linear(in_channels, in_channels)
+ self.k_proj = nn.Linear(in_channels, in_channels)
+
+ for p in self.parameters():
+ if p.dim() > 1:
+ nn.init.xavier_uniform_(p)
+
+ def forward(
+ self,
+ feature0,
+ flow,
+ local_window_attn=False,
+ local_window_radius=1,
+ **kwargs,
+ ):
+ # q, k: feature [B, C, H, W], v: flow [B, 2, H, W]
+ if local_window_attn:
+ return self.forward_local_window_attn(
+ feature0, flow, local_window_radius=local_window_radius
+ )
+
+ b, c, h, w = feature0.size()
+
+ query = feature0.view(b, c, h * w).permute(0, 2, 1) # [B, H*W, C]
+
+ # a note: the ``correct'' implementation should be:
+ # ``query = self.q_proj(query), key = self.k_proj(query)''
+ # this problem is observed while cleaning up the code
+ # however, this doesn't affect the performance since the projection is a linear operation,
+ # thus the two projection matrices for key can be merged
+ # so I just leave it as is in order to not re-train all models :)
+ query = self.q_proj(query) # [B, H*W, C]
+ key = self.k_proj(query) # [B, H*W, C]
+
+ value = flow.view(b, flow.size(1), h * w).permute(0, 2, 1) # [B, H*W, 2]
+
+ scores = torch.matmul(query, key.permute(0, 2, 1)) / (c**0.5) # [B, H*W, H*W]
+ prob = torch.softmax(scores, dim=-1)
+
+ out = torch.matmul(prob, value) # [B, H*W, 2]
+ out = out.view(b, h, w, value.size(-1)).permute(0, 3, 1, 2) # [B, 2, H, W]
+
+ return out
+
+ def forward_local_window_attn(
+ self,
+ feature0,
+ flow,
+ local_window_radius=1,
+ ):
+ assert flow.size(1) == 2
+ assert local_window_radius > 0
+
+ b, c, h, w = feature0.size()
+
+ feature0_reshape = self.q_proj(
+ feature0.view(b, c, -1).permute(0, 2, 1)
+ ).reshape(
+ b * h * w, 1, c
+ ) # [B*H*W, 1, C]
+
+ kernel_size = 2 * local_window_radius + 1
+
+ feature0_proj = (
+ self.k_proj(feature0.view(b, c, -1).permute(0, 2, 1))
+ .permute(0, 2, 1)
+ .reshape(b, c, h, w)
+ )
+
+ feature0_window = F.unfold(
+ feature0_proj, kernel_size=kernel_size, padding=local_window_radius
+ ) # [B, C*(2R+1)^2), H*W]
+
+ feature0_window = (
+ feature0_window.view(b, c, kernel_size**2, h, w)
+ .permute(0, 3, 4, 1, 2)
+ .reshape(b * h * w, c, kernel_size**2)
+ ) # [B*H*W, C, (2R+1)^2]
+
+ flow_window = F.unfold(
+ flow, kernel_size=kernel_size, padding=local_window_radius
+ ) # [B, 2*(2R+1)^2), H*W]
+
+ flow_window = (
+ flow_window.view(b, 2, kernel_size**2, h, w)
+ .permute(0, 3, 4, 2, 1)
+ .reshape(b * h * w, kernel_size**2, 2)
+ ) # [B*H*W, (2R+1)^2, 2]
+
+ scores = torch.matmul(feature0_reshape, feature0_window) / (
+ c**0.5
+ ) # [B*H*W, 1, (2R+1)^2]
+
+ prob = torch.softmax(scores, dim=-1)
+
+ out = (
+ torch.matmul(prob, flow_window)
+ .view(b, h, w, 2)
+ .permute(0, 3, 1, 2)
+ .contiguous()
+ ) # [B, 2, H, W]
+
+ return out
+
+
+def global_correlation_softmax(
+ feature0,
+ feature1,
+ pred_bidir_flow=False,
+):
+ # global correlation
+ b, c, h, w = feature0.shape
+ feature0 = feature0.view(b, c, -1).permute(0, 2, 1) # [B, H*W, C]
+ feature1 = feature1.view(b, c, -1) # [B, C, H*W]
+
+ correlation = torch.matmul(feature0, feature1).view(b, h, w, h, w) / (
+ c**0.5
+ ) # [B, H, W, H, W]
+
+ # flow from softmax
+ init_grid = coords_grid(b, h, w).to(correlation.device) # [B, 2, H, W]
+ grid = init_grid.view(b, 2, -1).permute(0, 2, 1) # [B, H*W, 2]
+
+ correlation = correlation.view(b, h * w, h * w) # [B, H*W, H*W]
+
+ if pred_bidir_flow:
+ correlation = torch.cat(
+ (correlation, correlation.permute(0, 2, 1)), dim=0
+ ) # [2*B, H*W, H*W]
+ init_grid = init_grid.repeat(2, 1, 1, 1) # [2*B, 2, H, W]
+ grid = grid.repeat(2, 1, 1) # [2*B, H*W, 2]
+ b = b * 2
+
+ prob = F.softmax(correlation, dim=-1) # [B, H*W, H*W]
+
+ correspondence = (
+ torch.matmul(prob, grid).view(b, h, w, 2).permute(0, 3, 1, 2)
+ ) # [B, 2, H, W]
+
+ # when predicting bidirectional flow, flow is the concatenation of forward flow and backward flow
+ flow = correspondence - init_grid
+
+ return flow, prob
+
+
+def local_correlation_softmax(
+ feature0,
+ feature1,
+ local_radius,
+ padding_mode="zeros",
+):
+ b, c, h, w = feature0.size()
+ coords_init = coords_grid(b, h, w).to(feature0.device) # [B, 2, H, W]
+ coords = coords_init.view(b, 2, -1).permute(0, 2, 1) # [B, H*W, 2]
+
+ local_h = 2 * local_radius + 1
+ local_w = 2 * local_radius + 1
+
+ window_grid = generate_window_grid(
+ -local_radius,
+ local_radius,
+ -local_radius,
+ local_radius,
+ local_h,
+ local_w,
+ device=feature0.device,
+ ) # [2R+1, 2R+1, 2]
+ window_grid = window_grid.reshape(-1, 2).repeat(b, 1, 1, 1) # [B, 1, (2R+1)^2, 2]
+ sample_coords = coords.unsqueeze(-2) + window_grid # [B, H*W, (2R+1)^2, 2]
+
+ sample_coords_softmax = sample_coords
+
+ # exclude coords that are out of image space
+ valid_x = (sample_coords[:, :, :, 0] >= 0) & (
+ sample_coords[:, :, :, 0] < w
+ ) # [B, H*W, (2R+1)^2]
+ valid_y = (sample_coords[:, :, :, 1] >= 0) & (
+ sample_coords[:, :, :, 1] < h
+ ) # [B, H*W, (2R+1)^2]
+
+ valid = (
+ valid_x & valid_y
+ ) # [B, H*W, (2R+1)^2], used to mask out invalid values when softmax
+
+ # normalize coordinates to [-1, 1]
+ sample_coords_norm = normalize_coords(sample_coords, h, w) # [-1, 1]
+ window_feature = F.grid_sample(
+ feature1, sample_coords_norm, padding_mode=padding_mode, align_corners=True
+ ).permute(
+ 0, 2, 1, 3
+ ) # [B, H*W, C, (2R+1)^2]
+ feature0_view = feature0.permute(0, 2, 3, 1).view(b, h * w, 1, c) # [B, H*W, 1, C]
+
+ corr = torch.matmul(feature0_view, window_feature).view(b, h * w, -1) / (
+ c**0.5
+ ) # [B, H*W, (2R+1)^2]
+
+ # mask invalid locations
+ corr[~valid] = -1e9
+
+ prob = F.softmax(corr, -1) # [B, H*W, (2R+1)^2]
+
+ correspondence = (
+ torch.matmul(prob.unsqueeze(-2), sample_coords_softmax)
+ .squeeze(-2)
+ .view(b, h, w, 2)
+ .permute(0, 3, 1, 2)
+ ) # [B, 2, H, W]
+
+ flow = correspondence - coords_init
+ match_prob = prob
+
+ return flow, match_prob
+
+
+def coords_grid(b, h, w, homogeneous=False, device=None):
+ y, x = torch.meshgrid(torch.arange(h), torch.arange(w)) # [H, W]
+
+ stacks = [x, y]
+
+ if homogeneous:
+ ones = torch.ones_like(x) # [H, W]
+ stacks.append(ones)
+
+ grid = torch.stack(stacks, dim=0).float() # [2, H, W] or [3, H, W]
+
+ grid = grid[None].repeat(b, 1, 1, 1) # [B, 2, H, W] or [B, 3, H, W]
+
+ if device is not None:
+ grid = grid.to(device)
+
+ return grid
+
+
+def generate_window_grid(h_min, h_max, w_min, w_max, len_h, len_w, device=None):
+ assert device is not None
+
+ x, y = torch.meshgrid(
+ [
+ torch.linspace(w_min, w_max, len_w, device=device),
+ torch.linspace(h_min, h_max, len_h, device=device),
+ ],
+ )
+ grid = torch.stack((x, y), -1).transpose(0, 1).float() # [H, W, 2]
+
+ return grid
+
+
+def normalize_coords(coords, h, w):
+ # coords: [B, H, W, 2]
+ c = torch.Tensor([(w - 1) / 2.0, (h - 1) / 2.0]).float().to(coords.device)
+ return (coords - c) / c # [-1, 1]
+
+
+def bilinear_sample(
+ img, sample_coords, mode="bilinear", padding_mode="zeros", return_mask=False
+):
+ # img: [B, C, H, W]
+ # sample_coords: [B, 2, H, W] in image scale
+ if sample_coords.size(1) != 2: # [B, H, W, 2]
+ sample_coords = sample_coords.permute(0, 3, 1, 2)
+
+ b, _, h, w = sample_coords.shape
+
+ # Normalize to [-1, 1]
+ x_grid = 2 * sample_coords[:, 0] / (w - 1) - 1
+ y_grid = 2 * sample_coords[:, 1] / (h - 1) - 1
+
+ grid = torch.stack([x_grid, y_grid], dim=-1) # [B, H, W, 2]
+
+ img = F.grid_sample(
+ img, grid, mode=mode, padding_mode=padding_mode, align_corners=True
+ )
+
+ if return_mask:
+ mask = (
+ (x_grid >= -1) & (y_grid >= -1) & (x_grid <= 1) & (y_grid <= 1)
+ ) # [B, H, W]
+
+ return img, mask
+
+ return img
+
+
+def flow_warp(feature, flow, mask=False, padding_mode="zeros"):
+ b, c, h, w = feature.size()
+ assert flow.size(1) == 2
+
+ grid = coords_grid(b, h, w).to(flow.device) + flow # [B, 2, H, W]
+
+ return bilinear_sample(feature, grid, padding_mode=padding_mode, return_mask=mask)
+
+
+def forward_backward_consistency_check(fwd_flow, bwd_flow, alpha=0.01, beta=0.5):
+ # fwd_flow, bwd_flow: [B, 2, H, W]
+ # alpha and beta values are following UnFlow (https://arxiv.org/abs/1711.07837)
+ assert fwd_flow.dim() == 4 and bwd_flow.dim() == 4
+ assert fwd_flow.size(1) == 2 and bwd_flow.size(1) == 2
+ flow_mag = torch.norm(fwd_flow, dim=1) + torch.norm(bwd_flow, dim=1) # [B, H, W]
+
+ warped_bwd_flow = flow_warp(bwd_flow, fwd_flow) # [B, 2, H, W]
+ warped_fwd_flow = flow_warp(fwd_flow, bwd_flow) # [B, 2, H, W]
+
+ diff_fwd = torch.norm(fwd_flow + warped_bwd_flow, dim=1) # [B, H, W]
+ diff_bwd = torch.norm(bwd_flow + warped_fwd_flow, dim=1)
+
+ threshold = alpha * flow_mag + beta
+
+ fwd_occ = (diff_fwd > threshold).float() # [B, H, W]
+ bwd_occ = (diff_bwd > threshold).float()
+
+ return fwd_occ, bwd_occ
+
+
+class PositionEmbeddingSine(nn.Module):
+ """
+ This is a more standard version of the position embedding, very similar to the one
+ used by the Attention is all you need paper, generalized to work on images.
+ """
+
+ def __init__(self, num_pos_feats=64, temperature=10000, normalize=True, scale=None):
+ super().__init__()
+ self.num_pos_feats = num_pos_feats
+ self.temperature = temperature
+ self.normalize = normalize
+ if scale is not None and normalize is False:
+ raise ValueError("normalize should be True if scale is passed")
+ if scale is None:
+ scale = 2 * math.pi
+ self.scale = scale
+
+ def forward(self, x):
+ # x = tensor_list.tensors # [B, C, H, W]
+ # mask = tensor_list.mask # [B, H, W], input with padding, valid as 0
+ b, c, h, w = x.size()
+ mask = torch.ones((b, h, w), device=x.device) # [B, H, W]
+ y_embed = mask.cumsum(1, dtype=torch.float32)
+ x_embed = mask.cumsum(2, dtype=torch.float32)
+ if self.normalize:
+ eps = 1e-6
+ y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale
+ x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale
+
+ dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device)
+ dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats)
+
+ pos_x = x_embed[:, :, :, None] / dim_t
+ pos_y = y_embed[:, :, :, None] / dim_t
+ pos_x = torch.stack(
+ (pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4
+ ).flatten(3)
+ pos_y = torch.stack(
+ (pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4
+ ).flatten(3)
+ pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2)
+ return pos
+
+
+def split_feature(
+ feature,
+ num_splits=2,
+ channel_last=False,
+):
+ if channel_last: # [B, H, W, C]
+ b, h, w, c = feature.size()
+ assert h % num_splits == 0 and w % num_splits == 0
+
+ b_new = b * num_splits * num_splits
+ h_new = h // num_splits
+ w_new = w // num_splits
+
+ feature = (
+ feature.view(b, num_splits, h // num_splits, num_splits, w // num_splits, c)
+ .permute(0, 1, 3, 2, 4, 5)
+ .reshape(b_new, h_new, w_new, c)
+ ) # [B*K*K, H/K, W/K, C]
+ else: # [B, C, H, W]
+ b, c, h, w = feature.size()
+ assert h % num_splits == 0 and w % num_splits == 0
+
+ b_new = b * num_splits * num_splits
+ h_new = h // num_splits
+ w_new = w // num_splits
+
+ feature = (
+ feature.view(b, c, num_splits, h // num_splits, num_splits, w // num_splits)
+ .permute(0, 2, 4, 1, 3, 5)
+ .reshape(b_new, c, h_new, w_new)
+ ) # [B*K*K, C, H/K, W/K]
+
+ return feature
+
+
+def merge_splits(
+ splits,
+ num_splits=2,
+ channel_last=False,
+):
+ if channel_last: # [B*K*K, H/K, W/K, C]
+ b, h, w, c = splits.size()
+ new_b = b // num_splits // num_splits
+
+ splits = splits.view(new_b, num_splits, num_splits, h, w, c)
+ merge = (
+ splits.permute(0, 1, 3, 2, 4, 5)
+ .contiguous()
+ .view(new_b, num_splits * h, num_splits * w, c)
+ ) # [B, H, W, C]
+ else: # [B*K*K, C, H/K, W/K]
+ b, c, h, w = splits.size()
+ new_b = b // num_splits // num_splits
+
+ splits = splits.view(new_b, num_splits, num_splits, c, h, w)
+ merge = (
+ splits.permute(0, 3, 1, 4, 2, 5)
+ .contiguous()
+ .view(new_b, c, num_splits * h, num_splits * w)
+ ) # [B, C, H, W]
+
+ return merge
+
+
+def normalize_img(img0, img1):
+ # loaded images are in [0, 255]
+ # normalize by ImageNet mean and std
+ mean = torch.tensor([0.485, 0.456, 0.406]).view(1, 3, 1, 1).to(img1.device)
+ std = torch.tensor([0.229, 0.224, 0.225]).view(1, 3, 1, 1).to(img1.device)
+ img0 = (img0 - mean) / std
+ img1 = (img1 - mean) / std
+
+ return img0, img1
+
+
+def feature_add_position(feature0, feature1, attn_splits, feature_channels):
+ pos_enc = PositionEmbeddingSine(num_pos_feats=feature_channels // 2)
+
+ if attn_splits > 1: # add position in splited window
+ feature0_splits = split_feature(feature0, num_splits=attn_splits)
+ feature1_splits = split_feature(feature1, num_splits=attn_splits)
+
+ position = pos_enc(feature0_splits)
+
+ feature0_splits = feature0_splits + position
+ feature1_splits = feature1_splits + position
+
+ feature0 = merge_splits(feature0_splits, num_splits=attn_splits)
+ feature1 = merge_splits(feature1_splits, num_splits=attn_splits)
+ else:
+ position = pos_enc(feature0)
+
+ feature0 = feature0 + position
+ feature1 = feature1 + position
+
+ return feature0, feature1
+
+
+class GMFlow(nn.Module):
+ def __init__(
+ self,
+ num_scales=2,
+ upsample_factor=4,
+ feature_channels=128,
+ attention_type="swin",
+ num_transformer_layers=6,
+ ffn_dim_expansion=4,
+ num_head=1,
+ **kwargs,
+ ):
+ super(GMFlow, self).__init__()
+
+ self.num_scales = num_scales
+ self.feature_channels = feature_channels
+ self.upsample_factor = upsample_factor
+ self.attention_type = attention_type
+ self.num_transformer_layers = num_transformer_layers
+
+ # CNN backbone
+ self.backbone = CNNEncoder(
+ output_dim=feature_channels, num_output_scales=num_scales
+ )
+
+ # Transformer
+ self.transformer = FeatureTransformer(
+ num_layers=num_transformer_layers,
+ d_model=feature_channels,
+ nhead=num_head,
+ attention_type=attention_type,
+ ffn_dim_expansion=ffn_dim_expansion,
+ )
+
+ # flow propagation with self-attn
+ self.feature_flow_attn = FeatureFlowAttention(in_channels=feature_channels)
+
+ # convex upsampling: concat feature0 and flow as input
+ self.upsampler = nn.Sequential(
+ nn.Conv2d(2 + feature_channels, 256, 3, 1, 1),
+ nn.ReLU(inplace=True),
+ nn.Conv2d(256, upsample_factor**2 * 9, 1, 1, 0),
+ )
+
+ def extract_feature(self, img0, img1):
+ concat = torch.cat((img0, img1), dim=0) # [2B, C, H, W]
+ features = self.backbone(
+ concat
+ ) # list of [2B, C, H, W], resolution from high to low
+
+ # reverse: resolution from low to high
+ features = features[::-1]
+
+ feature0, feature1 = [], []
+
+ for i in range(len(features)):
+ feature = features[i]
+ chunks = torch.chunk(feature, 2, 0) # tuple
+ feature0.append(chunks[0])
+ feature1.append(chunks[1])
+
+ return feature0, feature1
+
+ def upsample_flow(
+ self,
+ flow,
+ feature,
+ bilinear=False,
+ upsample_factor=8,
+ ):
+ if bilinear:
+ up_flow = (
+ F.interpolate(
+ flow,
+ scale_factor=upsample_factor,
+ mode="bilinear",
+ align_corners=True,
+ )
+ * upsample_factor
+ )
+
+ else:
+ # convex upsampling
+ concat = torch.cat((flow, feature), dim=1)
+
+ mask = self.upsampler(concat)
+ b, flow_channel, h, w = flow.shape
+ mask = mask.view(
+ b, 1, 9, self.upsample_factor, self.upsample_factor, h, w
+ ) # [B, 1, 9, K, K, H, W]
+ mask = torch.softmax(mask, dim=2)
+
+ up_flow = F.unfold(self.upsample_factor * flow, [3, 3], padding=1)
+ up_flow = up_flow.view(
+ b, flow_channel, 9, 1, 1, h, w
+ ) # [B, 2, 9, 1, 1, H, W]
+
+ up_flow = torch.sum(mask * up_flow, dim=2) # [B, 2, K, K, H, W]
+ up_flow = up_flow.permute(0, 1, 4, 2, 5, 3) # [B, 2, K, H, K, W]
+ up_flow = up_flow.reshape(
+ b, flow_channel, self.upsample_factor * h, self.upsample_factor * w
+ ) # [B, 2, K*H, K*W]
+
+ return up_flow
+
+ def forward(
+ self,
+ img0,
+ img1,
+ attn_splits_list=[2, 8],
+ corr_radius_list=[-1, 4],
+ prop_radius_list=[-1, 1],
+ pred_bidir_flow=False,
+ **kwargs,
+ ):
+ img0, img1 = normalize_img(img0, img1) # [B, 3, H, W]
+
+ # resolution low to high
+ feature0_list, feature1_list = self.extract_feature(
+ img0, img1
+ ) # list of features
+
+ flow = None
+
+ assert (
+ len(attn_splits_list)
+ == len(corr_radius_list)
+ == len(prop_radius_list)
+ == self.num_scales
+ )
+
+ for scale_idx in range(self.num_scales):
+ feature0, feature1 = feature0_list[scale_idx], feature1_list[scale_idx]
+
+ if pred_bidir_flow and scale_idx > 0:
+ # predicting bidirectional flow with refinement
+ feature0, feature1 = torch.cat((feature0, feature1), dim=0), torch.cat(
+ (feature1, feature0), dim=0
+ )
+
+ upsample_factor = self.upsample_factor * (
+ 2 ** (self.num_scales - 1 - scale_idx)
+ )
+
+ if scale_idx > 0:
+ flow = (
+ F.interpolate(
+ flow, scale_factor=2, mode="bilinear", align_corners=True
+ )
+ * 2
+ )
+
+ if flow is not None:
+ flow = flow.detach()
+ feature1 = flow_warp(feature1, flow) # [B, C, H, W]
+
+ attn_splits = attn_splits_list[scale_idx]
+ corr_radius = corr_radius_list[scale_idx]
+ prop_radius = prop_radius_list[scale_idx]
+
+ # add position to features
+ feature0, feature1 = feature_add_position(
+ feature0, feature1, attn_splits, self.feature_channels
+ )
+
+ # Transformer
+ feature0, feature1 = self.transformer(
+ feature0, feature1, attn_num_splits=attn_splits
+ )
+
+ # correlation and softmax
+ if corr_radius == -1: # global matching
+ flow_pred = global_correlation_softmax(
+ feature0, feature1, pred_bidir_flow
+ )[0]
+ else: # local matching
+ flow_pred = local_correlation_softmax(feature0, feature1, corr_radius)[
+ 0
+ ]
+
+ # flow or residual flow
+ flow = flow + flow_pred if flow is not None else flow_pred
+
+ # upsample to the original resolution for supervison
+ if (
+ self.training
+ ): # only need to upsample intermediate flow predictions at training time
+ flow_bilinear = self.upsample_flow(
+ flow, None, bilinear=True, upsample_factor=upsample_factor
+ )
+
+ # flow propagation with self-attn
+ if pred_bidir_flow and scale_idx == 0:
+ feature0 = torch.cat(
+ (feature0, feature1), dim=0
+ ) # [2*B, C, H, W] for propagation
+ flow = self.feature_flow_attn(
+ feature0,
+ flow.detach(),
+ local_window_attn=prop_radius > 0,
+ local_window_radius=prop_radius,
+ )
+
+ # bilinear upsampling at training time except the last one
+ if self.training and scale_idx < self.num_scales - 1:
+ flow_up = self.upsample_flow(
+ flow, feature0, bilinear=True, upsample_factor=upsample_factor
+ )
+
+ if scale_idx == self.num_scales - 1:
+ flow_up = self.upsample_flow(flow, feature0)
+
+ return flow_up
+
+
+backwarp_tenGrid = {}
+
+
+def backwarp(tenIn, tenflow):
+ if str(tenflow.shape) not in backwarp_tenGrid:
+ tenHor = (
+ torch.linspace(
+ start=-1.0,
+ end=1.0,
+ steps=tenflow.shape[3],
+ dtype=tenflow.dtype,
+ device=tenflow.device,
+ )
+ .view(1, 1, 1, -1)
+ .repeat(1, 1, tenflow.shape[2], 1)
+ )
+ tenVer = (
+ torch.linspace(
+ start=-1.0,
+ end=1.0,
+ steps=tenflow.shape[2],
+ dtype=tenflow.dtype,
+ device=tenflow.device,
+ )
+ .view(1, 1, -1, 1)
+ .repeat(1, 1, 1, tenflow.shape[3])
+ )
+
+ backwarp_tenGrid[str(tenflow.shape)] = torch.cat([tenHor, tenVer], 1).to(get_torch_device())
+ # end
+
+ tenflow = torch.cat(
+ [
+ tenflow[:, 0:1, :, :] / ((tenIn.shape[3] - 1.0) / 2.0),
+ tenflow[:, 1:2, :, :] / ((tenIn.shape[2] - 1.0) / 2.0),
+ ],
+ 1,
+ )
+
+ return torch.nn.functional.grid_sample(
+ input=tenIn,
+ grid=(backwarp_tenGrid[str(tenflow.shape)] + tenflow).permute(0, 2, 3, 1),
+ mode="bilinear",
+ padding_mode="zeros",
+ align_corners=True,
+ )
+
+
+class MetricNet(nn.Module):
+ def __init__(self):
+ super(MetricNet, self).__init__()
+ self.metric_in = nn.Conv2d(14, 64, 3, 1, 1)
+ self.metric_net1 = nn.Sequential(nn.PReLU(), nn.Conv2d(64, 64, 3, 1, 1))
+ self.metric_net2 = nn.Sequential(nn.PReLU(), nn.Conv2d(64, 64, 3, 1, 1))
+ self.metric_net3 = nn.Sequential(nn.PReLU(), nn.Conv2d(64, 64, 3, 1, 1))
+ self.metric_out = nn.Sequential(nn.PReLU(), nn.Conv2d(64, 2, 3, 1, 1))
+
+ def forward(self, img0, img1, flow01, flow10):
+ metric0 = F.l1_loss(img0, backwarp(img1, flow01), reduction="none").mean(
+ [1], True
+ )
+ metric1 = F.l1_loss(img1, backwarp(img0, flow10), reduction="none").mean(
+ [1], True
+ )
+
+ fwd_occ, bwd_occ = forward_backward_consistency_check(flow01, flow10)
+
+ flow01 = torch.cat(
+ [
+ flow01[:, 0:1, :, :] / ((flow01.shape[3] - 1.0) / 2.0),
+ flow01[:, 1:2, :, :] / ((flow01.shape[2] - 1.0) / 2.0),
+ ],
+ 1,
+ )
+ flow10 = torch.cat(
+ [
+ flow10[:, 0:1, :, :] / ((flow10.shape[3] - 1.0) / 2.0),
+ flow10[:, 1:2, :, :] / ((flow10.shape[2] - 1.0) / 2.0),
+ ],
+ 1,
+ )
+
+ img = torch.cat((img0, img1), 1)
+ metric = torch.cat((-metric0, -metric1), 1)
+ flow = torch.cat((flow01, flow10), 1)
+ occ = torch.cat((fwd_occ.unsqueeze(1), bwd_occ.unsqueeze(1)), 1)
+
+ feat = self.metric_in(torch.cat((img, metric, flow, occ), 1))
+ feat = self.metric_net1(feat) + feat
+ feat = self.metric_net2(feat) + feat
+ feat = self.metric_net3(feat) + feat
+ metric = self.metric_out(feat)
+
+ metric = torch.tanh(metric) * 10
+
+ return metric[:, :1], metric[:, 1:2]
+
+
+class FeatureNet(nn.Module):
+ """The quadratic model"""
+
+ def __init__(self):
+ super(FeatureNet, self).__init__()
+ self.block1 = nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(3, 64, 3, 2, 1),
+ nn.PReLU(),
+ nn.Conv2d(64, 64, 3, 1, 1),
+ )
+ self.block2 = nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(64, 128, 3, 2, 1),
+ nn.PReLU(),
+ nn.Conv2d(128, 128, 3, 1, 1),
+ )
+ self.block3 = nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(128, 192, 3, 2, 1),
+ nn.PReLU(),
+ nn.Conv2d(192, 192, 3, 1, 1),
+ )
+
+ def forward(self, x):
+ x1 = self.block1(x)
+ x2 = self.block2(x1)
+ x3 = self.block3(x2)
+
+ return x1, x2, x3
+
+
+# Residual Block
+def ResidualBlock(in_channels, out_channels, stride=1):
+ return torch.nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size=3,
+ stride=stride,
+ padding=1,
+ bias=True,
+ ),
+ nn.PReLU(),
+ nn.Conv2d(
+ out_channels,
+ out_channels,
+ kernel_size=3,
+ stride=stride,
+ padding=1,
+ bias=True,
+ ),
+ )
+
+
+# downsample block
+def DownsampleBlock(in_channels, out_channels, stride=2):
+ return torch.nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size=3,
+ stride=stride,
+ padding=1,
+ bias=True,
+ ),
+ nn.PReLU(),
+ nn.Conv2d(
+ out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=True
+ ),
+ )
+
+
+# upsample block
+def UpsampleBlock(in_channels, out_channels, stride=2):
+ return torch.nn.Sequential(
+ nn.PReLU(),
+ nn.ConvTranspose2d(
+ in_channels,
+ out_channels,
+ kernel_size=4,
+ stride=stride,
+ padding=1,
+ bias=True,
+ ),
+ nn.PReLU(),
+ nn.Conv2d(
+ out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=True
+ ),
+ )
+
+
+class PixelShuffleBlcok(nn.Module):
+ def __init__(self, in_feat, num_feat, num_out_ch):
+ super(PixelShuffleBlcok, self).__init__()
+ self.conv_before_upsample = nn.Sequential(
+ nn.Conv2d(in_feat, num_feat, 3, 1, 1), nn.PReLU()
+ )
+ self.upsample = nn.Sequential(
+ nn.Conv2d(num_feat, 4 * num_feat, 3, 1, 1), nn.PixelShuffle(2)
+ )
+ self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1)
+
+ def forward(self, x):
+ x = self.conv_before_upsample(x)
+ x = self.conv_last(self.upsample(x))
+ return x
+
+
+# grid network
+class GridNet(nn.Module):
+ def __init__(
+ self,
+ in_channels=9,
+ in_channels1=128,
+ in_channels2=256,
+ in_channels3=384,
+ out_channels=3,
+ ):
+ super(GridNet, self).__init__()
+
+ self.residual_model_head0 = ResidualBlock(in_channels, 64)
+ self.residual_model_head1 = ResidualBlock(in_channels1, 64)
+ self.residual_model_head2 = ResidualBlock(in_channels2, 128)
+ self.residual_model_head3 = ResidualBlock(in_channels3, 192)
+
+ self.residual_model_01 = ResidualBlock(64, 64)
+ # self.residual_model_02=ResidualBlock(64, 64)
+ # self.residual_model_03=ResidualBlock(64, 64)
+ self.residual_model_04 = ResidualBlock(64, 64)
+ self.residual_model_05 = ResidualBlock(64, 64)
+ self.residual_model_tail = PixelShuffleBlcok(64, 64, out_channels)
+
+ self.residual_model_11 = ResidualBlock(128, 128)
+ # self.residual_model_12=ResidualBlock(128, 128)
+ # self.residual_model_13=ResidualBlock(128, 128)
+ self.residual_model_14 = ResidualBlock(128, 128)
+ self.residual_model_15 = ResidualBlock(128, 128)
+
+ self.residual_model_21 = ResidualBlock(192, 192)
+ # self.residual_model_22=ResidualBlock(192, 192)
+ # self.residual_model_23=ResidualBlock(192, 192)
+ self.residual_model_24 = ResidualBlock(192, 192)
+ self.residual_model_25 = ResidualBlock(192, 192)
+
+ #
+
+ self.downsample_model_10 = DownsampleBlock(64, 128)
+ self.downsample_model_20 = DownsampleBlock(128, 192)
+
+ self.downsample_model_11 = DownsampleBlock(64, 128)
+ self.downsample_model_21 = DownsampleBlock(128, 192)
+
+ # self.downsample_model_12=DownsampleBlock(64, 128)
+ # self.downsample_model_22=DownsampleBlock(128, 192)
+
+ #
+
+ # self.upsample_model_03=UpsampleBlock(128, 64)
+ # self.upsample_model_13=UpsampleBlock(192, 128)
+
+ self.upsample_model_04 = UpsampleBlock(128, 64)
+ self.upsample_model_14 = UpsampleBlock(192, 128)
+
+ self.upsample_model_05 = UpsampleBlock(128, 64)
+ self.upsample_model_15 = UpsampleBlock(192, 128)
+
+ def forward(self, x, x1, x2, x3):
+ X00 = self.residual_model_head0(x) + self.residual_model_head1(
+ x1
+ ) # --- 182 ~ 185
+ # X10 = self.residual_model_head1(x1)
+
+ X01 = self.residual_model_01(X00) + X00 # --- 208 ~ 211 ,AddBackward1213
+
+ X10 = self.downsample_model_10(X00) + self.residual_model_head2(
+ x2
+ ) # --- 186 ~ 189
+ X20 = self.downsample_model_20(X10) + self.residual_model_head3(
+ x3
+ ) # --- 190 ~ 193
+
+ residual_11 = (
+ self.residual_model_11(X10) + X10
+ ) # 201 ~ 204 , sum AddBackward1206
+ downsample_11 = self.downsample_model_11(X01) # 214 ~ 217
+ X11 = residual_11 + downsample_11 # --- AddBackward1218
+
+ residual_21 = (
+ self.residual_model_21(X20) + X20
+ ) # 194 ~ 197 , sum AddBackward1199
+ downsample_21 = self.downsample_model_21(X11) # 219 ~ 222
+ X21 = residual_21 + downsample_21 # AddBackward1223
+
+ X24 = self.residual_model_24(X21) + X21 # --- 224 ~ 227 , AddBackward1229
+ X25 = self.residual_model_25(X24) + X24 # --- 230 ~ 233 , AddBackward1235
+
+ upsample_14 = self.upsample_model_14(X24) # 242 ~ 246
+ residual_14 = self.residual_model_14(X11) + X11 # 248 ~ 251, AddBackward1253
+ X14 = upsample_14 + residual_14 # --- AddBackward1254
+
+ upsample_04 = self.upsample_model_04(X14) # 268 ~ 272
+ residual_04 = self.residual_model_04(X01) + X01 # 274 ~ 277, AddBackward1279
+ X04 = upsample_04 + residual_04 # --- AddBackward1280
+
+ upsample_15 = self.upsample_model_15(X25) # 236 ~ 240
+ residual_15 = self.residual_model_15(X14) + X14 # 255 ~ 258, AddBackward1260
+ X15 = upsample_15 + residual_15 # AddBackward1261
+
+ upsample_05 = self.upsample_model_05(X15) # 262 ~ 266
+ residual_05 = self.residual_model_05(X04) + X04 # 281 ~ 284,AddBackward1286
+ X05 = upsample_05 + residual_05 # AddBackward1287
+
+ X_tail = self.residual_model_tail(X05) # 288 ~ 291
+
+ return X_tail
+# end
+
+
+class Model:
+ def __init__(self):
+ self.flownet = GMFlow()
+ self.ifnet = IFNet(arch_ver="4.6")
+ self.metricnet = MetricNet()
+ self.feat_ext = FeatureNet()
+ self.fusionnet = GridNet()
+ self.version = 3.9
+
+ def eval(self):
+ self.flownet.eval()
+ self.ifnet.eval()
+ self.metricnet.eval()
+ self.feat_ext.eval()
+ self.fusionnet.eval()
+
+ def device(self):
+ self.flownet.to(device)
+ self.ifnet.to(device)
+ self.metricnet.to(device)
+ self.feat_ext.to(device)
+ self.fusionnet.to(device)
+
+ def load_model(self, path_dict):
+ #models/rife46.pth
+ self.ifnet.load_state_dict(torch.load(path_dict["ifnet"]))
+ #models/GMFSS_fortuna_flownet.pkl
+ self.flownet.load_state_dict(torch.load(path_dict["flownet"]))
+ #models/GMFSS_fortuna_union_metric.pkl
+ self.metricnet.load_state_dict(torch.load(path_dict["metricnet"]))
+ #models/GMFSS_fortuna_union_feat.pkl
+ self.feat_ext.load_state_dict(torch.load(path_dict["feat_ext"]))
+ #models/GMFSS_fortuna_union_fusionnet.pkl
+ self.fusionnet.load_state_dict(torch.load(path_dict["fusionnet"]))
+
+ def reuse(self, img0, img1, scale):
+ feat11, feat12, feat13 = self.feat_ext(img0)
+ feat21, feat22, feat23 = self.feat_ext(img1)
+
+ img0 = F.interpolate(
+ img0, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ img1 = F.interpolate(
+ img1, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+
+ if scale != 1.0:
+ imgf0 = F.interpolate(
+ img0, scale_factor=scale, mode="bilinear", align_corners=False
+ )
+ imgf1 = F.interpolate(
+ img1, scale_factor=scale, mode="bilinear", align_corners=False
+ )
+ else:
+ imgf0 = img0
+ imgf1 = img1
+ flow01 = self.flownet(imgf0, imgf1, return_flow=True)
+ flow10 = self.flownet(imgf1, imgf0, return_flow=True)
+ if scale != 1.0:
+ flow01 = (
+ F.interpolate(
+ flow01,
+ scale_factor=1.0 / scale,
+ mode="bilinear",
+ align_corners=False,
+ )
+ / scale
+ )
+ flow10 = (
+ F.interpolate(
+ flow10,
+ scale_factor=1.0 / scale,
+ mode="bilinear",
+ align_corners=False,
+ )
+ / scale
+ )
+
+ metric0, metric1 = self.metricnet(img0, img1, flow01, flow10)
+
+ return (
+ flow01,
+ flow10,
+ metric0,
+ metric1,
+ feat11,
+ feat12,
+ feat13,
+ feat21,
+ feat22,
+ feat23,
+ )
+
+ def inference(
+ self,
+ img0,
+ img1,
+ flow01,
+ flow10,
+ metric0,
+ metric1,
+ feat11,
+ feat12,
+ feat13,
+ feat21,
+ feat22,
+ feat23,
+ timestep,
+ ):
+ F1t = timestep * flow01
+ F2t = (1 - timestep) * flow10
+
+ Z1t = timestep * metric0
+ Z2t = (1 - timestep) * metric1
+
+ img0 = F.interpolate(
+ img0, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ I1t = softsplat(img0, F1t, Z1t, strMode="soft")
+ img1 = F.interpolate(
+ img1, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ I2t = softsplat(img1, F2t, Z2t, strMode="soft")
+
+ rife = self.ifnet(img0, img1, timestep, scale_list=[8, 4, 2, 1])
+
+ feat1t1 = softsplat(feat11, F1t, Z1t, strMode="soft")
+ feat2t1 = softsplat(feat21, F2t, Z2t, strMode="soft")
+
+ F1td = (
+ F.interpolate(F1t, scale_factor=0.5, mode="bilinear", align_corners=False)
+ * 0.5
+ )
+ Z1d = F.interpolate(Z1t, scale_factor=0.5, mode="bilinear", align_corners=False)
+ feat1t2 = softsplat(feat12, F1td, Z1d, strMode="soft")
+ F2td = (
+ F.interpolate(F2t, scale_factor=0.5, mode="bilinear", align_corners=False)
+ * 0.5
+ )
+ Z2d = F.interpolate(Z2t, scale_factor=0.5, mode="bilinear", align_corners=False)
+ feat2t2 = softsplat(feat22, F2td, Z2d, strMode="soft")
+
+ F1tdd = (
+ F.interpolate(F1t, scale_factor=0.25, mode="bilinear", align_corners=False)
+ * 0.25
+ )
+ Z1dd = F.interpolate(
+ Z1t, scale_factor=0.25, mode="bilinear", align_corners=False
+ )
+ feat1t3 = softsplat(feat13, F1tdd, Z1dd, strMode="soft")
+ F2tdd = (
+ F.interpolate(F2t, scale_factor=0.25, mode="bilinear", align_corners=False)
+ * 0.25
+ )
+ Z2dd = F.interpolate(
+ Z2t, scale_factor=0.25, mode="bilinear", align_corners=False
+ )
+ feat2t3 = softsplat(feat23, F2tdd, Z2dd, strMode="soft")
+
+ out = self.fusionnet(
+ torch.cat([I1t, rife, I2t], dim=1),
+ torch.cat([feat1t1, feat2t1], dim=1),
+ torch.cat([feat1t2, feat2t2], dim=1),
+ torch.cat([feat1t3, feat2t3], dim=1),
+ )
+
+ return torch.clamp(out, 0, 1)
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3e55bb606f30d7d42eeac118fe8832bd7493957f
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/gmfss_fortuna/__init__.py
@@ -0,0 +1,143 @@
+import pathlib
+from vfi_utils import load_file_from_github_release, preprocess_frames, postprocess_frames, generic_frame_loop, InterpolationStateList
+import typing
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from comfy.model_management import get_torch_device
+
+
+GLOBAL_MODEL_TYPE = pathlib.Path(__file__).parent.name
+CKPTS_PATH_CONFIG = {
+ "GMFSS_fortuna_union": {
+ "ifnet": ("rife", "rife46.pth"),
+ "flownet": (GLOBAL_MODEL_TYPE, "GMFSS_fortuna_flownet.pkl"),
+ "metricnet": (GLOBAL_MODEL_TYPE, "GMFSS_fortuna_union_metric.pkl"),
+ "feat_ext": (GLOBAL_MODEL_TYPE, "GMFSS_fortuna_union_feat.pkl"),
+ "fusionnet": (GLOBAL_MODEL_TYPE, "GMFSS_fortuna_union_fusionnet.pkl")
+ },
+ "GMFSS_fortuna": {
+ "flownet": (GLOBAL_MODEL_TYPE, "GMFSS_fortuna_flownet.pkl"),
+ "metricnet": (GLOBAL_MODEL_TYPE, "GMFSS_fortuna_metric.pkl"),
+ "feat_ext": (GLOBAL_MODEL_TYPE, "GMFSS_fortuna_feat.pkl"),
+ "fusionnet": (GLOBAL_MODEL_TYPE, "GMFSS_fortuna_fusionnet.pkl")
+ }
+}
+
+class CommonModelInference(nn.Module):
+ def __init__(self, model_type):
+ super(CommonModelInference, self).__init__()
+ from .GMFSS_Fortuna_arch import Model as GMFSS
+ from .GMFSS_Fortuna_union_arch import Model as GMFSS_Union
+ self.model = GMFSS_Union() if "union" in model_type else GMFSS()
+ self.model.eval()
+ self.model.device()
+ _model_path_config = CKPTS_PATH_CONFIG[model_type]
+ self.model.load_model({
+ key: load_file_from_github_release(*_model_path_config[key])
+ for key in _model_path_config
+ })
+
+ def forward(self, I0, I1, timestep, scale=1.0):
+ n, c, h, w = I0.shape
+ tmp = max(64, int(64 / scale))
+ ph = ((h - 1) // tmp + 1) * tmp
+ pw = ((w - 1) // tmp + 1) * tmp
+ padding = (0, pw - w, 0, ph - h)
+ I0 = F.pad(I0, padding)
+ I1 = F.pad(I1, padding)
+ (
+ flow01,
+ flow10,
+ metric0,
+ metric1,
+ feat11,
+ feat12,
+ feat13,
+ feat21,
+ feat22,
+ feat23,
+ ) = self.model.reuse(I0, I1, scale)
+
+ output = self.model.inference(
+ I0,
+ I1,
+ flow01,
+ flow10,
+ metric0,
+ metric1,
+ feat11,
+ feat12,
+ feat13,
+ feat21,
+ feat22,
+ feat23,
+ timestep,
+ )
+ return output[:, :, :h, :w]
+
+class GMFSS_Fortuna_VFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (list(CKPTS_PATH_CONFIG.keys()), ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 10, "min": 1, "max": 1000}),
+ "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames = 10,
+ multiplier: typing.SupportsInt = 2,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ """
+ Perform video frame interpolation using a given checkpoint model.
+
+ Args:
+ ckpt_name (str): The name of the checkpoint model to use.
+ frames (torch.Tensor): A tensor containing input video frames.
+ clear_cache_after_n_frames (int, optional): The number of frames to process before clearing CUDA cache
+ to prevent memory overflow. Defaults to 10. Lower numbers are safer but mean more processing time.
+ How high you should set it depends on how many input frames there are, input resolution (after upscaling),
+ how many times you want to multiply them, and how long you're willing to wait for the process to complete.
+ multiplier (int, optional): The multiplier for each input frame. 60 input frames * 2 = 120 output frames. Defaults to 2.
+
+ Returns:
+ tuple: A tuple containing the output interpolated frames.
+
+ Note:
+ This method interpolates frames in a video sequence using a specified checkpoint model.
+ It processes each frame sequentially, generating interpolated frames between them.
+
+ To prevent memory overflow, it clears the CUDA cache after processing a specified number of frames.
+ """
+
+ interpolation_model = CommonModelInference(model_type=ckpt_name)
+ interpolation_model.eval().to(get_torch_device())
+ frames = preprocess_frames(frames)
+
+ def return_middle_frame(frame_0, frame_1, timestep, model, scale):
+ return model(frame_0, frame_1, timestep, scale)
+
+ scale = 1
+
+ args = [interpolation_model, scale]
+ out = postprocess_frames(
+ generic_frame_loop(type(self).__name__, frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
+ interpolation_states=optional_interpolation_states, dtype=torch.float32)
+ )
+ return (out,)
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ifrnet/IFRNet_L_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ifrnet/IFRNet_L_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..f9554a0bbfbe274ccfa021c618512f5220bbb220
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ifrnet/IFRNet_L_arch.py
@@ -0,0 +1,293 @@
+# https://github.com/ltkong218/IFRNet/blob/main/models/IFRNet_L.py
+# https://github.com/ltkong218/IFRNet/blob/main/utils.py
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from comfy.model_management import get_torch_device
+
+
+def warp(img, flow):
+ B, _, H, W = flow.shape
+ xx = torch.linspace(-1.0, 1.0, W).view(1, 1, 1, W).expand(B, -1, H, -1)
+ yy = torch.linspace(-1.0, 1.0, H).view(1, 1, H, 1).expand(B, -1, -1, W)
+ grid = torch.cat([xx, yy], 1).to(img)
+ flow_ = torch.cat(
+ [
+ flow[:, 0:1, :, :] / ((W - 1.0) / 2.0),
+ flow[:, 1:2, :, :] / ((H - 1.0) / 2.0),
+ ],
+ 1,
+ )
+ grid_ = (grid + flow_).permute(0, 2, 3, 1)
+ output = F.grid_sample(
+ input=img,
+ grid=grid_,
+ mode="bilinear",
+ padding_mode="border",
+ align_corners=True,
+ )
+ return output
+
+
+def get_robust_weight(flow_pred, flow_gt, beta):
+ epe = ((flow_pred.detach() - flow_gt) ** 2).sum(dim=1, keepdim=True) ** 0.5
+ robust_weight = torch.exp(-beta * epe)
+ return robust_weight
+
+
+def resize(x, scale_factor):
+ return F.interpolate(
+ x, scale_factor=scale_factor, mode="bilinear", align_corners=False
+ )
+
+
+def convrelu(
+ in_channels,
+ out_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ dilation=1,
+ groups=1,
+ bias=True,
+):
+ return nn.Sequential(
+ nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size,
+ stride,
+ padding,
+ dilation,
+ groups,
+ bias=bias,
+ ),
+ nn.PReLU(out_channels),
+ )
+
+
+class ResBlock(nn.Module):
+ def __init__(self, in_channels, side_channels, bias=True):
+ super(ResBlock, self).__init__()
+ self.side_channels = side_channels
+ self.conv1 = nn.Sequential(
+ nn.Conv2d(
+ in_channels, in_channels, kernel_size=3, stride=1, padding=1, bias=bias
+ ),
+ nn.PReLU(in_channels),
+ )
+ self.conv2 = nn.Sequential(
+ nn.Conv2d(
+ side_channels,
+ side_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ bias=bias,
+ ),
+ nn.PReLU(side_channels),
+ )
+ self.conv3 = nn.Sequential(
+ nn.Conv2d(
+ in_channels, in_channels, kernel_size=3, stride=1, padding=1, bias=bias
+ ),
+ nn.PReLU(in_channels),
+ )
+ self.conv4 = nn.Sequential(
+ nn.Conv2d(
+ side_channels,
+ side_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ bias=bias,
+ ),
+ nn.PReLU(side_channels),
+ )
+ self.conv5 = nn.Conv2d(
+ in_channels, in_channels, kernel_size=3, stride=1, padding=1, bias=bias
+ )
+ self.prelu = nn.PReLU(in_channels)
+
+ def forward(self, x):
+ out = self.conv1(x)
+ out[:, -self.side_channels :, :, :] = self.conv2(
+ out[:, -self.side_channels :, :, :]
+ )
+ out = self.conv3(out)
+ out[:, -self.side_channels :, :, :] = self.conv4(
+ out[:, -self.side_channels :, :, :]
+ )
+ out = self.prelu(x + self.conv5(out))
+ return out
+
+
+class Encoder(nn.Module):
+ def __init__(self):
+ super(Encoder, self).__init__()
+ self.pyramid1 = nn.Sequential(
+ convrelu(3, 64, 7, 2, 3), convrelu(64, 64, 3, 1, 1)
+ )
+ self.pyramid2 = nn.Sequential(
+ convrelu(64, 96, 3, 2, 1), convrelu(96, 96, 3, 1, 1)
+ )
+ self.pyramid3 = nn.Sequential(
+ convrelu(96, 144, 3, 2, 1), convrelu(144, 144, 3, 1, 1)
+ )
+ self.pyramid4 = nn.Sequential(
+ convrelu(144, 192, 3, 2, 1), convrelu(192, 192, 3, 1, 1)
+ )
+
+ def forward(self, img):
+ f1 = self.pyramid1(img)
+ f2 = self.pyramid2(f1)
+ f3 = self.pyramid3(f2)
+ f4 = self.pyramid4(f3)
+ return f1, f2, f3, f4
+
+
+class Decoder4(nn.Module):
+ def __init__(self):
+ super(Decoder4, self).__init__()
+ self.convblock = nn.Sequential(
+ convrelu(384 + 1, 384),
+ ResBlock(384, 64),
+ nn.ConvTranspose2d(384, 148, 4, 2, 1, bias=True),
+ )
+
+ def forward(self, f0, f1, embt):
+ b, c, h, w = f0.shape
+ embt = embt.repeat(1, 1, h, w)
+ f_in = torch.cat([f0, f1, embt], 1)
+ f_out = self.convblock(f_in)
+ return f_out
+
+
+class Decoder3(nn.Module):
+ def __init__(self):
+ super(Decoder3, self).__init__()
+ self.convblock = nn.Sequential(
+ convrelu(436, 432),
+ ResBlock(432, 64),
+ nn.ConvTranspose2d(432, 100, 4, 2, 1, bias=True),
+ )
+
+ def forward(self, ft_, f0, f1, up_flow0, up_flow1):
+ f0_warp = warp(f0, up_flow0)
+ f1_warp = warp(f1, up_flow1)
+ f_in = torch.cat([ft_, f0_warp, f1_warp, up_flow0, up_flow1], 1)
+ f_out = self.convblock(f_in)
+ return f_out
+
+
+class Decoder2(nn.Module):
+ def __init__(self):
+ super(Decoder2, self).__init__()
+ self.convblock = nn.Sequential(
+ convrelu(292, 288),
+ ResBlock(288, 64),
+ nn.ConvTranspose2d(288, 68, 4, 2, 1, bias=True),
+ )
+
+ def forward(self, ft_, f0, f1, up_flow0, up_flow1):
+ f0_warp = warp(f0, up_flow0)
+ f1_warp = warp(f1, up_flow1)
+ f_in = torch.cat([ft_, f0_warp, f1_warp, up_flow0, up_flow1], 1)
+ f_out = self.convblock(f_in)
+ return f_out
+
+
+class Decoder1(nn.Module):
+ def __init__(self):
+ super(Decoder1, self).__init__()
+ self.convblock = nn.Sequential(
+ convrelu(196, 192),
+ ResBlock(192, 64),
+ nn.ConvTranspose2d(192, 8, 4, 2, 1, bias=True),
+ )
+
+ def forward(self, ft_, f0, f1, up_flow0, up_flow1):
+ f0_warp = warp(f0, up_flow0)
+ f1_warp = warp(f1, up_flow1)
+ f_in = torch.cat([ft_, f0_warp, f1_warp, up_flow0, up_flow1], 1)
+ f_out = self.convblock(f_in)
+ return f_out
+
+
+class IRFNet_L(nn.Module):
+ def __init__(self):
+ super(IRFNet_L, self).__init__()
+ self.encoder = Encoder()
+ self.decoder4 = Decoder4()
+ self.decoder3 = Decoder3()
+ self.decoder2 = Decoder2()
+ self.decoder1 = Decoder1()
+
+ def forward(self, img0, img1, scale_factor=1.0, timestep=0.5):
+ # emb1 = torch.tensor(1/2).view(1, 1, 1, 1).float()
+ # emb2 = torch.tensor(2/2).view(1, 1, 1, 1).float()
+ # embt = torch.cat([emb1, emb2], 0)
+ n, c, h, w = img0.shape
+
+ ph = ((h - 1) // 64 + 1) * 64
+ pw = ((w - 1) // 64 + 1) * 64
+ padding = (0, pw - w, 0, ph - h)
+ img0 = F.pad(img0, padding)
+ img1 = F.pad(img1, padding)
+
+ #Support multiple batches
+ embt = torch.tensor([timestep] * n).view(n, 1, 1, 1).float().to(get_torch_device())
+ if "HalfTensor" in str(img0.type()):
+ embt = embt.half()
+
+ mean_ = (
+ torch.cat([img0, img1], 2)
+ .mean(1, keepdim=True)
+ .mean(2, keepdim=True)
+ .mean(3, keepdim=True)
+ )
+ img0 = img0 - mean_
+ img1 = img1 - mean_
+
+ img0_ = resize(img0, scale_factor=scale_factor)
+ img1_ = resize(img1, scale_factor=scale_factor)
+
+ f0_1, f0_2, f0_3, f0_4 = self.encoder(img0_)
+ f1_1, f1_2, f1_3, f1_4 = self.encoder(img1_)
+
+ out4 = self.decoder4(f0_4, f1_4, embt)
+ up_flow0_4 = out4[:, 0:2]
+ up_flow1_4 = out4[:, 2:4]
+ ft_3_ = out4[:, 4:]
+
+ out3 = self.decoder3(ft_3_, f0_3, f1_3, up_flow0_4, up_flow1_4)
+ up_flow0_3 = out3[:, 0:2] + 2.0 * resize(up_flow0_4, scale_factor=2.0)
+ up_flow1_3 = out3[:, 2:4] + 2.0 * resize(up_flow1_4, scale_factor=2.0)
+ ft_2_ = out3[:, 4:]
+
+ out2 = self.decoder2(ft_2_, f0_2, f1_2, up_flow0_3, up_flow1_3)
+ up_flow0_2 = out2[:, 0:2] + 2.0 * resize(up_flow0_3, scale_factor=2.0)
+ up_flow1_2 = out2[:, 2:4] + 2.0 * resize(up_flow1_3, scale_factor=2.0)
+ ft_1_ = out2[:, 4:]
+
+ out1 = self.decoder1(ft_1_, f0_1, f1_1, up_flow0_2, up_flow1_2)
+ up_flow0_1 = out1[:, 0:2] + 2.0 * resize(up_flow0_2, scale_factor=2.0)
+ up_flow1_1 = out1[:, 2:4] + 2.0 * resize(up_flow1_2, scale_factor=2.0)
+ up_mask_1 = torch.sigmoid(out1[:, 4:5])
+ up_res_1 = out1[:, 5:]
+
+ up_flow0_1 = resize(up_flow0_1, scale_factor=(1.0 / scale_factor)) * (
+ 1.0 / scale_factor
+ )
+ up_flow1_1 = resize(up_flow1_1, scale_factor=(1.0 / scale_factor)) * (
+ 1.0 / scale_factor
+ )
+ up_mask_1 = resize(up_mask_1, scale_factor=(1.0 / scale_factor))
+ up_res_1 = resize(up_res_1, scale_factor=(1.0 / scale_factor))
+
+ img0_warp = warp(img0, up_flow0_1)
+ img1_warp = warp(img1, up_flow1_1)
+ imgt_merge = up_mask_1 * img0_warp + (1 - up_mask_1) * img1_warp + mean_
+ imgt_pred = imgt_merge + up_res_1
+ imgt_pred = torch.clamp(imgt_pred, 0, 1)
+ return imgt_pred[:, :, :h, :w]
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ifrnet/IFRNet_S_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ifrnet/IFRNet_S_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..4a2282b93b74eddf5792190f77dff0de457ff8b4
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ifrnet/IFRNet_S_arch.py
@@ -0,0 +1,293 @@
+# https://github.com/ltkong218/IFRNet/blob/main/models/IFRNet_S.py
+# https://github.com/ltkong218/IFRNet/blob/main/utils.py
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from comfy.model_management import get_torch_device
+
+
+def warp(img, flow):
+ B, _, H, W = flow.shape
+ xx = torch.linspace(-1.0, 1.0, W).view(1, 1, 1, W).expand(B, -1, H, -1)
+ yy = torch.linspace(-1.0, 1.0, H).view(1, 1, H, 1).expand(B, -1, -1, W)
+ grid = torch.cat([xx, yy], 1).to(img)
+ flow_ = torch.cat(
+ [
+ flow[:, 0:1, :, :] / ((W - 1.0) / 2.0),
+ flow[:, 1:2, :, :] / ((H - 1.0) / 2.0),
+ ],
+ 1,
+ )
+ grid_ = (grid + flow_).permute(0, 2, 3, 1)
+ output = F.grid_sample(
+ input=img,
+ grid=grid_,
+ mode="bilinear",
+ padding_mode="border",
+ align_corners=True,
+ )
+ return output
+
+
+def get_robust_weight(flow_pred, flow_gt, beta):
+ epe = ((flow_pred.detach() - flow_gt) ** 2).sum(dim=1, keepdim=True) ** 0.5
+ robust_weight = torch.exp(-beta * epe)
+ return robust_weight
+
+
+def resize(x, scale_factor):
+ return F.interpolate(
+ x, scale_factor=scale_factor, mode="bilinear", align_corners=False
+ )
+
+
+def convrelu(
+ in_channels,
+ out_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ dilation=1,
+ groups=1,
+ bias=True,
+):
+ return nn.Sequential(
+ nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size,
+ stride,
+ padding,
+ dilation,
+ groups,
+ bias=bias,
+ ),
+ nn.PReLU(out_channels),
+ )
+
+
+class ResBlock(nn.Module):
+ def __init__(self, in_channels, side_channels, bias=True):
+ super(ResBlock, self).__init__()
+ self.side_channels = side_channels
+ self.conv1 = nn.Sequential(
+ nn.Conv2d(
+ in_channels, in_channels, kernel_size=3, stride=1, padding=1, bias=bias
+ ),
+ nn.PReLU(in_channels),
+ )
+ self.conv2 = nn.Sequential(
+ nn.Conv2d(
+ side_channels,
+ side_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ bias=bias,
+ ),
+ nn.PReLU(side_channels),
+ )
+ self.conv3 = nn.Sequential(
+ nn.Conv2d(
+ in_channels, in_channels, kernel_size=3, stride=1, padding=1, bias=bias
+ ),
+ nn.PReLU(in_channels),
+ )
+ self.conv4 = nn.Sequential(
+ nn.Conv2d(
+ side_channels,
+ side_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ bias=bias,
+ ),
+ nn.PReLU(side_channels),
+ )
+ self.conv5 = nn.Conv2d(
+ in_channels, in_channels, kernel_size=3, stride=1, padding=1, bias=bias
+ )
+ self.prelu = nn.PReLU(in_channels)
+
+ def forward(self, x):
+ out = self.conv1(x)
+ out[:, -self.side_channels :, :, :] = self.conv2(
+ out[:, -self.side_channels :, :, :]
+ )
+ out = self.conv3(out)
+ out[:, -self.side_channels :, :, :] = self.conv4(
+ out[:, -self.side_channels :, :, :]
+ )
+ out = self.prelu(x + self.conv5(out))
+ return out
+
+
+class Encoder(nn.Module):
+ def __init__(self):
+ super(Encoder, self).__init__()
+ self.pyramid1 = nn.Sequential(
+ convrelu(3, 24, 3, 2, 1), convrelu(24, 24, 3, 1, 1)
+ )
+ self.pyramid2 = nn.Sequential(
+ convrelu(24, 36, 3, 2, 1), convrelu(36, 36, 3, 1, 1)
+ )
+ self.pyramid3 = nn.Sequential(
+ convrelu(36, 54, 3, 2, 1), convrelu(54, 54, 3, 1, 1)
+ )
+ self.pyramid4 = nn.Sequential(
+ convrelu(54, 72, 3, 2, 1), convrelu(72, 72, 3, 1, 1)
+ )
+
+ def forward(self, img):
+ f1 = self.pyramid1(img)
+ f2 = self.pyramid2(f1)
+ f3 = self.pyramid3(f2)
+ f4 = self.pyramid4(f3)
+ return f1, f2, f3, f4
+
+
+class Decoder4(nn.Module):
+ def __init__(self):
+ super(Decoder4, self).__init__()
+ self.convblock = nn.Sequential(
+ convrelu(144 + 1, 144),
+ ResBlock(144, 24),
+ nn.ConvTranspose2d(144, 58, 4, 2, 1, bias=True),
+ )
+
+ def forward(self, f0, f1, embt):
+ b, c, h, w = f0.shape
+ embt = embt.repeat(1, 1, h, w)
+ f_in = torch.cat([f0, f1, embt], 1)
+ f_out = self.convblock(f_in)
+ return f_out
+
+
+class Decoder3(nn.Module):
+ def __init__(self):
+ super(Decoder3, self).__init__()
+ self.convblock = nn.Sequential(
+ convrelu(166, 162),
+ ResBlock(162, 24),
+ nn.ConvTranspose2d(162, 40, 4, 2, 1, bias=True),
+ )
+
+ def forward(self, ft_, f0, f1, up_flow0, up_flow1):
+ f0_warp = warp(f0, up_flow0)
+ f1_warp = warp(f1, up_flow1)
+ f_in = torch.cat([ft_, f0_warp, f1_warp, up_flow0, up_flow1], 1)
+ f_out = self.convblock(f_in)
+ return f_out
+
+
+class Decoder2(nn.Module):
+ def __init__(self):
+ super(Decoder2, self).__init__()
+ self.convblock = nn.Sequential(
+ convrelu(112, 108),
+ ResBlock(108, 24),
+ nn.ConvTranspose2d(108, 28, 4, 2, 1, bias=True),
+ )
+
+ def forward(self, ft_, f0, f1, up_flow0, up_flow1):
+ f0_warp = warp(f0, up_flow0)
+ f1_warp = warp(f1, up_flow1)
+ f_in = torch.cat([ft_, f0_warp, f1_warp, up_flow0, up_flow1], 1)
+ f_out = self.convblock(f_in)
+ return f_out
+
+
+class Decoder1(nn.Module):
+ def __init__(self):
+ super(Decoder1, self).__init__()
+ self.convblock = nn.Sequential(
+ convrelu(76, 72),
+ ResBlock(72, 24),
+ nn.ConvTranspose2d(72, 8, 4, 2, 1, bias=True),
+ )
+
+ def forward(self, ft_, f0, f1, up_flow0, up_flow1):
+ f0_warp = warp(f0, up_flow0)
+ f1_warp = warp(f1, up_flow1)
+ f_in = torch.cat([ft_, f0_warp, f1_warp, up_flow0, up_flow1], 1)
+ f_out = self.convblock(f_in)
+ return f_out
+
+
+class IRFNet_S(nn.Module):
+ def __init__(self):
+ super(IRFNet_S, self).__init__()
+ self.encoder = Encoder()
+ self.decoder4 = Decoder4()
+ self.decoder3 = Decoder3()
+ self.decoder2 = Decoder2()
+ self.decoder1 = Decoder1()
+
+ def forward(self, img0, img1, scale_factor=1.0, timestep=0.5):
+ # emb1 = torch.tensor(1/2).view(1, 1, 1, 1).float()
+ # emb2 = torch.tensor(2/2).view(1, 1, 1, 1).float()
+ # embt = torch.cat([emb1, emb2], 0)
+ n, c, h, w = img0.shape
+
+ ph = ((h - 1) // 64 + 1) * 64
+ pw = ((w - 1) // 64 + 1) * 64
+ padding = (0, pw - w, 0, ph - h)
+ img0 = F.pad(img0, padding)
+ img1 = F.pad(img1, padding)
+
+ #Support multiple batches
+ embt = torch.tensor([timestep] * n).view(n, 1, 1, 1).float().to(get_torch_device())
+ if "HalfTensor" in str(img0.type()):
+ embt = embt.half()
+
+ mean_ = (
+ torch.cat([img0, img1], 2)
+ .mean(1, keepdim=True)
+ .mean(2, keepdim=True)
+ .mean(3, keepdim=True)
+ )
+ img0 = img0 - mean_
+ img1 = img1 - mean_
+
+ img0_ = resize(img0, scale_factor=scale_factor)
+ img1_ = resize(img1, scale_factor=scale_factor)
+
+ f0_1, f0_2, f0_3, f0_4 = self.encoder(img0_)
+ f1_1, f1_2, f1_3, f1_4 = self.encoder(img1_)
+
+ out4 = self.decoder4(f0_4, f1_4, embt)
+ up_flow0_4 = out4[:, 0:2]
+ up_flow1_4 = out4[:, 2:4]
+ ft_3_ = out4[:, 4:]
+
+ out3 = self.decoder3(ft_3_, f0_3, f1_3, up_flow0_4, up_flow1_4)
+ up_flow0_3 = out3[:, 0:2] + 2.0 * resize(up_flow0_4, scale_factor=2.0)
+ up_flow1_3 = out3[:, 2:4] + 2.0 * resize(up_flow1_4, scale_factor=2.0)
+ ft_2_ = out3[:, 4:]
+
+ out2 = self.decoder2(ft_2_, f0_2, f1_2, up_flow0_3, up_flow1_3)
+ up_flow0_2 = out2[:, 0:2] + 2.0 * resize(up_flow0_3, scale_factor=2.0)
+ up_flow1_2 = out2[:, 2:4] + 2.0 * resize(up_flow1_3, scale_factor=2.0)
+ ft_1_ = out2[:, 4:]
+
+ out1 = self.decoder1(ft_1_, f0_1, f1_1, up_flow0_2, up_flow1_2)
+ up_flow0_1 = out1[:, 0:2] + 2.0 * resize(up_flow0_2, scale_factor=2.0)
+ up_flow1_1 = out1[:, 2:4] + 2.0 * resize(up_flow1_2, scale_factor=2.0)
+ up_mask_1 = torch.sigmoid(out1[:, 4:5])
+ up_res_1 = out1[:, 5:]
+
+ up_flow0_1 = resize(up_flow0_1, scale_factor=(1.0 / scale_factor)) * (
+ 1.0 / scale_factor
+ )
+ up_flow1_1 = resize(up_flow1_1, scale_factor=(1.0 / scale_factor)) * (
+ 1.0 / scale_factor
+ )
+ up_mask_1 = resize(up_mask_1, scale_factor=(1.0 / scale_factor))
+ up_res_1 = resize(up_res_1, scale_factor=(1.0 / scale_factor))
+
+ img0_warp = warp(img0, up_flow0_1)
+ img1_warp = warp(img1, up_flow1_1)
+ imgt_merge = up_mask_1 * img0_warp + (1 - up_mask_1) * img1_warp + mean_
+ imgt_pred = imgt_merge + up_res_1
+ imgt_pred = torch.clamp(imgt_pred, 0, 1)
+ return imgt_pred[:, :, :h, :w]
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ifrnet/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ifrnet/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..38a9b771f535dbf081c3a2f32af4e8079cb6203b
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ifrnet/__init__.py
@@ -0,0 +1,57 @@
+import torch
+import pathlib
+from vfi_utils import load_file_from_github_release, preprocess_frames, postprocess_frames
+import typing
+from comfy.model_management import get_torch_device
+from vfi_utils import generic_frame_loop, InterpolationStateList
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+CKPT_NAMES = ["IFRNet_S_Vimeo90K.pth", "IFRNet_L_Vimeo90K.pth", "IFRNet_S_GoPro.pth", "IFRNet_L_GoPro.pth"]
+
+class IFRNet_VFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (CKPT_NAMES, ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 10, "min": 1, "max": 1000}),
+ "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
+ "scale_factor": ([0.25, 0.5, 1.0, 2.0, 4.0], {"default": 1.0}),
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames: typing.SupportsInt = 1,
+ multiplier: typing.SupportsInt = 2,
+ scale_factor: typing.SupportsFloat = 1.0,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ from .IFRNet_S_arch import IRFNet_S
+ from .IFRNet_L_arch import IRFNet_L
+ model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
+ interpolation_model = IRFNet_S() if 'S' in ckpt_name else IRFNet_L()
+ interpolation_model.load_state_dict(torch.load(model_path))
+ interpolation_model.eval().to(get_torch_device())
+ frames = preprocess_frames(frames)
+
+ def return_middle_frame(frame_0, frame_1, timestep, model, scale_factor):
+ return model(frame_0, frame_1, timestep, scale_factor)
+
+ args = [interpolation_model, scale_factor]
+ out = postprocess_frames(
+ generic_frame_loop(type(self).__name__, frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
+ interpolation_states=optional_interpolation_states, dtype=torch.float32)
+ )
+ return (out,)
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ifunet/IFUNet_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ifunet/IFUNet_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..82066132e8fb370d8016afbedb47afed7779c9bb
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ifunet/IFUNet_arch.py
@@ -0,0 +1,766 @@
+"""
+https://github.com/98mxr/IFUNet/blob/main/model/IFUNet.py
+https://github.com/98mxr/IFUNet/blob/main/model/cbam.py
+https://github.com/98mxr/IFUNet/blob/main/model/warplayer.py
+https://github.com/98mxr/IFUNet/blob/5be535c8cff66d6fa1967252685719df4c0620e4/model/RIFE.py
+https://github.com/98mxr/IFUNet/blob/main/model/rrdb.py
+https://github.com/98mxr/IFUNet/blob/main/model/ResynNet.py
+"""
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from comfy.model_management import get_torch_device
+
+backwarp_tenGrid = {}
+device = get_torch_device()
+
+
+def conv(in_planes, out_planes, kernel_size=3, stride=1, padding=1, dilation=1):
+ return nn.Sequential(
+ nn.Conv2d(
+ in_planes,
+ out_planes,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ dilation=dilation,
+ bias=True,
+ ),
+ nn.PReLU(out_planes),
+ )
+
+
+def conv_bn(in_planes, out_planes, kernel_size=3, stride=1, padding=1, dilation=1):
+ return nn.Sequential(
+ nn.Conv2d(
+ in_planes,
+ out_planes,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ dilation=dilation,
+ bias=False,
+ ),
+ nn.BatchNorm2d(out_planes),
+ nn.PReLU(out_planes),
+ )
+
+
+class DegCNN(nn.Module):
+ def __init__(self):
+ super(DegCNN, self).__init__()
+ self.conv0 = conv(3, 32, 3, 2, 1)
+ self.conv1 = conv(32, 32, 3, 2, 1)
+ self.conv2 = conv(32, 32, 3, 2, 1)
+ self.conv3 = conv(32, 32, 3, 2, 1)
+ self.deconv = nn.Sequential(
+ nn.Dropout2d(0.95),
+ nn.ConvTranspose2d(4 * 32, 32, 4, 2, 1),
+ nn.PReLU(32),
+ nn.Conv2d(32, 3, 3, 1, 1),
+ nn.Sigmoid(),
+ )
+
+ def forward(self, x):
+ f0 = self.conv0(x)
+ f1 = self.conv1(f0)
+ f2 = self.conv2(f1)
+ f3 = self.conv3(f2)
+ f1 = F.interpolate(f1, scale_factor=2.0, mode="bilinear", align_corners=False)
+ f2 = F.interpolate(f2, scale_factor=4.0, mode="bilinear", align_corners=False)
+ f3 = F.interpolate(f3, scale_factor=8.0, mode="bilinear", align_corners=False)
+ return self.deconv(torch.cat((f0, f1, f2, f3), 1))
+
+
+class FlowBlock(nn.Module):
+ def __init__(self, in_planes, c=64):
+ super(FlowBlock, self).__init__()
+ self.conv0 = nn.Sequential(
+ conv_bn(in_planes, c // 2, 3, 2, 1),
+ conv_bn(c // 2, c, 3, 2, 1),
+ conv_bn(c, 2 * c, 3, 2, 1),
+ )
+ self.convblock = nn.Sequential(
+ conv_bn(2 * c, 2 * c),
+ conv_bn(2 * c, 2 * c),
+ conv_bn(2 * c, 2 * c),
+ conv_bn(2 * c, 2 * c),
+ conv_bn(2 * c, 2 * c),
+ conv_bn(2 * c, 2 * c),
+ )
+ self.lastconv = nn.ConvTranspose2d(2 * c, 4, 4, 2, 1)
+
+ def forward(self, x, flow, scale=1):
+ x = F.interpolate(
+ x, scale_factor=1.0 / scale, mode="bilinear", align_corners=False
+ )
+ if flow is not None:
+ flow = (
+ F.interpolate(
+ flow, scale_factor=1.0 / scale, mode="bilinear", align_corners=False
+ )
+ * 1.0
+ / scale
+ )
+ x = torch.cat((x, flow), 1)
+ feat = self.conv0(x)
+ feat = self.convblock(feat) + feat
+ tmp = self.lastconv(feat)
+ tmp = F.interpolate(
+ tmp, scale_factor=scale * 4, mode="bilinear", align_corners=False
+ )
+ flow = tmp[:, :2] * scale * 4
+ mask = tmp[:, 2:3]
+ return flow, mask
+
+
+class ResynNet(nn.Module):
+ def __init__(self):
+ super(ResynNet, self).__init__()
+ self.block0 = FlowBlock(6, c=128)
+ self.block1 = FlowBlock(12, c=128)
+ self.block2 = FlowBlock(12, c=128)
+ self.degrad = DegCNN()
+ # Contextual Refinement context + decode
+ self.context0 = nn.Sequential(
+ conv(3, 16, 3, 2, 1),
+ conv(16, 32, 3, 2, 1),
+ )
+ self.context1 = nn.Sequential(
+ conv(3, 16, 3, 2, 1),
+ conv(16, 32, 3, 2, 1),
+ )
+ self.decode = nn.Sequential(
+ nn.ConvTranspose2d(64, 32, 4, 2, 1),
+ nn.ConvTranspose2d(32, 3, 4, 2, 1),
+ nn.Tanh(),
+ )
+
+ def calflow(self, img0, lowres, scale):
+ flow = None
+ stu = [self.block0, self.block1, self.block2]
+ for i in range(3):
+ if flow is not None:
+ flow_d, mask_d = stu[i](
+ torch.cat((img0, lowres, warped_img0, mask), 1),
+ flow,
+ scale=scale[i],
+ )
+ flow = flow + flow_d
+ mask = mask + mask_d
+ else:
+ flow, mask = stu[i](torch.cat((img0, lowres), 1), None, scale=scale[i])
+ warped_img0 = warp(img0, flow)
+ flow_down = (
+ F.interpolate(flow, scale_factor=0.25, mode="bilinear", align_corners=False)
+ * 0.25
+ )
+ c0 = warp(self.context0(img0), flow_down)
+ c1 = self.context1(warped_img0)
+ warped_img0 = warped_img0 + self.decode(torch.cat((c0, c1), 1))
+ return flow, mask, torch.clamp(warped_img0, 0, 1)
+
+ def forward(
+ self, x, deg=None, gt=None, scale=[4, 2, 1], training=False, blend=True
+ ):
+ if training:
+ deg = self.degrad(gt)
+ loss_cons = (gt - deg).abs().mean()
+ else:
+ loss_cons = torch.tensor([0])
+ img_list = []
+ N = x.shape[1] // 3
+ for i in range(N):
+ img_list.append(x[:, i * 3 : i * 3 + 3])
+ warped_list = []
+ merged = []
+ mask_list = []
+ flow_list = []
+ for i in range(N):
+ f, m, img = self.calflow(img_list[i], deg.detach(), scale)
+ mask_list.append(m)
+ warped_list.append(img)
+ flow_list.append(f)
+ if blend:
+ N += 1
+ mask_list.append(m * 0)
+ warped_list.append(deg)
+ mask = F.softmax(torch.clamp(torch.cat(mask_list, 1), -4, 4), dim=1)
+ merged = 0
+ for i in range(N):
+ merged += warped_list[i] * mask[:, i : i + 1]
+ return merged, loss_cons
+
+
+def make_layer(basic_block, num_basic_block, **kwarg):
+ """Make layers by stacking the same blocks.
+ Args:
+ basic_block (nn.module): nn.module class for basic block.
+ num_basic_block (int): number of blocks.
+ Returns:
+ nn.Sequential: Stacked blocks in nn.Sequential.
+ """
+ layers = []
+ for _ in range(num_basic_block):
+ layers.append(basic_block(**kwarg))
+ return nn.Sequential(*layers)
+
+
+class ResidualDenseBlock(nn.Module):
+ """Residual Dense Block.
+
+ Used in RRDB block in ESRGAN.
+
+ Args:
+ num_feat (int): Channel number of intermediate features.
+ num_grow_ch (int): Channels for each growth.
+ """
+
+ def __init__(self, num_feat=64, num_grow_ch=32):
+ super(ResidualDenseBlock, self).__init__()
+ self.conv1 = nn.Conv2d(num_feat, num_grow_ch, 3, 1, 1)
+ self.conv2 = nn.Conv2d(num_feat + num_grow_ch, num_grow_ch, 3, 1, 1)
+ self.conv3 = nn.Conv2d(num_feat + 2 * num_grow_ch, num_grow_ch, 3, 1, 1)
+ self.conv4 = nn.Conv2d(num_feat + 3 * num_grow_ch, num_grow_ch, 3, 1, 1)
+ self.conv5 = nn.Conv2d(num_feat + 4 * num_grow_ch, num_feat, 3, 1, 1)
+
+ self.lrelu = nn.LeakyReLU(negative_slope=0.2, inplace=True)
+
+ # initialization
+ # default_init_weights([self.conv1, self.conv2, self.conv3, self.conv4, self.conv5], 0.1)
+ # 只能先取消,default_init_weights来自basicsr.arch_util
+
+ def forward(self, x):
+ x1 = self.lrelu(self.conv1(x))
+ x2 = self.lrelu(self.conv2(torch.cat((x, x1), 1)))
+ x3 = self.lrelu(self.conv3(torch.cat((x, x1, x2), 1)))
+ x4 = self.lrelu(self.conv4(torch.cat((x, x1, x2, x3), 1)))
+ x5 = self.conv5(torch.cat((x, x1, x2, x3, x4), 1))
+ # Emperically, we use 0.2 to scale the residual for better performance
+ # 原作者这么说我就这么听着吧
+ return x5 * 0.2 + x
+
+
+class RRDB(nn.Module):
+ """Residual in Residual Dense Block.
+
+ Used in RRDB-Net in ESRGAN.
+
+ Args:
+ num_feat (int): Channel number of intermediate features.
+ num_grow_ch (int): Channels for each growth.
+ """
+
+ def __init__(self, num_feat, num_grow_ch=32):
+ super(RRDB, self).__init__()
+ self.rdb1 = ResidualDenseBlock(num_feat, num_grow_ch)
+ self.rdb2 = ResidualDenseBlock(num_feat, num_grow_ch)
+ self.rdb3 = ResidualDenseBlock(num_feat, num_grow_ch)
+
+ def forward(self, x):
+ out = self.rdb1(x)
+ out = self.rdb2(out)
+ out = self.rdb3(out)
+ # Emperically, we use 0.2 to scale the residual for better performance
+ # 原作者这么说我就这么听着吧
+ return out * 0.2 + x
+
+
+class RRDBNet(nn.Module):
+ """Networks consisting of Residual in Residual Dense Block, which is used
+ in ESRGAN.
+
+ ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks.
+
+ We extend ESRGAN for scale x2 and scale x1.
+ Note: This is one option for scale 1, scale 2 in RRDBNet.
+ We first employ the pixel-unshuffle (an inverse operation of pixelshuffle to reduce the spatial size
+ and enlarge the channel size before feeding inputs into the main ESRGAN architecture.
+
+ Args:
+ num_in_ch (int): Channel number of inputs.
+ num_out_ch (int): Channel number of outputs.
+ num_feat (int): Channel number of intermediate features.
+ Default: 64
+ num_block (int): Block number in the trunk network. Defaults: 23
+ num_grow_ch (int): Channels for each growth. Default: 32.
+ """
+
+ def __init__(
+ self, num_in_ch=16, num_out_ch=1, num_feat=64, num_block=6, num_grow_ch=32
+ ):
+ super(RRDBNet, self).__init__()
+ self.conv_first = nn.Conv2d(num_in_ch, num_feat, 3, 1, 1)
+ self.body = make_layer(
+ RRDB, num_block, num_feat=num_feat, num_grow_ch=num_grow_ch
+ )
+ self.conv_body = nn.Conv2d(num_feat, num_feat, 3, 1, 1)
+ # upsample
+ self.conv_up1 = nn.Conv2d(num_feat, num_feat, 3, 1, 1)
+ self.conv_up2 = nn.Conv2d(num_feat, num_feat, 3, 1, 1)
+ self.conv_hr = nn.Conv2d(num_feat, num_feat, 3, 1, 1)
+ self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1)
+
+ self.lrelu = nn.LeakyReLU(negative_slope=0.2, inplace=True)
+
+ def forward(self, img0, img1, warped_img0, warped_img1, flow):
+ x = torch.cat((img0, img1, warped_img0, warped_img1), 1)
+ x = F.interpolate(x, scale_factor=0.25, mode="bilinear", align_corners=False)
+ flow = (
+ F.interpolate(flow, scale_factor=0.25, mode="bilinear", align_corners=False)
+ * 0.25
+ )
+ feat = torch.cat((x, flow), 1)
+
+ feat = self.conv_first(feat)
+ body_feat = self.conv_body(self.body(feat))
+ feat = feat + body_feat
+ # upsample,充分利用四倍放大
+ feat = self.lrelu(
+ self.conv_up1(F.interpolate(feat, scale_factor=2.0, mode="nearest"))
+ )
+ feat = self.lrelu(
+ self.conv_up2(F.interpolate(feat, scale_factor=2.0, mode="nearest"))
+ )
+ out = self.conv_last(self.lrelu(self.conv_hr(feat)))
+
+ out = torch.sigmoid(out)
+ return out
+
+
+def warp(tenInput, tenFlow):
+ k = (str(tenFlow.device), str(tenFlow.size()))
+ if k not in backwarp_tenGrid:
+ tenHorizontal = (
+ torch.linspace(-1.0, 1.0, tenFlow.shape[3], device=device)
+ .view(1, 1, 1, tenFlow.shape[3])
+ .expand(tenFlow.shape[0], -1, tenFlow.shape[2], -1)
+ )
+ tenVertical = (
+ torch.linspace(-1.0, 1.0, tenFlow.shape[2], device=device)
+ .view(1, 1, tenFlow.shape[2], 1)
+ .expand(tenFlow.shape[0], -1, -1, tenFlow.shape[3])
+ )
+ backwarp_tenGrid[k] = torch.cat([tenHorizontal, tenVertical], 1).to(device)
+
+ tenFlow = torch.cat(
+ [
+ tenFlow[:, 0:1, :, :] / ((tenInput.shape[3] - 1.0) / 2.0),
+ tenFlow[:, 1:2, :, :] / ((tenInput.shape[2] - 1.0) / 2.0),
+ ],
+ 1,
+ )
+
+ g = (backwarp_tenGrid[k] + tenFlow).permute(0, 2, 3, 1)
+ return torch.nn.functional.grid_sample(
+ input=tenInput,
+ grid=g,
+ mode="bilinear",
+ padding_mode="border",
+ align_corners=True,
+ )
+
+
+class BasicConv(nn.Module):
+ def __init__(
+ self,
+ in_planes,
+ out_planes,
+ kernel_size,
+ stride=1,
+ padding=0,
+ dilation=1,
+ groups=1,
+ relu=True,
+ bn=True,
+ bias=False,
+ ):
+ super(BasicConv, self).__init__()
+ self.out_channels = out_planes
+ self.conv = nn.Conv2d(
+ in_planes,
+ out_planes,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ dilation=dilation,
+ groups=groups,
+ bias=bias,
+ )
+ self.bn = (
+ nn.BatchNorm2d(out_planes, eps=1e-5, momentum=0.01, affine=True)
+ if bn
+ else None
+ )
+ self.relu = nn.ReLU() if relu else None
+
+ def forward(self, x):
+ x = self.conv(x)
+ if self.bn is not None:
+ x = self.bn(x)
+ if self.relu is not None:
+ x = self.relu(x)
+ return x
+
+
+class Flatten(nn.Module):
+ def forward(self, x):
+ return x.view(x.size(0), -1)
+
+
+class ChannelGate(nn.Module):
+ def __init__(self, gate_channels, reduction_ratio=16, pool_types=["avg", "max"]):
+ super(ChannelGate, self).__init__()
+ self.gate_channels = gate_channels
+ self.mlp = nn.Sequential(
+ Flatten(),
+ nn.Linear(gate_channels, gate_channels // reduction_ratio),
+ nn.ReLU(),
+ nn.Linear(gate_channels // reduction_ratio, gate_channels),
+ )
+ self.pool_types = pool_types
+
+ def forward(self, x):
+ channel_att_sum = None
+ for pool_type in self.pool_types:
+ if pool_type == "avg":
+ avg_pool = F.avg_pool2d(
+ x, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3))
+ )
+ channel_att_raw = self.mlp(avg_pool)
+ elif pool_type == "max":
+ max_pool = F.max_pool2d(
+ x, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3))
+ )
+ channel_att_raw = self.mlp(max_pool)
+ elif pool_type == "lp":
+ lp_pool = F.lp_pool2d(
+ x, 2, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3))
+ )
+ channel_att_raw = self.mlp(lp_pool)
+ elif pool_type == "lse":
+ # LSE pool only
+ lse_pool = logsumexp_2d(x)
+ channel_att_raw = self.mlp(lse_pool)
+
+ if channel_att_sum is None:
+ channel_att_sum = channel_att_raw
+ else:
+ channel_att_sum = channel_att_sum + channel_att_raw
+
+ scale = F.sigmoid(channel_att_sum).unsqueeze(2).unsqueeze(3).expand_as(x)
+ return x * scale
+
+
+def logsumexp_2d(tensor):
+ tensor_flatten = tensor.view(tensor.size(0), tensor.size(1), -1)
+ s, _ = torch.max(tensor_flatten, dim=2, keepdim=True)
+ outputs = s + (tensor_flatten - s).exp().sum(dim=2, keepdim=True).log()
+ return outputs
+
+
+class ChannelPool(nn.Module):
+ def forward(self, x):
+ return torch.cat(
+ (torch.max(x, 1)[0].unsqueeze(1), torch.mean(x, 1).unsqueeze(1)), dim=1
+ )
+
+
+class SpatialGate(nn.Module):
+ def __init__(self):
+ super(SpatialGate, self).__init__()
+ kernel_size = 7
+ self.compress = ChannelPool()
+ self.spatial = BasicConv(
+ 2, 1, kernel_size, stride=1, padding=(kernel_size - 1) // 2, relu=False
+ )
+
+ def forward(self, x):
+ x_compress = self.compress(x)
+ x_out = self.spatial(x_compress)
+ scale = F.sigmoid(x_out) # broadcasting
+ return x * scale
+
+
+class CBAM(nn.Module):
+ def __init__(
+ self,
+ gate_channels,
+ reduction_ratio=16,
+ pool_types=["avg", "max"],
+ no_spatial=False,
+ ):
+ super(CBAM, self).__init__()
+ self.ChannelGate = ChannelGate(gate_channels, reduction_ratio, pool_types)
+ self.no_spatial = no_spatial
+ if not no_spatial:
+ self.SpatialGate = SpatialGate()
+
+ def forward(self, x):
+ x_out = self.ChannelGate(x)
+ if not self.no_spatial:
+ x_out = self.SpatialGate(x_out)
+ return x_out
+
+
+def conv(in_planes, out_planes, kernel_size=3, stride=1, padding=1, dilation=1):
+ return nn.Sequential(
+ nn.Conv2d(
+ in_planes,
+ out_planes,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ dilation=dilation,
+ bias=True,
+ ),
+ nn.PReLU(out_planes),
+ )
+
+
+class UNetConv(nn.Module):
+ def __init__(self, in_planes, out_planes, att=True):
+ super(UNetConv, self).__init__()
+ self.conv1 = conv(in_planes, out_planes, 3, 2, 1)
+ self.conv2 = conv(out_planes, out_planes, 3, 1, 1)
+
+ if att:
+ self.cbam = CBAM(out_planes, 16) # 这一步导致了通道数最低为128
+ else:
+ self.cbam = None
+
+ def forward(self, x):
+ x = self.conv1(x)
+ x = self.conv2(x)
+ if self.cbam is not None:
+ x = self.cbam(x)
+ return x
+
+
+class UpConv(nn.Module):
+ def __init__(self, in_planes, out_planes, att=True):
+ super(UpConv, self).__init__()
+ self.deconv = nn.Sequential(
+ nn.ConvTranspose2d(in_planes, in_planes // 2, 4, 2, 1),
+ nn.PReLU(in_planes // 2),
+ )
+
+ # 也许不需要这么卷积,我不确定
+ self.conv1 = conv(in_planes, in_planes // 2, 3, 1, 1)
+ self.conv2 = conv(in_planes // 2, out_planes, 3, 1, 1)
+
+ if att:
+ self.cbam = CBAM(out_planes, 16)
+ else:
+ self.cbam = None
+
+ def forward(self, x1, x2):
+ x1 = self.deconv(x1)
+ y = self.conv1(torch.cat((x1, x2), 1))
+ y = self.conv2(y)
+ if self.cbam is not None:
+ y = self.cbam(y)
+ return y
+
+
+class FeatureNet(nn.Module):
+ def __init__(self, in_planes, out_planes):
+ super(FeatureNet, self).__init__()
+ # 处理IFBlock0时通道数问题
+ self.conv0 = conv(7, in_planes, 1, 1, 0)
+
+ self.conv1 = UNetConv(in_planes, out_planes // 8, att=False)
+ self.conv2 = UNetConv(out_planes // 8, out_planes // 4, att=True)
+ self.conv3 = UNetConv(out_planes // 4, out_planes // 2, att=True)
+ self.conv4 = UNetConv(out_planes // 2, out_planes, att=True)
+ self.conv5 = UNetConv(out_planes, 2 * out_planes, att=True)
+
+ self.deconv5 = UpConv(2 * out_planes, out_planes, att=True)
+ self.deconv4 = UpConv(out_planes, out_planes // 2, att=False)
+ self.deconv3 = UpConv(out_planes // 2, out_planes // 4, att=False)
+
+ def forward(self, x, level=0):
+ if x.shape[1] != 17:
+ x = self.conv0(x)
+ x2 = self.conv1(x)
+ x4 = self.conv2(x2)
+ x8 = self.conv3(x4)
+ x16 = self.conv4(x8)
+ x32 = self.conv5(x16)
+ y = self.deconv5(x32, x16) # 匹配IFBlock0通道和尺寸
+
+ # “早退机制”以期待用同一个UNet提取特征,不确定是否对训练产生影响
+ if level != 0:
+ y = self.deconv4(y, x8) # 匹配IFBlock1通道和尺寸
+ if level == 2:
+ y = self.deconv3(y, x4) # 匹配IFBlock2通道和尺寸
+ return y
+
+
+class IFBlock(nn.Module):
+ def __init__(self, c=64, level=0):
+ super(IFBlock, self).__init__()
+ self.convblock = nn.Sequential(
+ conv(c, c),
+ conv(c, c),
+ conv(c, c),
+ conv(c, c),
+ conv(c, c),
+ conv(c, c),
+ )
+ self.flowconv = nn.Conv2d(c, 4, 3, 1, 1)
+ self.maskconvx16 = nn.Conv2d(c, 16 * 16 * 9, 1, 1, 0)
+ self.maskconvx8 = nn.Conv2d(c, 8 * 8 * 9, 1, 1, 0)
+ self.maskconvx4 = nn.Conv2d(c, 4 * 4 * 9, 1, 1, 0)
+
+ self.level = level
+ assert self.level in [4, 8, 16], "Bitch"
+
+ def mask_conv(self, x):
+ if self.level == 4:
+ return self.maskconvx4(x)
+ if self.level == 8:
+ return self.maskconvx8(x)
+ if self.level == 16:
+ return self.maskconvx16(x)
+
+ def upsample_flow(self, flow, mask):
+ # 俺寻思俺懂了
+ N, _, H, W = flow.shape
+ mask = mask.view(N, 1, 9, self.level, self.level, H, W)
+ mask = torch.softmax(mask, dim=2)
+
+ up_flow = F.unfold(self.level * flow, [3, 3], padding=1)
+ up_flow = up_flow.view(N, 4, 9, 1, 1, H, W)
+
+ up_flow = torch.sum(mask * up_flow, dim=2)
+ up_flow = up_flow.permute(0, 1, 4, 2, 5, 3)
+ return up_flow.reshape(N, 4, self.level * H, self.level * W)
+
+ def forward(self, x, scale):
+ x = self.convblock(x) + x # 类似ResNet的f(x) + x
+ tmp = self.flowconv(x)
+ up_mask = self.mask_conv(x)
+ flow_up = self.upsample_flow(tmp, up_mask)
+ flow = (
+ F.interpolate(
+ flow_up, scale_factor=scale, mode="bilinear", align_corners=False
+ )
+ * scale
+ )
+ return flow
+
+
+class IFUNet(nn.Module):
+ def __init__(self):
+ super(IFUNet, self).__init__()
+ # block0通道数必须为128的整倍数
+ self.fmap = FeatureNet(in_planes=17, out_planes=256)
+ self.block0 = IFBlock(c=256, level=16)
+ self.block1 = IFBlock(c=128, level=8)
+ self.block2 = IFBlock(c=64, level=4)
+
+ def forward(self, x, scale=1.0, timestep=0.5, ensemble=True):
+ channel = x.shape[1] // 2
+ img0 = x[:, :channel]
+ img1 = x[:, channel:]
+ if not torch.is_tensor(timestep):
+ timestep = (x[:, :1].clone() * 0 + 1) * timestep
+ else:
+ timestep = timestep.repeat(1, 1, img0.shape[2], img0.shape[3])
+ warped_img0 = img0
+ warped_img1 = img1
+ flow = None
+ block = [self.block0, self.block1, self.block2]
+ for i in range(3):
+ if flow != None:
+ x = torch.cat((img0, img1, timestep, warped_img0, warped_img1), 1)
+ flowtmp = flow
+ if scale != 1:
+ x = F.interpolate(
+ x, scale_factor=scale, mode="bilinear", align_corners=False
+ )
+ flowtmp = (
+ F.interpolate(
+ flow,
+ scale_factor=scale,
+ mode="bilinear",
+ align_corners=False,
+ )
+ * scale
+ )
+ x = torch.cat((x, flowtmp), 1)
+ # 期待UNet能提取到特征,不再需要ensemble
+ Fmap = self.fmap(x, level=i)
+ flow_d = block[i](Fmap, scale=1.0 / scale)
+ flow = flow + flow_d
+
+ if ensemble:
+ x = torch.cat(
+ (img1, img0, 1 - timestep, warped_img0, warped_img1), 1
+ )
+ flowtmp = flow
+ if scale != 1:
+ x = F.interpolate(
+ x, scale_factor=scale, mode="bilinear", align_corners=False
+ )
+ flowtmp = (
+ F.interpolate(
+ flow,
+ scale_factor=scale,
+ mode="bilinear",
+ align_corners=False,
+ )
+ * scale
+ )
+ x = torch.cat((x, flowtmp), 1)
+ # 期待UNet能提取到特征,不再需要ensemble
+ Fmap = self.fmap(x, level=i)
+ flow_d = block[i](Fmap, scale=1.0 / scale)
+ flow2 = flow + flow_d
+ flow = (flow + flow2) / 2
+ else:
+ x = torch.cat((img0, img1, timestep), 1)
+ if scale != 1:
+ x = F.interpolate(
+ x, scale_factor=scale, mode="bilinear", align_corners=False
+ )
+ Fmap = self.fmap(x, level=i)
+ flow = block[i](Fmap, scale=1.0 / scale)
+
+ if ensemble:
+ x = torch.cat((img1, img0, 1 - timestep), 1)
+ if scale != 1:
+ x = F.interpolate(
+ x, scale_factor=scale, mode="bilinear", align_corners=False
+ )
+ Fmap = self.fmap(x, level=i)
+ flow2 = block[i](Fmap, scale=1.0 / scale)
+ flow = (flow + flow2) / 2
+
+ warped_img0 = warp(img0, flow[:, :2])
+ warped_img1 = warp(img1, flow[:, 2:4])
+ return flow, warped_img0, warped_img1
+
+
+class IFUNetModel(nn.Module):
+ def __init__(self, local_rank=-1):
+ super(IFUNetModel, self).__init__()
+ self.flownet = IFUNet()
+ self.fusionnet = RRDBNet()
+ self.refinenet = ResynNet()
+
+ def forward(self, img0, img1, timestep=0.5, scale=1.0, ensemble=False):
+ n, c, h, w = img0.shape
+ ph = ((h - 1) // 64 + 1) * 64
+ pw = ((w - 1) // 64 + 1) * 64
+ padding = (0, pw - w, 0, ph - h)
+ img0 = F.pad(img0, padding)
+ img1 = F.pad(img1, padding)
+
+ imgs = torch.cat((img0, img1), 1)
+ flow, warped_img0, warped_img1 = self.flownet(imgs, scale, timestep, ensemble)
+ mask = self.fusionnet(img0, img1, warped_img0, warped_img1, flow)
+ merged = warped_img0 * mask + warped_img1 * (1 - mask)
+ merged, _ = self.refinenet(imgs, deg=merged, scale=[4, 2, 1])
+ return merged[:, :, :h, :w]
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ifunet/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ifunet/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..bec98675f6cc459a026a0837c90915016c058d79
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ifunet/__init__.py
@@ -0,0 +1,59 @@
+import torch
+from torch.utils.data import DataLoader
+import pathlib
+from vfi_utils import load_file_from_github_release, preprocess_frames, postprocess_frames, generic_frame_loop, InterpolationStateList
+import typing
+from comfy.model_management import get_torch_device
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+CKPT_NAMES = ["IFUNet.pth"]
+
+class IFUnet_VFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (CKPT_NAMES, ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 10, "min": 1, "max": 1000}),
+ "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
+ "scale_factor": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 100, "step": 0.1}),
+ "ensemble": ("BOOLEAN", {"default":True})
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames: typing.SupportsInt = 1,
+ multiplier: typing.SupportsInt = 2,
+ scale_factor: typing.SupportsFloat = 1.0,
+ ensemble: bool = True,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ from .IFUNet_arch import IFUNetModel
+ model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
+ interpolation_model = IFUNetModel()
+ interpolation_model.load_state_dict(torch.load(model_path))
+ interpolation_model.eval().to(get_torch_device())
+ frames = preprocess_frames(frames)
+
+ def return_middle_frame(frame_0, frame_1, timestep, model, scale_factor, ensemble):
+ return model(frame_0, frame_1, timestep=timestep, scale=scale_factor, ensemble=ensemble)
+
+ args = [interpolation_model, scale_factor, ensemble]
+ out = postprocess_frames(
+ generic_frame_loop(type(self).__name__, frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
+ interpolation_states=optional_interpolation_states, dtype=torch.float32)
+ )
+ return (out,)
+
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/m2m/M2M_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/m2m/M2M_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..536f915efa4678bd55884852ad6e3ea386fd3ffe
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/m2m/M2M_arch.py
@@ -0,0 +1,1037 @@
+"""
+https://github.com/feinanshan/M2M_VFI/blob/main/Test/model/py
+https://raw.githubusercontent.com/feinanshan/M2M_VFI/main/Test/model/py
+https://github.com/feinanshan/M2M_VFI/blob/main/Test/model/py
+https://github.com/feinanshan/M2M_VFI/blob/main/Test/model/py
+https://github.com/feinanshan/M2M_VFI/blob/main/Test/model/m2m.py
+"""
+
+import collections
+import math
+import os
+import re
+import torch
+import typing
+from vfi_models.ops import softsplat_func
+from vfi_models.ops import costvol_func
+
+##########################################################
+
+
+objBackwarpcache = {}
+
+
+def backwarp(tenIn: torch.Tensor, tenFlow: torch.Tensor):
+ if (
+ "grid"
+ + str(tenFlow.dtype)
+ + str(tenFlow.device)
+ + str(tenFlow.shape[2])
+ + str(tenFlow.shape[3])
+ not in objBackwarpcache
+ ):
+ tenHor = (
+ torch.linspace(
+ start=-1.0,
+ end=1.0,
+ steps=tenFlow.shape[3],
+ dtype=tenFlow.dtype,
+ device=tenFlow.device,
+ )
+ .view(1, 1, 1, -1)
+ .repeat(1, 1, tenFlow.shape[2], 1)
+ )
+ tenVer = (
+ torch.linspace(
+ start=-1.0,
+ end=1.0,
+ steps=tenFlow.shape[2],
+ dtype=tenFlow.dtype,
+ device=tenFlow.device,
+ )
+ .view(1, 1, -1, 1)
+ .repeat(1, 1, 1, tenFlow.shape[3])
+ )
+
+ objBackwarpcache[
+ "grid"
+ + str(tenFlow.dtype)
+ + str(tenFlow.device)
+ + str(tenFlow.shape[2])
+ + str(tenFlow.shape[3])
+ ] = torch.cat([tenHor, tenVer], 1)
+ # end
+
+ if tenFlow.shape[3] == tenFlow.shape[2]:
+ tenFlow = tenFlow * (2.0 / ((tenFlow.shape[3] and tenFlow.shape[2]) - 1.0))
+
+ elif tenFlow.shape[3] != tenFlow.shape[2]:
+ tenFlow = tenFlow * torch.tensor(
+ data=[2.0 / (tenFlow.shape[3] - 1.0), 2.0 / (tenFlow.shape[2] - 1.0)],
+ dtype=tenFlow.dtype,
+ device=tenFlow.device,
+ ).view(1, 2, 1, 1)
+
+ # end
+
+ return torch.nn.functional.grid_sample(
+ input=tenIn,
+ grid=(
+ objBackwarpcache[
+ "grid"
+ + str(tenFlow.dtype)
+ + str(tenFlow.device)
+ + str(tenFlow.shape[2])
+ + str(tenFlow.shape[3])
+ ]
+ + tenFlow
+ ).permute(0, 2, 3, 1),
+ mode="bilinear",
+ padding_mode="zeros",
+ align_corners=True,
+ )
+
+
+# end
+
+##########################################################
+
+
+class Basic(torch.nn.Module):
+ def __init__(
+ self,
+ strType: str,
+ intChans: typing.List[int],
+ objScratch: typing.Optional[typing.Dict] = None,
+ ):
+ super().__init__()
+
+ self.strType = strType
+ self.netEvenize = None
+ self.netMain = None
+ self.netShortcut = None
+
+ intIn = intChans[0]
+ intOut = intChans[-1]
+ netMain = []
+ intChans = intChans.copy()
+ fltStride = 1.0
+
+ for intPart, strPart in enumerate(self.strType.split("+")[0].split("-")):
+ if strPart.startswith("evenize") == True and intPart == 0:
+
+ class Evenize(torch.nn.Module):
+ def __init__(self, strPad):
+ super().__init__()
+
+ self.strPad = strPad
+
+ # end
+
+ def forward(self, tenIn: torch.Tensor) -> torch.Tensor:
+ intPad = [0, 0, 0, 0]
+
+ if tenIn.shape[3] % 2 != 0:
+ intPad[1] = 1
+ if tenIn.shape[2] % 2 != 0:
+ intPad[3] = 1
+
+ if min(intPad) != 0 or max(intPad) != 0:
+ tenIn = torch.nn.functional.pad(
+ input=tenIn,
+ pad=intPad,
+ mode=self.strPad
+ if self.strPad != "zeros"
+ else "constant",
+ value=0.0,
+ )
+ # end
+
+ return tenIn
+
+ # end
+
+ # end
+
+ strPad = "zeros"
+
+ if "(" in strPart:
+ if "replpad" in strPart.split("(")[1].split(")")[0].split(","):
+ strPad = "replicate"
+ if "reflpad" in strPart.split("(")[1].split(")")[0].split(","):
+ strPad = "reflect"
+ # end
+
+ self.netEvenize = Evenize(strPad)
+
+ elif strPart.startswith("conv") == True:
+ intKsize = 3
+ intPad = 1
+ strPad = "zeros"
+
+ if "(" in strPart:
+ intKsize = int(strPart.split("(")[1].split(")")[0].split(",")[0])
+ intPad = int(math.floor(0.5 * (intKsize - 1)))
+
+ if "replpad" in strPart.split("(")[1].split(")")[0].split(","):
+ strPad = "replicate"
+ if "reflpad" in strPart.split("(")[1].split(")")[0].split(","):
+ strPad = "reflect"
+ # end
+
+ if "nopad" in self.strType.split("+"):
+ intPad = 0
+ # end
+
+ netMain += [
+ torch.nn.Conv2d(
+ in_channels=intChans[0],
+ out_channels=intChans[1],
+ kernel_size=intKsize,
+ stride=1,
+ padding=intPad,
+ padding_mode=strPad,
+ bias="nobias" not in self.strType.split("+"),
+ )
+ ]
+ intChans = intChans[1:]
+ fltStride *= 1.0
+
+ elif strPart.startswith("sconv") == True:
+ intKsize = 3
+ intPad = 1
+ strPad = "zeros"
+
+ if "(" in strPart:
+ intKsize = int(strPart.split("(")[1].split(")")[0].split(",")[0])
+ intPad = int(math.floor(0.5 * (intKsize - 1)))
+
+ if "replpad" in strPart.split("(")[1].split(")")[0].split(","):
+ strPad = "replicate"
+ if "reflpad" in strPart.split("(")[1].split(")")[0].split(","):
+ strPad = "reflect"
+ # end
+
+ if "nopad" in self.strType.split("+"):
+ intPad = 0
+ # end
+
+ netMain += [
+ torch.nn.Conv2d(
+ in_channels=intChans[0],
+ out_channels=intChans[1],
+ kernel_size=intKsize,
+ stride=2,
+ padding=intPad,
+ padding_mode=strPad,
+ bias="nobias" not in self.strType.split("+"),
+ )
+ ]
+ intChans = intChans[1:]
+ fltStride *= 2.0
+
+ elif strPart.startswith("up") == True:
+
+ class Up(torch.nn.Module):
+ def __init__(self, strType):
+ super().__init__()
+
+ self.strType = strType
+
+ # end
+
+ def forward(self, tenIn: torch.Tensor) -> torch.Tensor:
+ if self.strType == "nearest":
+ return torch.nn.functional.interpolate(
+ input=tenIn,
+ scale_factor=2.0,
+ mode="nearest-exact",
+ align_corners=False,
+ )
+
+ elif self.strType == "bilinear":
+ return torch.nn.functional.interpolate(
+ input=tenIn,
+ scale_factor=2.0,
+ mode="bilinear",
+ align_corners=False,
+ )
+
+ elif self.strType == "pyramid":
+ return pyramid(tenIn, None, "up")
+
+ elif self.strType == "shuffle":
+ return torch.nn.functional.pixel_shuffle(
+ tenIn, upscale_factor=2
+ ) # https://github.com/pytorch/pytorch/issues/62854
+
+ # end
+
+ assert False # to make torchscript happy
+
+ # end
+
+ # end
+
+ strType = "bilinear"
+
+ if "(" in strPart:
+ if "nearest" in strPart.split("(")[1].split(")")[0].split(","):
+ strType = "nearest"
+ if "pyramid" in strPart.split("(")[1].split(")")[0].split(","):
+ strType = "pyramid"
+ if "shuffle" in strPart.split("(")[1].split(")")[0].split(","):
+ strType = "shuffle"
+ # end
+
+ netMain += [Up(strType)]
+ fltStride *= 0.5
+
+ elif strPart.startswith("prelu") == True:
+ netMain += [
+ torch.nn.PReLU(
+ num_parameters=1,
+ init=float(strPart.split("(")[1].split(")")[0].split(",")[0]),
+ )
+ ]
+ fltStride *= 1.0
+
+ elif True:
+ assert False
+
+ # end
+ # end
+
+ self.netMain = torch.nn.Sequential(*netMain)
+
+ for strPart in self.strType.split("+")[1:]:
+ if strPart.startswith("skip") == True:
+ if intIn == intOut and fltStride == 1.0:
+ self.netShortcut = torch.nn.Identity()
+
+ elif intIn != intOut and fltStride == 1.0:
+ self.netShortcut = torch.nn.Conv2d(
+ in_channels=intIn,
+ out_channels=intOut,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ bias="nobias" not in self.strType.split("+"),
+ )
+
+ elif intIn == intOut and fltStride != 1.0:
+
+ class Down(torch.nn.Module):
+ def __init__(self, fltScale):
+ super().__init__()
+
+ self.fltScale = fltScale
+
+ # end
+
+ def forward(self, tenIn: torch.Tensor) -> torch.Tensor:
+ return torch.nn.functional.interpolate(
+ input=tenIn,
+ scale_factor=self.fltScale,
+ mode="bilinear",
+ align_corners=False,
+ )
+
+ # end
+
+ # end
+
+ self.netShortcut = Down(1.0 / fltStride)
+
+ elif intIn != intOut and fltStride != 1.0:
+
+ class Down(torch.nn.Module):
+ def __init__(self, fltScale):
+ super().__init__()
+
+ self.fltScale = fltScale
+
+ # end
+
+ def forward(self, tenIn: torch.Tensor) -> torch.Tensor:
+ return torch.nn.functional.interpolate(
+ input=tenIn,
+ scale_factor=self.fltScale,
+ mode="bilinear",
+ align_corners=False,
+ )
+
+ # end
+
+ # end
+
+ self.netShortcut = torch.nn.Sequential(
+ Down(1.0 / fltStride),
+ torch.nn.Conv2d(
+ in_channels=intIn,
+ out_channels=intOut,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ bias="nobias" not in self.strType.split("+"),
+ ),
+ )
+
+ # end
+
+ elif strPart.startswith("...") == True:
+ pass
+
+ # end
+ # end
+
+ assert len(intChans) == 1
+
+ # end
+
+ def forward(self, tenIn: torch.Tensor) -> torch.Tensor:
+ if self.netEvenize is not None:
+ tenIn = self.netEvenize(tenIn)
+ # end
+
+ tenOut = self.netMain(tenIn)
+
+ if self.netShortcut is not None:
+ tenOut = tenOut + self.netShortcut(tenIn)
+ # end
+
+ return tenOut
+
+ # end
+
+
+# end
+
+
+##########################################################
+
+
+class Network(torch.nn.Module):
+ def __init__(self):
+ super().__init__()
+
+ class Extractor(torch.nn.Module):
+ def __init__(self):
+ super().__init__()
+
+ self.netOne = Basic(
+ "evenize(replpad)-sconv(2)-prelu(0.25)-conv(3,replpad)-prelu(0.25)-conv(3,replpad)-prelu(0.25)",
+ [3, 32, 32, 32],
+ None,
+ )
+ self.netTwo = Basic(
+ "evenize(replpad)-sconv(2)-prelu(0.25)-conv(3,replpad)-prelu(0.25)-conv(3,replpad)-prelu(0.25)",
+ [32, 32, 32, 32],
+ None,
+ )
+ self.netThr = Basic(
+ "evenize(replpad)-sconv(2)-prelu(0.25)-conv(3,replpad)-prelu(0.25)-conv(3,replpad)-prelu(0.25)",
+ [32, 32, 32, 32],
+ None,
+ )
+
+ # end
+
+ def forward(self, tenIn):
+ tenOne = self.netOne(tenIn)
+ tenTwo = self.netTwo(tenOne)
+ tenThr = self.netThr(tenTwo)
+ tenFou = torch.nn.functional.avg_pool2d(
+ input=tenThr, kernel_size=2, stride=2, count_include_pad=False
+ )
+ tenFiv = torch.nn.functional.avg_pool2d(
+ input=tenFou, kernel_size=2, stride=2, count_include_pad=False
+ )
+
+ return [tenOne, tenTwo, tenThr, tenFou, tenFiv]
+
+ # end
+
+ # end
+
+ class Decoder(torch.nn.Module):
+ def __init__(self, intChannels):
+ super().__init__()
+
+ self.netCostacti = torch.nn.PReLU(num_parameters=1, init=0.25)
+ self.netMain = Basic(
+ "conv(3,replpad)-prelu(0.25)-conv(3,replpad)-prelu(0.25)-conv(3,replpad)-prelu(0.25)-conv(3,replpad)-prelu(0.25)-conv(3,replpad)-prelu(0.25)-conv(3,replpad)",
+ [intChannels, 128, 128, 96, 64, 32, 2],
+ None,
+ )
+
+ # end
+
+ def forward(self, tenOne, tenTwo, tenFlow):
+ if tenFlow is not None:
+ tenFlow = 2.0 * torch.nn.functional.interpolate(
+ input=tenFlow,
+ scale_factor=2.0,
+ mode="bilinear",
+ align_corners=False,
+ )
+ # end
+
+ tenMain = []
+
+ if tenFlow is None:
+ tenMain.append(tenOne)
+ tenMain.append(self.netCostacti(costvol_func.apply(tenOne, tenTwo)))
+
+ elif tenFlow is not None:
+ tenMain.append(tenOne)
+ tenMain.append(
+ self.netCostacti(
+ costvol_func.apply(
+ tenOne, backwarp(tenTwo, tenFlow.detach())
+ )
+ )
+ )
+ tenMain.append(tenFlow)
+
+ # end
+
+ return (tenFlow if tenFlow is not None else 0.0) + self.netMain(
+ torch.cat(tenMain, 1)
+ )
+
+ # end
+
+ # end
+
+ self.netExtractor = Extractor()
+
+ self.netFiv = Decoder(32 + 81 + 0)
+ self.netFou = Decoder(32 + 81 + 2)
+ self.netThr = Decoder(32 + 81 + 2)
+ self.netTwo = Decoder(32 + 81 + 2)
+ self.netOne = Decoder(32 + 81 + 2)
+
+ # end
+
+ def bidir(self, tenOne, tenTwo):
+ tenOne, tenTwo = list(
+ zip(
+ *[
+ torch.split(tenFeat, [tenOne.shape[0], tenTwo.shape[0]], 0)
+ for tenFeat in self.netExtractor(torch.cat([tenOne, tenTwo], 0))
+ ]
+ )
+ )
+
+ tenFwd = None
+ tenFwd = self.netFiv(tenOne[-1], tenTwo[-1], tenFwd)
+ tenFwd = self.netFou(tenOne[-2], tenTwo[-2], tenFwd)
+ tenFwd = self.netThr(tenOne[-3], tenTwo[-3], tenFwd)
+ tenFwd = self.netTwo(tenOne[-4], tenTwo[-4], tenFwd)
+ tenFwd = self.netOne(tenOne[-5], tenTwo[-5], tenFwd)
+
+ tenBwd = None
+ tenBwd = self.netFiv(tenTwo[-1], tenOne[-1], tenBwd)
+ tenBwd = self.netFou(tenTwo[-2], tenOne[-2], tenBwd)
+ tenBwd = self.netThr(tenTwo[-3], tenOne[-3], tenBwd)
+ tenBwd = self.netTwo(tenTwo[-4], tenOne[-4], tenBwd)
+ tenBwd = self.netOne(tenTwo[-5], tenOne[-5], tenBwd)
+
+ return tenFwd, tenBwd
+
+ # end
+
+
+# end
+
+##########################################################
+
+
+def forwarp_mframe_mask(
+ tenIn1, tenFlow1, t1, tenIn2, tenFlow2, t2, tenMetric1=None, tenMetric2=None
+):
+ def one_fdir(tenIn, tenFlow, td, tenMetric):
+ tenIn = torch.cat(
+ [
+ tenIn * td * (tenMetric).clip(-20.0, 20.0).exp(),
+ td * (tenMetric).clip(-20.0, 20.0).exp(),
+ ],
+ 1,
+ )
+
+ tenOut = softsplat_func.apply(tenIn, tenFlow)
+
+ return tenOut[:, :-1, :, :], tenOut[:, -1:, :, :] + 0.0000001
+
+ flow_num = tenFlow1.shape[0]
+ tenOut = 0
+ tenNormalize = 0
+ for idx in range(flow_num):
+ tenOutF, tenNormalizeF = one_fdir(
+ tenIn1[idx], tenFlow1[idx], t1[idx], tenMetric1[idx]
+ )
+ tenOutB, tenNormalizeB = one_fdir(
+ tenIn2[idx], tenFlow2[idx], t2[idx], tenMetric2[idx]
+ )
+
+ tenOut += tenOutF + tenOutB
+ tenNormalize += tenNormalizeF + tenNormalizeB
+
+ return tenOut / tenNormalize, tenNormalize < 0.00001
+
+
+###################################################################
+
+c = 16
+
+
+def conv(in_planes, out_planes, kernel_size=3, stride=1, padding=1, dilation=1):
+ return torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_planes,
+ out_planes,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ dilation=dilation,
+ bias=True,
+ ),
+ torch.nn.PReLU(out_planes),
+ )
+
+
+def deconv(in_planes, out_planes, kernel_size=4, stride=2, padding=1):
+ return torch.nn.Sequential(
+ torch.torch.nn.ConvTranspose2d(
+ in_channels=in_planes,
+ out_channels=out_planes,
+ kernel_size=4,
+ stride=2,
+ padding=1,
+ bias=True,
+ ),
+ torch.nn.PReLU(out_planes),
+ )
+
+
+class Conv2(torch.nn.Module):
+ def __init__(self, in_planes, out_planes, stride=2):
+ super(Conv2, self).__init__()
+ self.conv1 = conv(in_planes, out_planes, 3, stride, 1)
+ self.conv2 = conv(out_planes, out_planes, 3, 1, 1)
+
+ def forward(self, x):
+ x = self.conv1(x)
+ x = self.conv2(x)
+ return x
+
+
+class Conv2n(torch.nn.Module):
+ def __init__(self, in_planes, out_planes, stride=2):
+ super(Conv2n, self).__init__()
+ self.conv1 = conv(in_planes, in_planes, 3, stride, 1)
+ self.conv2 = conv(in_planes, in_planes, 3, 1, 1)
+ self.conv3 = conv(in_planes, in_planes, 1, 1, 0)
+ self.conv4 = conv(in_planes, out_planes, 1, 1, 0)
+
+ def forward(self, x):
+ x = self.conv1(x)
+ x = self.conv2(x)
+ x = self.conv3(x)
+ x = self.conv4(x)
+ return x
+
+
+#####################################################
+
+
+class ImgPyramid(torch.nn.Module):
+ def __init__(self):
+ super(ImgPyramid, self).__init__()
+ self.conv1 = Conv2(3, c)
+ self.conv2 = Conv2(c, 2 * c)
+ self.conv3 = Conv2(2 * c, 4 * c)
+ self.conv4 = Conv2(4 * c, 8 * c)
+
+ def forward(self, x):
+ x1 = self.conv1(x)
+ x2 = self.conv2(x1)
+ x3 = self.conv3(x2)
+ x4 = self.conv4(x3)
+ return [x1, x2, x3, x4]
+
+
+class EncDec(torch.nn.Module):
+ def __init__(self, branch):
+ super(EncDec, self).__init__()
+ self.branch = branch
+
+ self.down0 = Conv2(8, 2 * c)
+ self.down1 = Conv2(6 * c, 4 * c)
+ self.down2 = Conv2(12 * c, 8 * c)
+ self.down3 = Conv2(24 * c, 16 * c)
+
+ self.up0 = deconv(48 * c, 8 * c)
+ self.up1 = deconv(16 * c, 4 * c)
+ self.up2 = deconv(8 * c, 2 * c)
+ self.up3 = deconv(4 * c, c)
+ self.conv = torch.nn.Conv2d(c, 2 * self.branch, 3, 1, 1)
+
+ self.conv_m = torch.nn.Conv2d(c, 1, 3, 1, 1)
+
+ # For Channel dimennsion
+ self.conv_C = torch.nn.Sequential(
+ torch.nn.AdaptiveAvgPool2d(1),
+ torch.nn.Conv2d(
+ 16 * c,
+ 16 * 16 * c,
+ kernel_size=(1, 1),
+ stride=(1, 1),
+ padding=(0, 0),
+ bias=True,
+ ),
+ torch.nn.Sigmoid(),
+ )
+
+ # For Height dimennsion
+ self.conv_H = torch.nn.Sequential(
+ torch.nn.AdaptiveAvgPool2d((None, 1)),
+ torch.nn.Conv2d(
+ 16 * c, 16, kernel_size=(1, 1), stride=(1, 1), padding=(0, 0), bias=True
+ ),
+ torch.nn.Sigmoid(),
+ )
+
+ # For Width dimennsion
+ self.conv_W = torch.nn.Sequential(
+ torch.nn.AdaptiveAvgPool2d((1, None)),
+ torch.nn.Conv2d(
+ 16 * c, 16, kernel_size=(1, 1), stride=(1, 1), padding=(0, 0), bias=True
+ ),
+ torch.nn.Sigmoid(),
+ )
+
+ self.sigmoid = torch.nn.Sigmoid()
+
+ def forward(self, flow0, flow1, im0, im1, c0, c1):
+ N_, C_, H_, W_ = im0.shape
+
+ wim1 = backwarp(im1, flow0)
+ wim0 = backwarp(im0, flow1)
+ s0_0 = self.down0(torch.cat((flow0, im0, wim1), 1))
+ s1_0 = self.down0(torch.cat((flow1, im1, wim0), 1))
+
+ #########################################################################################
+ flow0 = (
+ torch.nn.functional.interpolate(
+ flow0, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ * 0.5
+ )
+ flow1 = (
+ torch.nn.functional.interpolate(
+ flow1, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ * 0.5
+ )
+
+ wf0 = backwarp(torch.cat((s0_0, c0[0]), 1), flow1)
+ wf1 = backwarp(torch.cat((s1_0, c1[0]), 1), flow0)
+
+ s0_1 = self.down1(torch.cat((s0_0, c0[0], wf1), 1))
+ s1_1 = self.down1(torch.cat((s1_0, c1[0], wf0), 1))
+
+ #########################################################################################
+ flow0 = (
+ torch.nn.functional.interpolate(
+ flow0, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ * 0.5
+ )
+ flow1 = (
+ torch.nn.functional.interpolate(
+ flow1, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ * 0.5
+ )
+
+ wf0 = backwarp(torch.cat((s0_1, c0[1]), 1), flow1)
+ wf1 = backwarp(torch.cat((s1_1, c1[1]), 1), flow0)
+
+ s0_2 = self.down2(torch.cat((s0_1, c0[1], wf1), 1))
+ s1_2 = self.down2(torch.cat((s1_1, c1[1], wf0), 1))
+
+ #########################################################################################
+ flow0 = (
+ torch.nn.functional.interpolate(
+ flow0, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ * 0.5
+ )
+ flow1 = (
+ torch.nn.functional.interpolate(
+ flow1, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ * 0.5
+ )
+
+ wf0 = backwarp(torch.cat((s0_2, c0[2]), 1), flow1)
+ wf1 = backwarp(torch.cat((s1_2, c1[2]), 1), flow0)
+
+ s0_3 = self.down3(torch.cat((s0_2, c0[2], wf1), 1))
+ s1_3 = self.down3(torch.cat((s1_2, c1[2], wf0), 1))
+
+ #########################################################################################
+
+ s0_3_c = self.conv_C(s0_3)
+ s0_3_c = s0_3_c.view(N_, 16, -1, 1, 1)
+
+ s0_3_h = self.conv_H(s0_3)
+ s0_3_h = s0_3_h.view(N_, 16, 1, -1, 1)
+
+ s0_3_w = self.conv_W(s0_3)
+ s0_3_w = s0_3_w.view(N_, 16, 1, 1, -1)
+
+ cube0 = (s0_3_c * s0_3_h * s0_3_w).mean(1)
+
+ s0_3 = s0_3 * cube0
+
+ s1_3_c = self.conv_C(s1_3)
+ s1_3_c = s1_3_c.view(N_, 16, -1, 1, 1)
+
+ s1_3_h = self.conv_H(s1_3)
+ s1_3_h = s1_3_h.view(N_, 16, 1, -1, 1)
+
+ s1_3_w = self.conv_W(s1_3)
+ s1_3_w = s1_3_w.view(N_, 16, 1, 1, -1)
+
+ cube1 = (s1_3_c * s1_3_h * s1_3_w).mean(1)
+
+ s1_3 = s1_3 * cube1
+
+ #########################################################################################
+ flow0 = (
+ torch.nn.functional.interpolate(
+ flow0, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ * 0.5
+ )
+ flow1 = (
+ torch.nn.functional.interpolate(
+ flow1, scale_factor=0.5, mode="bilinear", align_corners=False
+ )
+ * 0.5
+ )
+
+ wf0 = backwarp(torch.cat((s0_3, c0[3]), 1), flow1)
+ wf1 = backwarp(torch.cat((s1_3, c1[3]), 1), flow0)
+
+ x0 = self.up0(torch.cat((s0_3, c0[3], wf1), 1))
+ x1 = self.up0(torch.cat((s1_3, c1[3], wf0), 1))
+
+ x0 = self.up1(torch.cat((s0_2, x0), 1))
+ x1 = self.up1(torch.cat((s1_2, x1), 1))
+
+ x0 = self.up2(torch.cat((s0_1, x0), 1))
+ x1 = self.up2(torch.cat((s1_1, x1), 1))
+
+ x0 = self.up3(torch.cat((s0_0, x0), 1))
+ x1 = self.up3(torch.cat((s1_0, x1), 1))
+
+ m0 = self.sigmoid(self.conv_m(x0)) * 0.8 + 0.1
+ m1 = self.sigmoid(self.conv_m(x1)) * 0.8 + 0.1
+
+ x0 = self.conv(x0)
+ x1 = self.conv(x1)
+
+ return x0, x1, m0.repeat(1, self.branch, 1, 1), m1.repeat(1, self.branch, 1, 1)
+
+
+class M2M_PWC(torch.nn.Module):
+ def __init__(self, ratio=4):
+ super(M2M_PWC, self).__init__()
+ self.branch = 4
+ self.ratio = ratio
+
+ self.netFlow = Network()
+
+ self.paramAlpha = torch.nn.Parameter(10.0 * torch.ones(1, 1, 1, 1))
+
+ class MotionRefineNet(torch.nn.Module):
+ def __init__(self, branch):
+ super(MotionRefineNet, self).__init__()
+ self.branch = branch
+ self.img_pyramid = ImgPyramid()
+ self.motion_encdec = EncDec(branch)
+
+ def forward(self, flow0, flow1, im0, im1, ratio):
+ flow0 = ratio * torch.nn.functional.interpolate(
+ input=flow0,
+ scale_factor=ratio,
+ mode="bilinear",
+ align_corners=False,
+ )
+ flow1 = ratio * torch.nn.functional.interpolate(
+ input=flow1,
+ scale_factor=ratio,
+ mode="bilinear",
+ align_corners=False,
+ )
+
+ c0 = self.img_pyramid(im0)
+ c1 = self.img_pyramid(im1)
+
+ flow_res = self.motion_encdec(flow0, flow1, im0, im1, c0, c1)
+
+ flow0 = flow0.repeat(1, self.branch, 1, 1) + flow_res[0]
+ flow1 = flow1.repeat(1, self.branch, 1, 1) + flow_res[1]
+
+ return flow0, flow1, flow_res[2], flow_res[3]
+
+ self.MRN = MotionRefineNet(self.branch)
+
+ def forward(self, im0, im1, fltTimes=[0.5], ratio=None):
+ if ratio is None:
+ ratio = self.ratio
+
+ intWidth = im0.shape[3] and im1.shape[3]
+ intHeight = im0.shape[2] and im1.shape[2]
+
+ intPadr = ((ratio * 16) - (intWidth % (ratio * 16))) % (ratio * 16)
+ intPadb = ((ratio * 16) - (intHeight % (ratio * 16))) % (ratio * 16)
+
+ im0 = torch.nn.functional.pad(
+ input=im0, pad=[0, intPadr, 0, intPadb], mode="replicate"
+ )
+ im1 = torch.nn.functional.pad(
+ input=im1, pad=[0, intPadr, 0, intPadb], mode="replicate"
+ )
+
+ N_, C_, H_, W_ = im0.shape
+
+ outputs = []
+
+ with torch.set_grad_enabled(False):
+ tenStats = [im0, im1]
+ tenMean_ = sum([tenIn.mean([1, 2, 3], True) for tenIn in tenStats]) / len(
+ tenStats
+ )
+ tenStd_ = (
+ sum(
+ [
+ tenIn.std([1, 2, 3], False, True).square()
+ + (tenMean_ - tenIn.mean([1, 2, 3], True)).square()
+ for tenIn in tenStats
+ ]
+ )
+ / len(tenStats)
+ ).sqrt()
+
+ im0_o = (im0 - tenMean_) / (tenStd_ + 0.0000001)
+ im1_o = (im1 - tenMean_) / (tenStd_ + 0.0000001)
+
+ im0 = (im0 - tenMean_) / (tenStd_ + 0.0000001)
+ im1 = (im1 - tenMean_) / (tenStd_ + 0.0000001)
+
+ im0_ = torch.nn.functional.interpolate(
+ input=im0, scale_factor=2.0 / ratio, mode="bilinear", align_corners=False
+ )
+ im1_ = torch.nn.functional.interpolate(
+ input=im1, scale_factor=2.0 / ratio, mode="bilinear", align_corners=False
+ )
+
+ tenFwd, tenBwd = self.netFlow.bidir(im0_, im1_)
+
+ tenFwd, tenBwd, WeiMF, WeiMB = self.MRN(tenFwd, tenBwd, im0, im1, ratio)
+
+ for fltTime_ in fltTimes:
+ im0 = im0_o.repeat(1, self.branch, 1, 1)
+ im1 = im1_o.repeat(1, self.branch, 1, 1)
+ tenStd = tenStd_.repeat(1, self.branch, 1, 1)
+ tenMean = tenMean_.repeat(1, self.branch, 1, 1)
+ fltTime = fltTime_.repeat(1, self.branch, 1, 1)
+
+ tenFwd = tenFwd.reshape(N_, self.branch, 2, H_, W_).view(
+ N_ * self.branch, 2, H_, W_
+ )
+ tenBwd = tenBwd.reshape(N_, self.branch, 2, H_, W_).view(
+ N_ * self.branch, 2, H_, W_
+ )
+
+ WeiMF = WeiMF.reshape(N_, self.branch, 1, H_, W_).view(
+ N_ * self.branch, 1, H_, W_
+ )
+ WeiMB = WeiMB.reshape(N_, self.branch, 1, H_, W_).view(
+ N_ * self.branch, 1, H_, W_
+ )
+
+ im0 = im0.reshape(N_, self.branch, 3, H_, W_).view(
+ N_ * self.branch, 3, H_, W_
+ )
+ im1 = im1.reshape(N_, self.branch, 3, H_, W_).view(
+ N_ * self.branch, 3, H_, W_
+ )
+
+ tenStd = tenStd.reshape(N_, self.branch, 1, 1, 1).view(
+ N_ * self.branch, 1, 1, 1
+ )
+ tenMean = tenMean.reshape(N_, self.branch, 1, 1, 1).view(
+ N_ * self.branch, 1, 1, 1
+ )
+ fltTime = fltTime.reshape(N_, self.branch, 1, 1, 1).view(
+ N_ * self.branch, 1, 1, 1
+ )
+
+ tenPhotoone = (
+ (
+ 1.0
+ - (
+ WeiMF
+ * (im0 - backwarp(im1, tenFwd).detach()).abs().mean([1], True)
+ )
+ )
+ .clip(0.001, None)
+ .square()
+ )
+ tenPhototwo = (
+ (
+ 1.0
+ - (
+ WeiMB
+ * (im1 - backwarp(im0, tenBwd).detach()).abs().mean([1], True)
+ )
+ )
+ .clip(0.001, None)
+ .square()
+ )
+
+ t0 = fltTime
+ flow0 = tenFwd * t0
+ metric0 = self.paramAlpha * tenPhotoone
+
+ t1 = 1.0 - fltTime
+ flow1 = tenBwd * t1
+ metric1 = self.paramAlpha * tenPhototwo
+
+ flow0 = flow0.reshape(N_, self.branch, 2, H_, W_).permute(1, 0, 2, 3, 4)
+ flow1 = flow1.reshape(N_, self.branch, 2, H_, W_).permute(1, 0, 2, 3, 4)
+
+ metric0 = metric0.reshape(N_, self.branch, 1, H_, W_).permute(1, 0, 2, 3, 4)
+ metric1 = metric1.reshape(N_, self.branch, 1, H_, W_).permute(1, 0, 2, 3, 4)
+
+ im0 = im0.reshape(N_, self.branch, 3, H_, W_).permute(1, 0, 2, 3, 4)
+ im1 = im1.reshape(N_, self.branch, 3, H_, W_).permute(1, 0, 2, 3, 4)
+
+ t0 = t0.reshape(N_, self.branch, 1, 1, 1).permute(1, 0, 2, 3, 4)
+ t1 = t1.reshape(N_, self.branch, 1, 1, 1).permute(1, 0, 2, 3, 4)
+
+ tenOutput, mask = forwarp_mframe_mask(
+ im0, flow0, t1, im1, flow1, t0, metric0, metric1
+ )
+
+ tenOutput = tenOutput + mask * (t1.mean(0) * im0_o + t0.mean(0) * im1_o)
+
+ outputs.append((tenOutput * (tenStd_ + 0.0000001)) + tenMean_)
+
+ return [output[:, :, :intHeight, :intWidth] for output in outputs]
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/m2m/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/m2m/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..88e489e7825b005010e85009843b122aee8edbd6
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/m2m/__init__.py
@@ -0,0 +1,60 @@
+import pathlib
+import torch
+from torch.utils.data import DataLoader
+import pathlib
+from vfi_utils import load_file_from_github_release, preprocess_frames, postprocess_frames
+import typing
+from comfy.model_management import get_torch_device
+from vfi_utils import InterpolationStateList, generic_frame_loop
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+CKPT_NAMES = ["M2M.pth"]
+
+
+class M2M_VFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (CKPT_NAMES, ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 10, "min": 1, "max": 1000}),
+ "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames: typing.SupportsInt = 1,
+ multiplier: typing.SupportsInt = 2,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ from .M2M_arch import M2M_PWC
+ model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
+ interpolation_model = M2M_PWC()
+ interpolation_model.load_state_dict(torch.load(model_path))
+ interpolation_model.eval().to(get_torch_device())
+ frames = preprocess_frames(frames)
+
+ def return_middle_frame(frame_0, frame_1, int_timestep, model):
+ tenSteps = [
+ torch.FloatTensor([int_timestep] * len(frame_0)).view(len(frame_0), 1, 1, 1).to(get_torch_device())
+ ]
+ return model(frame_0, frame_1, tenSteps)[0]
+
+ args = [interpolation_model]
+ out = postprocess_frames(
+ generic_frame_loop(type(self).__name__, frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
+ interpolation_states=optional_interpolation_states, dtype=torch.float32)
+ )
+ return (out,)
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..25b13b405172ab46f9b45769520c58f5c098286d
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/__init__.py
@@ -0,0 +1,22 @@
+import torch.multiprocessing as mp
+
+if mp.current_process().name == "MainProcess":
+ import yaml
+ import os
+ from pathlib import Path
+
+ config_path = Path(Path(__file__).parent.parent.parent.resolve(), "config.yaml")
+
+ if os.path.exists(config_path):
+ config = yaml.load(open(config_path, "r"), Loader=yaml.FullLoader)
+ ops_backend = config["ops_backend"]
+ else:
+ ops_backend = "taichi"
+
+ assert ops_backend in ["taichi", "cupy"]
+
+ if ops_backend == "taichi":
+ from .taichi_ops import softsplat, ModuleSoftsplat, FunctionSoftsplat, softsplat_func, costvol_func, sepconv_func, init, batch_edt, FunctionAdaCoF, ModuleCorrelation, FunctionCorrelation, _FunctionCorrelation
+ else:
+ from .cupy_ops import softsplat, ModuleSoftsplat, FunctionSoftsplat, softsplat_func, costvol_func, sepconv_func, init, batch_edt, FunctionAdaCoF, ModuleCorrelation, FunctionCorrelation, _FunctionCorrelation
+
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..10090797e7a12b14bafe26d0c3235d6e80f82158
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/__init__.py
@@ -0,0 +1,11 @@
+from .costvol import *
+from .sepconv import *
+from .softsplat import *
+from .adacof import *
+from .correlation import *
+from comfy.model_management import is_nvidia, get_torch_device_name, get_torch_device
+
+def init():
+ if not is_nvidia():
+ raise NotImplementedError(f"CuPy ops backend only support CUDA device but found {get_torch_device_name(get_torch_device())} instead. Try Taichi ops backend by editing config.yaml")
+ return
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/adacof.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/adacof.py
new file mode 100644
index 0000000000000000000000000000000000000000..378469045ab9dcb31df62080ba80b2cf5aa9b616
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/adacof.py
@@ -0,0 +1,491 @@
+import torch
+from .utils import cuda_kernel, cuda_launch, cuda_int32
+import math
+
+kernel_AdaCoF_updateOutput = """
+ extern "C" __global__ void kernel_AdaCoF_updateOutput(
+ const int n,
+ const float* input,
+ const float* weight,
+ const float* offset_i,
+ const float* offset_j,
+ float* output
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ float dblOutput = 0.0;
+
+ const int intSample = ( intIndex / SIZE_3(output) / SIZE_2(output) / SIZE_1(output) ) % SIZE_0(output);
+ const int c = ( intIndex / SIZE_3(output) / SIZE_2(output) ) % SIZE_1(output);
+ const int i = ( intIndex / SIZE_3(output) ) % SIZE_2(output);
+ const int j = ( intIndex ) % SIZE_3(output);
+
+ for (int k = 0; k < F_SIZE; k += 1) {
+ for (int l = 0; l < F_SIZE; l += 1) {
+ float w = VALUE_4(weight, intSample, k*F_SIZE+l, i, j);
+ float alpha = VALUE_4(offset_i, intSample, k*F_SIZE+l, i, j);
+ float beta = VALUE_4(offset_j, intSample, k*F_SIZE+l, i, j);
+ int A = (int) alpha;
+ int B = (int) beta;
+
+ int i_k_A = i+k*DILATION+A;
+ if(i_k_A < 0)
+ i_k_A = 0;
+ if(i_k_A > SIZE_2(input) - 1)
+ i_k_A = SIZE_2(input) - 1;
+
+ int j_l_B = j+l*DILATION+B;
+ if(j_l_B < 0)
+ j_l_B = 0;
+ if(j_l_B > SIZE_3(input) - 1)
+ j_l_B = SIZE_3(input) - 1;
+
+ int i_k_A_1 = i+k*DILATION+A+1;
+ if(i_k_A_1 < 0)
+ i_k_A_1 = 0;
+ if(i_k_A_1 > SIZE_2(input) - 1)
+ i_k_A_1 = SIZE_2(input) - 1;
+
+ int j_l_B_1 = j+l*DILATION+B+1;
+ if(j_l_B_1 < 0)
+ j_l_B_1 = 0;
+ if(j_l_B_1 > SIZE_3(input) - 1)
+ j_l_B_1 = SIZE_3(input) - 1;
+
+ dblOutput += w * (
+ VALUE_4(input, intSample, c, i_k_A, j_l_B)*(1-(alpha-(float)A))*(1-(beta-(float)B)) +
+ VALUE_4(input, intSample, c, i_k_A_1, j_l_B)*(alpha-(float)A)*(1-(beta-(float)B)) +
+ VALUE_4(input, intSample, c, i_k_A, j_l_B_1)*(1-(alpha-(float)A))*(beta-(float)B) +
+ VALUE_4(input, intSample, c, i_k_A_1, j_l_B_1)*(alpha-(float)A)*(beta-(float)B)
+ );
+ }
+ }
+
+ output[intIndex] = dblOutput;
+ } }
+"""
+
+kernel_AdaCoF_updateGradWeight = """
+ extern "C" __global__ void kernel_AdaCoF_updateGradWeight(
+ const int n,
+ const float* gradLoss,
+ const float* input,
+ const float* offset_i,
+ const float* offset_j,
+ float* gradWeight
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ float floatOutput = 0.0;
+
+ const int intSample = ( intIndex / SIZE_3(gradWeight) / SIZE_2(gradWeight) / SIZE_1(gradWeight) ) % SIZE_0(gradWeight);
+ const int intDepth = ( intIndex / SIZE_3(gradWeight) / SIZE_2(gradWeight) ) % SIZE_1(gradWeight);
+ const int i = ( intIndex / SIZE_3(gradWeight) ) % SIZE_2(gradWeight);
+ const int j = ( intIndex ) % SIZE_3(gradWeight);
+
+ int k = intDepth / F_SIZE;
+ int l = intDepth % F_SIZE;
+
+ for (int c = 0; c < 3; c++)
+ {
+ float delta = VALUE_4(gradLoss, intSample, c, i, j);
+ float alpha = VALUE_4(offset_i, intSample, k*F_SIZE+l, i, j);
+ float beta = VALUE_4(offset_j, intSample, k*F_SIZE+l, i, j);
+ int A = (int) alpha;
+ int B = (int) beta;
+
+ int i_k_A = i+k*DILATION+A;
+ if(i_k_A < 0)
+ i_k_A = 0;
+ if(i_k_A > SIZE_2(input) - 1)
+ i_k_A = SIZE_2(input) - 1;
+
+ int j_l_B = j+l*DILATION+B;
+ if(j_l_B < 0)
+ j_l_B = 0;
+ if(j_l_B > SIZE_3(input) - 1)
+ j_l_B = SIZE_3(input) - 1;
+
+ int i_k_A_1 = i+k*DILATION+A+1;
+ if(i_k_A_1 < 0)
+ i_k_A_1 = 0;
+ if(i_k_A_1 > SIZE_2(input) - 1)
+ i_k_A_1 = SIZE_2(input) - 1;
+
+ int j_l_B_1 = j+l*DILATION+B+1;
+ if(j_l_B_1 < 0)
+ j_l_B_1 = 0;
+ if(j_l_B_1 > SIZE_3(input) - 1)
+ j_l_B_1 = SIZE_3(input) - 1;
+
+ floatOutput += delta * (
+ VALUE_4(input, intSample, c, i_k_A, j_l_B)*(1-(alpha-(float)A))*(1-(beta-(float)B)) +
+ VALUE_4(input, intSample, c, i_k_A_1, j_l_B)*(alpha-(float)A)*(1-(beta-(float)B)) +
+ VALUE_4(input, intSample, c, i_k_A, j_l_B_1)*(1-(alpha-(float)A))*(beta-(float)B) +
+ VALUE_4(input, intSample, c, i_k_A_1, j_l_B_1)*(alpha-(float)A)*(beta-(float)B)
+ );
+ }
+
+ gradWeight[intIndex] = floatOutput;
+ } }
+"""
+
+kernel_AdaCoF_updateGradAlpha = """
+ extern "C" __global__ void kernel_AdaCoF_updateGradAlpha(
+ const int n,
+ const float* gradLoss,
+ const float* input,
+ const float* weight,
+ const float* offset_i,
+ const float* offset_j,
+ float* gradOffset_i
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ float floatOutput = 0.0;
+
+ const int intSample = ( intIndex / SIZE_3(gradOffset_i) / SIZE_2(gradOffset_i) / SIZE_1(gradOffset_i) ) % SIZE_0(gradOffset_i);
+ const int intDepth = ( intIndex / SIZE_3(gradOffset_i) / SIZE_2(gradOffset_i) ) % SIZE_1(gradOffset_i);
+ const int i = ( intIndex / SIZE_3(gradOffset_i) ) % SIZE_2(gradOffset_i);
+ const int j = ( intIndex ) % SIZE_3(gradOffset_i);
+
+ int k = intDepth / F_SIZE;
+ int l = intDepth % F_SIZE;
+
+ for (int c = 0; c < 3; c++)
+ {
+ float delta = VALUE_4(gradLoss, intSample, c, i, j);
+ float w = VALUE_4(weight, intSample, k*F_SIZE+l, i, j);
+ float alpha = VALUE_4(offset_i, intSample, k*F_SIZE+l, i, j);
+ float beta = VALUE_4(offset_j, intSample, k*F_SIZE+l, i, j);
+ int A = (int) alpha;
+ int B = (int) beta;
+
+ int i_k_A = i+k*DILATION+A;
+ if(i_k_A < 0)
+ i_k_A = 0;
+ if(i_k_A > SIZE_2(input) - 1)
+ i_k_A = SIZE_2(input) - 1;
+
+ int j_l_B = j+l*DILATION+B;
+ if(j_l_B < 0)
+ j_l_B = 0;
+ if(j_l_B > SIZE_3(input) - 1)
+ j_l_B = SIZE_3(input) - 1;
+
+ int i_k_A_1 = i+k*DILATION+A+1;
+ if(i_k_A_1 < 0)
+ i_k_A_1 = 0;
+ if(i_k_A_1 > SIZE_2(input) - 1)
+ i_k_A_1 = SIZE_2(input) - 1;
+
+ int j_l_B_1 = j+l*DILATION+B+1;
+ if(j_l_B_1 < 0)
+ j_l_B_1 = 0;
+ if(j_l_B_1 > SIZE_3(input) - 1)
+ j_l_B_1 = SIZE_3(input) - 1;
+
+ floatOutput += delta * w * (
+ - VALUE_4(input, intSample, c, i_k_A, j_l_B)*(1-(beta-(float)B)) +
+ VALUE_4(input, intSample, c, i_k_A_1, j_l_B)*(1-(beta-(float)B)) -
+ VALUE_4(input, intSample, c, i_k_A, j_l_B_1)*(beta-(float)B) +
+ VALUE_4(input, intSample, c, i_k_A_1, j_l_B_1)*(beta-(float)B)
+ );
+ }
+
+ gradOffset_i[intIndex] = floatOutput;
+ } }
+"""
+
+kernel_AdaCoF_updateGradBeta = """
+ extern "C" __global__ void kernel_AdaCoF_updateGradBeta(
+ const int n,
+ const float* gradLoss,
+ const float* input,
+ const float* weight,
+ const float* offset_i,
+ const float* offset_j,
+ float* gradOffset_j
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ float floatOutput = 0.0;
+
+ const int intSample = ( intIndex / SIZE_3(gradOffset_j) / SIZE_2(gradOffset_j) / SIZE_1(gradOffset_j) ) % SIZE_0(gradOffset_j);
+ const int intDepth = ( intIndex / SIZE_3(gradOffset_j) / SIZE_2(gradOffset_j) ) % SIZE_1(gradOffset_j);
+ const int i = ( intIndex / SIZE_3(gradOffset_j) ) % SIZE_2(gradOffset_j);
+ const int j = ( intIndex ) % SIZE_3(gradOffset_j);
+
+ int k = intDepth / F_SIZE;
+ int l = intDepth % F_SIZE;
+
+ for (int c = 0; c < 3; c++)
+ {
+ float delta = VALUE_4(gradLoss, intSample, c, i, j);
+ float w = VALUE_4(weight, intSample, k*F_SIZE+l, i, j);
+ float alpha = VALUE_4(offset_i, intSample, k*F_SIZE+l, i, j);
+ float beta = VALUE_4(offset_j, intSample, k*F_SIZE+l, i, j);
+ int A = (int) alpha;
+ int B = (int) beta;
+
+ int i_k_A = i+k*DILATION+A;
+ if(i_k_A < 0)
+ i_k_A = 0;
+ if(i_k_A > SIZE_2(input) - 1)
+ i_k_A = SIZE_2(input) - 1;
+
+ int j_l_B = j+l*DILATION+B;
+ if(j_l_B < 0)
+ j_l_B = 0;
+ if(j_l_B > SIZE_3(input) - 1)
+ j_l_B = SIZE_3(input) - 1;
+
+ int i_k_A_1 = i+k*DILATION+A+1;
+ if(i_k_A_1 < 0)
+ i_k_A_1 = 0;
+ if(i_k_A_1 > SIZE_2(input) - 1)
+ i_k_A_1 = SIZE_2(input) - 1;
+
+ int j_l_B_1 = j+l*DILATION+B+1;
+ if(j_l_B_1 < 0)
+ j_l_B_1 = 0;
+ if(j_l_B_1 > SIZE_3(input) - 1)
+ j_l_B_1 = SIZE_3(input) - 1;
+
+ floatOutput += delta * w * (
+ - VALUE_4(input, intSample, c, i_k_A, j_l_B)*(1-(alpha-(float)A)) -
+ VALUE_4(input, intSample, c, i_k_A_1, j_l_B)*(alpha-(float)A) +
+ VALUE_4(input, intSample, c, i_k_A, j_l_B_1)*(1-(alpha-(float)A)) +
+ VALUE_4(input, intSample, c, i_k_A_1, j_l_B_1)*(alpha-(float)A)
+ );
+ }
+
+ gradOffset_j[intIndex] = floatOutput;
+ } }
+"""
+
+class FunctionAdaCoF(torch.autograd.Function):
+ # end
+ @staticmethod
+ def forward(ctx, input, weight, offset_i, offset_j, dilation):
+ ctx.save_for_backward(input, weight, offset_i, offset_j)
+ ctx.dilation = dilation
+
+ intSample = input.size(0)
+ intInputDepth = input.size(1)
+ intInputHeight = input.size(2)
+ intInputWidth = input.size(3)
+ intFilterSize = int(math.sqrt(weight.size(1)))
+ intOutputHeight = weight.size(2)
+ intOutputWidth = weight.size(3)
+
+ assert (
+ intInputHeight - ((intFilterSize - 1) * dilation + 1) == intOutputHeight - 1
+ )
+ assert (
+ intInputWidth - ((intFilterSize - 1) * dilation + 1) == intOutputWidth - 1
+ )
+
+ assert input.is_contiguous() == True
+ assert weight.is_contiguous() == True
+ assert offset_i.is_contiguous() == True
+ assert offset_j.is_contiguous() == True
+
+ output = input.new_zeros(
+ intSample, intInputDepth, intOutputHeight, intOutputWidth
+ )
+
+ if input.is_cuda == True:
+
+ class Stream:
+ ptr = torch.cuda.current_stream().cuda_stream
+
+ # end
+
+ n = output.nelement()
+ cuda_launch(
+ cuda_kernel(
+ "kernel_AdaCoF_updateOutput",
+ kernel_AdaCoF_updateOutput,
+ {
+ "input": input,
+ "weight": weight,
+ "offset_i": offset_i,
+ "offset_j": offset_j,
+ "output": output,
+ },
+ F_SIZE=str(intFilterSize),
+ DILATION=str(dilation)
+ ),
+ )(
+ grid=tuple([int((n + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ n,
+ input.data_ptr(),
+ weight.data_ptr(),
+ offset_i.data_ptr(),
+ offset_j.data_ptr(),
+ output.data_ptr(),
+ ],
+ stream=Stream,
+ )
+
+ elif input.is_cuda == False:
+ raise NotImplementedError()
+
+ # end
+
+ return output
+
+ # end
+ @staticmethod
+ def backward(ctx, gradOutput):
+ input, weight, offset_i, offset_j = ctx.saved_tensors
+ dilation = ctx.dilation
+
+ intSample = input.size(0)
+ intInputDepth = input.size(1)
+ intInputHeight = input.size(2)
+ intInputWidth = input.size(3)
+ intFilterSize = int(math.sqrt(weight.size(1)))
+ intOutputHeight = weight.size(2)
+ intOutputWidth = weight.size(3)
+
+ assert (
+ intInputHeight - ((intFilterSize - 1) * dilation + 1) == intOutputHeight - 1
+ )
+ assert (
+ intInputWidth - ((intFilterSize - 1) * dilation + 1) == intOutputWidth - 1
+ )
+
+ assert gradOutput.is_contiguous() == True
+
+ gradInput = (
+ input.new_zeros(intSample, intInputDepth, intInputHeight, intInputWidth)
+ if ctx.needs_input_grad[0] == True
+ else None
+ )
+ gradWeight = (
+ input.new_zeros(
+ intSample, intFilterSize**2, intOutputHeight, intOutputWidth
+ )
+ if ctx.needs_input_grad[1] == True
+ else None
+ )
+ gradOffset_i = (
+ input.new_zeros(
+ intSample, intFilterSize**2, intOutputHeight, intOutputWidth
+ )
+ if ctx.needs_input_grad[2] == True
+ else None
+ )
+ gradOffset_j = (
+ input.new_zeros(
+ intSample, intFilterSize**2, intOutputHeight, intOutputWidth
+ )
+ if ctx.needs_input_grad[2] == True
+ else None
+ )
+
+ if input.is_cuda == True:
+
+ class Stream:
+ ptr = torch.cuda.current_stream().cuda_stream
+
+ # end
+
+ # weight grad
+ n_w = gradWeight.nelement()
+ cuda_launch(
+ cuda_kernel(
+ "kernel_AdaCoF_updateGradWeight",
+ kernel_AdaCoF_updateGradWeight,
+ {
+ "gradLoss": gradOutput,
+ "input": input,
+ "offset_i": offset_i,
+ "offset_j": offset_j,
+ "gradWeight": gradWeight,
+ },
+ F_SIZE=str(intFilterSize),
+ DILATION=str(dilation)
+ ),
+ )(
+ grid=tuple([int((n_w + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ n_w,
+ gradOutput.data_ptr(),
+ input.data_ptr(),
+ offset_i.data_ptr(),
+ offset_j.data_ptr(),
+ gradWeight.data_ptr(),
+ ],
+ stream=Stream,
+ )
+
+ # alpha grad
+ n_i = gradOffset_i.nelement()
+ cuda_launch(
+ cuda_kernel(
+ "kernel_AdaCoF_updateGradAlpha",
+ kernel_AdaCoF_updateGradAlpha,
+ {
+ "gradLoss": gradOutput,
+ "input": input,
+ "weight": weight,
+ "offset_i": offset_i,
+ "offset_j": offset_j,
+ "gradOffset_i": gradOffset_i,
+ },
+ F_SIZE=str(intFilterSize),
+ DILATION=str(dilation)
+ ),
+ )(
+ grid=tuple([int((n_i + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ n_i,
+ gradOutput.data_ptr(),
+ input.data_ptr(),
+ weight.data_ptr(),
+ offset_i.data_ptr(),
+ offset_j.data_ptr(),
+ gradOffset_i.data_ptr(),
+ ],
+ stream=Stream,
+ )
+
+ # beta grad
+ n_j = gradOffset_j.nelement()
+ cuda_launch(
+ cuda_kernel(
+ "kernel_AdaCoF_updateGradBeta",
+ kernel_AdaCoF_updateGradBeta,
+ {
+ "gradLoss": gradOutput,
+ "input": input,
+ "weight": weight,
+ "offset_i": offset_i,
+ "offset_j": offset_j,
+ "gradOffset_j": gradOffset_j,
+ },
+ F_SIZE=str(intFilterSize),
+ DILATION=str(dilation)
+ ),
+ )(
+ grid=tuple([int((n_j + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ n_j,
+ gradOutput.data_ptr(),
+ input.data_ptr(),
+ weight.data_ptr(),
+ offset_i.data_ptr(),
+ offset_j.data_ptr(),
+ gradOffset_j.data_ptr(),
+ ],
+ stream=Stream,
+ )
+
+ elif input.is_cuda == False:
+ raise NotImplementedError()
+
+ # end
+
+ return gradInput, gradWeight, gradOffset_i, gradOffset_j, None
+
+__all__ = ["FunctionAdaCoF"]
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/batch_edt.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/batch_edt.py
new file mode 100644
index 0000000000000000000000000000000000000000..3c3542c7dc9332417ed898de2f7da5e3f750b298
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/batch_edt.py
@@ -0,0 +1,119 @@
+############### DISTANCE TRANSFORM ###############
+# img tensor: (bs,h,w) or (bs,1,h,w)
+# returns same shape
+# expects white lines, black whitespace
+# defaults to diameter if empty image
+from .utils import cuda_kernel, cuda_launch, cuda_int32, cuda_float32
+import torch
+
+_batch_edt_kernel = (
+ "kernel_dt",
+ """
+ extern "C" __global__ void kernel_dt(
+ const int bs,
+ const int h,
+ const int w,
+ const float diam2,
+ float* data,
+ float* output
+ ) {
+ int idx = blockIdx.x * blockDim.x + threadIdx.x;
+ if (idx >= bs*h*w) {
+ return;
+ }
+ int pb = idx / (h*w);
+ int pi = (idx - h*w*pb) / w;
+ int pj = (idx - h*w*pb - w*pi);
+
+ float cost;
+ float mincost = diam2;
+ for (int j = 0; j < w; j++) {
+ cost = data[h*w*pb + w*pi + j] + (pj-j)*(pj-j);
+ if (cost < mincost) {
+ mincost = cost;
+ }
+ }
+ output[idx] = mincost;
+ return;
+ }
+""",
+)
+_batch_edt = None
+
+
+def batch_edt(img, block=1024):
+ # must initialize cuda/cupy after forking
+ global _batch_edt
+ if _batch_edt is None:
+ _batch_edt = cuda_launch(*_batch_edt_kernel)
+
+ # bookkeeppingg
+ if len(img.shape) == 4:
+ assert img.shape[1] == 1
+ img = img.squeeze(1)
+ expand = True
+ else:
+ expand = False
+ bs, h, w = img.shape
+ diam2 = h**2 + w**2
+ odtype = img.dtype
+ grid = (img.nelement() + block - 1) // block
+
+ # cupy implementation
+ if img.is_cuda:
+ # first pass, y-axis
+ data = ((1 - img.type(torch.float32)) * diam2).contiguous()
+ intermed = torch.zeros_like(data)
+ _batch_edt(
+ grid=(grid, 1, 1),
+ block=(block, 1, 1), # < 1024
+ args=[
+ cuda_int32(bs),
+ cuda_int32(h),
+ cuda_int32(w),
+ cuda_float32(diam2),
+ data.data_ptr(),
+ intermed.data_ptr(),
+ ],
+ )
+
+ # second pass, x-axis
+ intermed = intermed.permute(0, 2, 1).contiguous()
+ out = torch.zeros_like(intermed)
+ _batch_edt(
+ grid=(grid, 1, 1),
+ block=(block, 1, 1),
+ args=[
+ cuda_int32(bs),
+ cuda_int32(w),
+ cuda_int32(h),
+ cuda_float32(diam2),
+ intermed.data_ptr(),
+ out.data_ptr(),
+ ],
+ )
+ ans = out.permute(0, 2, 1).sqrt()
+ ans = ans.type(odtype) if odtype != ans.dtype else ans
+
+ # default to scipy cpu implementation
+ else:
+ raise NotImplementedError()
+ """ sums = img.sum(dim=(1, 2))
+ ans = torch.tensor(
+ np.stack(
+ [
+ scipy.ndimage.morphology.distance_transform_edt(i)
+ if s != 0
+ else np.ones_like(i) # change scipy behavior for empty image
+ * np.sqrt(diam2)
+ for i, s in zip(1 - img, sums)
+ ]
+ ),
+ dtype=odtype,
+ ) """
+
+ if expand:
+ ans = ans.unsqueeze(1)
+ return ans
+
+__all__ = ["batch_edt"]
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/correlation.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/correlation.py
new file mode 100644
index 0000000000000000000000000000000000000000..d1e69e2dbbba453ab367dc76a1c3c566d2f5540c
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/correlation.py
@@ -0,0 +1,413 @@
+import torch
+from .utils import cuda_kernel, cuda_launch, cuda_int32
+
+kernel_Correlation_rearrange = """
+ extern "C" __global__ void kernel_Correlation_rearrange(
+ const int n,
+ const float* input,
+ float* output
+ ) {
+ int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x;
+
+ if (intIndex >= n) {
+ return;
+ }
+
+ int intSample = blockIdx.z;
+ int intChannel = blockIdx.y;
+
+ float fltValue = input[(((intSample * SIZE_1(input)) + intChannel) * SIZE_2(input) * SIZE_3(input)) + intIndex];
+
+ __syncthreads();
+
+ int intPaddedY = (intIndex / SIZE_3(input)) + 4;
+ int intPaddedX = (intIndex % SIZE_3(input)) + 4;
+ int intRearrange = ((SIZE_3(input) + 8) * intPaddedY) + intPaddedX;
+
+ output[(((intSample * SIZE_1(output) * SIZE_2(output)) + intRearrange) * SIZE_1(input)) + intChannel] = fltValue;
+ }
+"""
+
+kernel_Correlation_updateOutput = """
+ extern "C" __global__ void kernel_Correlation_updateOutput(
+ const int n,
+ const float* rbot0,
+ const float* rbot1,
+ float* top
+ ) {
+ extern __shared__ char patch_data_char[];
+
+ float *patch_data = (float *)patch_data_char;
+
+ // First (upper left) position of kernel upper-left corner in current center position of neighborhood in image 1
+ int x1 = blockIdx.x + 4;
+ int y1 = blockIdx.y + 4;
+ int item = blockIdx.z;
+ int ch_off = threadIdx.x;
+
+ // Load 3D patch into shared shared memory
+ for (int j = 0; j < 1; j++) { // HEIGHT
+ for (int i = 0; i < 1; i++) { // WIDTH
+ int ji_off = (j + i) * SIZE_3(rbot0);
+ for (int ch = ch_off; ch < SIZE_3(rbot0); ch += 32) { // CHANNELS
+ int idx1 = ((item * SIZE_1(rbot0) + y1+j) * SIZE_2(rbot0) + x1+i) * SIZE_3(rbot0) + ch;
+ int idxPatchData = ji_off + ch;
+ patch_data[idxPatchData] = rbot0[idx1];
+ }
+ }
+ }
+
+ __syncthreads();
+
+ __shared__ float sum[32];
+
+ // Compute correlation
+ for (int top_channel = 0; top_channel < SIZE_1(top); top_channel++) {
+ sum[ch_off] = 0;
+
+ int s2o = top_channel % 9 - 4;
+ int s2p = top_channel / 9 - 4;
+
+ for (int j = 0; j < 1; j++) { // HEIGHT
+ for (int i = 0; i < 1; i++) { // WIDTH
+ int ji_off = (j + i) * SIZE_3(rbot0);
+ for (int ch = ch_off; ch < SIZE_3(rbot0); ch += 32) { // CHANNELS
+ int x2 = x1 + s2o;
+ int y2 = y1 + s2p;
+
+ int idxPatchData = ji_off + ch;
+ int idx2 = ((item * SIZE_1(rbot0) + y2+j) * SIZE_2(rbot0) + x2+i) * SIZE_3(rbot0) + ch;
+
+ sum[ch_off] += patch_data[idxPatchData] * rbot1[idx2];
+ }
+ }
+ }
+
+ __syncthreads();
+
+ if (ch_off == 0) {
+ float total_sum = 0;
+ for (int idx = 0; idx < 32; idx++) {
+ total_sum += sum[idx];
+ }
+ const int sumelems = SIZE_3(rbot0);
+ const int index = ((top_channel*SIZE_2(top) + blockIdx.y)*SIZE_3(top))+blockIdx.x;
+ top[index + item*SIZE_1(top)*SIZE_2(top)*SIZE_3(top)] = total_sum / (float)sumelems;
+ }
+ }
+ }
+"""
+
+kernel_Correlation_updateGradFirst = """
+ #define ROUND_OFF 50000
+
+ extern "C" __global__ void kernel_Correlation_updateGradFirst(
+ const int n,
+ const int intSample,
+ const float* rbot0,
+ const float* rbot1,
+ const float* gradOutput,
+ float* gradFirst,
+ float* gradSecond
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ int n = intIndex % SIZE_1(gradFirst); // channels
+ int l = (intIndex / SIZE_1(gradFirst)) % SIZE_3(gradFirst) + 4; // w-pos
+ int m = (intIndex / SIZE_1(gradFirst) / SIZE_3(gradFirst)) % SIZE_2(gradFirst) + 4; // h-pos
+
+ // round_off is a trick to enable integer division with ceil, even for negative numbers
+ // We use a large offset, for the inner part not to become negative.
+ const int round_off = ROUND_OFF;
+ const int round_off_s1 = round_off;
+
+ // We add round_off before_s1 the int division and subtract round_off after it, to ensure the formula matches ceil behavior:
+ int xmin = (l - 4 + round_off_s1 - 1) + 1 - round_off; // ceil (l - 4)
+ int ymin = (m - 4 + round_off_s1 - 1) + 1 - round_off; // ceil (l - 4)
+
+ // Same here:
+ int xmax = (l - 4 + round_off_s1) - round_off; // floor (l - 4)
+ int ymax = (m - 4 + round_off_s1) - round_off; // floor (m - 4)
+
+ float sum = 0;
+ if (xmax>=0 && ymax>=0 && (xmin<=SIZE_3(gradOutput)-1) && (ymin<=SIZE_2(gradOutput)-1)) {
+ xmin = max(0,xmin);
+ xmax = min(SIZE_3(gradOutput)-1,xmax);
+
+ ymin = max(0,ymin);
+ ymax = min(SIZE_2(gradOutput)-1,ymax);
+
+ for (int p = -4; p <= 4; p++) {
+ for (int o = -4; o <= 4; o++) {
+ // Get rbot1 data:
+ int s2o = o;
+ int s2p = p;
+ int idxbot1 = ((intSample * SIZE_1(rbot0) + (m+s2p)) * SIZE_2(rbot0) + (l+s2o)) * SIZE_3(rbot0) + n;
+ float bot1tmp = rbot1[idxbot1]; // rbot1[l+s2o,m+s2p,n]
+
+ // Index offset for gradOutput in following loops:
+ int op = (p+4) * 9 + (o+4); // index[o,p]
+ int idxopoffset = (intSample * SIZE_1(gradOutput) + op);
+
+ for (int y = ymin; y <= ymax; y++) {
+ for (int x = xmin; x <= xmax; x++) {
+ int idxgradOutput = (idxopoffset * SIZE_2(gradOutput) + y) * SIZE_3(gradOutput) + x; // gradOutput[x,y,o,p]
+ sum += gradOutput[idxgradOutput] * bot1tmp;
+ }
+ }
+ }
+ }
+ }
+ const int sumelems = SIZE_1(gradFirst);
+ const int bot0index = ((n * SIZE_2(gradFirst)) + (m-4)) * SIZE_3(gradFirst) + (l-4);
+ gradFirst[bot0index + intSample*SIZE_1(gradFirst)*SIZE_2(gradFirst)*SIZE_3(gradFirst)] = sum / (float)sumelems;
+ } }
+"""
+
+kernel_Correlation_updateGradSecond = """
+ #define ROUND_OFF 50000
+
+ extern "C" __global__ void kernel_Correlation_updateGradSecond(
+ const int n,
+ const int intSample,
+ const float* rbot0,
+ const float* rbot1,
+ const float* gradOutput,
+ float* gradFirst,
+ float* gradSecond
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ int n = intIndex % SIZE_1(gradSecond); // channels
+ int l = (intIndex / SIZE_1(gradSecond)) % SIZE_3(gradSecond) + 4; // w-pos
+ int m = (intIndex / SIZE_1(gradSecond) / SIZE_3(gradSecond)) % SIZE_2(gradSecond) + 4; // h-pos
+
+ // round_off is a trick to enable integer division with ceil, even for negative numbers
+ // We use a large offset, for the inner part not to become negative.
+ const int round_off = ROUND_OFF;
+ const int round_off_s1 = round_off;
+
+ float sum = 0;
+ for (int p = -4; p <= 4; p++) {
+ for (int o = -4; o <= 4; o++) {
+ int s2o = o;
+ int s2p = p;
+
+ //Get X,Y ranges and clamp
+ // We add round_off before_s1 the int division and subtract round_off after it, to ensure the formula matches ceil behavior:
+ int xmin = (l - 4 - s2o + round_off_s1 - 1) + 1 - round_off; // ceil (l - 4 - s2o)
+ int ymin = (m - 4 - s2p + round_off_s1 - 1) + 1 - round_off; // ceil (l - 4 - s2o)
+
+ // Same here:
+ int xmax = (l - 4 - s2o + round_off_s1) - round_off; // floor (l - 4 - s2o)
+ int ymax = (m - 4 - s2p + round_off_s1) - round_off; // floor (m - 4 - s2p)
+
+ if (xmax>=0 && ymax>=0 && (xmin<=SIZE_3(gradOutput)-1) && (ymin<=SIZE_2(gradOutput)-1)) {
+ xmin = max(0,xmin);
+ xmax = min(SIZE_3(gradOutput)-1,xmax);
+
+ ymin = max(0,ymin);
+ ymax = min(SIZE_2(gradOutput)-1,ymax);
+
+ // Get rbot0 data:
+ int idxbot0 = ((intSample * SIZE_1(rbot0) + (m-s2p)) * SIZE_2(rbot0) + (l-s2o)) * SIZE_3(rbot0) + n;
+ float bot0tmp = rbot0[idxbot0]; // rbot1[l+s2o,m+s2p,n]
+
+ // Index offset for gradOutput in following loops:
+ int op = (p+4) * 9 + (o+4); // index[o,p]
+ int idxopoffset = (intSample * SIZE_1(gradOutput) + op);
+
+ for (int y = ymin; y <= ymax; y++) {
+ for (int x = xmin; x <= xmax; x++) {
+ int idxgradOutput = (idxopoffset * SIZE_2(gradOutput) + y) * SIZE_3(gradOutput) + x; // gradOutput[x,y,o,p]
+ sum += gradOutput[idxgradOutput] * bot0tmp;
+ }
+ }
+ }
+ }
+ }
+ const int sumelems = SIZE_1(gradSecond);
+ const int bot1index = ((n * SIZE_2(gradSecond)) + (m-4)) * SIZE_3(gradSecond) + (l-4);
+ gradSecond[bot1index + intSample*SIZE_1(gradSecond)*SIZE_2(gradSecond)*SIZE_3(gradSecond)] = sum / (float)sumelems;
+ } }
+"""
+
+
+class _FunctionCorrelation(torch.autograd.Function):
+ @staticmethod
+ def forward(self, first, second):
+ rbot0 = first.new_zeros(
+ [first.shape[0], first.shape[2] + 8, first.shape[3] + 8, first.shape[1]]
+ )
+ rbot1 = first.new_zeros(
+ [first.shape[0], first.shape[2] + 8, first.shape[3] + 8, first.shape[1]]
+ )
+
+ self.save_for_backward(first, second, rbot0, rbot1)
+
+ first = first.contiguous()
+ assert first.is_cuda == True
+ second = second.contiguous()
+ assert second.is_cuda == True
+
+ output = first.new_zeros([first.shape[0], 81, first.shape[2], first.shape[3]])
+
+ if first.is_cuda == True:
+ n = first.shape[2] * first.shape[3]
+ cuda_launch(
+ cuda_kernel(
+ "kernel_Correlation_rearrange", kernel_Correlation_rearrange, {"input": first, "output": rbot0}
+ ),
+ )(
+ grid=tuple([int((n + 16 - 1) / 16), first.shape[1], first.shape[0]]),
+ block=tuple([16, 1, 1]),
+ args=[n, first.data_ptr(), rbot0.data_ptr()],
+ )
+
+ n = second.shape[2] * second.shape[3]
+ cuda_launch(
+ cuda_kernel(
+ "kernel_Correlation_rearrange", kernel_Correlation_rearrange, {"input": second, "output": rbot1}
+ ),
+ )(
+ grid=tuple([int((n + 16 - 1) / 16), second.shape[1], second.shape[0]]),
+ block=tuple([16, 1, 1]),
+ args=[n, second.data_ptr(), rbot1.data_ptr()],
+ )
+
+ n = output.shape[1] * output.shape[2] * output.shape[3]
+ cuda_launch(
+ cuda_kernel(
+ "kernel_Correlation_updateOutput",
+ kernel_Correlation_updateOutput,
+ {"rbot0": rbot0, "rbot1": rbot1, "top": output},
+ ),
+ )(
+ grid=tuple([output.shape[3], output.shape[2], output.shape[0]]),
+ block=tuple([32, 1, 1]),
+ shared_mem=first.shape[1] * 4,
+ args=[n, rbot0.data_ptr(), rbot1.data_ptr(), output.data_ptr()],
+ )
+
+ elif first.is_cuda == False:
+ raise NotImplementedError()
+
+ # end
+
+ return output
+
+ # end
+
+ @staticmethod
+ def backward(self, gradOutput):
+ first, second, rbot0, rbot1 = self.saved_tensors
+
+ gradOutput = gradOutput.contiguous()
+ assert gradOutput.is_cuda == True
+
+ gradFirst = (
+ first.new_zeros(
+ [first.shape[0], first.shape[1], first.shape[2], first.shape[3]]
+ )
+ if self.needs_input_grad[0] == True
+ else None
+ )
+ gradSecond = (
+ first.new_zeros(
+ [first.shape[0], first.shape[1], first.shape[2], first.shape[3]]
+ )
+ if self.needs_input_grad[1] == True
+ else None
+ )
+
+ if first.is_cuda == True:
+ if gradFirst is not None:
+ for intSample in range(first.shape[0]):
+ n = first.shape[1] * first.shape[2] * first.shape[3]
+ cuda_launch(
+ cuda_kernel(
+ "kernel_Correlation_updateGradFirst",
+ kernel_Correlation_updateGradFirst,
+ {
+ "rbot0": rbot0,
+ "rbot1": rbot1,
+ "gradOutput": gradOutput,
+ "gradFirst": gradFirst,
+ "gradSecond": None,
+ },
+ ),
+ )(
+ grid=tuple([int((n + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ n,
+ intSample,
+ rbot0.data_ptr(),
+ rbot1.data_ptr(),
+ gradOutput.data_ptr(),
+ gradFirst.data_ptr(),
+ None,
+ ],
+ )
+ # end
+ # end
+
+ if gradSecond is not None:
+ for intSample in range(first.shape[0]):
+ n = first.shape[1] * first.shape[2] * first.shape[3]
+ cuda_launch(
+ cuda_kernel(
+ "kernel_Correlation_updateGradSecond",
+ kernel_Correlation_updateGradSecond,
+ {
+ "rbot0": rbot0,
+ "rbot1": rbot1,
+ "gradOutput": gradOutput,
+ "gradFirst": None,
+ "gradSecond": gradSecond,
+ },
+ ),
+ )(
+ grid=tuple([int((n + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ n,
+ intSample,
+ rbot0.data_ptr(),
+ rbot1.data_ptr(),
+ gradOutput.data_ptr(),
+ None,
+ gradSecond.data_ptr(),
+ ],
+ )
+ # end
+ # end
+
+ elif first.is_cuda == False:
+ raise NotImplementedError()
+
+ # end
+
+ return gradFirst, gradSecond
+
+ # end
+
+
+# end
+
+
+def FunctionCorrelation(tenFirst, tenSecond):
+ return _FunctionCorrelation.apply(tenFirst, tenSecond)
+
+
+# end
+
+
+class ModuleCorrelation(torch.nn.Module):
+ def __init__(self):
+ super(ModuleCorrelation, self).__init__()
+
+ # end
+
+ def forward(self, tenFirst, tenSecond):
+ return _FunctionCorrelation.apply(tenFirst, tenSecond)
+
+ # end
+
+__all__ = ["_FunctionCorrelation", "FunctionCorrelation", "ModuleCorrelation"]
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/costvol.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/costvol.py
new file mode 100644
index 0000000000000000000000000000000000000000..070dd483be1716de1a3986034eaaeb9cddda9ee9
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/costvol.py
@@ -0,0 +1,317 @@
+from .utils import cuda_kernel, cuda_launch, cuda_int32
+import torch, collections
+
+costvol_out = """
+ extern "C" __global__ void __launch_bounds__(512) costvol_out(
+ const int n,
+ const {{type}}* __restrict__ tenOne,
+ const {{type}}* __restrict__ tenTwo,
+ {{type}}* __restrict__ tenOut
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ const int intN = ( intIndex / SIZE_3(tenOut) / SIZE_2(tenOut) ) % SIZE_0(tenOut);
+ const int intC = -1;
+ const int intY = ( intIndex / SIZE_3(tenOut) ) % SIZE_2(tenOut);
+ const int intX = ( intIndex ) % SIZE_3(tenOut);
+
+ {{type}} fltOne[{{intChans}}];
+
+ for (int intValue = 0; intValue < SIZE_1(tenOne); intValue += 1) {
+ fltOne[intValue] = VALUE_4(tenOne, intN, intValue, intY, intX);
+ }
+
+ int intOffset = OFFSET_4(tenOut, intN, 0, intY, intX);
+
+ for (int intOy = intY - 4; intOy <= intY + 4; intOy += 1) {
+ for (int intOx = intX - 4; intOx <= intX + 4; intOx += 1) {
+ {{type}} fltValue = 0.0f;
+
+ if ((intOy >= 0) && (intOy < SIZE_2(tenOut)) && (intOx >= 0) && (intOx < SIZE_3(tenOut))) {
+ for (int intValue = 0; intValue < SIZE_1(tenOne); intValue += 1) {
+ fltValue += abs(fltOne[intValue] - VALUE_4(tenTwo, intN, intValue, intOy, intOx));
+ }
+ } else {
+ for (int intValue = 0; intValue < SIZE_1(tenOne); intValue += 1) {
+ fltValue += abs(fltOne[intValue]);
+ }
+ }
+
+ tenOut[intOffset] = fltValue / SIZE_1(tenOne);
+ intOffset += SIZE_2(tenOut) * SIZE_3(tenOut);
+ }
+ }
+ } }
+"""
+
+costvol_onegrad = """
+ extern "C" __global__ void __launch_bounds__(512) costvol_onegrad(
+ const int n,
+ const {{type}}* __restrict__ tenOne,
+ const {{type}}* __restrict__ tenTwo,
+ const {{type}}* __restrict__ tenOutgrad,
+ {{type}}* __restrict__ tenOnegrad,
+ {{type}}* __restrict__ tenTwograd
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ const int intN = ( intIndex / SIZE_3(tenOnegrad) / SIZE_2(tenOnegrad) ) % SIZE_0(tenOnegrad);
+ const int intC = -1;
+ const int intY = ( intIndex / SIZE_3(tenOnegrad) ) % SIZE_2(tenOnegrad);
+ const int intX = ( intIndex ) % SIZE_3(tenOnegrad);
+
+ {{type}} fltOne[{{intChans}}];
+
+ for (int intValue = 0; intValue < SIZE_1(tenOne); intValue += 1) {
+ fltOne[intValue] = VALUE_4(tenOne, intN, intValue, intY, intX);
+ }
+
+ int intOffset = OFFSET_4(tenOutgrad, intN, 0, intY, intX);
+
+ for (int intOy = intY - 4; intOy <= intY + 4; intOy += 1) {
+ for (int intOx = intX - 4; intOx <= intX + 4; intOx += 1) {
+ if ((intOy >= 0) && (intOy < SIZE_2(tenOutgrad)) && (intOx >= 0) && (intOx < SIZE_3(tenOutgrad))) {
+ for (int intValue = 0; intValue < SIZE_1(tenOne); intValue += 1) {
+ if (fltOne[intValue] - VALUE_4(tenTwo, intN, intValue, intOy, intOx) >= 0.0f) {
+ tenOnegrad[OFFSET_4(tenOnegrad, intN, intValue, intY, intX)] += +tenOutgrad[intOffset] / SIZE_1(tenOne);
+ } else {
+ tenOnegrad[OFFSET_4(tenOnegrad, intN, intValue, intY, intX)] += -tenOutgrad[intOffset] / SIZE_1(tenOne);
+ }
+ }
+ } else {
+ for (int intValue = 0; intValue < SIZE_1(tenOne); intValue += 1) {
+ if (fltOne[intValue] >= 0.0f) {
+ tenOnegrad[OFFSET_4(tenOnegrad, intN, intValue, intY, intX)] += +tenOutgrad[intOffset] / SIZE_1(tenOne);
+ } else {
+ tenOnegrad[OFFSET_4(tenOnegrad, intN, intValue, intY, intX)] += -tenOutgrad[intOffset] / SIZE_1(tenOne);
+ }
+ }
+ }
+
+ intOffset += SIZE_2(tenOutgrad) * SIZE_3(tenOutgrad);
+ }
+ }
+ } }
+"""
+
+costvol_twograd = """
+ extern "C" __global__ void __launch_bounds__(512) costvol_twograd(
+ const int n,
+ const {{type}}* __restrict__ tenOne,
+ const {{type}}* __restrict__ tenTwo,
+ const {{type}}* __restrict__ tenOutgrad,
+ {{type}}* __restrict__ tenOnegrad,
+ {{type}}* __restrict__ tenTwograd
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ const int intN = ( intIndex / SIZE_3(tenTwograd) / SIZE_2(tenTwograd) ) % SIZE_0(tenTwograd);
+ const int intC = -1;
+ const int intY = ( intIndex / SIZE_3(tenTwograd) ) % SIZE_2(tenTwograd);
+ const int intX = ( intIndex ) % SIZE_3(tenTwograd);
+
+ {{type}} fltOne[{{intChans}}];
+
+ for (int intValue = 0; intValue < SIZE_1(tenOne); intValue += 1) {
+ fltOne[intValue] = VALUE_4(tenOne, intN, intValue, intY, intX);
+ }
+
+ int intOffset = OFFSET_4(tenOutgrad, intN, 0, intY, intX);
+
+ for (int intOy = intY - 4; intOy <= intY + 4; intOy += 1) {
+ for (int intOx = intX - 4; intOx <= intX + 4; intOx += 1) {
+ if ((intOy >= 0) && (intOy < SIZE_2(tenOutgrad)) && (intOx >= 0) && (intOx < SIZE_3(tenOutgrad))) {
+ for (int intValue = 0; intValue < SIZE_1(tenOne); intValue += 1) {
+ if (fltOne[intValue] - VALUE_4(tenTwo, intN, intValue, intOy, intOx) >= 0.0f) {
+ atomicAdd(&tenTwograd[OFFSET_4(tenTwograd, intN, intValue, intOy, intOx)], -tenOutgrad[intOffset] / SIZE_1(tenOne));
+ } else {
+ atomicAdd(&tenTwograd[OFFSET_4(tenTwograd, intN, intValue, intOy, intOx)], +tenOutgrad[intOffset] / SIZE_1(tenOne));
+ }
+ }
+ } else {
+ // ...
+ }
+
+ intOffset += SIZE_2(tenOutgrad) * SIZE_3(tenOutgrad);
+ }
+ }
+ } }
+"""
+
+class costvol_func(torch.autograd.Function):
+ @staticmethod
+ @torch.cuda.amp.custom_fwd(cast_inputs=torch.float32)
+ def forward(self, tenOne, tenTwo):
+ tenOut = tenOne.new_empty(
+ [tenOne.shape[0], 81, tenOne.shape[2], tenOne.shape[3]]
+ )
+
+ cuda_launch(
+ cuda_kernel(
+ "costvol_out",
+ costvol_out,
+ {
+ "intChans": tenOne.shape[1],
+ "tenOne": tenOne,
+ "tenTwo": tenTwo,
+ "tenOut": tenOut,
+ },
+ )
+ )(
+ grid=tuple(
+ [
+ int(
+ (
+ (tenOut.shape[0] * tenOut.shape[2] * tenOut.shape[3])
+ + 512
+ - 1
+ )
+ / 512
+ ),
+ 1,
+ 1,
+ ]
+ ),
+ block=tuple([512, 1, 1]),
+ args=[
+ cuda_int32(tenOut.shape[0] * tenOut.shape[2] * tenOut.shape[3]),
+ tenOne.data_ptr(),
+ tenTwo.data_ptr(),
+ tenOut.data_ptr(),
+ ],
+ stream=collections.namedtuple("Stream", "ptr")(
+ torch.cuda.current_stream().cuda_stream
+ ),
+ )
+
+ self.save_for_backward(tenOne, tenTwo)
+
+ return tenOut
+
+ # end
+
+ @staticmethod
+ @torch.cuda.amp.custom_bwd
+ def backward(self, tenOutgrad):
+ tenOne, tenTwo = self.saved_tensors
+
+ tenOutgrad = tenOutgrad.contiguous()
+ assert tenOutgrad.is_cuda == True
+
+ tenOnegrad = (
+ tenOne.new_zeros(
+ [tenOne.shape[0], tenOne.shape[1], tenOne.shape[2], tenOne.shape[3]]
+ )
+ if self.needs_input_grad[0] == True
+ else None
+ )
+ tenTwograd = (
+ tenTwo.new_zeros(
+ [tenTwo.shape[0], tenTwo.shape[1], tenTwo.shape[2], tenTwo.shape[3]]
+ )
+ if self.needs_input_grad[1] == True
+ else None
+ )
+
+ if tenOnegrad is not None:
+ cuda_launch(
+ cuda_kernel(
+ "costvol_onegrad",
+ costvol_onegrad,
+ {
+ "intChans": tenOne.shape[1],
+ "tenOne": tenOne,
+ "tenTwo": tenTwo,
+ "tenOutgrad": tenOutgrad,
+ "tenOnegrad": tenOnegrad,
+ "tenTwograd": tenTwograd,
+ },
+ )
+ )(
+ grid=tuple(
+ [
+ int(
+ (
+ (
+ tenOnegrad.shape[0]
+ * tenOnegrad.shape[2]
+ * tenOnegrad.shape[3]
+ )
+ + 512
+ - 1
+ )
+ / 512
+ ),
+ 1,
+ 1,
+ ]
+ ),
+ block=tuple([512, 1, 1]),
+ args=[
+ cuda_int32(
+ tenOnegrad.shape[0] * tenOnegrad.shape[2] * tenOnegrad.shape[3]
+ ),
+ tenOne.data_ptr(),
+ tenTwo.data_ptr(),
+ tenOutgrad.data_ptr(),
+ tenOnegrad.data_ptr(),
+ tenTwograd.data_ptr(),
+ ],
+ stream=collections.namedtuple("Stream", "ptr")(
+ torch.cuda.current_stream().cuda_stream
+ ),
+ )
+ # end
+
+ if tenTwograd is not None:
+ cuda_launch(
+ cuda_kernel(
+ "costvol_twograd",
+ costvol_twograd,
+ {
+ "intChans": tenOne.shape[1],
+ "tenOne": tenOne,
+ "tenTwo": tenTwo,
+ "tenOutgrad": tenOutgrad,
+ "tenOnegrad": tenOnegrad,
+ "tenTwograd": tenTwograd,
+ },
+ )
+ )(
+ grid=tuple(
+ [
+ int(
+ (
+ (
+ tenTwograd.shape[0]
+ * tenTwograd.shape[2]
+ * tenTwograd.shape[3]
+ )
+ + 512
+ - 1
+ )
+ / 512
+ ),
+ 1,
+ 1,
+ ]
+ ),
+ block=tuple([512, 1, 1]),
+ args=[
+ cuda_int32(
+ tenTwograd.shape[0] * tenTwograd.shape[2] * tenTwograd.shape[3]
+ ),
+ tenOne.data_ptr(),
+ tenTwo.data_ptr(),
+ tenOutgrad.data_ptr(),
+ tenOnegrad.data_ptr(),
+ tenTwograd.data_ptr(),
+ ],
+ stream=collections.namedtuple("Stream", "ptr")(
+ torch.cuda.current_stream().cuda_stream
+ ),
+ )
+ # end
+
+ return tenOnegrad, tenTwograd, None, None
+
+ # end
+
+
+# end
+
+__all__ = ["costvol_func"]
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/sepconv.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/sepconv.py
new file mode 100644
index 0000000000000000000000000000000000000000..c334cdca77674f2566dd0075903e4d590e6d9eca
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/sepconv.py
@@ -0,0 +1,332 @@
+import torch
+from .utils import cuda_launch, cuda_kernel, cuda_int32
+
+sepconv_vergrad = """
+ extern "C" __global__ void __launch_bounds__(512) sepconv_vergrad(
+ const int n,
+ const {{type}}* __restrict__ tenIn,
+ const {{type}}* __restrict__ tenVer,
+ const {{type}}* __restrict__ tenHor,
+ const {{type}}* __restrict__ tenOutgrad,
+ {{type}}* __restrict__ tenIngrad,
+ {{type}}* __restrict__ tenVergrad,
+ {{type}}* __restrict__ tenHorgrad
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ const int intN = ( intIndex / SIZE_3(tenVergrad) / SIZE_2(tenVergrad) / SIZE_1(tenVergrad) ) % SIZE_0(tenVergrad);
+ const int intC = ( intIndex / SIZE_3(tenVergrad) / SIZE_2(tenVergrad) ) % SIZE_1(tenVergrad);
+ const int intY = ( intIndex / SIZE_3(tenVergrad) ) % SIZE_2(tenVergrad);
+ const int intX = ( intIndex ) % SIZE_3(tenVergrad);
+
+ {{type}} fltVergrad = 0.0;
+
+ {{type}} fltKahanc = 0.0;
+ {{type}} fltKahany = 0.0;
+ {{type}} fltKahant = 0.0;
+
+ for (int intI = 0; intI < SIZE_1(tenIn); intI += 1) {
+ for (int intFx = 0; intFx < SIZE_1(tenHor); intFx += 1) {
+ fltKahany = VALUE_4(tenHor, intN, intFx, intY, intX) * VALUE_4(tenIn, intN, intI, intY + intC, intX + intFx) * VALUE_4(tenOutgrad, intN, intI, intY, intX);
+ fltKahany = fltKahany - fltKahanc;
+ fltKahant = fltVergrad + fltKahany;
+ fltKahanc = (fltKahant - fltVergrad) - fltKahany;
+ fltVergrad = fltKahant;
+ }
+ }
+
+ tenVergrad[intIndex] = fltVergrad;
+ } }
+"""
+
+sepconv_ingrad = """
+ extern "C" __global__ void __launch_bounds__(512) sepconv_ingrad(
+ const int n,
+ const {{type}}* __restrict__ tenIn,
+ const {{type}}* __restrict__ tenVer,
+ const {{type}}* __restrict__ tenHor,
+ const {{type}}* __restrict__ tenOutgrad,
+ {{type}}* __restrict__ tenIngrad,
+ {{type}}* __restrict__ tenVergrad,
+ {{type}}* __restrict__ tenHorgrad
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ const int intN = ( intIndex / SIZE_3(tenIngrad) / SIZE_2(tenIngrad) / SIZE_1(tenIngrad) ) % SIZE_0(tenIngrad);
+ const int intC = ( intIndex / SIZE_3(tenIngrad) / SIZE_2(tenIngrad) ) % SIZE_1(tenIngrad);
+ const int intY = ( intIndex / SIZE_3(tenIngrad) ) % SIZE_2(tenIngrad);
+ const int intX = ( intIndex ) % SIZE_3(tenIngrad);
+
+ {{type}} fltIngrad = 0.0;
+
+ {{type}} fltKahanc = 0.0;
+ {{type}} fltKahany = 0.0;
+ {{type}} fltKahant = 0.0;
+
+ for (int intFy = 0; intFy < SIZE_1(tenVer); intFy += 1) {
+ int intKy = intY + intFy - (SIZE_1(tenVer) - 1);
+
+ if (intKy < 0) { continue; }
+ if (intKy >= SIZE_2(tenVer)) { continue; }
+
+ for (int intFx = 0; intFx < SIZE_1(tenHor); intFx += 1) {
+ int intKx = intX + intFx - (SIZE_1(tenHor) - 1);
+
+ if (intKx < 0) { continue; }
+ if (intKx >= SIZE_3(tenHor)) { continue; }
+
+ fltKahany = VALUE_4(tenVer, intN, (SIZE_1(tenVer) - 1) - intFy, intKy, intKx) * VALUE_4(tenHor, intN, (SIZE_1(tenHor) - 1) - intFx, intKy, intKx) * VALUE_4(tenOutgrad, intN, intC, intKy, intKx);
+ fltKahany = fltKahany - fltKahanc;
+ fltKahant = fltIngrad + fltKahany;
+ fltKahanc = (fltKahant - fltIngrad) - fltKahany;
+ fltIngrad = fltKahant;
+ }
+ }
+
+ tenIngrad[intIndex] = fltIngrad;
+ } }
+"""
+
+sepconv_out = """
+ extern "C" __global__ void __launch_bounds__(512) sepconv_out(
+ const int n,
+ const {{type}}* __restrict__ tenIn,
+ const {{type}}* __restrict__ tenVer,
+ const {{type}}* __restrict__ tenHor,
+ {{type}}* __restrict__ tenOut
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ const int intN = ( intIndex / SIZE_3(tenOut) / SIZE_2(tenOut) / SIZE_1(tenOut) ) % SIZE_0(tenOut);
+ const int intC = ( intIndex / SIZE_3(tenOut) / SIZE_2(tenOut) ) % SIZE_1(tenOut);
+ const int intY = ( intIndex / SIZE_3(tenOut) ) % SIZE_2(tenOut);
+ const int intX = ( intIndex ) % SIZE_3(tenOut);
+
+ {{type}} fltOut = 0.0;
+
+ {{type}} fltKahanc = 0.0;
+ {{type}} fltKahany = 0.0;
+ {{type}} fltKahant = 0.0;
+
+ for (int intFy = 0; intFy < SIZE_1(tenVer); intFy += 1) {
+ for (int intFx = 0; intFx < SIZE_1(tenHor); intFx += 1) {
+ fltKahany = VALUE_4(tenIn, intN, intC, intY + intFy, intX + intFx) * VALUE_4(tenVer, intN, intFy, intY, intX) * VALUE_4(tenHor, intN, intFx, intY, intX);
+ fltKahany = fltKahany - fltKahanc;
+ fltKahant = fltOut + fltKahany;
+ fltKahanc = (fltKahant - fltOut) - fltKahany;
+ fltOut = fltKahant;
+ }
+ }
+
+ tenOut[intIndex] = fltOut;
+ } }
+"""
+
+sepconv_horgrad = """
+ extern "C" __global__ void __launch_bounds__(512) sepconv_horgrad(
+ const int n,
+ const {{type}}* __restrict__ tenIn,
+ const {{type}}* __restrict__ tenVer,
+ const {{type}}* __restrict__ tenHor,
+ const {{type}}* __restrict__ tenOutgrad,
+ {{type}}* __restrict__ tenIngrad,
+ {{type}}* __restrict__ tenVergrad,
+ {{type}}* __restrict__ tenHorgrad
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ const int intN = ( intIndex / SIZE_3(tenHorgrad) / SIZE_2(tenHorgrad) / SIZE_1(tenHorgrad) ) % SIZE_0(tenHorgrad);
+ const int intC = ( intIndex / SIZE_3(tenHorgrad) / SIZE_2(tenHorgrad) ) % SIZE_1(tenHorgrad);
+ const int intY = ( intIndex / SIZE_3(tenHorgrad) ) % SIZE_2(tenHorgrad);
+ const int intX = ( intIndex ) % SIZE_3(tenHorgrad);
+
+ {{type}} fltHorgrad = 0.0;
+
+ {{type}} fltKahanc = 0.0;
+ {{type}} fltKahany = 0.0;
+ {{type}} fltKahant = 0.0;
+
+ for (int intI = 0; intI < SIZE_1(tenIn); intI += 1) {
+ for (int intFy = 0; intFy < SIZE_1(tenVer); intFy += 1) {
+ fltKahany = VALUE_4(tenVer, intN, intFy, intY, intX) * VALUE_4(tenIn, intN, intI, intY + intFy, intX + intC) * VALUE_4(tenOutgrad, intN, intI, intY, intX);
+ fltKahany = fltKahany - fltKahanc;
+ fltKahant = fltHorgrad + fltKahany;
+ fltKahanc = (fltKahant - fltHorgrad) - fltKahany;
+ fltHorgrad = fltKahant;
+ }
+ }
+
+ tenHorgrad[intIndex] = fltHorgrad;
+ } }
+"""
+
+class sepconv_func(torch.autograd.Function):
+ @staticmethod
+ @torch.cuda.amp.custom_fwd(cast_inputs=torch.float32)
+ def forward(self, tenIn, tenVer, tenHor):
+ tenOut = tenIn.new_empty(
+ [
+ tenIn.shape[0],
+ tenIn.shape[1],
+ tenVer.shape[2] and tenHor.shape[2],
+ tenVer.shape[3] and tenHor.shape[3],
+ ]
+ )
+
+ if tenIn.is_cuda == True:
+ cuda_launch(
+ cuda_kernel(
+ "sepconv_out",
+ sepconv_out,
+ {
+ "tenIn": tenIn,
+ "tenVer": tenVer,
+ "tenHor": tenHor,
+ "tenOut": tenOut,
+ },
+ )
+ )(
+ grid=tuple([int((tenOut.nelement() + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ cuda_int32(tenOut.nelement()),
+ tenIn.data_ptr(),
+ tenVer.data_ptr(),
+ tenHor.data_ptr(),
+ tenOut.data_ptr(),
+ ],
+ )
+
+ elif tenIn.is_cuda != True:
+ assert False
+
+ # end
+
+ self.save_for_backward(tenIn, tenVer, tenHor)
+
+ return tenOut
+
+ # end
+
+ @staticmethod
+ @torch.cuda.amp.custom_bwd
+ def backward(self, tenOutgrad):
+ tenIn, tenVer, tenHor = self.saved_tensors
+
+ tenOutgrad = tenOutgrad.contiguous()
+ assert tenOutgrad.is_cuda == True
+
+ tenIngrad = (
+ tenIn.new_empty(
+ [tenIn.shape[0], tenIn.shape[1], tenIn.shape[2], tenIn.shape[3]]
+ )
+ if self.needs_input_grad[0] == True
+ else None
+ )
+ tenVergrad = (
+ tenVer.new_empty(
+ [tenVer.shape[0], tenVer.shape[1], tenVer.shape[2], tenVer.shape[3]]
+ )
+ if self.needs_input_grad[1] == True
+ else None
+ )
+ tenHorgrad = (
+ tenHor.new_empty(
+ [tenHor.shape[0], tenHor.shape[1], tenHor.shape[2], tenHor.shape[3]]
+ )
+ if self.needs_input_grad[2] == True
+ else None
+ )
+
+ if tenIngrad is not None:
+ cuda_launch(
+ cuda_kernel(
+ "sepconv_ingrad",
+ sepconv_ingrad,
+ {
+ "tenIn": tenIn,
+ "tenVer": tenVer,
+ "tenHor": tenHor,
+ "tenOutgrad": tenOutgrad,
+ "tenIngrad": tenIngrad,
+ "tenVergrad": tenVergrad,
+ "tenHorgrad": tenHorgrad,
+ },
+ )
+ )(
+ grid=tuple([int((tenIngrad.nelement() + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ cuda_int32(tenIngrad.nelement()),
+ tenIn.data_ptr(),
+ tenVer.data_ptr(),
+ tenHor.data_ptr(),
+ tenOutgrad.data_ptr(),
+ tenIngrad.data_ptr(),
+ None,
+ None,
+ ],
+ )
+ # end
+
+ if tenVergrad is not None:
+ cuda_launch(
+ cuda_kernel(
+ "sepconv_vergrad",
+ sepconv_vergrad,
+ {
+ "tenIn": tenIn,
+ "tenVer": tenVer,
+ "tenHor": tenHor,
+ "tenOutgrad": tenOutgrad,
+ "tenIngrad": tenIngrad,
+ "tenVergrad": tenVergrad,
+ "tenHorgrad": tenHorgrad,
+ },
+ )
+ )(
+ grid=tuple([int((tenVergrad.nelement() + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ cuda_int32(tenVergrad.nelement()),
+ tenIn.data_ptr(),
+ tenVer.data_ptr(),
+ tenHor.data_ptr(),
+ tenOutgrad.data_ptr(),
+ None,
+ tenVergrad.data_ptr(),
+ None,
+ ],
+ )
+ # end
+
+ if tenHorgrad is not None:
+ cuda_launch(
+ cuda_kernel(
+ "sepconv_horgrad",
+ sepconv_horgrad,
+ {
+ "tenIn": tenIn,
+ "tenVer": tenVer,
+ "tenHor": tenHor,
+ "tenOutgrad": tenOutgrad,
+ "tenIngrad": tenIngrad,
+ "tenVergrad": tenVergrad,
+ "tenHorgrad": tenHorgrad,
+ },
+ )
+ )(
+ grid=tuple([int((tenHorgrad.nelement() + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ cuda_int32(tenHorgrad.nelement()),
+ tenIn.data_ptr(),
+ tenVer.data_ptr(),
+ tenHor.data_ptr(),
+ tenOutgrad.data_ptr(),
+ None,
+ None,
+ tenHorgrad.data_ptr(),
+ ],
+ )
+ # end
+
+ return tenIngrad, tenVergrad, tenHorgrad
+
+ # end
+
+
+# end
+__all__ = ["sepconv_func"]
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/softsplat.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/softsplat.py
new file mode 100644
index 0000000000000000000000000000000000000000..4a2ae47a638c5d025e85169759b587947640e012
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/softsplat.py
@@ -0,0 +1,440 @@
+import torch
+from .utils import cuda_launch, cuda_kernel, cuda_int32
+import cupy
+import collections
+
+softsplat_flowgrad = """
+ extern "C" __global__ void __launch_bounds__(512) softsplat_flowgrad(
+ const int n,
+ const {{type}}* __restrict__ tenIn,
+ const {{type}}* __restrict__ tenFlow,
+ const {{type}}* __restrict__ tenOutgrad,
+ {{type}}* __restrict__ tenIngrad,
+ {{type}}* __restrict__ tenFlowgrad
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ const int intN = ( intIndex / SIZE_3(tenFlowgrad) / SIZE_2(tenFlowgrad) / SIZE_1(tenFlowgrad) ) % SIZE_0(tenFlowgrad);
+ const int intC = ( intIndex / SIZE_3(tenFlowgrad) / SIZE_2(tenFlowgrad) ) % SIZE_1(tenFlowgrad);
+ const int intY = ( intIndex / SIZE_3(tenFlowgrad) ) % SIZE_2(tenFlowgrad);
+ const int intX = ( intIndex ) % SIZE_3(tenFlowgrad);
+
+ assert(SIZE_1(tenFlow) == 2);
+
+ {{type}} fltFlowgrad = 0.0f;
+
+ {{type}} fltX = ({{type}}) (intX) + VALUE_4(tenFlow, intN, 0, intY, intX);
+ {{type}} fltY = ({{type}}) (intY) + VALUE_4(tenFlow, intN, 1, intY, intX);
+
+ if (isfinite(fltX) == false) { return; }
+ if (isfinite(fltY) == false) { return; }
+
+ int intNorthwestX = (int) (floor(fltX));
+ int intNorthwestY = (int) (floor(fltY));
+ int intNortheastX = intNorthwestX + 1;
+ int intNortheastY = intNorthwestY;
+ int intSouthwestX = intNorthwestX;
+ int intSouthwestY = intNorthwestY + 1;
+ int intSoutheastX = intNorthwestX + 1;
+ int intSoutheastY = intNorthwestY + 1;
+
+ {{type}} fltNorthwest = 0.0f;
+ {{type}} fltNortheast = 0.0f;
+ {{type}} fltSouthwest = 0.0f;
+ {{type}} fltSoutheast = 0.0f;
+
+ if (intC == 0) {
+ fltNorthwest = (({{type}}) (-1.0f)) * (({{type}}) (intSoutheastY) - fltY);
+ fltNortheast = (({{type}}) (+1.0f)) * (({{type}}) (intSouthwestY) - fltY);
+ fltSouthwest = (({{type}}) (-1.0f)) * (fltY - ({{type}}) (intNortheastY));
+ fltSoutheast = (({{type}}) (+1.0f)) * (fltY - ({{type}}) (intNorthwestY));
+
+ } else if (intC == 1) {
+ fltNorthwest = (({{type}}) (intSoutheastX) - fltX) * (({{type}}) (-1.0f));
+ fltNortheast = (fltX - ({{type}}) (intSouthwestX)) * (({{type}}) (-1.0f));
+ fltSouthwest = (({{type}}) (intNortheastX) - fltX) * (({{type}}) (+1.0f));
+ fltSoutheast = (fltX - ({{type}}) (intNorthwestX)) * (({{type}}) (+1.0f));
+
+ }
+
+ for (int intChannel = 0; intChannel < SIZE_1(tenOutgrad); intChannel += 1) {
+ {{type}} fltIn = VALUE_4(tenIn, intN, intChannel, intY, intX);
+
+ if ((intNorthwestX >= 0) && (intNorthwestX < SIZE_3(tenOutgrad)) && (intNorthwestY >= 0) && (intNorthwestY < SIZE_2(tenOutgrad))) {
+ fltFlowgrad += VALUE_4(tenOutgrad, intN, intChannel, intNorthwestY, intNorthwestX) * fltIn * fltNorthwest;
+ }
+
+ if ((intNortheastX >= 0) && (intNortheastX < SIZE_3(tenOutgrad)) && (intNortheastY >= 0) && (intNortheastY < SIZE_2(tenOutgrad))) {
+ fltFlowgrad += VALUE_4(tenOutgrad, intN, intChannel, intNortheastY, intNortheastX) * fltIn * fltNortheast;
+ }
+
+ if ((intSouthwestX >= 0) && (intSouthwestX < SIZE_3(tenOutgrad)) && (intSouthwestY >= 0) && (intSouthwestY < SIZE_2(tenOutgrad))) {
+ fltFlowgrad += VALUE_4(tenOutgrad, intN, intChannel, intSouthwestY, intSouthwestX) * fltIn * fltSouthwest;
+ }
+
+ if ((intSoutheastX >= 0) && (intSoutheastX < SIZE_3(tenOutgrad)) && (intSoutheastY >= 0) && (intSoutheastY < SIZE_2(tenOutgrad))) {
+ fltFlowgrad += VALUE_4(tenOutgrad, intN, intChannel, intSoutheastY, intSoutheastX) * fltIn * fltSoutheast;
+ }
+ }
+
+ tenFlowgrad[intIndex] = fltFlowgrad;
+ } }
+"""
+
+softsplat_ingrad = """
+ extern "C" __global__ void __launch_bounds__(512) softsplat_ingrad(
+ const int n,
+ const {{type}}* __restrict__ tenIn,
+ const {{type}}* __restrict__ tenFlow,
+ const {{type}}* __restrict__ tenOutgrad,
+ {{type}}* __restrict__ tenIngrad,
+ {{type}}* __restrict__ tenFlowgrad
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ const int intN = ( intIndex / SIZE_3(tenIngrad) / SIZE_2(tenIngrad) / SIZE_1(tenIngrad) ) % SIZE_0(tenIngrad);
+ const int intC = ( intIndex / SIZE_3(tenIngrad) / SIZE_2(tenIngrad) ) % SIZE_1(tenIngrad);
+ const int intY = ( intIndex / SIZE_3(tenIngrad) ) % SIZE_2(tenIngrad);
+ const int intX = ( intIndex ) % SIZE_3(tenIngrad);
+
+ assert(SIZE_1(tenFlow) == 2);
+
+ {{type}} fltIngrad = 0.0f;
+
+ {{type}} fltX = ({{type}}) (intX) + VALUE_4(tenFlow, intN, 0, intY, intX);
+ {{type}} fltY = ({{type}}) (intY) + VALUE_4(tenFlow, intN, 1, intY, intX);
+
+ if (isfinite(fltX) == false) { return; }
+ if (isfinite(fltY) == false) { return; }
+
+ int intNorthwestX = (int) (floor(fltX));
+ int intNorthwestY = (int) (floor(fltY));
+ int intNortheastX = intNorthwestX + 1;
+ int intNortheastY = intNorthwestY;
+ int intSouthwestX = intNorthwestX;
+ int intSouthwestY = intNorthwestY + 1;
+ int intSoutheastX = intNorthwestX + 1;
+ int intSoutheastY = intNorthwestY + 1;
+
+ {{type}} fltNorthwest = (({{type}}) (intSoutheastX) - fltX) * (({{type}}) (intSoutheastY) - fltY);
+ {{type}} fltNortheast = (fltX - ({{type}}) (intSouthwestX)) * (({{type}}) (intSouthwestY) - fltY);
+ {{type}} fltSouthwest = (({{type}}) (intNortheastX) - fltX) * (fltY - ({{type}}) (intNortheastY));
+ {{type}} fltSoutheast = (fltX - ({{type}}) (intNorthwestX)) * (fltY - ({{type}}) (intNorthwestY));
+
+ if ((intNorthwestX >= 0) && (intNorthwestX < SIZE_3(tenOutgrad)) && (intNorthwestY >= 0) && (intNorthwestY < SIZE_2(tenOutgrad))) {
+ fltIngrad += VALUE_4(tenOutgrad, intN, intC, intNorthwestY, intNorthwestX) * fltNorthwest;
+ }
+
+ if ((intNortheastX >= 0) && (intNortheastX < SIZE_3(tenOutgrad)) && (intNortheastY >= 0) && (intNortheastY < SIZE_2(tenOutgrad))) {
+ fltIngrad += VALUE_4(tenOutgrad, intN, intC, intNortheastY, intNortheastX) * fltNortheast;
+ }
+
+ if ((intSouthwestX >= 0) && (intSouthwestX < SIZE_3(tenOutgrad)) && (intSouthwestY >= 0) && (intSouthwestY < SIZE_2(tenOutgrad))) {
+ fltIngrad += VALUE_4(tenOutgrad, intN, intC, intSouthwestY, intSouthwestX) * fltSouthwest;
+ }
+
+ if ((intSoutheastX >= 0) && (intSoutheastX < SIZE_3(tenOutgrad)) && (intSoutheastY >= 0) && (intSoutheastY < SIZE_2(tenOutgrad))) {
+ fltIngrad += VALUE_4(tenOutgrad, intN, intC, intSoutheastY, intSoutheastX) * fltSoutheast;
+ }
+
+ tenIngrad[intIndex] = fltIngrad;
+ } }
+"""
+
+softsplat_out = """
+ extern "C" __global__ void __launch_bounds__(512) softsplat_out(
+ const int n,
+ const {{type}}* __restrict__ tenIn,
+ const {{type}}* __restrict__ tenFlow,
+ {{type}}* __restrict__ tenOut
+ ) { for (int intIndex = (blockIdx.x * blockDim.x) + threadIdx.x; intIndex < n; intIndex += blockDim.x * gridDim.x) {
+ const int intN = ( intIndex / SIZE_3(tenOut) / SIZE_2(tenOut) / SIZE_1(tenOut) ) % SIZE_0(tenOut);
+ const int intC = ( intIndex / SIZE_3(tenOut) / SIZE_2(tenOut) ) % SIZE_1(tenOut);
+ const int intY = ( intIndex / SIZE_3(tenOut) ) % SIZE_2(tenOut);
+ const int intX = ( intIndex ) % SIZE_3(tenOut);
+
+ assert(SIZE_1(tenFlow) == 2);
+
+ {{type}} fltX = ({{type}}) (intX) + VALUE_4(tenFlow, intN, 0, intY, intX);
+ {{type}} fltY = ({{type}}) (intY) + VALUE_4(tenFlow, intN, 1, intY, intX);
+
+ if (isfinite(fltX) == false) { return; }
+ if (isfinite(fltY) == false) { return; }
+
+ {{type}} fltIn = VALUE_4(tenIn, intN, intC, intY, intX);
+
+ int intNorthwestX = (int) (floor(fltX));
+ int intNorthwestY = (int) (floor(fltY));
+ int intNortheastX = intNorthwestX + 1;
+ int intNortheastY = intNorthwestY;
+ int intSouthwestX = intNorthwestX;
+ int intSouthwestY = intNorthwestY + 1;
+ int intSoutheastX = intNorthwestX + 1;
+ int intSoutheastY = intNorthwestY + 1;
+
+ {{type}} fltNorthwest = (({{type}}) (intSoutheastX) - fltX) * (({{type}}) (intSoutheastY) - fltY);
+ {{type}} fltNortheast = (fltX - ({{type}}) (intSouthwestX)) * (({{type}}) (intSouthwestY) - fltY);
+ {{type}} fltSouthwest = (({{type}}) (intNortheastX) - fltX) * (fltY - ({{type}}) (intNortheastY));
+ {{type}} fltSoutheast = (fltX - ({{type}}) (intNorthwestX)) * (fltY - ({{type}}) (intNorthwestY));
+
+ if ((intNorthwestX >= 0) && (intNorthwestX < SIZE_3(tenOut)) && (intNorthwestY >= 0) && (intNorthwestY < SIZE_2(tenOut))) {
+ atomicAdd(&tenOut[OFFSET_4(tenOut, intN, intC, intNorthwestY, intNorthwestX)], fltIn * fltNorthwest);
+ }
+
+ if ((intNortheastX >= 0) && (intNortheastX < SIZE_3(tenOut)) && (intNortheastY >= 0) && (intNortheastY < SIZE_2(tenOut))) {
+ atomicAdd(&tenOut[OFFSET_4(tenOut, intN, intC, intNortheastY, intNortheastX)], fltIn * fltNortheast);
+ }
+
+ if ((intSouthwestX >= 0) && (intSouthwestX < SIZE_3(tenOut)) && (intSouthwestY >= 0) && (intSouthwestY < SIZE_2(tenOut))) {
+ atomicAdd(&tenOut[OFFSET_4(tenOut, intN, intC, intSouthwestY, intSouthwestX)], fltIn * fltSouthwest);
+ }
+
+ if ((intSoutheastX >= 0) && (intSoutheastX < SIZE_3(tenOut)) && (intSoutheastY >= 0) && (intSoutheastY < SIZE_2(tenOut))) {
+ atomicAdd(&tenOut[OFFSET_4(tenOut, intN, intC, intSoutheastY, intSoutheastX)], fltIn * fltSoutheast);
+ }
+ } }
+"""
+
+
+# end
+
+class softsplat_func(torch.autograd.Function):
+ @staticmethod
+ @torch.cuda.amp.custom_fwd(cast_inputs=torch.float32)
+ def forward(self, tenIn, tenFlow):
+ tenOut = tenIn.new_zeros(
+ [tenIn.shape[0], tenIn.shape[1], tenIn.shape[2], tenIn.shape[3]]
+ )
+
+ if tenIn.is_cuda == True:
+ cuda_launch(
+ cuda_kernel(
+ "softsplat_out",
+ softsplat_out,
+ {"tenIn": tenIn, "tenFlow": tenFlow, "tenOut": tenOut},
+ )
+ )(
+ grid=tuple([int((tenOut.nelement() + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ cuda_int32(tenOut.nelement()),
+ tenIn.data_ptr(),
+ tenFlow.data_ptr(),
+ tenOut.data_ptr(),
+ ],
+ stream=collections.namedtuple("Stream", "ptr")(
+ torch.cuda.current_stream().cuda_stream
+ ),
+ )
+
+ elif tenIn.is_cuda != True:
+ assert False
+
+ # end
+
+ self.save_for_backward(tenIn, tenFlow)
+
+ return tenOut
+
+ # end
+
+ @staticmethod
+ @torch.cuda.amp.custom_bwd
+ def backward(self, tenOutgrad):
+ tenIn, tenFlow = self.saved_tensors
+
+ tenOutgrad = tenOutgrad.contiguous()
+ assert tenOutgrad.is_cuda == True
+
+ tenIngrad = (
+ tenIn.new_zeros(
+ [tenIn.shape[0], tenIn.shape[1], tenIn.shape[2], tenIn.shape[3]]
+ )
+ if self.needs_input_grad[0] == True
+ else None
+ )
+ tenFlowgrad = (
+ tenFlow.new_zeros(
+ [tenFlow.shape[0], tenFlow.shape[1], tenFlow.shape[2], tenFlow.shape[3]]
+ )
+ if self.needs_input_grad[1] == True
+ else None
+ )
+
+ if tenIngrad is not None:
+ cuda_launch(
+ cuda_kernel(
+ "softsplat_ingrad",
+ softsplat_ingrad,
+ {
+ "tenIn": tenIn,
+ "tenFlow": tenFlow,
+ "tenOutgrad": tenOutgrad,
+ "tenIngrad": tenIngrad,
+ "tenFlowgrad": tenFlowgrad,
+ },
+ )
+ )(
+ grid=tuple([int((tenIngrad.nelement() + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ cuda_int32(tenIngrad.nelement()),
+ tenIn.data_ptr(),
+ tenFlow.data_ptr(),
+ tenOutgrad.data_ptr(),
+ tenIngrad.data_ptr(),
+ None,
+ ],
+ stream=collections.namedtuple("Stream", "ptr")(
+ torch.cuda.current_stream().cuda_stream
+ ),
+ )
+ # end
+
+ if tenFlowgrad is not None:
+ cuda_launch(
+ cuda_kernel(
+ "softsplat_flowgrad",
+ softsplat_flowgrad,
+ {
+ "tenIn": tenIn,
+ "tenFlow": tenFlow,
+ "tenOutgrad": tenOutgrad,
+ "tenIngrad": tenIngrad,
+ "tenFlowgrad": tenFlowgrad,
+ },
+ )
+ )(
+ grid=tuple([int((tenFlowgrad.nelement() + 512 - 1) / 512), 1, 1]),
+ block=tuple([512, 1, 1]),
+ args=[
+ cuda_int32(tenFlowgrad.nelement()),
+ tenIn.data_ptr(),
+ tenFlow.data_ptr(),
+ tenOutgrad.data_ptr(),
+ None,
+ tenFlowgrad.data_ptr(),
+ ],
+ stream=collections.namedtuple("Stream", "ptr")(
+ torch.cuda.current_stream().cuda_stream
+ ),
+ )
+ # end
+
+ return tenIngrad, tenFlowgrad
+
+ # end
+
+
+def FunctionSoftsplat(tenInput, tenFlow, tenMetric, strType):
+ assert tenMetric is None or tenMetric.shape[1] == 1
+ assert strType in ["summation", "average", "linear", "softmax"]
+
+ if strType == "average":
+ tenInput = torch.cat(
+ [
+ tenInput,
+ tenInput.new_ones(
+ tenInput.shape[0], 1, tenInput.shape[2], tenInput.shape[3]
+ ),
+ ],
+ 1,
+ )
+
+ elif strType == "linear":
+ tenInput = torch.cat([tenInput * tenMetric, tenMetric], 1)
+
+ elif strType == "softmax":
+ tenInput = torch.cat([tenInput * tenMetric.exp(), tenMetric.exp()], 1)
+
+ # end
+
+ tenOutput = softsplat_func.apply(tenInput, tenFlow)
+
+ if strType != "summation":
+ tenNormalize = tenOutput[:, -1:, :, :]
+
+ tenNormalize[tenNormalize == 0.0] = 1.0
+
+ tenOutput = tenOutput[:, :-1, :, :] / tenNormalize
+ # end
+
+ return tenOutput
+
+
+# end
+
+
+class ModuleSoftsplat(torch.nn.Module):
+ def __init__(self, strType):
+ super().__init__()
+
+ self.strType = strType
+
+ # end
+
+ def forward(self, tenInput, tenFlow, tenMetric):
+ return FunctionSoftsplat(tenInput, tenFlow, tenMetric, self.strType)
+
+ # end
+
+
+# end
+
+
+
+def softsplat(
+ tenIn: torch.Tensor, tenFlow: torch.Tensor, tenMetric: torch.Tensor, strMode: str
+):
+ assert strMode.split("-")[0] in ["sum", "avg", "linear", "soft"]
+
+ if strMode == "sum":
+ assert tenMetric is None
+ if strMode == "avg":
+ assert tenMetric is None
+ if strMode.split("-")[0] == "linear":
+ assert tenMetric is not None
+ if strMode.split("-")[0] == "soft":
+ assert tenMetric is not None
+
+ if strMode == "avg":
+ tenIn = torch.cat(
+ [
+ tenIn,
+ tenIn.new_ones([tenIn.shape[0], 1, tenIn.shape[2], tenIn.shape[3]]),
+ ],
+ 1,
+ )
+
+ elif strMode.split("-")[0] == "linear":
+ tenIn = torch.cat([tenIn * tenMetric, tenMetric], 1)
+
+ elif strMode.split("-")[0] == "soft":
+ tenIn = torch.cat([tenIn * tenMetric.exp(), tenMetric.exp()], 1)
+
+ # end
+
+ tenOut = softsplat_func.apply(tenIn, tenFlow)
+
+ if strMode.split("-")[0] in ["avg", "linear", "soft"]:
+ tenNormalize = tenOut[:, -1:, :, :]
+
+ if len(strMode.split("-")) == 1:
+ tenNormalize = tenNormalize + 0.0000001
+
+ elif strMode.split("-")[1] == "addeps":
+ tenNormalize = tenNormalize + 0.0000001
+
+ elif strMode.split("-")[1] == "zeroeps":
+ tenNormalize[tenNormalize == 0.0] = 1.0
+
+ elif strMode.split("-")[1] == "clipeps":
+ tenNormalize = tenNormalize.clip(0.0000001, None)
+
+ # end
+
+ tenOut = tenOut[:, :-1, :, :] / tenNormalize
+ # end
+
+ return tenOut
+
+
+# end
+
+__all__ = ["FunctionSoftsplat", "ModuleSoftsplat", "softsplat", "softsplat_func"]
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/utils.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec29a48e11955eb9f9f8aa36b1542721dd362345
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/cupy_ops/utils.py
@@ -0,0 +1,242 @@
+import cupy
+import os
+import re
+import torch
+import typing
+from pathlib import Path
+import platform
+
+##########################################################
+
+
+objCudacache = {}
+
+
+def cuda_int32(intIn: int):
+ return cupy.int32(intIn)
+
+
+# end
+
+
+def cuda_float32(fltIn: float):
+ return cupy.float32(fltIn)
+
+
+# end
+
+
+def cuda_kernel(strFunction: str, strKernel: str, objVariables: typing.Dict, **replace_kwargs):
+ if "device" not in objCudacache:
+ objCudacache["device"] = torch.cuda.get_device_name()
+ # end
+
+ strKey = strFunction
+
+ for strVariable in objVariables:
+ objValue = objVariables[strVariable]
+
+ strKey += strVariable
+
+ if objValue is None:
+ continue
+
+ elif type(objValue) == int:
+ strKey += str(objValue)
+
+ elif type(objValue) == float:
+ strKey += str(objValue)
+
+ elif type(objValue) == bool:
+ strKey += str(objValue)
+
+ elif type(objValue) == str:
+ strKey += objValue
+
+ elif type(objValue) == torch.Tensor:
+ strKey += str(objValue.dtype)
+ strKey += str(objValue.shape)
+ strKey += str(objValue.stride())
+
+ elif True:
+ print(strVariable, type(objValue))
+ assert False
+
+ # end
+ # end
+
+ strKey += objCudacache["device"]
+
+ if strKey not in objCudacache:
+ for strVariable in objVariables:
+ objValue = objVariables[strVariable]
+
+ if objValue is None:
+ continue
+
+ elif type(objValue) == int:
+ strKernel = strKernel.replace("{{" + strVariable + "}}", str(objValue))
+
+ elif type(objValue) == float:
+ strKernel = strKernel.replace("{{" + strVariable + "}}", str(objValue))
+
+ elif type(objValue) == bool:
+ strKernel = strKernel.replace("{{" + strVariable + "}}", str(objValue))
+
+ elif type(objValue) == str:
+ strKernel = strKernel.replace("{{" + strVariable + "}}", objValue)
+
+ elif type(objValue) == torch.Tensor and objValue.dtype == torch.uint8:
+ strKernel = strKernel.replace("{{type}}", "unsigned char")
+
+ elif type(objValue) == torch.Tensor and objValue.dtype == torch.float16:
+ strKernel = strKernel.replace("{{type}}", "half")
+
+ elif type(objValue) == torch.Tensor and objValue.dtype == torch.float32:
+ strKernel = strKernel.replace("{{type}}", "float")
+
+ elif type(objValue) == torch.Tensor and objValue.dtype == torch.float64:
+ strKernel = strKernel.replace("{{type}}", "double")
+
+ elif type(objValue) == torch.Tensor and objValue.dtype == torch.int32:
+ strKernel = strKernel.replace("{{type}}", "int")
+
+ elif type(objValue) == torch.Tensor and objValue.dtype == torch.int64:
+ strKernel = strKernel.replace("{{type}}", "long")
+
+ elif type(objValue) == torch.Tensor:
+ print(strVariable, objValue.dtype)
+ assert False
+
+ elif True:
+ print(strVariable, type(objValue))
+ assert False
+
+ # end
+ # end
+
+ while True:
+ objMatch = re.search("(SIZE_)([0-4])(\()([^\)]*)(\))", strKernel)
+
+ if objMatch is None:
+ break
+ # end
+
+ intArg = int(objMatch.group(2))
+
+ strTensor = objMatch.group(4)
+ intSizes = objVariables[strTensor].size()
+
+ strKernel = strKernel.replace(objMatch.group(), str(intSizes[intArg]))
+ # end
+
+ while True:
+ objMatch = re.search("(OFFSET_)([0-4])(\()([^\)]+)(\))", strKernel)
+
+ if objMatch is None:
+ break
+ # end
+
+ intArgs = int(objMatch.group(2))
+ strArgs = objMatch.group(4).split(",")
+
+ strTensor = strArgs[0]
+ intStrides = objVariables[strTensor].stride()
+ strIndex = [
+ "(("
+ + strArgs[intArg + 1].replace("{", "(").replace("}", ")").strip()
+ + ")*"
+ + str(intStrides[intArg])
+ + ")"
+ for intArg in range(intArgs)
+ ]
+
+ strKernel = strKernel.replace(
+ objMatch.group(0), "(" + str.join("+", strIndex) + ")"
+ )
+ # end
+
+ while True:
+ objMatch = re.search("(VALUE_)([0-4])(\()", strKernel)
+
+ if objMatch is None:
+ break
+ # end
+
+ intStart = objMatch.span()[1]
+ intStop = objMatch.span()[1]
+ intParentheses = 1
+
+ while True:
+ intParentheses += 1 if strKernel[intStop] == "(" else 0
+ intParentheses -= 1 if strKernel[intStop] == ")" else 0
+
+ if intParentheses == 0:
+ break
+ # end
+
+ intStop += 1
+ # end
+
+ intArgs = int(objMatch.group(2))
+ strArgs = strKernel[intStart:intStop].split(",")
+
+ assert intArgs == len(strArgs) - 1
+
+ strTensor = strArgs[0]
+ intStrides = objVariables[strTensor].stride()
+
+ strIndex = []
+
+ for intArg in range(intArgs):
+ strIndex.append(
+ "(("
+ + strArgs[intArg + 1].replace("{", "(").replace("}", ")").strip()
+ + ")*"
+ + str(intStrides[intArg])
+ + ")"
+ )
+ # end
+
+ strKernel = strKernel.replace(
+ "VALUE_" + str(intArgs) + "(" + strKernel[intStart:intStop] + ")",
+ strTensor + "[" + str.join("+", strIndex) + "]",
+ )
+ # end
+
+ for replace_key, value in replace_kwargs.items():
+ strKernel = strKernel.replace(replace_key, value)
+
+ objCudacache[strKey] = {"strFunction": strFunction, "strKernel": strKernel}
+ # end
+
+ return strKey
+
+
+# end
+def get_cuda_home_path():
+ if "CUDA_HOME" in os.environ:
+ return os.environ["CUDA_HOME"]
+ import torch
+ torch_lib_path = Path(torch.__file__).parent / "lib"
+ torch_lib_path = str(torch_lib_path.resolve())
+ if os.path.exists(torch_lib_path):
+ nvrtc = filter(lambda lib_file: "nvrtc-builtins" in lib_file, os.listdir(torch_lib_path))
+ nvrtc = list(nvrtc)
+ return torch_lib_path if len(nvrtc) > 0 else None
+
+@cupy.memoize(for_each_device=True)
+def cuda_launch(strKey: str):
+ if True:#"CUDA_HOME" not in os.environ:
+ cuda_home = get_cuda_home_path()
+ if cuda_home is not None:
+ os.environ["CUDA_HOME"] = cuda_home
+ os.environ["CUDA_PATH"] = cuda_home
+ else:
+ os.environ["CUDA_HOME"] = "/usr/local/cuda/"
+ os.environ["CUDA_PATH"] = "/usr/local/cuda/"
+ # print(objCudacache[strKey]['strKernel'])
+ # return cupy.cuda.compile_with_cache(objCudacache[strKey]['strKernel'], tuple(['-I ' + os.environ['CUDA_HOME'], '-I ' + os.environ['CUDA_HOME'] + '/include'])).get_function(objCudacache[strKey]['strFunction'])
+ return cupy.RawModule(code=objCudacache[strKey]["strKernel"]).get_function(
+ objCudacache[strKey]["strFunction"]
+ )
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e36bb6cf71d64b17637b96712784de777eef1b28
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/__init__.py
@@ -0,0 +1,150 @@
+import comfy.model_management as model_management
+import torch
+import torch.multiprocessing as mp
+from .worker_process import f
+from .utils import to_shared_memory
+
+parent_conn, child_conn, process = None, None, None
+device = model_management.get_torch_device()
+
+def req_to_taichi_process(op_name, *tensors):
+ global parent_conn, child_conn, process
+ if parent_conn is None:
+ mp.set_start_method('spawn', force=True)
+ parent_conn, child_conn = mp.Pipe()
+ process = mp.Process(target=f, args=(child_conn, device))
+ process.start()
+
+ tensors = to_shared_memory(tensors)
+ parent_conn.send((op_name, tensors))
+ result = parent_conn.recv()
+ del tensors
+
+ if type(result) not in [tuple, list]:
+ raise Exception(result)
+
+ return [tensor.to(device) for tensor in result]
+
+def softsplat(
+ tenIn: torch.Tensor, tenFlow: torch.Tensor, tenMetric: torch.Tensor, strMode: str
+):
+ assert strMode.split("-")[0] in ["sum", "avg", "linear", "soft"]
+
+ if strMode == "sum":
+ assert tenMetric is None
+ if strMode == "avg":
+ assert tenMetric is None
+ if strMode.split("-")[0] == "linear":
+ assert tenMetric is not None
+ if strMode.split("-")[0] == "soft":
+ assert tenMetric is not None
+
+ if strMode == "avg":
+ tenIn = torch.cat(
+ [
+ tenIn,
+ tenIn.new_ones([tenIn.shape[0], 1, tenIn.shape[2], tenIn.shape[3]]),
+ ],
+ 1,
+ )
+
+ elif strMode.split("-")[0] == "linear":
+ tenIn = torch.cat([tenIn * tenMetric, tenMetric], 1)
+
+ elif strMode.split("-")[0] == "soft":
+ tenIn = torch.cat([tenIn * tenMetric.exp(), tenMetric.exp()], 1)
+
+ # end
+
+ tenOut = req_to_taichi_process("softsplat_out", tenIn, tenFlow)[0]
+
+ if strMode.split("-")[0] in ["avg", "linear", "soft"]:
+ tenNormalize = tenOut[:, -1:, :, :]
+
+ if len(strMode.split("-")) == 1:
+ tenNormalize = tenNormalize + 0.0000001
+
+ elif strMode.split("-")[1] == "addeps":
+ tenNormalize = tenNormalize + 0.0000001
+
+ elif strMode.split("-")[1] == "zeroeps":
+ tenNormalize[tenNormalize == 0.0] = 1.0
+
+ elif strMode.split("-")[1] == "clipeps":
+ tenNormalize = tenNormalize.clip(0.0000001, None)
+
+ # end
+
+ tenOut = tenOut[:, :-1, :, :] / tenNormalize
+ # end
+
+ return tenOut
+
+def FunctionSoftsplat(tenInput, tenFlow, tenMetric, strType):
+ assert tenMetric is None or tenMetric.shape[1] == 1
+ assert strType in ["summation", "average", "linear", "softmax"]
+
+ if strType == "average":
+ tenInput = torch.cat(
+ [
+ tenInput,
+ tenInput.new_ones(
+ tenInput.shape[0], 1, tenInput.shape[2], tenInput.shape[3]
+ ),
+ ],
+ 1,
+ )
+
+ elif strType == "linear":
+ tenInput = torch.cat([tenInput * tenMetric, tenMetric], 1)
+
+ elif strType == "softmax":
+ tenInput = torch.cat([tenInput * tenMetric.exp(), tenMetric.exp()], 1)
+
+ # end
+
+ tenOutput = req_to_taichi_process("softsplat_out", tenInput, tenFlow)[0]
+
+ if strType != "summation":
+ tenNormalize = tenOutput[:, -1:, :, :]
+
+ tenNormalize[tenNormalize == 0.0] = 1.0
+
+ tenOutput = tenOutput[:, :-1, :, :] / tenNormalize
+ # end
+
+ return tenOutput
+
+
+# end
+
+
+class ModuleSoftsplat(torch.nn.Module):
+ def __init__(self, strType):
+ super(self).__init__()
+
+ self.strType = strType
+
+ # end
+
+ def forward(self, tenInput, tenFlow, tenMetric):
+ return FunctionSoftsplat(tenInput, tenFlow, tenMetric, self.strType)
+
+def softsplat_func(tenIn, tenFlow):
+ return req_to_taichi_process("softsplat_out", tenIn, tenFlow)[0]
+
+class costvol_func:
+ @staticmethod
+ def apply(tenOne, tenTwo):
+ return req_to_taichi_process("costvol_out", tenOne, tenTwo)[0]
+
+class sepconv_func:
+ @staticmethod
+ def apply(tenIn, tenVer, tenHor):
+ return req_to_taichi_process("sepconv_out", tenIn, tenVer, tenHor)[0]
+
+def init():
+ one_sample = torch.ones(1, 3, 16, 16, dtype=torch.float32, device=device)
+ softsplat_func(one_sample, one_sample)
+ costvol_func.apply(one_sample, one_sample)
+ sepconv_func.apply(one_sample, one_sample, one_sample)
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/adacof.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/adacof.py
new file mode 100644
index 0000000000000000000000000000000000000000..acf2672e84b32f843018ee617b7800b9b884d4b1
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/adacof.py
@@ -0,0 +1,6 @@
+import torch
+class FunctionAdaCoF(torch.autograd.Function):
+ # end
+ @staticmethod
+ def forward(ctx, input, weight, offset_i, offset_j, dilation):
+ raise NotImplementedError()
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/batch_edt.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/batch_edt.py
new file mode 100644
index 0000000000000000000000000000000000000000..c1fe1fd4e2e6eb51cbad9d76d29cf2191c194d14
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/batch_edt.py
@@ -0,0 +1,2 @@
+def batch_edt(img, block=1024):
+ raise NotImplementedError()
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/correlation.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/correlation.py
new file mode 100644
index 0000000000000000000000000000000000000000..3782d1a930219681996d3e48361acf82b8866edc
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/correlation.py
@@ -0,0 +1,15 @@
+import torch
+
+class _FunctionCorrelation(torch.autograd.Function):
+ @staticmethod
+ def forward(self, first, second):
+ raise NotImplementedError()
+
+def FunctionCorrelation(tenFirst, tenSecond):
+ raise NotImplementedError()
+ return _FunctionCorrelation.apply(tenFirst, tenSecond)
+
+class ModuleCorrelation(torch.nn.Module):
+ def __init__(self):
+ raise NotImplementedError()
+ super(ModuleCorrelation, self).__init__()
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/costvol.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/costvol.py
new file mode 100644
index 0000000000000000000000000000000000000000..a82b7273cd38b7ea19c99356ea762a6e4b58ff99
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/costvol.py
@@ -0,0 +1,26 @@
+import taichi as ti
+import taichi.math as tm
+
+""" @ti.kernel
+def costvol_out(tenOne: ti.types.ndarray(), tltOne: ti.types.ndarray(), tenTwo: ti.types.ndarray(), tenOut: ti.types.ndarray()):
+ N, C, H, W = tenOut.shape
+ for i, ch, y, x in ti.ndrange(N, C, H, W):
+ for intValue in range(tenOne.shape[1]):
+ tltOne[intValue] = tenOne[i, intValue, y, x]
+
+ tenOut_ch = 0
+ for intOy in range(y - 4, y + 4 + 1):
+ for intOx in range(x - 4, x + 4 + 1):
+ point = tm.ivec2(intOx, intOy)
+ fltValue = 0.0
+ for intValue in range(ch):
+ if (point.y >= 0) and (point.y < H) and (point.x >= 0) and (point.x < W):
+ fltValue += ti.abs(tltOne[intValue] - tenTwo[i, intValue, point.y, point.x])
+ else:
+ fltValue += ti.abs(tltOne[intValue])
+
+ tenOut[i, tenOut_ch, y, x] = fltValue / tenOne.shape[1]
+ tenOut_ch += 1 """
+
+def worker_interface(op_name, tensors):
+ raise NotImplementedError(op_name)
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/raw_softsplat.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/raw_softsplat.py
new file mode 100644
index 0000000000000000000000000000000000000000..0cfd3fd52484afa930939541c10c94c7b270d7bf
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/raw_softsplat.py
@@ -0,0 +1,126 @@
+#Seperate taichi kernels to another file so that comfy.model_management won't be called in the new process
+
+import taichi as ti
+import taichi.math as tm
+
+@ti.func
+def put_to_tenOut(tenOut: ti.types.ndarray(), fltIn: ti.i32, flt: ti.i32, pos:tm.uvec2, i:ti.i32, ch:ti.i32):
+ N, C, H, W = tenOut.shape
+ if (pos.x >= 0) and (pos.x < W) and (pos.y >= 0) and (pos.y < H):
+ tenOut[i, ch, pos.y, pos.x] += fltIn * flt
+@ti.kernel
+def softsplat_out(tenIn: ti.types.ndarray(), tenFlow: ti.types.ndarray(), tenOut: ti.types.ndarray()):
+ N, C, H, W = tenIn.shape
+ for i, ch, y, x in ti.ndrange(N, C, H, W):
+ fltX = x + tenFlow[i, 0, y, x]
+ fltY = y + tenFlow[i, 1, y, x]
+ fltIn = tenIn[i, ch, y, x]
+
+ northWest = tm.ivec2(ti.floor(fltX), ti.floor(fltY))
+ northEast = northWest + [1, 0]
+ southWest = northWest + [0, 1]
+ southEast = northWest + [1, 1]
+
+ fltNorthwest = (southEast.x - fltX) * (southEast.y - fltY)
+ fltNortheast = (fltX - southWest.x) * (southWest.y - fltY)
+ fltSouthwest = (northEast.x - fltX) * (fltY - northEast.y)
+ fltSoutheast = (fltX - northWest.x) * (fltY - northWest.y)
+
+ put_to_tenOut(tenOut, fltIn, fltNorthwest, northWest, i, ch)
+ put_to_tenOut(tenOut, fltIn, fltNortheast, northEast, i, ch)
+ put_to_tenOut(tenOut, fltIn, fltSouthwest, southWest, i, ch)
+ put_to_tenOut(tenOut, fltIn, fltSoutheast, southEast, i, ch)
+
+@ti.func
+def add_to_fltFlowgrad(fltFlowgrad, tenOutgrad, fltIn, flt, pos, i, ch):
+ N, C, H, W = tenOutgrad.shape
+ if (pos.x >= 0) and (pos.x < W) and (pos.y >= 0) and (pos.y < H):
+ fltFlowgrad += tenOutgrad[i, ch, pos.y, pos.x] * fltIn * flt
+
+@ti.kernel
+def softsplat_flowgrad(
+ tenIn: ti.types.ndarray(),
+ tenFlow: ti.types.ndarray(),
+ tenOutgrad: ti.types.ndarray(),
+ tenIngrad: ti.types.ndarray(),
+ tenFlowgrad: ti.types.ndarray()
+):
+ N, C, H, W = tenFlowgrad.shape
+ for i, ch, y, x in ti.ndrange(N, C, H, W):
+ fltFlowgrad = 0.0
+ fltX = x + tenFlow[i, 0, y, x]
+ fltY = y + tenFlow[i, 1, y, x]
+
+ northWest = tm.vec2(ti.floor(fltX, dtype=ti.i32), ti.floor(fltY, dtype=ti.i32))
+ northEast = tm.vec2(northWest.x + 1, northWest.y)
+ southWest = tm.vec2(northWest.x, northWest.y + 1)
+ southEast = tm.vec2(northWest.x + 1, northWest.y + 1)
+
+ if ch == 0:
+ fltNorthwest = -1.0 * (southEast.y - fltY)
+ fltNortheast = +1.0 * (southWest.y - fltY)
+ fltSouthwest = -1.0 * (fltY - northEast.y)
+ fltSoutheast = +1.0 * (fltY - northWest.y)
+
+ elif ch == 1:
+ fltNorthwest = -1.0 * (southEast.x - fltX)
+ fltNortheast = -1.0 * (fltX - southWest.x)
+ fltSouthwest = +1.0 * (northEast.x - fltX)
+ fltSoutheast = +1.0 * (fltX - northWest.x)
+
+ for outgrad_ch in ti.ndrange(tenOutgrad.shape[1]):
+ fltIn = tenIn[i, outgrad_ch, y, x]
+ add_to_fltFlowgrad(fltFlowgrad, tenOutgrad, fltIn, fltNorthwest, northWest, i, outgrad_ch)
+ add_to_fltFlowgrad(fltFlowgrad, tenOutgrad, fltIn, fltNortheast, northEast, i, outgrad_ch)
+ add_to_fltFlowgrad(fltFlowgrad, tenOutgrad, fltIn, fltSouthwest, southWest, i, outgrad_ch)
+ add_to_fltFlowgrad(fltFlowgrad, tenOutgrad, fltIn, fltSoutheast, southEast, i, outgrad_ch)
+
+ tenFlowgrad[i] = fltFlowgrad #Is 'i' the same as intIndex?
+
+@ti.func
+def add_to_fltIngrad(fltIngrad, tenOutgrad, flt, pos, i, ch):
+ N, C, H, W = tenOutgrad.shape
+ if (pos.x >= 0) and (pos.x < W) and (pos.y >= 0) and (pos.y < H):
+ fltIngrad += tenOutgrad[i, ch, pos.y, pos.x] * flt
+@ti.kernel
+def softsplat_ingrad(
+ tenIn: ti.types.ndarray(),
+ tenFlow: ti.types.ndarray(),
+ tenOutgrad: ti.types.ndarray(),
+ tenIngrad: ti.types.ndarray(),
+ tenFlowgrad: ti.types.ndarray()
+):
+ N, C, H, W = tenIngrad.shape
+ for i, ch, y, x in ti.ndrange(N, C, H, W):
+ fltIngrad = 0.0
+ fltX = x + tenFlow[i, 0, y, x]
+ fltY = y + tenFlow[i, 1, y, x]
+
+ northWest = tm.vec2(ti.floor(fltX, dtype=ti.i32), ti.floor(fltY, dtype=ti.i32))
+ northEast = tm.vec2(northWest.x + 1, northWest.y)
+ southWest = tm.vec2(northWest.x, northWest.y + 1)
+ southEast = tm.vec2(northWest.x + 1, northWest.y + 1)
+
+ fltNorthwest = (southEast.x - fltX) * (southEast.y - fltY)
+ fltNortheast = (fltX - southWest.x) * (southWest.y - fltY)
+ fltSouthwest = (northEast.x - fltX) * (fltY - northEast.y)
+ fltSoutheast = (fltX - northWest.x) * (fltY - northWest.y)
+
+ add_to_fltIngrad(fltIngrad, tenOutgrad, fltNorthwest, northWest, i, ch)
+ add_to_fltIngrad(fltIngrad, tenOutgrad, fltNortheast, northEast, i, ch)
+ add_to_fltIngrad(fltIngrad, tenOutgrad, fltSouthwest, southWest, i, ch)
+ add_to_fltIngrad(fltIngrad, tenOutgrad, fltSoutheast, southEast, i, ch)
+ tenIngrad[i] = fltIngrad
+
+# end
+
+def worker_interface(op_name, tensors):
+ if op_name == "softsplat_out":
+ tenIn, tenFlow = tensors
+ tenOut = tenIn.new_zeros(tenIn.shape)
+ softsplat_out(tenIn, tenFlow, tenOut)
+ return (tenOut, )
+
+ raise NotImplementedError(op_name)
+
+__all__ = ["worker_interface"]
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/sepconv.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/sepconv.py
new file mode 100644
index 0000000000000000000000000000000000000000..f9d8909befa072646f4077b10bd18f735c928218
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/sepconv.py
@@ -0,0 +1,39 @@
+import taichi as ti
+import taichi.math as tm
+from functools import reduce
+
+@ti.kernel
+def sepconv_out(tenIn: ti.types.ndarray(), tenVer: ti.types.ndarray(), tenHor: ti.types.ndarray(), tenOut: ti.types.ndarray()):
+ N, C, H, W = tenIn.shape
+ intIndex = 0
+ for i, ch, y, x in ti.ndrange(N, C, H, W):
+ fltOut, fltKahanc, fltKahany, fltKahant = 0.0, 0.0, 0.0, 0.0
+ for intFy, intFx in ti.ndrange(tenVer.shape[1], tenHor.shape[1]):
+ fltKahany = tenIn[i, ch, y + intFy, x + intFx] * tenVer[i, intFy, y, x] * tenHor[i, intFx, y, x]
+ fltKahany = fltKahany - fltKahanc
+ fltKahant = fltOut + fltKahany
+ fltKahanc = (fltKahant - fltOut) - fltKahany
+ fltOut = fltKahant
+ tenOut[intIndex] = fltOut
+ intIndex += 1
+
+
+def worker_interface(op_name, tensors):
+ if op_name == "sepconv_out":
+ tenIn, tenVer, tenHor = tensors
+ real_tenOut_shape = [
+ tenIn.shape[0],
+ tenIn.shape[1],
+ tenVer.shape[2] and tenHor.shape[2],
+ tenVer.shape[3] and tenHor.shape[3],
+ ]
+ tenOut = tenIn.new_zeros([
+ int(reduce(lambda a, b: a * b, real_tenOut_shape))
+ ])
+ sepconv_out(tenIn, tenVer, tenHor, tenOut)
+ tenOut = tenOut.view(*real_tenOut_shape)
+ return (tenOut, )
+
+ raise NotImplementedError(op_name)
+
+__all__ = ["worker_interface"]
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/utils.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..ee42b2fb05c2230930d0fe4557db361a47b54708
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/utils.py
@@ -0,0 +1,11 @@
+import platform
+import torch
+def to_shared_memory(tensors: tuple[torch.Tensor]):
+ return [tensor.cpu() for tensor in tensors if tensor is not None]
+ """ if platform.system() == "Windows":
+ return [tensor.cpu() for tensor in tensors if tensor is not None]
+
+ return [tensor.share_memory_() for tensor in tensors if tensor is not None] """
+
+def to_device(tensors: tuple[torch.Tensor], device: torch.device):
+ return [tensor.to(device) for tensor in tensors if tensor is not None]
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/worker_process.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/worker_process.py
new file mode 100644
index 0000000000000000000000000000000000000000..586d06a9e310247fcdd2368f8e362eeaaddac1fd
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/ops/taichi_ops/worker_process.py
@@ -0,0 +1,26 @@
+import torch.multiprocessing as mp
+import torch
+from .raw_softsplat import worker_interface as raw_softsplat
+from .costvol import worker_interface as costvol
+from .sepconv import worker_interface as sepconv
+from .utils import to_shared_memory, to_device
+import taichi as ti
+import traceback
+
+def f(child_conn, device: torch.DeviceObjType):
+ ti.init(arch=ti.gpu)
+ while True:
+ op_name, tensors = child_conn.recv()
+ tensors = to_device(tensors, device)
+ try:
+ if "softsplat" in op_name:
+ result = raw_softsplat(op_name, tensors)
+ elif "costvol" in op_name:
+ result = costvol(op_name, tensors)
+ elif "sepconv" in op_name:
+ result = sepconv(op_name, tensors)
+ else:
+ raise NotImplementedError(op_name)
+ child_conn.send(to_shared_memory(result))
+ except:
+ child_conn.send(traceback.format_exc())
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/rife/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/rife/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..9c9e82dbeebcd7dcd49acc16703fbcea110d0657
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/rife/__init__.py
@@ -0,0 +1,107 @@
+import torch
+from torch.utils.data import DataLoader
+import pathlib
+from vfi_utils import load_file_from_github_release, preprocess_frames, postprocess_frames, generic_frame_loop, InterpolationStateList
+import typing
+from comfy.model_management import get_torch_device
+import re
+from functools import cmp_to_key
+from packaging import version
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+CKPT_NAME_VER_DICT = {
+ "rife40.pth": "4.0",
+ "rife41.pth": "4.0",
+ "rife42.pth": "4.2",
+ "rife43.pth": "4.3",
+ "rife44.pth": "4.3",
+ "rife45.pth": "4.5",
+ "rife46.pth": "4.6",
+ "rife47.pth": "4.7",
+ "rife48.pth": "4.7",
+ "rife49.pth": "4.7",
+ "sudo_rife4_269.662_testV1_scale1.pth": "4.0"
+ #Arch 4.10 doesn't work due to state dict mismatch
+ #TODO: Investigating and fix it
+ #"rife410.pth": "4.10",
+ #"rife411.pth": "4.10",
+ #"rife412.pth": "4.10"
+}
+
+class RIFE_VFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (
+ sorted(list(CKPT_NAME_VER_DICT.keys()), key=lambda ckpt_name: version.parse(CKPT_NAME_VER_DICT[ckpt_name])),
+ {"default": "rife47.pth"}
+ ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 10, "min": 1, "max": 1000}),
+ "multiplier": ("INT", {"default": 2, "min": 1}),
+ "fast_mode": ("BOOLEAN", {"default":True}),
+ "ensemble": ("BOOLEAN", {"default":True}),
+ "scale_factor": ([0.25, 0.5, 1.0, 2.0, 4.0], {"default": 1.0})
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames = 10,
+ multiplier: typing.SupportsInt = 2,
+ fast_mode = False,
+ ensemble = False,
+ scale_factor = 1.0,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ """
+ Perform video frame interpolation using a given checkpoint model.
+
+ Args:
+ ckpt_name (str): The name of the checkpoint model to use.
+ frames (torch.Tensor): A tensor containing input video frames.
+ clear_cache_after_n_frames (int, optional): The number of frames to process before clearing CUDA cache
+ to prevent memory overflow. Defaults to 10. Lower numbers are safer but mean more processing time.
+ How high you should set it depends on how many input frames there are, input resolution (after upscaling),
+ how many times you want to multiply them, and how long you're willing to wait for the process to complete.
+ multiplier (int, optional): The multiplier for each input frame. 60 input frames * 2 = 120 output frames. Defaults to 2.
+
+ Returns:
+ tuple: A tuple containing the output interpolated frames.
+
+ Note:
+ This method interpolates frames in a video sequence using a specified checkpoint model.
+ It processes each frame sequentially, generating interpolated frames between them.
+
+ To prevent memory overflow, it clears the CUDA cache after processing a specified number of frames.
+ """
+ from .rife_arch import IFNet
+ model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
+ arch_ver = CKPT_NAME_VER_DICT[ckpt_name]
+ interpolation_model = IFNet(arch_ver=arch_ver)
+ interpolation_model.load_state_dict(torch.load(model_path))
+ interpolation_model.eval().to(get_torch_device())
+ frames = preprocess_frames(frames)
+
+ def return_middle_frame(frame_0, frame_1, timestep, model, scale_list, in_fast_mode, in_ensemble):
+ return model(frame_0, frame_1, timestep, scale_list, in_fast_mode, in_ensemble)
+
+ scale_list = [8 / scale_factor, 4 / scale_factor, 2 / scale_factor, 1 / scale_factor]
+
+ args = [interpolation_model, scale_list, fast_mode, ensemble]
+ out = postprocess_frames(
+ generic_frame_loop(type(self).__name__, frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
+ interpolation_states=optional_interpolation_states, dtype=torch.float32)
+ )
+ return (out,)
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/rife/rife_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/rife/rife_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..cf2b4545298a1f34d8429e93f0aa4f43c06c090e
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/rife/rife_arch.py
@@ -0,0 +1,586 @@
+"""
+26-Dez-21
+https://github.com/hzwer/Practical-RIFE
+https://github.com/hzwer/Practical-RIFE/blob/main/model/warplayer.py
+https://github.com/HolyWu/vs-rife/blob/master/vsrife/__init__.py
+"""
+from torch.nn.parallel import DistributedDataParallel as DDP
+from torch.optim import AdamW
+import torch
+import torch.nn.functional as F
+import torch.nn as nn
+import torch.optim as optim
+import warnings
+from comfy.model_management import get_torch_device
+
+device = get_torch_device()
+backwarp_tenGrid = {}
+
+
+class ResConv(nn.Module):
+ def __init__(self, c, dilation=1):
+ super(ResConv, self).__init__()
+ self.conv = nn.Conv2d(c, c, 3, 1, dilation, dilation=dilation, groups=1)
+ self.beta = nn.Parameter(torch.ones((1, c, 1, 1)), requires_grad=True)
+ self.relu = nn.LeakyReLU(0.2, True)
+
+ def forward(self, x):
+ return self.relu(self.conv(x) * self.beta + x)
+
+
+def warp(tenInput, tenFlow):
+ k = (str(tenFlow.device), str(tenFlow.size()))
+ if k not in backwarp_tenGrid:
+ tenHorizontal = (
+ torch.linspace(-1.0, 1.0, tenFlow.shape[3], device=device)
+ .view(1, 1, 1, tenFlow.shape[3])
+ .expand(tenFlow.shape[0], -1, tenFlow.shape[2], -1)
+ )
+ tenVertical = (
+ torch.linspace(-1.0, 1.0, tenFlow.shape[2], device=device)
+ .view(1, 1, tenFlow.shape[2], 1)
+ .expand(tenFlow.shape[0], -1, -1, tenFlow.shape[3])
+ )
+ backwarp_tenGrid[k] = torch.cat([tenHorizontal, tenVertical], 1).to(device)
+
+ tenFlow = torch.cat(
+ [
+ tenFlow[:, 0:1, :, :] / ((tenInput.shape[3] - 1.0) / 2.0),
+ tenFlow[:, 1:2, :, :] / ((tenInput.shape[2] - 1.0) / 2.0),
+ ],
+ 1,
+ )
+
+ g = (backwarp_tenGrid[k] + tenFlow).permute(0, 2, 3, 1)
+
+ if tenInput.type() == "torch.cuda.HalfTensor":
+ g = g.half()
+
+ padding_mode = "border"
+ if device.type == "mps":
+ # https://github.com/pytorch/pytorch/issues/125098
+ padding_mode = "zeros"
+ g = g.clamp(-1, 1)
+ return torch.nn.functional.grid_sample(
+ input=tenInput,
+ grid=g,
+ mode="bilinear",
+ padding_mode=padding_mode,
+ align_corners=True,
+ )
+
+
+def conv(
+ in_planes,
+ out_planes,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ dilation=1,
+ arch_ver="4.0",
+):
+ if arch_ver == "4.0":
+ return nn.Sequential(
+ nn.Conv2d(
+ in_planes,
+ out_planes,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ dilation=dilation,
+ bias=True,
+ ),
+ nn.PReLU(out_planes),
+ )
+ if arch_ver in ["4.2", "4.3", "4.5", "4.6", "4.7", "4.10"]:
+ return nn.Sequential(
+ nn.Conv2d(
+ in_planes,
+ out_planes,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ dilation=dilation,
+ bias=True,
+ ),
+ nn.LeakyReLU(0.2, True),
+ )
+
+
+def conv_woact(in_planes, out_planes, kernel_size=3, stride=1, padding=1, dilation=1):
+ return nn.Sequential(
+ nn.Conv2d(
+ in_planes,
+ out_planes,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ dilation=dilation,
+ bias=True,
+ ),
+ )
+
+
+def conv_woact(in_planes, out_planes, kernel_size=3, stride=1, padding=1, dilation=1):
+ return nn.Sequential(
+ nn.Conv2d(
+ in_planes,
+ out_planes,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ dilation=dilation,
+ bias=True,
+ )
+ )
+
+
+def deconv(in_planes, out_planes, kernel_size=4, stride=2, padding=1, arch_ver="4.0"):
+ if arch_ver == "4.0":
+ return nn.Sequential(
+ torch.nn.ConvTranspose2d(
+ in_channels=in_planes,
+ out_channels=out_planes,
+ kernel_size=4,
+ stride=2,
+ padding=1,
+ bias=True,
+ ),
+ nn.PReLU(out_planes),
+ )
+ if arch_ver in ["4.2", "4.3", "4.5", "4.6", "4.7", "4.10"]:
+ return nn.Sequential(
+ torch.nn.ConvTranspose2d(
+ in_channels=in_planes,
+ out_channels=out_planes,
+ kernel_size=4,
+ stride=2,
+ padding=1,
+ bias=True,
+ ),
+ nn.LeakyReLU(0.2, True),
+ )
+
+
+class Conv2(nn.Module):
+ def __init__(self, in_planes, out_planes, stride=2, arch_ver="4.0"):
+ super(Conv2, self).__init__()
+ self.conv1 = conv(in_planes, out_planes, 3, stride, 1, arch_ver=arch_ver)
+ self.conv2 = conv(out_planes, out_planes, 3, 1, 1, arch_ver=arch_ver)
+
+ def forward(self, x):
+ x = self.conv1(x)
+ x = self.conv2(x)
+ return x
+
+
+class IFBlock(nn.Module):
+ def __init__(self, in_planes, c=64, arch_ver="4.0"):
+ super(IFBlock, self).__init__()
+ self.arch_ver = arch_ver
+ self.conv0 = nn.Sequential(
+ conv(in_planes, c // 2, 3, 2, 1, arch_ver=arch_ver),
+ conv(c // 2, c, 3, 2, 1, arch_ver=arch_ver),
+ )
+ self.arch_ver = arch_ver
+
+ if arch_ver in ["4.0", "4.2", "4.3"]:
+ self.convblock = nn.Sequential(
+ conv(c, c, arch_ver=arch_ver),
+ conv(c, c, arch_ver=arch_ver),
+ conv(c, c, arch_ver=arch_ver),
+ conv(c, c, arch_ver=arch_ver),
+ conv(c, c, arch_ver=arch_ver),
+ conv(c, c, arch_ver=arch_ver),
+ conv(c, c, arch_ver=arch_ver),
+ conv(c, c, arch_ver=arch_ver),
+ )
+ self.lastconv = nn.ConvTranspose2d(c, 5, 4, 2, 1)
+
+ if arch_ver in ["4.5", "4.6", "4.7", "4.10"]:
+ self.convblock = nn.Sequential(
+ ResConv(c),
+ ResConv(c),
+ ResConv(c),
+ ResConv(c),
+ ResConv(c),
+ ResConv(c),
+ ResConv(c),
+ ResConv(c),
+ )
+ if arch_ver == "4.5":
+ self.lastconv = nn.Sequential(
+ nn.ConvTranspose2d(c, 4 * 5, 4, 2, 1), nn.PixelShuffle(2)
+ )
+ if arch_ver in ["4.6", "4.7", "4.10"]:
+ self.lastconv = nn.Sequential(
+ nn.ConvTranspose2d(c, 4 * 6, 4, 2, 1), nn.PixelShuffle(2)
+ )
+
+ def forward(self, x, flow=None, scale=1):
+ x = F.interpolate(
+ x, scale_factor=1.0 / scale, mode="bilinear", align_corners=False
+ )
+ if flow is not None:
+ flow = (
+ F.interpolate(
+ flow, scale_factor=1.0 / scale, mode="bilinear", align_corners=False
+ )
+ * 1.0
+ / scale
+ )
+ x = torch.cat((x, flow), 1)
+ feat = self.conv0(x)
+ if self.arch_ver == "4.0":
+ feat = self.convblock(feat) + feat
+ if self.arch_ver in ["4.2", "4.3", "4.5", "4.6", "4.7", "4.10"]:
+ feat = self.convblock(feat)
+
+ tmp = self.lastconv(feat)
+ if self.arch_ver in ["4.0", "4.2", "4.3"]:
+ tmp = F.interpolate(
+ tmp, scale_factor=scale * 2, mode="bilinear", align_corners=False
+ )
+ flow = tmp[:, :4] * scale * 2
+ if self.arch_ver in ["4.5", "4.6", "4.7", "4.10"]:
+ tmp = F.interpolate(
+ tmp, scale_factor=scale, mode="bilinear", align_corners=False
+ )
+ flow = tmp[:, :4] * scale
+ mask = tmp[:, 4:5]
+ return flow, mask
+
+
+class Contextnet(nn.Module):
+ def __init__(self, arch_ver="4.0"):
+ super(Contextnet, self).__init__()
+ c = 16
+ self.conv1 = Conv2(3, c, arch_ver=arch_ver)
+ self.conv2 = Conv2(c, 2 * c, arch_ver=arch_ver)
+ self.conv3 = Conv2(2 * c, 4 * c, arch_ver=arch_ver)
+ self.conv4 = Conv2(4 * c, 8 * c, arch_ver=arch_ver)
+
+ def forward(self, x, flow):
+ x = self.conv1(x)
+ flow = (
+ F.interpolate(flow, scale_factor=0.5, mode="bilinear", align_corners=False)
+ * 0.5
+ )
+ f1 = warp(x, flow)
+ x = self.conv2(x)
+ flow = (
+ F.interpolate(flow, scale_factor=0.5, mode="bilinear", align_corners=False)
+ * 0.5
+ )
+ f2 = warp(x, flow)
+ x = self.conv3(x)
+ flow = (
+ F.interpolate(flow, scale_factor=0.5, mode="bilinear", align_corners=False)
+ * 0.5
+ )
+ f3 = warp(x, flow)
+ x = self.conv4(x)
+ flow = (
+ F.interpolate(flow, scale_factor=0.5, mode="bilinear", align_corners=False)
+ * 0.5
+ )
+ f4 = warp(x, flow)
+ return [f1, f2, f3, f4]
+
+
+class Unet(nn.Module):
+ def __init__(self, arch_ver="4.0"):
+ super(Unet, self).__init__()
+ c = 16
+ self.down0 = Conv2(17, 2 * c, arch_ver=arch_ver)
+ self.down1 = Conv2(4 * c, 4 * c, arch_ver=arch_ver)
+ self.down2 = Conv2(8 * c, 8 * c, arch_ver=arch_ver)
+ self.down3 = Conv2(16 * c, 16 * c, arch_ver=arch_ver)
+ self.up0 = deconv(32 * c, 8 * c, arch_ver=arch_ver)
+ self.up1 = deconv(16 * c, 4 * c, arch_ver=arch_ver)
+ self.up2 = deconv(8 * c, 2 * c, arch_ver=arch_ver)
+ self.up3 = deconv(4 * c, c, arch_ver=arch_ver)
+ self.conv = nn.Conv2d(c, 3, 3, 1, 1)
+
+ def forward(self, img0, img1, warped_img0, warped_img1, mask, flow, c0, c1):
+ s0 = self.down0(
+ torch.cat((img0, img1, warped_img0, warped_img1, mask, flow), 1)
+ )
+ s1 = self.down1(torch.cat((s0, c0[0], c1[0]), 1))
+ s2 = self.down2(torch.cat((s1, c0[1], c1[1]), 1))
+ s3 = self.down3(torch.cat((s2, c0[2], c1[2]), 1))
+ x = self.up0(torch.cat((s3, c0[3], c1[3]), 1))
+ x = self.up1(torch.cat((x, s2), 1))
+ x = self.up2(torch.cat((x, s1), 1))
+ x = self.up3(torch.cat((x, s0), 1))
+ x = self.conv(x)
+ return torch.sigmoid(x)
+
+
+"""
+currently supports 4.0-4.12
+
+4.0: 4.0, 4.1
+4.2: 4.2
+4.3: 4.3, 4.4
+4.5: 4.5
+4.6: 4.6
+4.7: 4.7, 4.8, 4.9
+4.10: 4.10 4.11 4.12
+"""
+
+
+class IFNet(nn.Module):
+ def __init__(self, arch_ver="4.0"):
+ super(IFNet, self).__init__()
+ self.arch_ver = arch_ver
+ if arch_ver in ["4.0", "4.2", "4.3", "4.5", "4.6"]:
+ self.block0 = IFBlock(7, c=192, arch_ver=arch_ver)
+ self.block1 = IFBlock(8 + 4, c=128, arch_ver=arch_ver)
+ self.block2 = IFBlock(8 + 4, c=96, arch_ver=arch_ver)
+ self.block3 = IFBlock(8 + 4, c=64, arch_ver=arch_ver)
+ if arch_ver in ["4.7"]:
+ self.block0 = IFBlock(7 + 8, c=192, arch_ver=arch_ver)
+ self.block1 = IFBlock(8 + 4 + 8, c=128, arch_ver=arch_ver)
+ self.block2 = IFBlock(8 + 4 + 8, c=96, arch_ver=arch_ver)
+ self.block3 = IFBlock(8 + 4 + 8, c=64, arch_ver=arch_ver)
+ self.encode = nn.Sequential(
+ nn.Conv2d(3, 16, 3, 2, 1), nn.ConvTranspose2d(16, 4, 4, 2, 1)
+ )
+ if arch_ver in ["4.10"]:
+ self.block0 = IFBlock(7 + 16, c=192)
+ self.block1 = IFBlock(8 + 4 + 16, c=128)
+ self.block2 = IFBlock(8 + 4 + 16, c=96)
+ self.block3 = IFBlock(8 + 4 + 16, c=64)
+ self.encode = nn.Sequential(
+ nn.Conv2d(3, 32, 3, 2, 1),
+ nn.LeakyReLU(0.2, True),
+ nn.Conv2d(32, 32, 3, 1, 1),
+ nn.LeakyReLU(0.2, True),
+ nn.Conv2d(32, 32, 3, 1, 1),
+ nn.LeakyReLU(0.2, True),
+ nn.ConvTranspose2d(32, 8, 4, 2, 1),
+ )
+
+ if arch_ver in ["4.0", "4.2", "4.3"]:
+ self.contextnet = Contextnet(arch_ver=arch_ver)
+ self.unet = Unet(arch_ver=arch_ver)
+ self.arch_ver = arch_ver
+
+ def forward(
+ self,
+ img0,
+ img1,
+ timestep=0.5,
+ scale_list=[8, 4, 2, 1],
+ training=True,
+ fastmode=True,
+ ensemble=False,
+ return_flow=False,
+ ):
+ img0 = torch.clamp(img0, 0, 1)
+ img1 = torch.clamp(img1, 0, 1)
+
+ n, c, h, w = img0.shape
+ ph = ((h - 1) // 64 + 1) * 64
+ pw = ((w - 1) // 64 + 1) * 64
+ padding = (0, pw - w, 0, ph - h)
+ img0 = F.pad(img0, padding)
+ img1 = F.pad(img1, padding)
+ x = torch.cat((img0, img1), 1)
+
+ if training == False:
+ channel = x.shape[1] // 2
+ img0 = x[:, :channel]
+ img1 = x[:, channel:]
+ if not torch.is_tensor(timestep):
+ timestep = (x[:, :1].clone() * 0 + 1) * timestep
+ else:
+ timestep = timestep.repeat(1, 1, img0.shape[2], img0.shape[3])
+
+ flow_list = []
+ merged = []
+ mask_list = []
+
+ if self.arch_ver in ["4.7", "4.10"]:
+ f0 = self.encode(img0[:, :3])
+ f1 = self.encode(img1[:, :3])
+
+ warped_img0 = img0
+ warped_img1 = img1
+ flow = None
+ mask = None
+ block = [self.block0, self.block1, self.block2, self.block3]
+
+ for i in range(4):
+ if flow is None:
+ # 4.0-4.6
+ if self.arch_ver in ["4.0", "4.2", "4.3", "4.5", "4.6"]:
+ flow, mask = block[i](
+ torch.cat((img0[:, :3], img1[:, :3], timestep), 1),
+ None,
+ scale=scale_list[i],
+ )
+ if ensemble:
+ f1, m1 = block[i](
+ torch.cat((img1[:, :3], img0[:, :3], 1 - timestep), 1),
+ None,
+ scale=scale_list[i],
+ )
+ flow = (flow + torch.cat((f1[:, 2:4], f1[:, :2]), 1)) / 2
+ mask = (mask + (-m1)) / 2
+
+ # 4.7+
+ if self.arch_ver in ["4.7", "4.10"]:
+ flow, mask = block[i](
+ torch.cat((img0[:, :3], img1[:, :3], f0, f1, timestep), 1),
+ None,
+ scale=scale_list[i],
+ )
+
+ if ensemble:
+ f_, m_ = block[i](
+ torch.cat(
+ (img1[:, :3], img0[:, :3], f1, f0, 1 - timestep), 1
+ ),
+ None,
+ scale=scale_list[i],
+ )
+ flow = (flow + torch.cat((f_[:, 2:4], f_[:, :2]), 1)) / 2
+ mask = (mask + (-m_)) / 2
+
+ else:
+ # 4.0-4.6
+ if self.arch_ver in ["4.0", "4.2", "4.3", "4.5", "4.6"]:
+ f0, m0 = block[i](
+ torch.cat(
+ (warped_img0[:, :3], warped_img1[:, :3], timestep, mask), 1
+ ),
+ flow,
+ scale=scale_list[i],
+ )
+
+ if self.arch_ver in ["4.0"]:
+ if (
+ i == 1
+ and f0[:, :2].abs().max() > 32
+ and f0[:, 2:4].abs().max() > 32
+ and not training
+ ):
+ for k in range(4):
+ scale_list[k] *= 2
+ flow, mask = block[0](
+ torch.cat((img0[:, :3], img1[:, :3], timestep), 1),
+ None,
+ scale=scale_list[0],
+ )
+ warped_img0 = warp(img0, flow[:, :2])
+ warped_img1 = warp(img1, flow[:, 2:4])
+ f0, m0 = block[i](
+ torch.cat(
+ (
+ warped_img0[:, :3],
+ warped_img1[:, :3],
+ timestep,
+ mask,
+ ),
+ 1,
+ ),
+ flow,
+ scale=scale_list[i],
+ )
+
+ # 4.7+
+ if self.arch_ver in ["4.7", "4.10"]:
+ fd, m0 = block[i](
+ torch.cat(
+ (
+ warped_img0[:, :3],
+ warped_img1[:, :3],
+ warp(f0, flow[:, :2]),
+ warp(f1, flow[:, 2:4]),
+ timestep,
+ mask,
+ ),
+ 1,
+ ),
+ flow,
+ scale=scale_list[i],
+ )
+ flow = flow + fd
+
+ # 4.0-4.6 ensemble
+ if ensemble and self.arch_ver in [
+ "4.0",
+ "4.2",
+ "4.3",
+ "4.5",
+ "4.6",
+ ]:
+ f1, m1 = block[i](
+ torch.cat(
+ (
+ warped_img1[:, :3],
+ warped_img0[:, :3],
+ 1 - timestep,
+ -mask,
+ ),
+ 1,
+ ),
+ torch.cat((flow[:, 2:4], flow[:, :2]), 1),
+ scale=scale_list[i],
+ )
+ f0 = (f0 + torch.cat((f1[:, 2:4], f1[:, :2]), 1)) / 2
+ m0 = (m0 + (-m1)) / 2
+
+ # 4.7+ ensemble
+ if ensemble and self.arch_ver in ["4.7", "4.10"]:
+ wf0 = warp(f0, flow[:, :2])
+ wf1 = warp(f1, flow[:, 2:4])
+
+ f_, m_ = block[i](
+ torch.cat(
+ (
+ warped_img1[:, :3],
+ warped_img0[:, :3],
+ wf1,
+ wf0,
+ 1 - timestep,
+ -mask,
+ ),
+ 1,
+ ),
+ torch.cat((flow[:, 2:4], flow[:, :2]), 1),
+ scale=scale_list[i],
+ )
+ fd = (fd + torch.cat((f_[:, 2:4], f_[:, :2]), 1)) / 2
+ mask = (m0 + (-m_)) / 2
+
+ if self.arch_ver in ["4.0", "4.2", "4.3", "4.5", "4.6"]:
+ flow = flow + f0
+ mask = mask + m0
+
+ if not ensemble and self.arch_ver in ["4.7", "4.10"]:
+ mask = m0
+
+ mask_list.append(mask)
+ flow_list.append(flow)
+ warped_img0 = warp(img0, flow[:, :2])
+ warped_img1 = warp(img1, flow[:, 2:4])
+ merged.append((warped_img0, warped_img1))
+
+ if self.arch_ver in ["4.0", "4.1", "4.2", "4.3", "4.4", "4.5", "4.6"]:
+ mask_list[3] = torch.sigmoid(mask_list[3])
+ merged[3] = merged[3][0] * mask_list[3] + merged[3][1] * (1 - mask_list[3])
+
+ if self.arch_ver in ["4.7", "4.10"]:
+ mask = torch.sigmoid(mask)
+ merged[3] = warped_img0 * mask + warped_img1 * (1 - mask)
+
+ if not fastmode and self.arch_ver in ["4.0", "4.2", "4.3"]:
+ c0 = self.contextnet(img0, flow[:, :2])
+ c1 = self.contextnet(img1, flow[:, 2:4])
+ tmp = self.unet(img0, img1, warped_img0, warped_img1, mask, flow, c0, c1)
+ res = tmp[:, :3] * 2 - 1
+ merged[3] = torch.clamp(merged[3] + res, 0, 1)
+ return merged[3][:, :, :h, :w]
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/sepconv/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/sepconv/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..eb62e76289052ff8a0bc7c9260b664c62e2e033a
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/sepconv/__init__.py
@@ -0,0 +1,56 @@
+import torch
+from torch.utils.data import DataLoader
+import pathlib
+from vfi_utils import load_file_from_github_release, preprocess_frames, postprocess_frames
+import typing
+from comfy.model_management import soft_empty_cache, get_torch_device
+from vfi_utils import InterpolationStateList, generic_frame_loop
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+CKPT_NAMES = ["sepconv.pth"]
+
+
+class SepconvVFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (CKPT_NAMES, ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 10, "min": 1, "max": 1000}),
+ "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames = 10,
+ multiplier: typing.SupportsInt = 2,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ from .sepconv_enhanced import Network
+ model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
+ interpolation_model = Network()
+ interpolation_model.load_state_dict(torch.load(model_path))
+ interpolation_model.eval().to(get_torch_device())
+ frames = preprocess_frames(frames)
+
+ def return_middle_frame(frame_0, frame_1, timestep, model):
+ return model(frame_0, frame_1)
+
+ args = [interpolation_model]
+ out = postprocess_frames(
+ generic_frame_loop(type(self).__name__, frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
+ interpolation_states=optional_interpolation_states, use_timestep=False, dtype=torch.float32)
+ )
+ return (out,)
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/sepconv/sepconv_enhanced.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/sepconv/sepconv_enhanced.py
new file mode 100644
index 0000000000000000000000000000000000000000..e5a747ee5053bd7b1053e1a432cf86a0164a2223
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/sepconv/sepconv_enhanced.py
@@ -0,0 +1,748 @@
+"""
+23-nov-21
+https://github.com/sniklaus/revisiting-sepconv/blob/fea509d98157170df1fb35bf615bd41d98858e1a/run.py
+https://github.com/sniklaus/revisiting-sepconv/blob/fea509d98157170df1fb35bf615bd41d98858e1a/sepconv/sepconv.py
+Deleted stuffs about arguments_strModel and getopt
+"""
+#!/usr/bin/env python
+import torch
+import typing
+from comfy.model_management import get_torch_device
+
+##########################################################
+from vfi_models.ops import sepconv_func
+##########################################################
+
+
+
+
+
+import torch
+
+import math
+import numpy
+import os
+import PIL
+import PIL.Image
+import sys
+import typing
+
+##########################################################
+
+assert (
+ int(str("").join(torch.__version__.split(".")[0:2])) >= 13
+) # requires at least pytorch version 1.3.0
+
+torch.set_grad_enabled(
+ False
+) # make sure to not compute gradients for computational performance
+
+torch.backends.cudnn.enabled = (
+ True # make sure to use cudnn for computational performance
+)
+
+##########################################################
+
+##########################################################
+
+
+class Basic(torch.nn.Module):
+ def __init__(
+ self,
+ strType: str,
+ intChans: typing.List[int],
+ objScratch: typing.Optional[typing.Dict] = None,
+ ):
+ super().__init__()
+
+ self.strType = strType
+ self.netEvenize = None
+ self.netMain = None
+ self.netShortcut = None
+
+ intIn = intChans[0]
+ intOut = intChans[-1]
+ netMain = []
+ intChans = intChans.copy()
+ fltStride = 1.0
+
+ for intPart, strPart in enumerate(self.strType.split("+")[0].split("-")):
+ if strPart.startswith("conv") == True:
+ intKsize = 3
+ intPad = 1
+ strPad = "zeros"
+
+ if "(" in strPart:
+ intKsize = int(strPart.split("(")[1].split(")")[0].split(",")[0])
+ intPad = int(math.floor(0.5 * (intKsize - 1)))
+
+ if "replpad" in strPart.split("(")[1].split(")")[0].split(","):
+ strPad = "replicate"
+ if "reflpad" in strPart.split("(")[1].split(")")[0].split(","):
+ strPad = "reflect"
+ # end
+
+ if "nopad" in self.strType.split("+"):
+ intPad = 0
+ # end
+
+ netMain += [
+ torch.nn.Conv2d(
+ in_channels=intChans[0],
+ out_channels=intChans[1],
+ kernel_size=intKsize,
+ stride=1,
+ padding=intPad,
+ padding_mode=strPad,
+ bias="nobias" not in self.strType.split("+"),
+ )
+ ]
+ intChans = intChans[1:]
+ fltStride *= 1.0
+
+ elif strPart.startswith("sconv") == True:
+ intKsize = 3
+ intPad = 1
+ strPad = "zeros"
+
+ if "(" in strPart:
+ intKsize = int(strPart.split("(")[1].split(")")[0].split(",")[0])
+ intPad = int(math.floor(0.5 * (intKsize - 1)))
+
+ if "replpad" in strPart.split("(")[1].split(")")[0].split(","):
+ strPad = "replicate"
+ if "reflpad" in strPart.split("(")[1].split(")")[0].split(","):
+ strPad = "reflect"
+ # end
+
+ if "nopad" in self.strType.split("+"):
+ intPad = 0
+ # end
+
+ netMain += [
+ torch.nn.Conv2d(
+ in_channels=intChans[0],
+ out_channels=intChans[1],
+ kernel_size=intKsize,
+ stride=2,
+ padding=intPad,
+ padding_mode=strPad,
+ bias="nobias" not in self.strType.split("+"),
+ )
+ ]
+ intChans = intChans[1:]
+ fltStride *= 2.0
+
+ elif strPart.startswith("up") == True:
+
+ class Up(torch.nn.Module):
+ def __init__(self, strType):
+ super().__init__()
+
+ self.strType = strType
+
+ # end
+
+ def forward(self, tenIn: torch.Tensor) -> torch.Tensor:
+ if self.strType == "nearest":
+ return torch.nn.functional.interpolate(
+ input=tenIn,
+ scale_factor=2.0,
+ mode="nearest",
+ align_corners=False,
+ )
+
+ elif self.strType == "bilinear":
+ return torch.nn.functional.interpolate(
+ input=tenIn,
+ scale_factor=2.0,
+ mode="bilinear",
+ align_corners=False,
+ )
+
+ elif self.strType == "pyramid":
+ return pyramid(tenIn, None, "up")
+
+ elif self.strType == "shuffle":
+ return torch.nn.functional.pixel_shuffle(
+ tenIn, upscale_factor=2
+ ) # https://github.com/pytorch/pytorch/issues/62854
+
+ # end
+
+ assert False # to make torchscript happy
+
+ # end
+
+ # end
+
+ strType = "bilinear"
+
+ if "(" in strPart:
+ if "nearest" in strPart.split("(")[1].split(")")[0].split(","):
+ strType = "nearest"
+ if "pyramid" in strPart.split("(")[1].split(")")[0].split(","):
+ strType = "pyramid"
+ if "shuffle" in strPart.split("(")[1].split(")")[0].split(","):
+ strType = "shuffle"
+ # end
+
+ netMain += [Up(strType)]
+ fltStride *= 0.5
+
+ elif strPart.startswith("prelu") == True:
+ netMain += [
+ torch.nn.PReLU(
+ num_parameters=1,
+ init=float(strPart.split("(")[1].split(")")[0].split(",")[0]),
+ )
+ ]
+ fltStride *= 1.0
+
+ elif True:
+ assert False
+
+ # end
+ # end
+
+ self.netMain = torch.nn.Sequential(*netMain)
+
+ for strPart in self.strType.split("+")[1:]:
+ if strPart.startswith("skip") == True:
+ if intIn == intOut and fltStride == 1.0:
+ self.netShortcut = torch.nn.Identity()
+
+ elif intIn != intOut and fltStride == 1.0:
+ self.netShortcut = torch.nn.Conv2d(
+ in_channels=intIn,
+ out_channels=intOut,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ bias="nobias" not in self.strType.split("+"),
+ )
+
+ elif intIn == intOut and fltStride != 1.0:
+
+ class Down(torch.nn.Module):
+ def __init__(self, fltScale):
+ super().__init__()
+
+ self.fltScale = fltScale
+
+ # end
+
+ def forward(self, tenIn: torch.Tensor) -> torch.Tensor:
+ return torch.nn.functional.interpolate(
+ input=tenIn,
+ scale_factor=self.fltScale,
+ mode="bilinear",
+ align_corners=False,
+ )
+
+ # end
+
+ # end
+
+ self.netShortcut = Down(1.0 / fltStride)
+
+ elif intIn != intOut and fltStride != 1.0:
+
+ class Down(torch.nn.Module):
+ def __init__(self, fltScale):
+ super().__init__()
+
+ self.fltScale = fltScale
+
+ # end
+
+ def forward(self, tenIn: torch.Tensor) -> torch.Tensor:
+ return torch.nn.functional.interpolate(
+ input=tenIn,
+ scale_factor=self.fltScale,
+ mode="bilinear",
+ align_corners=False,
+ )
+
+ # end
+
+ # end
+
+ self.netShortcut = torch.nn.Sequential(
+ Down(1.0 / fltStride),
+ torch.nn.Conv2d(
+ in_channels=intIn,
+ out_channels=intOut,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ bias="nobias" not in self.strType.split("+"),
+ ),
+ )
+
+ # end
+
+ elif strPart.startswith("...") == True:
+ pass
+
+ # end
+ # end
+
+ assert len(intChans) == 1
+
+ # end
+
+ def forward(self, tenIn: torch.Tensor) -> torch.Tensor:
+ if self.netEvenize is not None:
+ tenIn = self.netEvenize(tenIn)
+ # end
+
+ tenOut = self.netMain(tenIn)
+
+ if self.netShortcut is not None:
+ tenOut = tenOut + self.netShortcut(tenIn)
+ # end
+
+ return tenOut
+
+ # end
+
+
+# end
+
+
+class Encode(torch.nn.Module):
+ objScratch: typing.Dict[str, typing.List[int]] = None
+
+ def __init__(
+ self,
+ intIns: typing.List[int],
+ intOuts: typing.List[int],
+ strHor: str,
+ strVer: str,
+ objScratch: typing.Dict[str, typing.List[int]],
+ ):
+ super().__init__()
+
+ assert len(intIns) == len(intOuts)
+ assert len(intOuts) == len(intIns)
+
+ self.intRows = len(intIns) and len(intOuts)
+ self.intIns = intIns.copy()
+ self.intOuts = intOuts.copy()
+ self.strHor = strHor
+ self.strVer = strVer
+ self.objScratch = objScratch
+
+ self.netHor = torch.nn.ModuleList()
+ self.netVer = torch.nn.ModuleList()
+
+ for intRow in range(self.intRows):
+ netHor = torch.nn.Identity()
+ netVer = torch.nn.Identity()
+
+ if self.intOuts[intRow] != 0:
+ if self.intIns[intRow] != 0:
+ netHor = Basic(
+ self.strHor,
+ [
+ self.intIns[intRow],
+ self.intOuts[intRow],
+ self.intOuts[intRow],
+ ],
+ objScratch,
+ )
+ # end
+
+ if intRow != 0:
+ netVer = Basic(
+ self.strVer,
+ [
+ self.intOuts[intRow - 1],
+ self.intOuts[intRow],
+ self.intOuts[intRow],
+ ],
+ objScratch,
+ )
+ # end
+ # end
+
+ self.netHor.append(netHor)
+ self.netVer.append(netVer)
+ # end
+
+ # end
+
+ def forward(self, tenIns: typing.List[torch.Tensor]) -> typing.List[torch.Tensor]:
+ intRow = 0
+ for netHor in self.netHor:
+ if self.intOuts[intRow] != 0:
+ if self.intIns[intRow] != 0:
+ tenIns[intRow] = netHor(tenIns[intRow])
+ # end
+ # end
+ intRow += 1
+ # end
+
+ intRow = 0
+ for netVer in self.netVer:
+ if self.intOuts[intRow] != 0:
+ if intRow != 0:
+ tenIns[intRow] = tenIns[intRow] + netVer(tenIns[intRow - 1])
+ # end
+ # end
+ intRow += 1
+ # end
+
+ for intRow, tenIn in enumerate(tenIns):
+ self.objScratch["levelshape" + str(intRow)] = tenIn.shape
+ # end
+
+ return tenIns
+
+ # end
+
+
+# end
+
+
+class Decode(torch.nn.Module):
+ objScratch: typing.Dict[str, typing.List[int]] = None
+
+ def __init__(
+ self,
+ intIns: typing.List[int],
+ intOuts: typing.List[int],
+ strHor: str,
+ strVer: str,
+ objScratch: typing.Dict[str, typing.List[int]],
+ ):
+ super().__init__()
+
+ assert len(intIns) == len(intOuts)
+ assert len(intOuts) == len(intIns)
+
+ self.intRows = len(intIns) and len(intOuts)
+ self.intIns = intIns.copy()
+ self.intOuts = intOuts.copy()
+ self.strHor = strHor
+ self.strVer = strVer
+ self.objScratch = objScratch
+
+ self.netHor = torch.nn.ModuleList()
+ self.netVer = torch.nn.ModuleList()
+
+ for intRow in range(self.intRows - 1, -1, -1):
+ netHor = torch.nn.Identity()
+ netVer = torch.nn.Identity()
+
+ if self.intOuts[intRow] != 0:
+ if self.intIns[intRow] != 0:
+ netHor = Basic(
+ self.strHor,
+ [
+ self.intIns[intRow],
+ self.intOuts[intRow],
+ self.intOuts[intRow],
+ ],
+ objScratch,
+ )
+ # end
+
+ if intRow != self.intRows - 1:
+ netVer = Basic(
+ self.strVer,
+ [
+ self.intOuts[intRow + 1],
+ self.intOuts[intRow],
+ self.intOuts[intRow],
+ ],
+ objScratch,
+ )
+ # end
+ # end
+
+ self.netHor.append(netHor)
+ self.netVer.append(netVer)
+ # end
+
+ # end
+
+ def forward(self, tenIns: typing.List[torch.Tensor]) -> typing.List[torch.Tensor]:
+ intRow = self.intRows - 1
+ for netHor in self.netHor:
+ if self.intOuts[intRow] != 0:
+ if self.intIns[intRow] != 0:
+ tenIns[intRow] = netHor(tenIns[intRow])
+ # end
+ # end
+ intRow -= 1
+ # end
+
+ intRow = self.intRows - 1
+ for netVer in self.netVer:
+ if self.intOuts[intRow] != 0:
+ if intRow != self.intRows - 1:
+ tenVer = netVer(tenIns[intRow + 1])
+
+ if "levelshape" + str(intRow) in self.objScratch:
+ if (
+ tenVer.shape[2]
+ == self.objScratch["levelshape" + str(intRow)][2] + 1
+ ):
+ tenVer = torch.nn.functional.pad(
+ input=tenVer,
+ pad=[0, 0, 0, -1],
+ mode="constant",
+ value=0.0,
+ )
+ if (
+ tenVer.shape[3]
+ == self.objScratch["levelshape" + str(intRow)][3] + 1
+ ):
+ tenVer = torch.nn.functional.pad(
+ input=tenVer,
+ pad=[0, -1, 0, 0],
+ mode="constant",
+ value=0.0,
+ )
+ # end
+
+ tenIns[intRow] = tenIns[intRow] + tenVer
+ # end
+ # end
+ intRow -= 1
+ # end
+
+ return tenIns
+
+ # end
+
+
+# end
+
+##########################################################
+
+
+class Network(torch.nn.Module):
+ def __init__(self):
+ super().__init__()
+
+ self.intEncdec = [1, 1]
+ self.intChannels = [32, 64, 128, 256, 512]
+
+ self.objScratch = {}
+
+ self.netInput = torch.nn.Conv2d(
+ in_channels=3,
+ out_channels=int(round(0.5 * self.intChannels[0])),
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ padding_mode="zeros",
+ )
+
+ self.netEncode = torch.nn.Sequential(
+ *(
+ [
+ Encode(
+ [0] * len(self.intChannels),
+ self.intChannels,
+ "prelu(0.25)-conv(3)-prelu(0.25)-conv(3)+skip",
+ "prelu(0.25)-sconv(3)-prelu(0.25)-conv(3)",
+ self.objScratch,
+ )
+ ]
+ + [
+ Encode(
+ self.intChannels,
+ self.intChannels,
+ "prelu(0.25)-conv(3)-prelu(0.25)-conv(3)+skip",
+ "prelu(0.25)-sconv(3)-prelu(0.25)-conv(3)",
+ self.objScratch,
+ )
+ for intEncdec in range(1, self.intEncdec[0])
+ ]
+ )
+ )
+
+ self.netDecode = torch.nn.Sequential(
+ *(
+ [
+ Decode(
+ [0] + self.intChannels[1:],
+ [0] + self.intChannels[1:],
+ "prelu(0.25)-conv(3)-prelu(0.25)-conv(3)+skip",
+ "prelu(0.25)-up(bilinear)-conv(3)-prelu(0.25)-conv(3)",
+ self.objScratch,
+ )
+ for intEncdec in range(0, self.intEncdec[1])
+ ]
+ )
+ )
+
+ self.netVerone = Basic(
+ "up(bilinear)-conv(3)-prelu(0.25)-conv(3)",
+ [self.intChannels[1], self.intChannels[1], 51],
+ )
+ self.netVertwo = Basic(
+ "up(bilinear)-conv(3)-prelu(0.25)-conv(3)",
+ [self.intChannels[1], self.intChannels[1], 51],
+ )
+ self.netHorone = Basic(
+ "up(bilinear)-conv(3)-prelu(0.25)-conv(3)",
+ [self.intChannels[1], self.intChannels[1], 51],
+ )
+ self.netHortwo = Basic(
+ "up(bilinear)-conv(3)-prelu(0.25)-conv(3)",
+ [self.intChannels[1], self.intChannels[1], 51],
+ )
+
+ # self.load_state_dict(torch.hub.load_state_dict_from_url(url='http://content.sniklaus.com/resepconv/network-' + arguments_strModel + '.pytorch', file_name='resepconv-' + arguments_strModel))
+
+ # end
+
+ def forward(self, x1, x2):
+ # padding if needed
+ intWidth = x1.shape[3]
+ intHeight = x1.shape[2]
+
+ intPadr = (2 - (intWidth % 2)) % 2
+ intPadb = (2 - (intHeight % 2)) % 2
+
+ tenOne = torch.nn.functional.pad(
+ input=x1, pad=[0, intPadr, 0, intPadb], mode="replicate"
+ )
+ tenTwo = torch.nn.functional.pad(
+ input=x2, pad=[0, intPadr, 0, intPadb], mode="replicate"
+ )
+ ####
+
+ tenSeq = [tenOne, tenTwo]
+
+ with torch.set_grad_enabled(False):
+ tenStack = torch.stack(tenSeq, 1)
+ tenMean = (
+ tenStack.view(tenStack.shape[0], -1)
+ .mean(1, True)
+ .view(tenStack.shape[0], 1, 1, 1)
+ )
+ tenStd = (
+ tenStack.view(tenStack.shape[0], -1)
+ .std(1, True)
+ .view(tenStack.shape[0], 1, 1, 1)
+ )
+ tenSeq = [
+ (tenFrame - tenMean) / (tenStd + 0.0000001) for tenFrame in tenSeq
+ ]
+ tenSeq = [tenFrame.detach() for tenFrame in tenSeq]
+ # end
+
+ tenOut = self.netDecode(
+ self.netEncode(
+ [torch.cat([self.netInput(tenSeq[0]), self.netInput(tenSeq[1])], 1)]
+ + ([0.0] * (len(self.intChannels) - 1))
+ )
+ )[1]
+
+ tenOne = torch.nn.functional.pad(
+ input=tenOne,
+ pad=[
+ int(math.floor(0.5 * 51)),
+ int(math.floor(0.5 * 51)),
+ int(math.floor(0.5 * 51)),
+ int(math.floor(0.5 * 51)),
+ ],
+ mode="replicate",
+ )
+ tenTwo = torch.nn.functional.pad(
+ input=tenTwo,
+ pad=[
+ int(math.floor(0.5 * 51)),
+ int(math.floor(0.5 * 51)),
+ int(math.floor(0.5 * 51)),
+ int(math.floor(0.5 * 51)),
+ ],
+ mode="replicate",
+ )
+
+ tenOne = torch.cat(
+ [
+ tenOne,
+ tenOne.new_ones([tenOne.shape[0], 1, tenOne.shape[2], tenOne.shape[3]]),
+ ],
+ 1,
+ ).detach()
+ tenTwo = torch.cat(
+ [
+ tenTwo,
+ tenTwo.new_ones([tenTwo.shape[0], 1, tenTwo.shape[2], tenTwo.shape[3]]),
+ ],
+ 1,
+ ).detach()
+
+ tenVerone = self.netVerone(tenOut)
+ tenVertwo = self.netVertwo(tenOut)
+ tenHorone = self.netHorone(tenOut)
+ tenHortwo = self.netHortwo(tenOut)
+
+ tenOut = sepconv_func.apply(tenOne, tenVerone, tenHorone) + sepconv_func.apply(
+ tenTwo, tenVertwo, tenHortwo
+ )
+
+ tenNormalize = tenOut[:, -1:, :, :]
+ tenNormalize[tenNormalize.abs() < 0.01] = 1.0
+ tenOut = tenOut[:, :-1, :, :] / tenNormalize
+
+ # crop if needed
+ return tenOut[:, :, :intHeight, :intWidth]
+
+ # end
+
+
+# end
+
+netNetwork = None
+
+##########################################################
+
+
+def estimate(tenOne, tenTwo):
+ global netNetwork
+
+ if netNetwork is None:
+ netNetwork = Network().to(get_torch_device()).eval()
+ # end
+
+ assert tenOne.shape[1] == tenTwo.shape[1]
+ assert tenOne.shape[2] == tenTwo.shape[2]
+
+ intWidth = tenOne.shape[2]
+ intHeight = tenOne.shape[1]
+
+ assert (
+ intWidth <= 1280
+ ) # while our approach works with larger images, we do not recommend it unless you are aware of the implications
+ assert (
+ intHeight <= 720
+ ) # while our approach works with larger images, we do not recommend it unless you are aware of the implications
+
+ tenPreprocessedOne = tenOne.to(get_torch_device()).view(1, 3, intHeight, intWidth)
+ tenPreprocessedTwo = tenTwo.to(get_torch_device()).view(1, 3, intHeight, intWidth)
+
+ intPadr = (2 - (intWidth % 2)) % 2
+ intPadb = (2 - (intHeight % 2)) % 2
+
+ tenPreprocessedOne = torch.nn.functional.pad(
+ input=tenPreprocessedOne, pad=[0, intPadr, 0, intPadb], mode="replicate"
+ )
+ tenPreprocessedTwo = torch.nn.functional.pad(
+ input=tenPreprocessedTwo, pad=[0, intPadr, 0, intPadb], mode="replicate"
+ )
+
+ return netNetwork([tenPreprocessedOne, tenPreprocessedTwo])[
+ 0, :, :intHeight, :intWidth
+ ].cpu()
+
+
+# end
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/stmfnet/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/stmfnet/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..2d10f1ec96f25df510245e87bb7a41938ed4768b
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/stmfnet/__init__.py
@@ -0,0 +1,100 @@
+import torch
+from comfy.model_management import get_torch_device, soft_empty_cache
+import numpy as np
+import typing
+from vfi_utils import InterpolationStateList, load_file_from_github_release, preprocess_frames, postprocess_frames, assert_batch_size
+import pathlib
+import warnings
+import gc
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+device = get_torch_device()
+
+class STMFNet_VFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (["stmfnet.pth"], ),
+ "frames": ("IMAGE", ),
+ "clear_cache_after_n_frames": ("INT", {"default": 10, "min": 1, "max": 1000}),
+ "multiplier": ("INT", {"default": 2, "min": 2, "max": 2}), #TODO: Implement recursively invoking interpolator for multi-frame interpolation
+ "duplicate_first_last_frames": ("BOOLEAN", {"default": False})
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", )
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ #Reference: https://github.com/danier97/ST-MFNet/blob/main/interpolate_yuv.py#L93
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ clear_cache_after_n_frames = 10,
+ multiplier: typing.SupportsInt = 2,
+ duplicate_first_last_frames: bool = False,
+ optional_interpolation_states: InterpolationStateList = None,
+ **kwargs
+ ):
+ from .stmfnet_arch import STMFNet_Model
+ if multiplier != 2:
+ warnings.warn("Currently, ST-MFNet only supports 2x interpolation. The process will continue but please set multiplier=2 afterward")
+
+ assert_batch_size(frames, batch_size=4, vfi_name="ST-MFNet")
+ interpolation_states = optional_interpolation_states
+ model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
+ model = STMFNet_Model()
+ model.load_state_dict(torch.load(model_path)['state_dict'])
+ model = model.eval().to(device)
+
+ frames = preprocess_frames(frames)
+ number_of_frames_processed_since_last_cleared_cuda_cache = 0
+ output_frames = []
+ for frame_itr in range(len(frames) - 3):
+ #Does skipping frame i+1 make sanse in this case?
+ if interpolation_states is not None and interpolation_states.is_frame_skipped(frame_itr) and interpolation_states.is_frame_skipped(frame_itr + 1):
+ continue
+
+ #Ensure that input frames are in fp32 - the same dtype as model
+ frame0, frame1, frame2, frame3 = (
+ frames[frame_itr:frame_itr+1].float(),
+ frames[frame_itr+1:frame_itr+2].float(),
+ frames[frame_itr+2:frame_itr+3].float(),
+ frames[frame_itr+3:frame_itr+4].float()
+ )
+ new_frame = model(frame0.to(device), frame1.to(device), frame2.to(device), frame3.to(device)).detach().cpu()
+ number_of_frames_processed_since_last_cleared_cuda_cache += 2
+
+ if frame_itr == 0:
+ output_frames.append(frame0)
+ if duplicate_first_last_frames:
+ output_frames.append(frame0) # repeat the first frame
+ output_frames.append(frame1)
+ output_frames.append(new_frame)
+ output_frames.append(frame2)
+ if frame_itr == len(frames) - 4:
+ output_frames.append(frame3)
+ if duplicate_first_last_frames:
+ output_frames.append(frame3) # repeat the last frame
+
+ # Try to avoid a memory overflow by clearing cuda cache regularly
+ if number_of_frames_processed_since_last_cleared_cuda_cache >= clear_cache_after_n_frames:
+ print("Comfy-VFI: Clearing cache...", end = ' ')
+ soft_empty_cache()
+ number_of_frames_processed_since_last_cleared_cuda_cache = 0
+ print("Done cache clearing")
+ gc.collect()
+
+ dtype = torch.float32
+ output_frames = [frame.cpu().to(dtype=dtype) for frame in output_frames] #Ensure all frames are in cpu
+ out = torch.cat(output_frames, dim=0)
+ # clear cache for courtesy
+ print("Comfy-VFI: Final clearing cache...", end = ' ')
+ soft_empty_cache()
+ print("Done cache clearing")
+ return (postprocess_frames(out), )
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/stmfnet/stmfnet_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/stmfnet/stmfnet_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..1e495e0eabf68a39af6bc7eceef554c3777d9d5f
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/stmfnet/stmfnet_arch.py
@@ -0,0 +1,2858 @@
+# https://github.com/danielism97/ST-MFNet/blob/main/models/stmfnet.py
+# https://github.com/danielism97/ST-MFNet/blob/main/models/misc/pwcnet.py
+# https://github.com/danielism97/ST-MFNet/blob/main/models/misc/correlation/correlation.py
+# https://github.com/danielism97/ST-MFNet/blob/main/models/misc/gridnet.py
+# https://github.com/danielism97/ST-MFNet/blob/main/models/feature.py
+# https://github.com/danielism97/ST-MFNet/blob/main/utility.py
+# https://github.com/danielism97/ST-MFNet/blob/main/models/misc/resnet_3D.py
+# https://github.com/danielism97/ST-MFNet/blob/main/cupy_module/adacof.py
+# https://github.com/danielism97/ST-MFNet/blob/main/cupy_module/softsplat.py
+# https://github.com/danielism97/ST-MFNet/blob/main/models/misc/__init__.py
+# https://github.com/danielism97/ST-MFNet/blob/main/models/misc/pwcnet.py
+# https://github.com/danielism97/ST-MFNet/blob/main/models/misc/correlation/correlation.py
+from torch.nn import functional as F
+from torch.utils.model_zoo import load_url as load_state_dict_from_url
+import cv2
+import math
+import numpy
+import numpy as np
+import PIL
+import PIL.Image
+import re
+import sys
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.optim as optim
+import torch.optim.lr_scheduler as lrs
+from vfi_models.ops import FunctionCorrelation, FunctionAdaCoF, ModuleSoftsplat
+from vfi_utils import get_ckpt_container_path
+import pathlib
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+
+#Simple way to reduce oranges on VSCode bar
+def identity(x):
+ return x
+
+
+def backwarp(tenInput, tenFlow):
+ backwarp_tenGrid = {}
+ backwarp_tenPartial = {}
+ if str(tenFlow.shape) not in backwarp_tenGrid:
+ tenHor = (
+ torch.linspace(
+ -1.0 + (1.0 / tenFlow.shape[3]),
+ 1.0 - (1.0 / tenFlow.shape[3]),
+ tenFlow.shape[3],
+ )
+ .view(1, 1, 1, -1)
+ .expand(-1, -1, tenFlow.shape[2], -1)
+ )
+ tenVer = (
+ torch.linspace(
+ -1.0 + (1.0 / tenFlow.shape[2]),
+ 1.0 - (1.0 / tenFlow.shape[2]),
+ tenFlow.shape[2],
+ )
+ .view(1, 1, -1, 1)
+ .expand(-1, -1, -1, tenFlow.shape[3])
+ )
+
+ backwarp_tenGrid[str(tenFlow.shape)] = torch.cat([tenHor, tenVer], 1).cuda()
+ # end
+
+ if str(tenFlow.shape) not in backwarp_tenPartial:
+ backwarp_tenPartial[str(tenFlow.shape)] = tenFlow.new_ones(
+ [tenFlow.shape[0], 1, tenFlow.shape[2], tenFlow.shape[3]]
+ )
+ # end
+
+ tenFlow = torch.cat(
+ [
+ tenFlow[:, 0:1, :, :] / ((tenInput.shape[3] - 1.0) / 2.0),
+ tenFlow[:, 1:2, :, :] / ((tenInput.shape[2] - 1.0) / 2.0),
+ ],
+ 1,
+ )
+ tenInput = torch.cat([tenInput, backwarp_tenPartial[str(tenFlow.shape)]], 1)
+
+ tenOutput = torch.nn.functional.grid_sample(
+ input=tenInput,
+ grid=(backwarp_tenGrid[str(tenFlow.shape)] + tenFlow).permute(0, 2, 3, 1),
+ mode="bilinear",
+ padding_mode="zeros",
+ align_corners=False,
+ )
+
+ tenMask = tenOutput[:, -1:, :, :]
+ tenMask[tenMask > 0.999] = 1.0
+ tenMask[tenMask < 1.0] = 0.0
+
+ return tenOutput[:, :-1, :, :] * tenMask
+
+
+# end
+
+##########################################################
+
+
+class PWCNet(torch.nn.Module):
+ def __init__(self):
+ super(PWCNet, self).__init__()
+
+ class Extractor(torch.nn.Module):
+ def __init__(self):
+ super(Extractor, self).__init__()
+
+ self.netOne = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=3,
+ out_channels=16,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=16,
+ out_channels=16,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=16,
+ out_channels=16,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netTwo = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=16,
+ out_channels=32,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=32,
+ out_channels=32,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=32,
+ out_channels=32,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netThr = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=32,
+ out_channels=64,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=64,
+ out_channels=64,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=64,
+ out_channels=64,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netFou = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=64,
+ out_channels=96,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=96,
+ out_channels=96,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=96,
+ out_channels=96,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netFiv = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=96,
+ out_channels=128,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netSix = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=196,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=196,
+ out_channels=196,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=196,
+ out_channels=196,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ # end
+
+ def forward(self, tenInput):
+ tenOne = self.netOne(tenInput)
+ tenTwo = self.netTwo(tenOne)
+ tenThr = self.netThr(tenTwo)
+ tenFou = self.netFou(tenThr)
+ tenFiv = self.netFiv(tenFou)
+ tenSix = self.netSix(tenFiv)
+
+ return [tenOne, tenTwo, tenThr, tenFou, tenFiv, tenSix]
+
+ # end
+
+ # end
+
+ class Decoder(torch.nn.Module):
+ def __init__(self, intLevel):
+ super(Decoder, self).__init__()
+
+ intPrevious = [
+ None,
+ None,
+ 81 + 32 + 2 + 2,
+ 81 + 64 + 2 + 2,
+ 81 + 96 + 2 + 2,
+ 81 + 128 + 2 + 2,
+ 81,
+ None,
+ ][intLevel + 1]
+ intCurrent = [
+ None,
+ None,
+ 81 + 32 + 2 + 2,
+ 81 + 64 + 2 + 2,
+ 81 + 96 + 2 + 2,
+ 81 + 128 + 2 + 2,
+ 81,
+ None,
+ ][intLevel + 0]
+
+ if intLevel < 6:
+ self.netUpflow = torch.nn.ConvTranspose2d(
+ in_channels=2,
+ out_channels=2,
+ kernel_size=4,
+ stride=2,
+ padding=1,
+ )
+ if intLevel < 6:
+ self.netUpfeat = torch.nn.ConvTranspose2d(
+ in_channels=intPrevious + 128 + 128 + 96 + 64 + 32,
+ out_channels=2,
+ kernel_size=4,
+ stride=2,
+ padding=1,
+ )
+ if intLevel < 6:
+ self.fltBackwarp = [None, None, None, 5.0, 2.5, 1.25, 0.625, None][
+ intLevel + 1
+ ]
+
+ self.netOne = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netTwo = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent + 128,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netThr = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent + 128 + 128,
+ out_channels=96,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netFou = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent + 128 + 128 + 96,
+ out_channels=64,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netFiv = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent + 128 + 128 + 96 + 64,
+ out_channels=32,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netSix = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent + 128 + 128 + 96 + 64 + 32,
+ out_channels=2,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ )
+ )
+
+ # end
+
+ def forward(self, tenFirst, tenSecond, objPrevious):
+ tenFlow = None
+ tenFeat = None
+
+ if objPrevious is None:
+ tenFlow = None
+ tenFeat = None
+
+ tenVolume = torch.nn.functional.leaky_relu(
+ input=FunctionCorrelation(
+ tenFirst=tenFirst, tenSecond=tenSecond
+ ),
+ negative_slope=0.1,
+ inplace=False,
+ )
+
+ tenFeat = torch.cat([tenVolume], 1)
+
+ elif objPrevious is not None:
+ tenFlow = self.netUpflow(objPrevious["tenFlow"])
+ tenFeat = self.netUpfeat(objPrevious["tenFeat"])
+
+ tenVolume = torch.nn.functional.leaky_relu(
+ input=FunctionCorrelation(
+ tenFirst=tenFirst,
+ tenSecond=backwarp(
+ tenInput=tenSecond, tenFlow=tenFlow * self.fltBackwarp
+ ),
+ ),
+ negative_slope=0.1,
+ inplace=False,
+ )
+
+ tenFeat = torch.cat([tenVolume, tenFirst, tenFlow, tenFeat], 1)
+
+ # end
+
+ tenFeat = torch.cat([self.netOne(tenFeat), tenFeat], 1)
+ tenFeat = torch.cat([self.netTwo(tenFeat), tenFeat], 1)
+ tenFeat = torch.cat([self.netThr(tenFeat), tenFeat], 1)
+ tenFeat = torch.cat([self.netFou(tenFeat), tenFeat], 1)
+ tenFeat = torch.cat([self.netFiv(tenFeat), tenFeat], 1)
+
+ tenFlow = self.netSix(tenFeat)
+
+ return {"tenFlow": tenFlow, "tenFeat": tenFeat}
+
+ # end
+
+ # end
+
+ class Refiner(torch.nn.Module):
+ def __init__(self):
+ super(Refiner, self).__init__()
+
+ self.netMain = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=81 + 32 + 2 + 2 + 128 + 128 + 96 + 64 + 32,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ dilation=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=2,
+ dilation=2,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=4,
+ dilation=4,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=96,
+ kernel_size=3,
+ stride=1,
+ padding=8,
+ dilation=8,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=96,
+ out_channels=64,
+ kernel_size=3,
+ stride=1,
+ padding=16,
+ dilation=16,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=64,
+ out_channels=32,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ dilation=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=32,
+ out_channels=2,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ dilation=1,
+ ),
+ )
+
+ # end
+
+ def forward(self, tenInput):
+ return self.netMain(tenInput)
+
+ # end
+
+ # end
+
+ self.netExtractor = Extractor()
+
+ self.netTwo = Decoder(2)
+ self.netThr = Decoder(3)
+ self.netFou = Decoder(4)
+ self.netFiv = Decoder(5)
+ self.netSix = Decoder(6)
+
+ self.netRefiner = Refiner()
+
+ self.load_state_dict(
+ {
+ strKey.replace("module", "net"): tenWeight
+ for strKey, tenWeight in torch.hub.load_state_dict_from_url(
+ url="http://content.sniklaus.com/github/pytorch-pwc/network-"
+ + "default"
+ + ".pytorch",
+ model_dir=get_ckpt_container_path(MODEL_TYPE)
+ ).items()
+ }
+ )
+
+ # end
+
+ def forward(self, tenFirst, tenSecond, *args):
+ # optionally pass pre-extracted feature pyramid in as args
+ if len(args) == 0:
+ tenFirst = self.netExtractor(tenFirst)
+ tenSecond = self.netExtractor(tenSecond)
+ else:
+ tenFirst, tenSecond = args
+
+ objEstimate = self.netSix(tenFirst[-1], tenSecond[-1], None)
+ objEstimate = self.netFiv(tenFirst[-2], tenSecond[-2], objEstimate)
+ objEstimate = self.netFou(tenFirst[-3], tenSecond[-3], objEstimate)
+ objEstimate = self.netThr(tenFirst[-4], tenSecond[-4], objEstimate)
+ objEstimate = self.netTwo(tenFirst[-5], tenSecond[-5], objEstimate)
+
+ return objEstimate["tenFlow"] + self.netRefiner(objEstimate["tenFeat"])
+
+ # end
+
+ def extract_pyramid(self, tenFirst, tenSecond):
+ return self.netExtractor(tenFirst), self.netExtractor(tenSecond)
+
+ def extract_pyramid_single(self, tenFirst):
+ return self.netExtractor(tenFirst)
+
+
+# end
+
+netNetwork = None
+
+##########################################################
+
+
+def estimate(tenFirst, tenSecond):
+ global netNetwork
+
+ if netNetwork is None:
+ netNetwork = Network().cuda().eval()
+ # end
+
+ assert tenFirst.shape[1] == tenSecond.shape[1]
+ assert tenFirst.shape[2] == tenSecond.shape[2]
+
+ intWidth = tenFirst.shape[2]
+ intHeight = tenFirst.shape[1]
+
+ assert (
+ intWidth == 1024
+ ) # remember that there is no guarantee for correctness, comment this line out if you acknowledge this and want to continue
+ assert (
+ intHeight == 436
+ ) # remember that there is no guarantee for correctness, comment this line out if you acknowledge this and want to continue
+
+ tenPreprocessedFirst = tenFirst.cuda().view(1, 3, intHeight, intWidth)
+ tenPreprocessedSecond = tenSecond.cuda().view(1, 3, intHeight, intWidth)
+
+ intPreprocessedWidth = int(math.floor(math.ceil(intWidth / 64.0) * 64.0))
+ intPreprocessedHeight = int(math.floor(math.ceil(intHeight / 64.0) * 64.0))
+
+ tenPreprocessedFirst = torch.nn.functional.interpolate(
+ input=tenPreprocessedFirst,
+ size=(intPreprocessedHeight, intPreprocessedWidth),
+ mode="bilinear",
+ align_corners=False,
+ )
+ tenPreprocessedSecond = torch.nn.functional.interpolate(
+ input=tenPreprocessedSecond,
+ size=(intPreprocessedHeight, intPreprocessedWidth),
+ mode="bilinear",
+ align_corners=False,
+ )
+
+ tenFlow = 20.0 * torch.nn.functional.interpolate(
+ input=netNetwork(tenPreprocessedFirst, tenPreprocessedSecond),
+ size=(intHeight, intWidth),
+ mode="bilinear",
+ align_corners=False,
+ )
+
+ tenFlow[:, 0, :, :] *= float(intWidth) / float(intPreprocessedWidth)
+ tenFlow[:, 1, :, :] *= float(intHeight) / float(intPreprocessedHeight)
+
+ return tenFlow[0, :, :, :].cpu()
+
+
+# end
+
+
+class Upsampler_8tap(nn.Module):
+ def __init__(self):
+ super(Upsampler_8tap, self).__init__()
+ filt_8tap = torch.tensor([[-1, 4, -11, 40, 40, -11, 4, -1]]).div(64)
+ self.filter = nn.Parameter(filt_8tap.repeat(3, 1, 1, 1), requires_grad=False)
+
+ def forward(self, im):
+ b, c, h, w = im.shape
+ im_up = torch.zeros(b, c, h * 2, w * 2).to(im.device)
+ im_up[:, :, ::2, ::2] = im
+
+ p = (8 - 1) // 2
+ im_up_row = F.conv2d(
+ F.pad(im, pad=(p, p + 1, 0, 0), mode="reflect"), self.filter, groups=3
+ )
+ im_up[:, :, 0::2, 1::2] = im_up_row
+ im_up_col = torch.transpose(
+ F.conv2d(
+ F.pad(torch.transpose(im, 2, 3), pad=(p, p + 1, 0, 0), mode="reflect"),
+ self.filter,
+ groups=3,
+ ),
+ 2,
+ 3,
+ )
+ im_up[:, :, 1::2, 0::2] = im_up_col
+ im_up_cross = F.conv2d(
+ F.pad(im_up[:, :, 1::2, ::2], pad=(p, p + 1, 0, 0), mode="reflect"),
+ self.filter,
+ groups=3,
+ )
+ im_up[:, :, 1::2, 1::2] = im_up_cross
+ return im_up
+
+# end
+
+
+model_urls = {
+ "r3d_18": "https://download.pytorch.org/models/r3d_18-b3b3357e.pth",
+ "mc3_18": "https://download.pytorch.org/models/mc3_18-a90a0ba3.pth",
+ "r2plus1d_18": "https://download.pytorch.org/models/r2plus1d_18-91a641e6.pth",
+}
+
+
+class Conv3DSimple(nn.Conv3d):
+ def __init__(self, in_planes, out_planes, midplanes=None, stride=1, padding=1):
+ super(Conv3DSimple, self).__init__(
+ in_channels=in_planes,
+ out_channels=out_planes,
+ kernel_size=(3, 3, 3),
+ stride=stride,
+ padding=padding,
+ bias=False,
+ )
+
+ @staticmethod
+ def get_downsample_stride(stride, temporal_stride):
+ if temporal_stride:
+ return (temporal_stride, stride, stride)
+ else:
+ return (stride, stride, stride)
+
+
+class Conv2Plus1D(nn.Sequential):
+ def __init__(self, in_planes, out_planes, midplanes, stride=1, padding=1):
+ super(Conv2Plus1D, self).__init__(
+ nn.Conv3d(
+ in_planes,
+ midplanes,
+ kernel_size=(1, 3, 3),
+ stride=(1, stride, stride),
+ padding=(0, padding, padding),
+ bias=False,
+ ),
+ batchnorm(midplanes),
+ nn.ReLU(inplace=True),
+ nn.Conv3d(
+ midplanes,
+ out_planes,
+ kernel_size=(3, 1, 1),
+ stride=(stride, 1, 1),
+ padding=(padding, 0, 0),
+ bias=False,
+ ),
+ )
+
+ @staticmethod
+ def get_downsample_stride(stride):
+ return stride, stride, stride
+
+
+class Conv3DNoTemporal(nn.Conv3d):
+ def __init__(self, in_planes, out_planes, midplanes=None, stride=1, padding=1):
+ super(Conv3DNoTemporal, self).__init__(
+ in_channels=in_planes,
+ out_channels=out_planes,
+ kernel_size=(1, 3, 3),
+ stride=(1, stride, stride),
+ padding=(0, padding, padding),
+ bias=False,
+ )
+
+ @staticmethod
+ def get_downsample_stride(stride):
+ return 1, stride, stride
+
+
+class SEGating(nn.Module):
+ def __init__(self, inplanes, reduction=16):
+ super().__init__()
+
+ self.pool = nn.AdaptiveAvgPool3d(1)
+ self.attn_layer = nn.Sequential(
+ nn.Conv3d(inplanes, inplanes, kernel_size=1, stride=1, bias=True),
+ nn.Sigmoid(),
+ )
+
+ def forward(self, x):
+ out = self.pool(x)
+ y = self.attn_layer(out)
+ return x * y
+
+
+class BasicBlock(nn.Module):
+ expansion = 1
+
+ def __init__(self, inplanes, planes, conv_builder, stride=1, downsample=None):
+ midplanes = (inplanes * planes * 3 * 3 * 3) // (inplanes * 3 * 3 + 3 * planes)
+
+ super(BasicBlock, self).__init__()
+ self.conv1 = nn.Sequential(
+ conv_builder(inplanes, planes, midplanes, stride),
+ batchnorm(planes),
+ nn.ReLU(inplace=True),
+ )
+ self.conv2 = nn.Sequential(
+ conv_builder(planes, planes, midplanes), batchnorm(planes)
+ )
+ self.fg = SEGating(planes) ## Feature Gating, from FLAVR
+ self.relu = nn.ReLU(inplace=True)
+ self.downsample = downsample
+ self.stride = stride
+
+ def forward(self, x):
+ residual = x
+ out = self.conv1(x)
+ out = self.conv2(out)
+ out = self.fg(out)
+ if self.downsample is not None:
+ residual = self.downsample(x)
+
+ out += residual
+ out = self.relu(out)
+
+ return out
+
+
+class Bottleneck(nn.Module):
+ expansion = 4
+
+ def __init__(self, inplanes, planes, conv_builder, stride=1, downsample=None):
+ super(Bottleneck, self).__init__()
+ midplanes = (inplanes * planes * 3 * 3 * 3) // (inplanes * 3 * 3 + 3 * planes)
+
+ # 1x1x1
+ self.conv1 = nn.Sequential(
+ nn.Conv3d(inplanes, planes, kernel_size=1, bias=False),
+ batchnorm(planes),
+ nn.ReLU(inplace=True),
+ )
+ # Second kernel
+ self.conv2 = nn.Sequential(
+ conv_builder(planes, planes, midplanes, stride),
+ batchnorm(planes),
+ nn.ReLU(inplace=True),
+ )
+
+ # 1x1x1
+ self.conv3 = nn.Sequential(
+ nn.Conv3d(planes, planes * self.expansion, kernel_size=1, bias=False),
+ batchnorm(planes * self.expansion),
+ )
+ self.relu = nn.ReLU(inplace=True)
+ self.downsample = downsample
+ self.stride = stride
+
+ def forward(self, x):
+ residual = x
+
+ out = self.conv1(x)
+ out = self.conv2(out)
+ out = self.conv3(out)
+
+ if self.downsample is not None:
+ residual = self.downsample(x)
+
+ out += residual
+ out = self.relu(out)
+
+ return out
+
+
+class BasicStem(nn.Sequential):
+ """The default conv-batchnorm-relu stem"""
+
+ def __init__(self, outplanes=32):
+ super(BasicStem, self).__init__(
+ nn.Conv3d(
+ 3,
+ outplanes,
+ kernel_size=(3, 7, 7),
+ stride=(1, 2, 2),
+ padding=(1, 3, 3),
+ bias=False,
+ ),
+ batchnorm(outplanes),
+ nn.ReLU(inplace=True),
+ )
+
+
+class R2Plus1dStem(nn.Sequential):
+ """R(2+1)D stem is different than the default one as it uses separated 3D convolution"""
+
+ def __init__(self):
+ super(R2Plus1dStem, self).__init__(
+ nn.Conv3d(
+ 3,
+ 45,
+ kernel_size=(1, 7, 7),
+ stride=(1, 2, 2),
+ padding=(0, 3, 3),
+ bias=False,
+ ),
+ batchnorm(45),
+ nn.ReLU(inplace=True),
+ nn.Conv3d(
+ 45,
+ 64,
+ kernel_size=(3, 1, 1),
+ stride=(1, 1, 1),
+ padding=(1, 0, 0),
+ bias=False,
+ ),
+ batchnorm(64),
+ nn.ReLU(inplace=True),
+ )
+
+
+class VideoResNet(nn.Module):
+ def __init__(
+ self,
+ block,
+ conv_makers,
+ layers,
+ stem,
+ zero_init_residual=False,
+ channels=[32, 64, 96, 128],
+ ):
+ """Generic resnet video generator.
+
+ Args:
+ block (nn.Module): resnet building block
+ conv_makers (list(functions)): generator function for each layer
+ layers (List[int]): number of blocks per layer
+ stem (nn.Module, optional): Resnet stem, if None, defaults to conv-bn-relu. Defaults to None.
+ zero_init_residual (bool, optional): Zero init bottleneck residual BN. Defaults to False.
+ """
+ super(VideoResNet, self).__init__()
+ self.inplanes = channels[0] # output channel of first stem
+
+ self.stem = stem()
+
+ self.layer1 = self._make_layer(
+ block, conv_makers[0], channels[0], layers[0], stride=1
+ )
+ self.layer2 = self._make_layer(
+ block, conv_makers[1], channels[1], layers[1], stride=2, temporal_stride=1
+ )
+ self.layer3 = self._make_layer(
+ block, conv_makers[2], channels[2], layers[2], stride=2, temporal_stride=1
+ )
+ self.layer4 = self._make_layer(
+ block, conv_makers[3], channels[3], layers[3], stride=1, temporal_stride=1
+ )
+
+ # init weights
+ self._initialize_weights()
+
+ if zero_init_residual:
+ for m in self.modules():
+ if isinstance(m, Bottleneck):
+ nn.init.constant_(m.bn3.weight, 0)
+
+ def forward(self, x):
+ tensorConv0 = self.stem(x)
+ tensorConv1 = self.layer1(tensorConv0)
+ tensorConv2 = self.layer2(tensorConv1)
+ tensorConv3 = self.layer3(tensorConv2)
+ tensorConv4 = self.layer4(tensorConv3)
+ return tensorConv0, tensorConv1, tensorConv2, tensorConv3, tensorConv4
+
+ def _make_layer(
+ self, block, conv_builder, planes, blocks, stride=1, temporal_stride=None
+ ):
+ downsample = None
+
+ if stride != 1 or self.inplanes != planes * block.expansion:
+ ds_stride = conv_builder.get_downsample_stride(stride, temporal_stride)
+ downsample = nn.Sequential(
+ nn.Conv3d(
+ self.inplanes,
+ planes * block.expansion,
+ kernel_size=1,
+ stride=ds_stride,
+ bias=False,
+ ),
+ batchnorm(planes * block.expansion),
+ )
+ stride = ds_stride
+
+ layers = []
+ layers.append(block(self.inplanes, planes, conv_builder, stride, downsample))
+
+ self.inplanes = planes * block.expansion
+ for i in range(1, blocks):
+ layers.append(block(self.inplanes, planes, conv_builder))
+
+ return nn.Sequential(*layers)
+
+ def _initialize_weights(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv3d):
+ nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+ elif isinstance(m, nn.BatchNorm3d):
+ nn.init.constant_(m.weight, 1)
+ nn.init.constant_(m.bias, 0)
+ elif isinstance(m, nn.Linear):
+ nn.init.normal_(m.weight, 0, 0.01)
+ nn.init.constant_(m.bias, 0)
+
+
+def _video_resnet(arch, pretrained=False, progress=True, **kwargs):
+ model = VideoResNet(**kwargs)
+
+ if pretrained:
+ state_dict = load_state_dict_from_url(model_urls[arch], progress=progress, model_dir=get_ckpt_container_path(MODEL_TYPE))
+ model.load_state_dict(state_dict)
+ return model
+
+
+def r3d_18(bn=False, pretrained=False, progress=True, **kwargs):
+ """Construct 18 layer Resnet3D model as in
+ https://arxiv.org/abs/1711.11248
+
+ Args:
+ pretrained (bool): If True, returns a model pre-trained on Kinetics-400
+ progress (bool): If True, displays a progress bar of the download to stderr
+
+ Returns:
+ nn.Module: R3D-18 network
+ """
+
+ global batchnorm
+ if bn:
+ batchnorm = nn.BatchNorm3d
+ else:
+ batchnorm = identity
+
+ return _video_resnet(
+ "r3d_18",
+ pretrained,
+ progress,
+ block=BasicBlock,
+ conv_makers=[Conv3DSimple] * 4,
+ layers=[2, 2, 2, 2],
+ stem=BasicStem,
+ **kwargs,
+ )
+
+
+def mc3_18(bn=False, pretrained=False, progress=True, **kwargs):
+ """Constructor for 18 layer Mixed Convolution network as in
+ https://arxiv.org/abs/1711.11248
+
+ Args:
+ pretrained (bool): If True, returns a model pre-trained on Kinetics-400
+ progress (bool): If True, displays a progress bar of the download to stderr
+
+ Returns:
+ nn.Module: MC3 Network definition
+ """
+ global batchnorm
+ if bn:
+ batchnorm = nn.BatchNorm3d
+ else:
+ batchnorm = identity
+
+ return _video_resnet(
+ "mc3_18",
+ pretrained,
+ progress,
+ block=BasicBlock,
+ conv_makers=[Conv3DSimple] + [Conv3DNoTemporal] * 3,
+ layers=[2, 2, 2, 2],
+ stem=BasicStem,
+ **kwargs,
+ )
+
+
+def r2plus1d_18(bn=False, pretrained=False, progress=True, **kwargs):
+ """Constructor for the 18 layer deep R(2+1)D network as in
+ https://arxiv.org/abs/1711.11248
+
+ Args:
+ pretrained (bool): If True, returns a model pre-trained on Kinetics-400
+ progress (bool): If True, displays a progress bar of the download to stderr
+
+ Returns:
+ nn.Module: R(2+1)D-18 network
+ """
+
+ global batchnorm
+ if bn:
+ batchnorm = nn.BatchNorm3d
+ else:
+ batchnorm = identity
+
+ return _video_resnet(
+ "r2plus1d_18",
+ pretrained,
+ progress,
+ block=BasicBlock,
+ conv_makers=[Conv2Plus1D] * 4,
+ layers=[2, 2, 2, 2],
+ stem=R2Plus1dStem,
+ **kwargs,
+ )
+
+
+class upConv3D(nn.Module):
+ def __init__(self, in_ch, out_ch, kernel_size, stride, padding, upmode="transpose"):
+ super().__init__()
+ self.upmode = upmode
+ if self.upmode == "transpose":
+ self.upconv = nn.ModuleList(
+ [
+ nn.ConvTranspose3d(
+ in_ch,
+ out_ch,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ ),
+ SEGating(out_ch),
+ batchnorm(out_ch),
+ ]
+ )
+ else:
+ self.upconv = nn.ModuleList(
+ [
+ nn.Upsample(
+ mode="trilinear", scale_factor=(1, 2, 2), align_corners=False
+ ),
+ nn.Conv3d(in_ch, out_ch, kernel_size=1, stride=1),
+ SEGating(out_ch),
+ batchnorm(out_ch),
+ ]
+ )
+ self.upconv = nn.Sequential(*self.upconv)
+
+ def forward(self, x):
+ return self.upconv(x)
+
+
+class Conv_3d(nn.Module):
+ def __init__(self, in_ch, out_ch, kernel_size, stride=1, padding=0, bias=True):
+ super().__init__()
+ self.conv = nn.Sequential(
+ nn.Conv3d(
+ in_ch,
+ out_ch,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ bias=bias,
+ ),
+ SEGating(out_ch),
+ batchnorm(out_ch),
+ )
+
+ def forward(self, x):
+ return self.conv(x)
+
+
+def make_optimizer(args, my_model):
+ trainable = filter(lambda x: x.requires_grad, my_model.parameters())
+
+ if args.optimizer == "SGD":
+ optimizer_function = optim.SGD
+ kwargs = {"momentum": 0.9}
+ elif args.optimizer == "ADAM":
+ optimizer_function = optim.Adam
+ kwargs = {"betas": (0.9, 0.999), "eps": 1e-08}
+ elif args.optimizer == "ADAMax":
+ optimizer_function = optim.Adamax
+ kwargs = {"betas": (0.9, 0.999), "eps": 1e-08}
+ elif args.optimizer == "RMSprop":
+ optimizer_function = optim.RMSprop
+ kwargs = {"eps": 1e-08}
+
+ kwargs["lr"] = args.lr
+ kwargs["weight_decay"] = args.weight_decay
+
+ return optimizer_function(trainable, **kwargs)
+
+
+def make_scheduler(args, my_optimizer):
+ if args.decay_type == "step":
+ scheduler = lrs.StepLR(my_optimizer, step_size=args.lr_decay, gamma=args.gamma)
+ elif args.decay_type.find("step") >= 0:
+ milestones = args.decay_type.split("_")
+ milestones.pop(0)
+ milestones = list(map(lambda x: int(x), milestones))
+ scheduler = lrs.MultiStepLR(
+ my_optimizer, milestones=milestones, gamma=args.gamma
+ )
+ elif args.decay_type == "plateau":
+ scheduler = lrs.ReduceLROnPlateau(
+ my_optimizer,
+ mode="max",
+ factor=args.gamma,
+ patience=args.patience,
+ threshold=0.01, # metric to be used is psnr
+ threshold_mode="abs",
+ verbose=True,
+ )
+
+ return scheduler
+
+
+def gaussian_kernel(sz, sigma):
+ k = torch.arange(-(sz - 1) / 2, (sz + 1) / 2)
+ k = torch.exp(-1.0 / (2 * sigma**2) * k**2)
+ k = k.reshape(-1, 1) * k.reshape(1, -1)
+ k = k / torch.sum(k)
+ return k
+
+
+def moduleNormalize(frame):
+ return torch.cat(
+ [
+ (frame[:, 0:1, :, :] - 0.4631),
+ (frame[:, 1:2, :, :] - 0.4352),
+ (frame[:, 2:3, :, :] - 0.3990),
+ ],
+ 1,
+ )
+
+
+class FoldUnfold:
+ """
+ Class to handle folding tensor frame into batch of patches and back to frame again
+ Thanks to Charlie Tan (charlie.tan.2019@bristol.ac.uk) for the earier version.
+ """
+
+ def __init__(self, height, width, patch_size, overlap):
+ if height % 2 or width % 2 or patch_size % 2 or overlap % 2:
+ print(
+ "only defined for even values of height, width, patch_size size and overlap, odd values will reconstruct incorrectly"
+ )
+ return
+
+ self.height = height
+ self.width = width
+
+ self.patch_size = patch_size
+ self.overlap = overlap
+ self.stride = patch_size - overlap
+
+ def fold_to_patches(self, *frames):
+ """
+ args: frames -- list of (1,3,H,W) tensors
+ returns: list of (B,3,h,w) image patches
+ """
+
+ # number of blocks in each direction
+ n_blocks_h = (self.height // (self.stride)) + 1
+ n_blocks_w = (self.width // (self.stride)) + 1
+
+ # how much to pad each edge by
+ self.pad_h = (self.stride * n_blocks_h + self.overlap - self.height) // 2
+ self.pad_w = (self.stride * n_blocks_w + self.overlap - self.width) // 2
+ self.height_pad = self.height + 2 * self.pad_h
+ self.width_pad = self.width + 2 * self.pad_w
+
+ # pad the frames and unfold into patches
+ patches_list = []
+ for i in range(len(frames)):
+ padded = F.pad(
+ frames[i],
+ (self.pad_w, self.pad_w, self.pad_h, self.pad_h),
+ mode="reflect",
+ )
+ unfolded = F.unfold(padded, self.patch_size, stride=self.stride)
+ patches = unfolded.permute(2, 1, 0).reshape(
+ -1, 3, self.patch_size, self.patch_size
+ )
+ patches_list.append(patches)
+
+ return patches_list
+
+ def unfold_to_frame(self, patches):
+ """
+ args: patches -- tensor of shape (B,3,h,w)
+ returns: frame -- tensor of shape (1,3,H,W)
+ """
+
+ # reshape and permute back into [frames, chans * patch_size ** 2, num_patches] as expected by fold
+ frame_unfold = patches.reshape(-1, 3 * self.patch_size**2, 1).permute(2, 1, 0)
+
+ # fold into tensor of shape pad_shape
+ frame_fold = F.fold(
+ frame_unfold,
+ (self.height_pad, self.width_pad),
+ self.patch_size,
+ stride=self.stride,
+ )
+
+ # unfold sums overlaps instead of averaging so tensor of ones unfolded and
+ # folded to track overlaps and take mean of overlapping pixels
+ ones = torch.ones_like(frame_fold)
+ ones_unfold = F.unfold(ones, self.patch_size, stride=self.stride)
+
+ # divisor is tensor of shape pad_shape where each element is the number of values that have overlapped
+ # 1 = no overlaps
+ divisor = F.fold(
+ ones_unfold,
+ (self.height_pad, self.width_pad),
+ self.patch_size,
+ stride=self.stride,
+ )
+
+ # divide reconstructed frame by divisor
+ frame_div = frame_fold / divisor
+
+ # crop frame to remove the padded areas
+ frame_crop = frame_div[
+ :, :, self.pad_h : -self.pad_h, self.pad_w : -self.pad_w
+ ].clone()
+
+ return frame_crop
+
+
+def read_frame_yuv2rgb(stream, width, height, iFrame, bit_depth, pix_fmt="420"):
+ if pix_fmt == "420":
+ multiplier = 1
+ uv_factor = 2
+ elif pix_fmt == "444":
+ multiplier = 2
+ uv_factor = 1
+ else:
+ print("Pixel format {} is not supported".format(pix_fmt))
+ return
+
+ if bit_depth == 8:
+ datatype = np.uint8
+ stream.seek(iFrame * 1.5 * width * height * multiplier)
+ Y = np.fromfile(stream, dtype=datatype, count=width * height).reshape(
+ (height, width)
+ )
+
+ # read chroma samples and upsample since original is 4:2:0 sampling
+ U = np.fromfile(
+ stream, dtype=datatype, count=(width // uv_factor) * (height // uv_factor)
+ ).reshape((height // uv_factor, width // uv_factor))
+ V = np.fromfile(
+ stream, dtype=datatype, count=(width // uv_factor) * (height // uv_factor)
+ ).reshape((height // uv_factor, width // uv_factor))
+
+ else:
+ datatype = np.uint16
+ stream.seek(iFrame * 3 * width * height * multiplier)
+ Y = np.fromfile(stream, dtype=datatype, count=width * height).reshape(
+ (height, width)
+ )
+
+ U = np.fromfile(
+ stream, dtype=datatype, count=(width // uv_factor) * (height // uv_factor)
+ ).reshape((height // uv_factor, width // uv_factor))
+ V = np.fromfile(
+ stream, dtype=datatype, count=(width // uv_factor) * (height // uv_factor)
+ ).reshape((height // uv_factor, width // uv_factor))
+
+ if pix_fmt == "420":
+ yuv = np.empty((height * 3 // 2, width), dtype=datatype)
+ yuv[0:height, :] = Y
+
+ yuv[height : height + height // 4, :] = U.reshape(-1, width)
+ yuv[height + height // 4 :, :] = V.reshape(-1, width)
+
+ if bit_depth != 8:
+ yuv = (yuv / (2**bit_depth - 1) * 255).astype(np.uint8)
+
+ # convert to rgb
+ rgb = cv2.cvtColor(yuv, cv2.COLOR_YUV2RGB_I420)
+
+ else:
+ yvu = np.stack([Y, V, U], axis=2)
+ if bit_depth != 8:
+ yvu = (yvu / (2**bit_depth - 1) * 255).astype(np.uint8)
+ rgb = cv2.cvtColor(yvu, cv2.COLOR_YCrCb2RGB)
+
+ return rgb
+
+
+def quantize(imTensor):
+ return imTensor.clamp(0.0, 1.0).mul(255).round()
+
+
+def tensor2rgb(tensor):
+ """
+ Convert GPU Tensor to RGB image (numpy array)
+ """
+ out = []
+ for b in range(tensor.shape[0]):
+ out.append(
+ np.moveaxis(quantize(tensor[b]).cpu().detach().numpy(), 0, 2).astype(
+ np.uint8
+ )
+ )
+ return np.array(out) # (B,H,W,C)
+
+
+class Identity(nn.Module):
+ def __init__(self, *args):
+ super(Identity, self).__init__()
+
+ def forward(self, x):
+ return x
+
+
+class SEBlock(nn.Module):
+ def __init__(self, input_dim, reduction=16):
+ super(SEBlock, self).__init__()
+ mid = int(input_dim / reduction)
+ self.avg_pool = nn.AdaptiveAvgPool2d(1)
+ self.fc = nn.Sequential(
+ nn.Linear(input_dim, mid),
+ nn.ReLU(inplace=True),
+ nn.Linear(mid, input_dim),
+ nn.Sigmoid(),
+ )
+
+ def forward(self, x):
+ b, c, _, _ = x.size()
+ y = self.avg_pool(x).view(b, c)
+ y = self.fc(y).view(b, c, 1, 1)
+ return x * y
+
+
+class ResNextBlock(nn.Module):
+ def __init__(
+ self, down, cin, cout, ks, stride=1, groups=32, base_width=4, norm_layer=None
+ ):
+ super(ResNextBlock, self).__init__()
+ if norm_layer is None or norm_layer == "batch":
+ norm_layer = nn.BatchNorm2d
+ elif norm_layer == "identity":
+ norm_layer = Identity
+ width = int(cout * (base_width / 64.0)) * groups
+ # Both self.conv2 and self.downsample layers downsample the input when stride != 1
+ self.conv1 = nn.Conv2d(cin, width, kernel_size=1, stride=1, bias=False)
+ self.bn1 = norm_layer(width)
+ if down:
+ self.conv2 = nn.Conv2d(
+ width,
+ width,
+ kernel_size=ks,
+ stride=stride,
+ padding=(ks - 1) // 2,
+ groups=groups,
+ bias=False,
+ )
+ else:
+ self.conv2 = nn.ConvTranspose2d(
+ width,
+ width,
+ kernel_size=ks,
+ stride=stride,
+ padding=(ks - stride) // 2,
+ groups=groups,
+ bias=False,
+ )
+ self.bn2 = norm_layer(width)
+ self.conv3 = nn.Conv2d(width, cout, kernel_size=1, stride=1, bias=False)
+ self.bn3 = norm_layer(cout)
+ self.relu = nn.ReLU(inplace=True)
+ self.downsample = None
+ if stride != 1 or cin != cout:
+ if down:
+ self.downsample = nn.Sequential(
+ nn.Conv2d(cin, cout, kernel_size=1, stride=stride, bias=False),
+ norm_layer(cout),
+ )
+ else:
+ self.downsample = nn.Sequential(
+ # ks = stride here s.t. resolution can be kept
+ nn.ConvTranspose2d(
+ cin, cout, kernel_size=2, stride=stride, bias=False
+ ),
+ norm_layer(cout),
+ )
+ self.stride = stride
+
+ def forward(self, x):
+ identity = x
+
+ out = self.conv1(x)
+ out = self.bn1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out)
+ out = self.bn2(out)
+ out = self.relu(out)
+
+ out = self.conv3(out)
+ out = self.bn3(out)
+
+ if self.downsample is not None:
+ identity = self.downsample(x)
+
+ out += identity
+ out = self.relu(out)
+
+ return out
+
+
+class MultiScaleResNextBlock(nn.Module):
+ def __init__(self, down, cin, cout, ks_s, ks_l, stride, norm_layer):
+ super(MultiScaleResNextBlock, self).__init__()
+ self.resnext_small = ResNextBlock(
+ down, cin, cout // 2, ks_s, stride, norm_layer=norm_layer
+ )
+ self.resnext_large = ResNextBlock(
+ down, cin, cout // 2, ks_l, stride, norm_layer=norm_layer
+ )
+ self.attention = SEBlock(cout)
+
+ def forward(self, tensorCombine):
+ out_small = self.resnext_small(tensorCombine)
+ out_large = self.resnext_large(tensorCombine)
+ out = torch.cat([out_small, out_large], 1)
+ out = self.attention(out)
+ return out
+
+
+class UMultiScaleResNext(nn.Module):
+ def __init__(
+ self, channels=[64, 128, 256, 512], norm_layer="batch", inplanes=6, **kwargs
+ ):
+ super(UMultiScaleResNext, self).__init__()
+ self.conv1 = MultiScaleResNextBlock(
+ True, inplanes, channels[0], ks_s=3, ks_l=7, stride=2, norm_layer=norm_layer
+ )
+ self.conv2 = MultiScaleResNextBlock(
+ True,
+ channels[0],
+ channels[1],
+ ks_s=3,
+ ks_l=7,
+ stride=2,
+ norm_layer=norm_layer,
+ )
+ self.conv3 = MultiScaleResNextBlock(
+ True,
+ channels[1],
+ channels[2],
+ ks_s=3,
+ ks_l=5,
+ stride=2,
+ norm_layer=norm_layer,
+ )
+ self.conv4 = MultiScaleResNextBlock(
+ True,
+ channels[2],
+ channels[3],
+ ks_s=3,
+ ks_l=5,
+ stride=2,
+ norm_layer=norm_layer,
+ )
+
+ self.deconv4 = MultiScaleResNextBlock(
+ True,
+ channels[3],
+ channels[3],
+ ks_s=3,
+ ks_l=5,
+ stride=1,
+ norm_layer=norm_layer,
+ )
+ self.deconv3 = MultiScaleResNextBlock(
+ False,
+ channels[3],
+ channels[2],
+ ks_s=4,
+ ks_l=6,
+ stride=2,
+ norm_layer=norm_layer,
+ )
+ self.deconv2 = MultiScaleResNextBlock(
+ False,
+ channels[2],
+ channels[1],
+ ks_s=4,
+ ks_l=8,
+ stride=2,
+ norm_layer=norm_layer,
+ )
+ self.deconv1 = MultiScaleResNextBlock(
+ False,
+ channels[1],
+ channels[0],
+ ks_s=4,
+ ks_l=8,
+ stride=2,
+ norm_layer=norm_layer,
+ )
+
+ def forward(self, im0, im2):
+ tensorJoin = torch.cat([im0, im2], 1) # (B,6,H,W)
+
+ tensorConv1 = self.conv1(tensorJoin)
+ tensorConv2 = self.conv2(tensorConv1)
+ tensorConv3 = self.conv3(tensorConv2)
+ tensorConv4 = self.conv4(tensorConv3)
+
+ tensorDeconv4 = self.deconv4(tensorConv4)
+ tensorDeconv3 = self.deconv3(tensorDeconv4 + tensorConv4)
+ tensorDeconv2 = self.deconv2(tensorDeconv3 + tensorConv3)
+ tensorDeconv1 = self.deconv1(tensorDeconv2 + tensorConv2)
+
+ return tensorDeconv1
+
+
+class MultiInputGridNet(nn.Module):
+ def __init__(self, in_chs, out_chs, grid_chs=(32, 64, 96), n_row=3, n_col=6):
+ super(MultiInputGridNet, self).__init__()
+
+ self.n_row = n_row
+ self.n_col = n_col
+ self.n_chs = grid_chs
+ assert (
+ len(grid_chs) == self.n_row
+ ), "should give num channels for each row (scale stream)"
+ assert (
+ len(in_chs) == self.n_row
+ ), "should give input channels for each row (scale stream)"
+
+ for r, n_ch in enumerate(self.n_chs):
+ setattr(self, f"lateral_{r}_0", LateralBlock(in_chs[r], n_ch))
+ for c in range(1, self.n_col):
+ setattr(self, f"lateral_{r}_{c}", LateralBlock(n_ch, n_ch))
+
+ for r, (in_ch, out_ch) in enumerate(zip(self.n_chs[:-1], self.n_chs[1:])):
+ for c in range(int(self.n_col / 2)):
+ setattr(self, f"down_{r}_{c}", DownSamplingBlock(in_ch, out_ch))
+
+ for r, (in_ch, out_ch) in enumerate(zip(self.n_chs[1:], self.n_chs[:-1])):
+ for c in range(int(self.n_col / 2)):
+ setattr(self, f"up_{r}_{c}", UpSamplingBlock(in_ch, out_ch))
+
+ self.lateral_final = LateralBlock(self.n_chs[0], out_chs)
+
+ def forward(self, *args):
+ assert len(args) == self.n_row
+
+ # extensible, memory-efficient
+ cur_col = list(args)
+ for c in range(int(self.n_col / 2)):
+ for r in range(self.n_row):
+ cur_col[r] = getattr(self, f"lateral_{r}_{c}")(cur_col[r])
+ if r != 0:
+ cur_col[r] += getattr(self, f"down_{r-1}_{c}")(cur_col[r - 1])
+
+ for c in range(int(self.n_col / 2), self.n_col):
+ for r in range(self.n_row - 1, -1, -1):
+ cur_col[r] = getattr(self, f"lateral_{r}_{c}")(cur_col[r])
+ if r != self.n_row - 1:
+ cur_col[r] += getattr(self, f"up_{r}_{c-int(self.n_col/2)}")(
+ cur_col[r + 1]
+ )
+
+ return self.lateral_final(cur_col[0])
+
+
+class MIMOGridNet(nn.Module):
+ def __init__(
+ self, in_chs, out_chs, grid_chs=(32, 64, 96), n_row=3, n_col=6, outrow=(0, 1, 2)
+ ):
+ super(MIMOGridNet, self).__init__()
+
+ self.n_row = n_row
+ self.n_col = n_col
+ self.n_chs = grid_chs
+ self.outrow = outrow
+ assert (
+ len(grid_chs) == self.n_row
+ ), "should give num channels for each row (scale stream)"
+ assert (
+ len(in_chs) == self.n_row
+ ), "should give input channels for each row (scale stream)"
+ assert len(out_chs) == len(
+ self.outrow
+ ), "should give out channels for each output row (scale stream)"
+
+ for r, n_ch in enumerate(self.n_chs):
+ setattr(self, f"lateral_{r}_0", LateralBlock(in_chs[r], n_ch))
+ for c in range(1, self.n_col):
+ setattr(self, f"lateral_{r}_{c}", LateralBlock(n_ch, n_ch))
+
+ for r, (in_ch, out_ch) in enumerate(zip(self.n_chs[:-1], self.n_chs[1:])):
+ for c in range(int(self.n_col / 2)):
+ setattr(self, f"down_{r}_{c}", DownSamplingBlock(in_ch, out_ch))
+
+ for r, (in_ch, out_ch) in enumerate(zip(self.n_chs[1:], self.n_chs[:-1])):
+ for c in range(int(self.n_col / 2)):
+ setattr(self, f"up_{r}_{c}", UpSamplingBlock(in_ch, out_ch))
+
+ for i, r in enumerate(outrow):
+ setattr(self, f"lateral_final_{r}", LateralBlock(self.n_chs[r], out_chs[i]))
+
+ def forward(self, *args):
+ assert len(args) == self.n_row
+
+ # extensible, memory-efficient
+ cur_col = list(args)
+ for c in range(int(self.n_col / 2)):
+ for r in range(self.n_row):
+ cur_col[r] = getattr(self, f"lateral_{r}_{c}")(cur_col[r])
+ if r != 0:
+ cur_col[r] += getattr(self, f"down_{r-1}_{c}")(cur_col[r - 1])
+
+ for c in range(int(self.n_col / 2), self.n_col):
+ for r in range(self.n_row - 1, -1, -1):
+ cur_col[r] = getattr(self, f"lateral_{r}_{c}")(cur_col[r])
+ if r != self.n_row - 1:
+ cur_col[r] += getattr(self, f"up_{r}_{c-int(self.n_col/2)}")(
+ cur_col[r + 1]
+ )
+
+ out = []
+ for r in self.outrow:
+ out.append(getattr(self, f"lateral_final_{r}")(cur_col[r]))
+
+ return out
+
+
+class GeneralGridNet(nn.Module):
+ def __init__(self, in_chs, out_chs, grid_chs=(32, 64, 96), n_row=3, n_col=6):
+ super(GeneralGridNet, self).__init__()
+
+ self.n_row = n_row
+ self.n_col = n_col
+ self.n_chs = grid_chs
+ assert (
+ len(grid_chs) == self.n_row
+ ), "should give num channels for each row (scale stream)"
+
+ for r, n_ch in enumerate(self.n_chs):
+ if r == 0:
+ setattr(self, f"lateral_{r}_0", LateralBlock(in_chs, n_ch))
+ for c in range(1, self.n_col):
+ setattr(self, f"lateral_{r}_{c}", LateralBlock(n_ch, n_ch))
+
+ for r, (in_ch, out_ch) in enumerate(zip(self.n_chs[:-1], self.n_chs[1:])):
+ for c in range(int(self.n_col / 2)):
+ setattr(self, f"down_{r}_{c}", DownSamplingBlock(in_ch, out_ch))
+
+ for r, (in_ch, out_ch) in enumerate(zip(self.n_chs[1:], self.n_chs[:-1])):
+ for c in range(int(self.n_col / 2)):
+ setattr(self, f"up_{r}_{c}", UpSamplingBlock(in_ch, out_ch))
+
+ self.lateral_final = LateralBlock(self.n_chs[0], out_chs)
+
+ def forward(self, x):
+ cur_col = [x] + [None] * (self.n_row - 1)
+ for c in range(int(self.n_col / 2)):
+ for r in range(self.n_row):
+ if cur_col[r] != None:
+ cur_col[r] = getattr(self, f"lateral_{r}_{c}")(cur_col[r])
+ else:
+ cur_col[r] = 0.0
+ if r != 0:
+ cur_col[r] += getattr(self, f"down_{r-1}_{c}")(cur_col[r - 1])
+
+ for c in range(int(self.n_col / 2), self.n_col):
+ for r in range(self.n_row - 1, -1, -1):
+ cur_col[r] = getattr(self, f"lateral_{r}_{c}")(cur_col[r])
+ if r != self.n_row - 1:
+ cur_col[r] += getattr(self, f"up_{r}_{c-int(self.n_col/2)}")(
+ cur_col[r + 1]
+ )
+
+ return self.lateral_final(cur_col[0])
+
+
+class GridNet(nn.Module):
+ def __init__(self, in_chs, out_chs, grid_chs=(32, 64, 96)):
+ super(GridNet, self).__init__()
+
+ self.n_row = 3
+ self.n_col = 6
+ self.n_chs = grid_chs
+ assert (
+ len(grid_chs) == self.n_row
+ ), "should give num channels for each row (scale stream)"
+
+ self.lateral_init = LateralBlock(in_chs, self.n_chs[0])
+
+ for r, n_ch in enumerate(self.n_chs):
+ for c in range(self.n_col - 1):
+ setattr(self, f"lateral_{r}_{c}", LateralBlock(n_ch, n_ch))
+
+ for r, (in_ch, out_ch) in enumerate(zip(self.n_chs[:-1], self.n_chs[1:])):
+ for c in range(int(self.n_col / 2)):
+ setattr(self, f"down_{r}_{c}", DownSamplingBlock(in_ch, out_ch))
+
+ for r, (in_ch, out_ch) in enumerate(zip(self.n_chs[1:], self.n_chs[:-1])):
+ for c in range(int(self.n_col / 2)):
+ setattr(self, f"up_{r}_{c}", UpSamplingBlock(in_ch, out_ch))
+
+ self.lateral_final = LateralBlock(self.n_chs[0], out_chs)
+
+ def forward(self, x):
+ state_00 = self.lateral_init(x)
+ state_10 = self.down_0_0(state_00)
+ state_20 = self.down_1_0(state_10)
+
+ state_01 = self.lateral_0_0(state_00)
+ state_11 = self.down_0_1(state_01) + self.lateral_1_0(state_10)
+ state_21 = self.down_1_1(state_11) + self.lateral_2_0(state_20)
+
+ state_02 = self.lateral_0_1(state_01)
+ state_12 = self.down_0_2(state_02) + self.lateral_1_1(state_11)
+ state_22 = self.down_1_2(state_12) + self.lateral_2_1(state_21)
+
+ state_23 = self.lateral_2_2(state_22)
+ state_13 = self.up_1_0(state_23) + self.lateral_1_2(state_12)
+ state_03 = self.up_0_0(state_13) + self.lateral_0_2(state_02)
+
+ state_24 = self.lateral_2_3(state_23)
+ state_14 = self.up_1_1(state_24) + self.lateral_1_3(state_13)
+ state_04 = self.up_0_1(state_14) + self.lateral_0_3(state_03)
+
+ state_25 = self.lateral_2_4(state_24)
+ state_15 = self.up_1_2(state_25) + self.lateral_1_4(state_14)
+ state_05 = self.up_0_2(state_15) + self.lateral_0_4(state_04)
+
+ return self.lateral_final(state_05)
+
+
+class LateralBlock(nn.Module):
+ def __init__(self, ch_in, ch_out):
+ super(LateralBlock, self).__init__()
+ self.f = nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(ch_in, ch_out, kernel_size=3, padding=1),
+ nn.PReLU(),
+ nn.Conv2d(ch_out, ch_out, kernel_size=3, padding=1),
+ )
+ if ch_in != ch_out:
+ self.conv = nn.Conv2d(ch_in, ch_out, kernel_size=3, padding=1)
+
+ def forward(self, x):
+ fx = self.f(x)
+ if fx.shape[1] != x.shape[1]:
+ x = self.conv(x)
+ return fx + x
+
+
+class DownSamplingBlock(nn.Module):
+ def __init__(self, ch_in, ch_out):
+ super(DownSamplingBlock, self).__init__()
+ self.f = nn.Sequential(
+ nn.PReLU(),
+ nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=2, padding=1),
+ nn.PReLU(),
+ nn.Conv2d(ch_out, ch_out, kernel_size=3, padding=1),
+ )
+
+ def forward(self, x):
+ return self.f(x)
+
+
+class UpSamplingBlock(nn.Module):
+ def __init__(self, ch_in, ch_out):
+ super(UpSamplingBlock, self).__init__()
+ self.f = nn.Sequential(
+ nn.Upsample(scale_factor=2, mode="bilinear", align_corners=False),
+ nn.PReLU(),
+ nn.Conv2d(ch_in, ch_out, kernel_size=3, padding=1),
+ nn.PReLU(),
+ nn.Conv2d(ch_out, ch_out, kernel_size=3, padding=1),
+ )
+
+ def forward(self, x):
+ return self.f(x)
+
+# end
+
+
+class Network(torch.nn.Module):
+ def __init__(self):
+ super(Network, self).__init__()
+
+ class Extractor(torch.nn.Module):
+ def __init__(self):
+ super(Extractor, self).__init__()
+
+ self.netOne = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=3,
+ out_channels=16,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=16,
+ out_channels=16,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=16,
+ out_channels=16,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netTwo = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=16,
+ out_channels=32,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=32,
+ out_channels=32,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=32,
+ out_channels=32,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netThr = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=32,
+ out_channels=64,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=64,
+ out_channels=64,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=64,
+ out_channels=64,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netFou = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=64,
+ out_channels=96,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=96,
+ out_channels=96,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=96,
+ out_channels=96,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netFiv = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=96,
+ out_channels=128,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netSix = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=196,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=196,
+ out_channels=196,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=196,
+ out_channels=196,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ # end
+
+ def forward(self, tenInput):
+ tenOne = self.netOne(tenInput)
+ tenTwo = self.netTwo(tenOne)
+ tenThr = self.netThr(tenTwo)
+ tenFou = self.netFou(tenThr)
+ tenFiv = self.netFiv(tenFou)
+ tenSix = self.netSix(tenFiv)
+
+ return [tenOne, tenTwo, tenThr, tenFou, tenFiv, tenSix]
+
+ # end
+
+ # end
+
+ class Decoder(torch.nn.Module):
+ def __init__(self, intLevel):
+ super(Decoder, self).__init__()
+
+ intPrevious = [
+ None,
+ None,
+ 81 + 32 + 2 + 2,
+ 81 + 64 + 2 + 2,
+ 81 + 96 + 2 + 2,
+ 81 + 128 + 2 + 2,
+ 81,
+ None,
+ ][intLevel + 1]
+ intCurrent = [
+ None,
+ None,
+ 81 + 32 + 2 + 2,
+ 81 + 64 + 2 + 2,
+ 81 + 96 + 2 + 2,
+ 81 + 128 + 2 + 2,
+ 81,
+ None,
+ ][intLevel + 0]
+
+ if intLevel < 6:
+ self.netUpflow = torch.nn.ConvTranspose2d(
+ in_channels=2,
+ out_channels=2,
+ kernel_size=4,
+ stride=2,
+ padding=1,
+ )
+ if intLevel < 6:
+ self.netUpfeat = torch.nn.ConvTranspose2d(
+ in_channels=intPrevious + 128 + 128 + 96 + 64 + 32,
+ out_channels=2,
+ kernel_size=4,
+ stride=2,
+ padding=1,
+ )
+ if intLevel < 6:
+ self.fltBackwarp = [None, None, None, 5.0, 2.5, 1.25, 0.625, None][
+ intLevel + 1
+ ]
+
+ self.netOne = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netTwo = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent + 128,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netThr = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent + 128 + 128,
+ out_channels=96,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netFou = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent + 128 + 128 + 96,
+ out_channels=64,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netFiv = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent + 128 + 128 + 96 + 64,
+ out_channels=32,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ )
+
+ self.netSix = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=intCurrent + 128 + 128 + 96 + 64 + 32,
+ out_channels=2,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ )
+ )
+
+ # end
+
+ def forward(self, tenFirst, tenSecond, objPrevious):
+ tenFlow = None
+ tenFeat = None
+
+ if objPrevious is None:
+ tenFlow = None
+ tenFeat = None
+
+ tenVolume = torch.nn.functional.leaky_relu(
+ input=FunctionCorrelation(
+ tenFirst=tenFirst, tenSecond=tenSecond
+ ),
+ negative_slope=0.1,
+ inplace=False,
+ )
+
+ tenFeat = torch.cat([tenVolume], 1)
+
+ elif objPrevious is not None:
+ tenFlow = self.netUpflow(objPrevious["tenFlow"])
+ tenFeat = self.netUpfeat(objPrevious["tenFeat"])
+
+ tenVolume = torch.nn.functional.leaky_relu(
+ input=FunctionCorrelation(
+ tenFirst=tenFirst,
+ tenSecond=backwarp(
+ tenInput=tenSecond, tenFlow=tenFlow * self.fltBackwarp
+ ),
+ ),
+ negative_slope=0.1,
+ inplace=False,
+ )
+
+ tenFeat = torch.cat([tenVolume, tenFirst, tenFlow, tenFeat], 1)
+
+ # end
+
+ tenFeat = torch.cat([self.netOne(tenFeat), tenFeat], 1)
+ tenFeat = torch.cat([self.netTwo(tenFeat), tenFeat], 1)
+ tenFeat = torch.cat([self.netThr(tenFeat), tenFeat], 1)
+ tenFeat = torch.cat([self.netFou(tenFeat), tenFeat], 1)
+ tenFeat = torch.cat([self.netFiv(tenFeat), tenFeat], 1)
+
+ tenFlow = self.netSix(tenFeat)
+
+ return {"tenFlow": tenFlow, "tenFeat": tenFeat}
+
+ # end
+
+ # end
+
+ class Refiner(torch.nn.Module):
+ def __init__(self):
+ super(Refiner, self).__init__()
+
+ self.netMain = torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=81 + 32 + 2 + 2 + 128 + 128 + 96 + 64 + 32,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ dilation=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=2,
+ dilation=2,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=128,
+ kernel_size=3,
+ stride=1,
+ padding=4,
+ dilation=4,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=128,
+ out_channels=96,
+ kernel_size=3,
+ stride=1,
+ padding=8,
+ dilation=8,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=96,
+ out_channels=64,
+ kernel_size=3,
+ stride=1,
+ padding=16,
+ dilation=16,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=64,
+ out_channels=32,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ dilation=1,
+ ),
+ torch.nn.LeakyReLU(inplace=False, negative_slope=0.1),
+ torch.nn.Conv2d(
+ in_channels=32,
+ out_channels=2,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ dilation=1,
+ ),
+ )
+
+ # end
+
+ def forward(self, tenInput):
+ return self.netMain(tenInput)
+
+ # end
+
+ # end
+
+ self.netExtractor = Extractor()
+
+ self.netTwo = Decoder(2)
+ self.netThr = Decoder(3)
+ self.netFou = Decoder(4)
+ self.netFiv = Decoder(5)
+ self.netSix = Decoder(6)
+
+ self.netRefiner = Refiner()
+
+ self.load_state_dict(
+ {
+ strKey.replace("module", "net"): tenWeight
+ for strKey, tenWeight in torch.hub.load_state_dict_from_url(
+ url="http://content.sniklaus.com/github/pytorch-pwc/network-"
+ + "default"
+ + ".pytorch",
+ model_dir=get_ckpt_container_path(MODEL_TYPE)
+ ).items()
+ }
+ )
+
+ # end
+
+ def forward(self, tenFirst, tenSecond, *args):
+ # optionally pass pre-extracted feature pyramid in as args
+ if len(args) == 0:
+ tenFirst = self.netExtractor(tenFirst)
+ tenSecond = self.netExtractor(tenSecond)
+ else:
+ tenFirst, tenSecond = args
+
+ objEstimate = self.netSix(tenFirst[-1], tenSecond[-1], None)
+ objEstimate = self.netFiv(tenFirst[-2], tenSecond[-2], objEstimate)
+ objEstimate = self.netFou(tenFirst[-3], tenSecond[-3], objEstimate)
+ objEstimate = self.netThr(tenFirst[-4], tenSecond[-4], objEstimate)
+ objEstimate = self.netTwo(tenFirst[-5], tenSecond[-5], objEstimate)
+
+ return objEstimate["tenFlow"] + self.netRefiner(objEstimate["tenFeat"])
+
+ # end
+
+ def extract_pyramid(self, tenFirst, tenSecond):
+ return self.netExtractor(tenFirst), self.netExtractor(tenSecond)
+
+ def extract_pyramid_single(self, tenFirst):
+ return self.netExtractor(tenFirst)
+
+
+# end
+
+netNetwork = None
+
+##########################################################
+
+
+def estimate(tenFirst, tenSecond):
+ global netNetwork
+
+ if netNetwork is None:
+ netNetwork = Network().cuda().eval()
+ # end
+
+ assert tenFirst.shape[1] == tenSecond.shape[1]
+ assert tenFirst.shape[2] == tenSecond.shape[2]
+
+ intWidth = tenFirst.shape[2]
+ intHeight = tenFirst.shape[1]
+
+ assert (
+ intWidth == 1024
+ ) # remember that there is no guarantee for correctness, comment this line out if you acknowledge this and want to continue
+ assert (
+ intHeight == 436
+ ) # remember that there is no guarantee for correctness, comment this line out if you acknowledge this and want to continue
+
+ tenPreprocessedFirst = tenFirst.cuda().view(1, 3, intHeight, intWidth)
+ tenPreprocessedSecond = tenSecond.cuda().view(1, 3, intHeight, intWidth)
+
+ intPreprocessedWidth = int(math.floor(math.ceil(intWidth / 64.0) * 64.0))
+ intPreprocessedHeight = int(math.floor(math.ceil(intHeight / 64.0) * 64.0))
+
+ tenPreprocessedFirst = torch.nn.functional.interpolate(
+ input=tenPreprocessedFirst,
+ size=(intPreprocessedHeight, intPreprocessedWidth),
+ mode="bilinear",
+ align_corners=False,
+ )
+ tenPreprocessedSecond = torch.nn.functional.interpolate(
+ input=tenPreprocessedSecond,
+ size=(intPreprocessedHeight, intPreprocessedWidth),
+ mode="bilinear",
+ align_corners=False,
+ )
+
+ tenFlow = 20.0 * torch.nn.functional.interpolate(
+ input=netNetwork(tenPreprocessedFirst, tenPreprocessedSecond),
+ size=(intHeight, intWidth),
+ mode="bilinear",
+ align_corners=False,
+ )
+
+ tenFlow[:, 0, :, :] *= float(intWidth) / float(intPreprocessedWidth)
+ tenFlow[:, 1, :, :] *= float(intHeight) / float(intPreprocessedHeight)
+
+ return tenFlow[0, :, :, :].cpu()
+
+
+# end
+
+
+class UNet3d_18(nn.Module):
+ def __init__(self, channels=[32, 64, 96, 128], bn=True):
+ super(UNet3d_18, self).__init__()
+ growth = 2 # since concatenating previous outputs
+ upmode = "transpose" # use transposeConv to upsample
+
+ self.channels = channels
+
+ self.lrelu = nn.LeakyReLU(0.2, True)
+
+ self.encoder = r3d_18(bn=bn, channels=channels)
+
+ self.decoder = nn.Sequential(
+ Conv_3d(
+ channels[::-1][0],
+ channels[::-1][1],
+ kernel_size=3,
+ padding=1,
+ bias=True,
+ ),
+ upConv3D(
+ channels[::-1][1] * growth,
+ channels[::-1][2],
+ kernel_size=(3, 4, 4),
+ stride=(1, 2, 2),
+ padding=(1, 1, 1),
+ upmode=upmode,
+ ),
+ upConv3D(
+ channels[::-1][2] * growth,
+ channels[::-1][3],
+ kernel_size=(3, 4, 4),
+ stride=(1, 2, 2),
+ padding=(1, 1, 1),
+ upmode=upmode,
+ ),
+ Conv_3d(
+ channels[::-1][3] * growth,
+ channels[::-1][3],
+ kernel_size=3,
+ padding=1,
+ bias=True,
+ ),
+ upConv3D(
+ channels[::-1][3] * growth,
+ channels[::-1][3],
+ kernel_size=(3, 4, 4),
+ stride=(1, 2, 2),
+ padding=(1, 1, 1),
+ upmode=upmode,
+ ),
+ )
+
+ self.feature_fuse = nn.Sequential(
+ *(
+ [
+ nn.Conv2d(
+ channels[::-1][3] * 5,
+ channels[::-1][3],
+ kernel_size=1,
+ stride=1,
+ bias=False,
+ )
+ ]
+ + [nn.BatchNorm2d(channels[::-1][3]) if bn else Identity]
+ )
+ )
+
+ self.outconv = nn.Sequential(
+ nn.ReflectionPad2d(3),
+ nn.Conv2d(channels[::-1][3], 3, kernel_size=7, stride=1, padding=0),
+ )
+
+ def forward(self, im1, im3, im5, im7, im4_tilde):
+ images = torch.stack((im1, im3, im4_tilde, im5, im7), dim=2)
+
+ x_0, x_1, x_2, x_3, x_4 = self.encoder(images)
+
+ dx_3 = self.lrelu(self.decoder[0](x_4))
+ dx_3 = torch.cat([dx_3, x_3], dim=1)
+
+ dx_2 = self.lrelu(self.decoder[1](dx_3))
+ dx_2 = torch.cat([dx_2, x_2], dim=1)
+
+ dx_1 = self.lrelu(self.decoder[2](dx_2))
+ dx_1 = torch.cat([dx_1, x_1], dim=1)
+
+ dx_0 = self.lrelu(self.decoder[3](dx_1))
+ dx_0 = torch.cat([dx_0, x_0], dim=1)
+
+ dx_out = self.lrelu(self.decoder[4](dx_0))
+ dx_out = torch.cat(torch.unbind(dx_out, 2), 1)
+
+ out = self.lrelu(self.feature_fuse(dx_out))
+ out = self.outconv(out)
+
+ return out
+
+
+class KernelEstimation(torch.nn.Module):
+ def __init__(self, kernel_size):
+ super(KernelEstimation, self).__init__()
+ self.kernel_size = kernel_size
+
+ def Subnet_offset(ks):
+ return torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=ks, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Upsample(scale_factor=2, mode="bilinear", align_corners=True),
+ torch.nn.Conv2d(
+ in_channels=ks, out_channels=ks, kernel_size=3, stride=1, padding=1
+ ),
+ )
+
+ def Subnet_weight(ks):
+ return torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=ks, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Upsample(scale_factor=2, mode="bilinear", align_corners=True),
+ torch.nn.Conv2d(
+ in_channels=ks, out_channels=ks, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.Softmax(dim=1),
+ )
+
+ def Subnet_offset_ds(ks):
+ return torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=ks, kernel_size=3, stride=1, padding=1
+ ),
+ )
+
+ def Subnet_weight_ds(ks):
+ return torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=ks, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.Softmax(dim=1),
+ )
+
+ def Subnet_offset_us(ks):
+ return torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=ks, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Upsample(scale_factor=4, mode="bilinear", align_corners=True),
+ torch.nn.Conv2d(
+ in_channels=ks, out_channels=ks, kernel_size=3, stride=1, padding=1
+ ),
+ )
+
+ def Subnet_weight_us(ks):
+ return torch.nn.Sequential(
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Conv2d(
+ in_channels=64, out_channels=ks, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.ReLU(inplace=False),
+ torch.nn.Upsample(scale_factor=4, mode="bilinear", align_corners=True),
+ torch.nn.Conv2d(
+ in_channels=ks, out_channels=ks, kernel_size=3, stride=1, padding=1
+ ),
+ torch.nn.Softmax(dim=1),
+ )
+
+ self.moduleWeight1_ds = Subnet_weight_ds(self.kernel_size**2)
+ self.moduleAlpha1_ds = Subnet_offset_ds(self.kernel_size**2)
+ self.moduleBeta1_ds = Subnet_offset_ds(self.kernel_size**2)
+ self.moduleWeight2_ds = Subnet_weight_ds(self.kernel_size**2)
+ self.moduleAlpha2_ds = Subnet_offset_ds(self.kernel_size**2)
+ self.moduleBeta2_ds = Subnet_offset_ds(self.kernel_size**2)
+
+ self.moduleWeight1 = Subnet_weight(self.kernel_size**2)
+ self.moduleAlpha1 = Subnet_offset(self.kernel_size**2)
+ self.moduleBeta1 = Subnet_offset(self.kernel_size**2)
+ self.moduleWeight2 = Subnet_weight(self.kernel_size**2)
+ self.moduleAlpha2 = Subnet_offset(self.kernel_size**2)
+ self.moduleBeta2 = Subnet_offset(self.kernel_size**2)
+
+ self.moduleWeight1_us = Subnet_weight_us(self.kernel_size**2)
+ self.moduleAlpha1_us = Subnet_offset_us(self.kernel_size**2)
+ self.moduleBeta1_us = Subnet_offset_us(self.kernel_size**2)
+ self.moduleWeight2_us = Subnet_weight_us(self.kernel_size**2)
+ self.moduleAlpha2_us = Subnet_offset_us(self.kernel_size**2)
+ self.moduleBeta2_us = Subnet_offset_us(self.kernel_size**2)
+
+ def forward(self, tensorCombine):
+ # Frame 0
+ Weight1_ds = self.moduleWeight1_ds(tensorCombine)
+ Weight1 = self.moduleWeight1(tensorCombine)
+ Weight1_us = self.moduleWeight1_us(tensorCombine)
+ Alpha1_ds = self.moduleAlpha1_ds(tensorCombine)
+ Alpha1 = self.moduleAlpha1(tensorCombine)
+ Alpha1_us = self.moduleAlpha1_us(tensorCombine)
+ Beta1_ds = self.moduleBeta1_ds(tensorCombine)
+ Beta1 = self.moduleBeta1(tensorCombine)
+ Beta1_us = self.moduleBeta1_us(tensorCombine)
+
+ # Frame 2
+ Weight2_ds = self.moduleWeight2_ds(tensorCombine)
+ Weight2 = self.moduleWeight2(tensorCombine)
+ Weight2_us = self.moduleWeight2_us(tensorCombine)
+ Alpha2_ds = self.moduleAlpha2_ds(tensorCombine)
+ Alpha2 = self.moduleAlpha2(tensorCombine)
+ Alpha2_us = self.moduleAlpha2_us(tensorCombine)
+ Beta2_ds = self.moduleBeta2_ds(tensorCombine)
+ Beta2 = self.moduleBeta2(tensorCombine)
+ Beta2_us = self.moduleBeta2_us(tensorCombine)
+
+ return (
+ Weight1_ds,
+ Alpha1_ds,
+ Beta1_ds,
+ Weight2_ds,
+ Alpha2_ds,
+ Beta2_ds,
+ Weight1,
+ Alpha1,
+ Beta1,
+ Weight2,
+ Alpha2,
+ Beta2,
+ Weight1_us,
+ Alpha1_us,
+ Beta1_us,
+ Weight2_us,
+ Alpha2_us,
+ Beta2_us,
+ )
+
+
+class STMFNet_Model(torch.nn.Module):
+ def __init__(self):
+ super(STMFNet_Model, self).__init__()
+
+ class Metric(torch.nn.Module):
+ def __init__(self):
+ super(Metric, self).__init__()
+ self.paramScale = torch.nn.Parameter(-torch.ones(1, 1, 1, 1))
+
+ def forward(self, tenFirst, tenSecond, tenFlow):
+ return self.paramScale * F.l1_loss(
+ input=tenFirst,
+ target=backwarp(tenSecond, tenFlow),
+ reduction="none",
+ ).mean(1, True)
+
+ self.kernel_size = 5
+ self.dilation = 1
+ self.featc = [64, 128, 256, 512]
+ self.featnorm = "batch"
+ self.finetune_pwc = False
+
+ self.kernel_pad = int(((self.kernel_size - 1) * self.dilation) / 2.0)
+
+ self.feature_extractor = UMultiScaleResNext(
+ self.featc, norm_layer=self.featnorm
+ )
+
+ self.get_kernel = KernelEstimation(self.kernel_size)
+
+ self.modulePad = torch.nn.ReplicationPad2d(
+ [self.kernel_pad, self.kernel_pad, self.kernel_pad, self.kernel_pad]
+ )
+
+ self.moduleAdaCoF = FunctionAdaCoF.apply
+
+ self.gauss_kernel = torch.nn.Parameter(
+ gaussian_kernel(5, 0.5).repeat(3, 1, 1, 1), requires_grad=False
+ )
+
+ self.upsampler = Upsampler_8tap()
+
+ self.scale_synthesis = MIMOGridNet(
+ (6, 6 + 6, 6), (3,), grid_chs=(32, 64, 96), n_row=3, n_col=4, outrow=(1,)
+ )
+
+ self.flow_estimator = PWCNet()
+
+ self.softsplat = ModuleSoftsplat(strType="softmax")
+
+ self.metric = Metric()
+
+ self.dyntex_generator = UNet3d_18(bn=self.featnorm)
+
+ # freeze weights of PWCNet if not finetuning it
+ if not self.finetune_pwc:
+ for param in self.flow_estimator.parameters():
+ param.requires_grad = False
+
+ def forward(self, I0, I1, I2, I3):
+ h0 = int(list(I1.size())[2])
+ w0 = int(list(I1.size())[3])
+ h2 = int(list(I2.size())[2])
+ w2 = int(list(I2.size())[3])
+ if h0 != h2 or w0 != w2:
+ sys.exit("Frame sizes do not match")
+
+ h_padded = False
+ w_padded = False
+ if h0 % 128 != 0:
+ pad_h = 128 - (h0 % 128)
+ I0 = F.pad(I0, (0, 0, 0, pad_h), mode="reflect")
+ I1 = F.pad(I1, (0, 0, 0, pad_h), mode="reflect")
+ I2 = F.pad(I2, (0, 0, 0, pad_h), mode="reflect")
+ I3 = F.pad(I3, (0, 0, 0, pad_h), mode="reflect")
+ h_padded = True
+
+ if w0 % 128 != 0:
+ pad_w = 128 - (w0 % 128)
+ I0 = F.pad(I0, (0, pad_w, 0, 0), mode="reflect")
+ I1 = F.pad(I1, (0, pad_w, 0, 0), mode="reflect")
+ I2 = F.pad(I2, (0, pad_w, 0, 0), mode="reflect")
+ I3 = F.pad(I3, (0, pad_w, 0, 0), mode="reflect")
+ w_padded = True
+
+ feats = self.feature_extractor(moduleNormalize(I1), moduleNormalize(I2))
+ kernelest = self.get_kernel(feats)
+ Weight1_ds, Alpha1_ds, Beta1_ds, Weight2_ds, Alpha2_ds, Beta2_ds = kernelest[:6]
+ Weight1, Alpha1, Beta1, Weight2, Alpha2, Beta2 = kernelest[6:12]
+ Weight1_us, Alpha1_us, Beta1_us, Weight2_us, Alpha2_us, Beta2_us = kernelest[
+ 12:
+ ]
+
+ # Original scale
+ tensorAdaCoF1 = (
+ self.moduleAdaCoF(self.modulePad(I1), Weight1, Alpha1, Beta1, self.dilation)
+ * 1.0
+ )
+ tensorAdaCoF2 = (
+ self.moduleAdaCoF(self.modulePad(I2), Weight2, Alpha2, Beta2, self.dilation)
+ * 1.0
+ )
+
+ # 1/2 downsampled version
+ c, h, w = I1.shape[1:]
+ p = (self.gauss_kernel.shape[-1] - 1) // 2
+ I1_blur = F.conv2d(
+ F.pad(I1, pad=(p, p, p, p), mode="reflect"), self.gauss_kernel, groups=c
+ )
+ I2_blur = F.conv2d(
+ F.pad(I2, pad=(p, p, p, p), mode="reflect"), self.gauss_kernel, groups=c
+ )
+ I1_ds = F.interpolate(
+ I1_blur, size=(h // 2, w // 2), mode="bilinear", align_corners=False
+ )
+ I2_ds = F.interpolate(
+ I2_blur, size=(h // 2, w // 2), mode="bilinear", align_corners=False
+ )
+ tensorAdaCoF1_ds = (
+ self.moduleAdaCoF(
+ self.modulePad(I1_ds), Weight1_ds, Alpha1_ds, Beta1_ds, self.dilation
+ )
+ * 1.0
+ )
+ tensorAdaCoF2_ds = (
+ self.moduleAdaCoF(
+ self.modulePad(I2_ds), Weight2_ds, Alpha2_ds, Beta2_ds, self.dilation
+ )
+ * 1.0
+ )
+
+ # x2 upsampled version
+ I1_us = self.upsampler(I1)
+ I2_us = self.upsampler(I2)
+ tensorAdaCoF1_us = (
+ self.moduleAdaCoF(
+ self.modulePad(I1_us), Weight1_us, Alpha1_us, Beta1_us, self.dilation
+ )
+ * 1.0
+ )
+ tensorAdaCoF2_us = (
+ self.moduleAdaCoF(
+ self.modulePad(I2_us), Weight2_us, Alpha2_us, Beta2_us, self.dilation
+ )
+ * 1.0
+ )
+
+ # use softsplat for refinement
+ pyramid0, pyramid2 = self.flow_estimator.extract_pyramid(I1, I2)
+ flow_0_2 = 20 * self.flow_estimator(I1, I2, pyramid0, pyramid2)
+ flow_0_2 = F.interpolate(
+ flow_0_2, size=(h, w), mode="bilinear", align_corners=False
+ )
+ flow_2_0 = 20 * self.flow_estimator(I2, I1, pyramid2, pyramid0)
+ flow_2_0 = F.interpolate(
+ flow_2_0, size=(h, w), mode="bilinear", align_corners=False
+ )
+ metric_0_2 = self.metric(I1, I2, flow_0_2)
+ metric_2_0 = self.metric(I2, I1, flow_2_0)
+ tensorSoftsplat0 = self.softsplat(I1, 0.5 * flow_0_2, metric_0_2)
+ tensorSoftsplat2 = self.softsplat(I2, 0.5 * flow_2_0, metric_2_0)
+
+ # synthesize multiple scales
+ tensorCombine_us = torch.cat([tensorAdaCoF1_us, tensorAdaCoF2_us], dim=1)
+ tensorCombine = torch.cat(
+ [tensorAdaCoF1, tensorAdaCoF2, tensorSoftsplat0, tensorSoftsplat2], dim=1
+ )
+ tensorCombine_ds = torch.cat([tensorAdaCoF1_ds, tensorAdaCoF2_ds], dim=1)
+ output_tilde = self.scale_synthesis(
+ tensorCombine_us, tensorCombine, tensorCombine_ds
+ )[0]
+
+ # generate dynamic texture
+ dyntex = self.dyntex_generator(I0, I1, I2, I3, output_tilde)
+ output = output_tilde + dyntex
+
+ if h_padded:
+ output = output[:, :, 0:h0, :]
+ if w_padded:
+ output = output[:, :, :, 0:w0]
+
+ if self.training:
+ return {"frame1": output}
+ else:
+ return output
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/xvfi/__init__.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/xvfi/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e52fc1a85dfadc84dd517875abd7d592e3c087e2
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/xvfi/__init__.py
@@ -0,0 +1,115 @@
+import argparse
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import einops
+from torch.utils.data import DataLoader
+import pathlib
+from vfi_utils import load_file_from_github_release, preprocess_frames, postprocess_frames, InterpolationStateList
+import typing
+from comfy.model_management import get_torch_device
+
+CKPT_CONFIGS = {
+ "XVFInet_X4K1000FPS_exp1_latest.pt": {
+ "module_scale_factor": 4,
+ "S_trn": 3,
+ "S_tst": 5
+ },
+ "XVFInet_Vimeo_exp1_latest.pt": {
+ "module_scale_factor": 2,
+ "S_trn": 1,
+ "S_tst": 1
+ }
+}
+
+class XVFI_Inference(nn.Module):
+ def __init__(self, model_path, model_config) -> None:
+ super(XVFI_Inference, self).__init__()
+ from .xvfi_arch import XVFInet, weights_init
+ model_config = model_config
+ args = argparse.Namespace(
+ gpu=get_torch_device(),
+ nf=64,
+ **model_config,
+ img_ch=3,
+ )
+ self.model = XVFInet(args).apply(weights_init).to(get_torch_device())
+ self.model.load_state_dict(torch.load(model_path, map_location=get_torch_device())["state_dict_Model"])
+
+ def forward(self, I0, I1, timestep):
+ #"Real" inference is called "test_custom" in the original repo
+ #https://github.com/JihyongOh/XVFI/blob/main/utils.py#L434
+ #https://github.com/JihyongOh/XVFI/blob/main/main.py#L336
+
+ x = torch.stack([I0, I1], dim=0)
+ x = einops.rearrange(x, "t b c h w -> b c t h w")
+ return self.model(x, timestep, is_training=False)
+
+MODEL_TYPE = pathlib.Path(__file__).parent.name
+
+class XVFI:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "ckpt_name": (list(CKPT_CONFIGS.keys()), ),
+ "frames": ("IMAGE", ),
+ "batch_size": ("INT", {"default": 1, "min": 1, "max": 100}),
+ "multipler": ("INT", {"default": 2, "min": 2, "max": 1000}),
+ },
+ "optional": {
+ "optional_interpolation_states": ("INTERPOLATION_STATES", ),
+ }
+ }
+
+ RETURN_TYPES = ("IMAGE", )
+ FUNCTION = "vfi"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def vfi(
+ self,
+ ckpt_name: typing.AnyStr,
+ frames: torch.Tensor,
+ batch_size: typing.SupportsInt = 1,
+ multipler: typing.SupportsInt = 2,
+ optional_interpolation_states: InterpolationStateList = None
+ ):
+ model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
+ ckpt_config = CKPT_CONFIGS[ckpt_name]
+ global model
+ model = XVFI_Inference(model_path, ckpt_config)
+
+ frames = preprocess_frames(frames)
+ #https://github.com/JihyongOh/XVFI/blob/main/main.py#L314
+ divide = 2 ** (ckpt_config["S_tst"]) * ckpt_config["module_scale_factor"] * 4
+ B, C, H, W = frames.size()
+ H_padding = (divide - H % divide) % divide
+ W_padding = (divide - W % divide) % divide
+ if H_padding != 0 or W_padding != 0:
+ frames = F.pad(frames, (0, W_padding, 0, H_padding), "constant")
+
+ frame_dict = {
+ str(i): frames[i].unsqueeze(0) for i in range(frames.shape[0])
+ }
+
+ if optional_interpolation_states is None:
+ interpolation_states = [True] * (frames.shape[0] - 1)
+ else:
+ interpolation_states = optional_interpolation_states
+
+ enabled_former_idxs = [i for i, state in enumerate(interpolation_states) if state]
+ former_idxs_loader = DataLoader(enabled_former_idxs, batch_size=batch_size)
+
+ for former_idxs_batch in former_idxs_loader:
+ for middle_i in range(1, multipler):
+ _middle_frames = model(
+ frames[former_idxs_batch],
+ frames[former_idxs_batch + 1],
+ timestep=torch.tensor([middle_i/multipler]).repeat(len(former_idxs_batch)).unsqueeze(1).to(get_torch_device())
+ )
+ for i, former_idx in enumerate(former_idxs_batch):
+ frame_dict[f'{former_idx}.{middle_i}'] = _middle_frames[i].unsqueeze(0)
+
+ out_frames = torch.cat([frame_dict[key] for key in sorted(frame_dict.keys())], dim=0)[:, :, :H, :W]
+ return (postprocess_frames(out_frames), )
+
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_models/xvfi/xvfi_arch.py b/custom_nodes/comfyui-frame-interpolation/vfi_models/xvfi/xvfi_arch.py
new file mode 100644
index 0000000000000000000000000000000000000000..dae013e749616c9b6b2e2767db08b8c8dab6046f
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_models/xvfi/xvfi_arch.py
@@ -0,0 +1,506 @@
+import functools, random
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch.autograd import Variable
+import numpy as np
+from torch.nn import init
+from comfy.model_management import get_torch_device
+
+
+
+class XVFInet(nn.Module):
+
+ def __init__(self, args):
+ super(XVFInet, self).__init__()
+ self.args = args
+ self.device = get_torch_device()
+ self.nf = args.nf
+ self.scale = args.module_scale_factor
+ self.vfinet = VFInet(args)
+ self.lrelu = nn.ReLU()
+ self.in_channels = 3
+ self.channel_converter = nn.Sequential(
+ nn.Conv3d(self.in_channels, self.nf, [1, 3, 3], [1, 1, 1], [0, 1, 1]),
+ nn.ReLU())
+
+ self.rec_ext_ds_module = [self.channel_converter]
+ self.rec_ext_ds = nn.Conv3d(self.nf, self.nf, [1, 3, 3], [1, 2, 2], [0, 1, 1])
+ for _ in range(int(np.log2(self.scale))):
+ self.rec_ext_ds_module.append(self.rec_ext_ds)
+ self.rec_ext_ds_module.append(nn.ReLU())
+ self.rec_ext_ds_module.append(nn.Conv3d(self.nf, self.nf, [1, 3, 3], 1, [0, 1, 1]))
+ self.rec_ext_ds_module.append(RResBlock2D_3D(args, T_reduce_flag=False))
+ self.rec_ext_ds_module = nn.Sequential(*self.rec_ext_ds_module)
+
+ self.rec_ctx_ds = nn.Conv3d(self.nf, self.nf, [1, 3, 3], [1, 2, 2], [0, 1, 1])
+
+ print("The lowest scale depth for training (S_trn): ", self.args.S_trn)
+ print("The lowest scale depth for test (S_tst): ", self.args.S_tst)
+
+ def forward(self, x, t_value, is_training=True):
+ '''
+ x shape : [B,C,T,H,W]
+ t_value shape : [B,1] ###############
+ '''
+ B, C, T, H, W = x.size()
+ B2, C2 = t_value.size()
+ assert C2 == 1, "t_value shape is [B,]"
+ assert T % 2 == 0, "T must be an even number"
+ t_value = t_value.view(B, 1, 1, 1)
+
+ flow_l = None
+ feat_x = self.rec_ext_ds_module(x)
+ feat_x_list = [feat_x]
+ self.lowest_depth_level = self.args.S_trn if is_training else self.args.S_tst
+ for level in range(1, self.lowest_depth_level+1):
+ feat_x = self.rec_ctx_ds(feat_x)
+ feat_x_list.append(feat_x)
+
+ if is_training:
+ out_l_list = []
+ flow_refine_l_list = []
+ out_l, flow_l, flow_refine_l = self.vfinet(x, feat_x_list[self.args.S_trn], flow_l, t_value, level=self.args.S_trn, is_training=True)
+ out_l_list.append(out_l)
+ flow_refine_l_list.append(flow_refine_l)
+ for level in range(self.args.S_trn-1, 0, -1): ## self.args.S_trn, self.args.S_trn-1, ..., 1. level 0 is not included
+ out_l, flow_l = self.vfinet(x, feat_x_list[level], flow_l, t_value, level=level, is_training=True)
+ out_l_list.append(out_l)
+ out_l, flow_l, flow_refine_l, occ_0_l0 = self.vfinet(x, feat_x_list[0], flow_l, t_value, level=0, is_training=True)
+ out_l_list.append(out_l)
+ flow_refine_l_list.append(flow_refine_l)
+ return out_l_list[::-1], flow_refine_l_list[::-1], occ_0_l0, torch.mean(x, dim=2) # out_l_list should be reversed. [out_l0, out_l1, ...]
+
+ else: # Testing
+ for level in range(self.args.S_tst, 0, -1): ## self.args.S_tst, self.args.S_tst-1, ..., 1. level 0 is not included
+ flow_l = self.vfinet(x, feat_x_list[level], flow_l, t_value, level=level, is_training=False)
+ out_l = self.vfinet(x, feat_x_list[0], flow_l, t_value, level=0, is_training=False)
+ return out_l
+
+
+class VFInet(nn.Module):
+
+ def __init__(self, args):
+ super(VFInet, self).__init__()
+ self.args = args
+ self.device = get_torch_device()
+ self.nf = args.nf
+ self.scale = args.module_scale_factor
+ self.in_channels = 3
+
+ self.conv_flow_bottom = nn.Sequential(
+ nn.Conv2d(2*self.nf, 2*self.nf, [4,4], 2, [1,1]),
+ nn.ReLU(),
+ nn.Conv2d(2*self.nf, 4*self.nf, [4,4], 2, [1,1]),
+ nn.ReLU(),
+ nn.UpsamplingNearest2d(scale_factor=2),
+ nn.Conv2d(4 * self.nf, 2 * self.nf, [3, 3], 1, [1, 1]),
+ nn.ReLU(),
+ nn.UpsamplingNearest2d(scale_factor=2),
+ nn.Conv2d(2 * self.nf, self.nf, [3, 3], 1, [1, 1]),
+ nn.ReLU(),
+ nn.Conv2d(self.nf, 6, [3,3], 1, [1,1]),
+ )
+
+ self.conv_flow1 = nn.Conv2d(2*self.nf, self.nf, [3, 3], 1, [1, 1])
+
+ self.conv_flow2 = nn.Sequential(
+ nn.Conv2d(2*self.nf + 4, 2 * self.nf, [4, 4], 2, [1, 1]),
+ nn.ReLU(),
+ nn.Conv2d(2 * self.nf, 4 * self.nf, [4, 4], 2, [1, 1]),
+ nn.ReLU(),
+ nn.UpsamplingNearest2d(scale_factor=2),
+ nn.Conv2d(4 * self.nf, 2 * self.nf, [3, 3], 1, [1, 1]),
+ nn.ReLU(),
+ nn.UpsamplingNearest2d(scale_factor=2),
+ nn.Conv2d(2 * self.nf, self.nf, [3, 3], 1, [1, 1]),
+ nn.ReLU(),
+ nn.Conv2d(self.nf, 6, [3, 3], 1, [1, 1]),
+ )
+
+ self.conv_flow3 = nn.Sequential(
+ nn.Conv2d(4 + self.nf * 4, self.nf, [1, 1], 1, [0, 0]),
+ nn.ReLU(),
+ nn.Conv2d(self.nf, 2 * self.nf, [4, 4], 2, [1, 1]),
+ nn.ReLU(),
+ nn.Conv2d(2 * self.nf, 4 * self.nf, [4, 4], 2, [1, 1]),
+ nn.ReLU(),
+ nn.UpsamplingNearest2d(scale_factor=2),
+ nn.Conv2d(4 * self.nf, 2 * self.nf, [3, 3], 1, [1, 1]),
+ nn.ReLU(),
+ nn.UpsamplingNearest2d(scale_factor=2),
+ nn.Conv2d(2 * self.nf, self.nf, [3, 3], 1, [1, 1]),
+ nn.ReLU(),
+ nn.Conv2d(self.nf, 4, [3, 3], 1, [1, 1]),
+ )
+
+ self.refine_unet = RefineUNet(args)
+ self.lrelu = nn.ReLU()
+
+ def forward(self, x, feat_x, flow_l_prev, t_value, level, is_training):
+ '''
+ x shape : [B,C,T,H,W]
+ t_value shape : [B,1] ###############
+ '''
+ B, C, T, H, W = x.size()
+ assert T % 2 == 0, "T must be an even number"
+
+ ####################### For a single level
+ l = 2 ** level
+ x_l = x.permute(0,2,1,3,4)
+ x_l = x_l.contiguous().view(B * T, C, H, W)
+
+ if level == 0:
+ pass
+ else:
+ x_l = F.interpolate(x_l, scale_factor=(1.0 / l, 1.0 / l), mode='bicubic', align_corners=False)
+ '''
+ Down pixel-shuffle
+ '''
+ x_l = x_l.view(B, T, C, H//l, W//l)
+ x_l = x_l.permute(0,2,1,3,4)
+
+ B, C, T, H, W = x_l.size()
+
+ ## Feature extraction
+ feat0_l = feat_x[:,:,0,:,:]
+ feat1_l = feat_x[:,:,1,:,:]
+
+ ## Flow estimation
+ if flow_l_prev is None:
+ flow_l_tmp = self.conv_flow_bottom(torch.cat((feat0_l, feat1_l), dim=1))
+ flow_l = flow_l_tmp[:,:4,:,:]
+ else:
+ up_flow_l_prev = 2.0*F.interpolate(flow_l_prev.detach(), scale_factor=(2,2), mode='bilinear', align_corners=False)
+ warped_feat1_l = self.bwarp(feat1_l, up_flow_l_prev[:,:2,:,:])
+ warped_feat0_l = self.bwarp(feat0_l, up_flow_l_prev[:,2:,:,:])
+ flow_l_tmp = self.conv_flow2(torch.cat([self.conv_flow1(torch.cat([feat0_l, warped_feat1_l],dim=1)), self.conv_flow1(torch.cat([feat1_l, warped_feat0_l],dim=1)), up_flow_l_prev],dim=1))
+ flow_l = flow_l_tmp[:,:4,:,:] + up_flow_l_prev
+
+ if not is_training and level!=0:
+ return flow_l
+
+ flow_01_l = flow_l[:,:2,:,:]
+ flow_10_l = flow_l[:,2:,:,:]
+ z_01_l = torch.sigmoid(flow_l_tmp[:,4:5,:,:])
+ z_10_l = torch.sigmoid(flow_l_tmp[:,5:6,:,:])
+
+ ## Complementary Flow Reversal (CFR)
+ flow_forward, norm0_l = self.z_fwarp(flow_01_l, t_value * flow_01_l, z_01_l) ## Actually, F (t) -> (t+1). Translation only. Not normalized yet
+ flow_backward, norm1_l = self.z_fwarp(flow_10_l, (1-t_value) * flow_10_l, z_10_l) ## Actually, F (1-t) -> (-t). Translation only. Not normalized yet
+
+ flow_t0_l = -(1-t_value) * ((t_value)*flow_forward) + (t_value) * ((t_value)*flow_backward) # The numerator of Eq.(1) in the paper.
+ flow_t1_l = (1-t_value) * ((1-t_value)*flow_forward) - (t_value) * ((1-t_value)*flow_backward) # The numerator of Eq.(2) in the paper.
+
+ norm_l = (1-t_value)*norm0_l + t_value*norm1_l
+ mask_ = (norm_l.detach() > 0).type(norm_l.type())
+ flow_t0_l = (1-mask_) * flow_t0_l + mask_ * (flow_t0_l.clone() / (norm_l.clone() + (1-mask_))) # Divide the numerator with denominator in Eq.(1)
+ flow_t1_l = (1-mask_) * flow_t1_l + mask_ * (flow_t1_l.clone() / (norm_l.clone() + (1-mask_))) # Divide the numerator with denominator in Eq.(2)
+
+ ## Feature warping
+ warped0_l = self.bwarp(feat0_l, flow_t0_l)
+ warped1_l = self.bwarp(feat1_l, flow_t1_l)
+
+ ## Flow refinement
+ flow_refine_l = torch.cat([feat0_l, warped0_l, warped1_l, feat1_l, flow_t0_l, flow_t1_l], dim=1)
+ flow_refine_l = self.conv_flow3(flow_refine_l) + torch.cat([flow_t0_l, flow_t1_l], dim=1)
+ flow_t0_l = flow_refine_l[:, :2, :, :]
+ flow_t1_l = flow_refine_l[:, 2:4, :, :]
+
+ warped0_l = self.bwarp(feat0_l, flow_t0_l)
+ warped1_l = self.bwarp(feat1_l, flow_t1_l)
+
+ ## Flow upscale
+ flow_t0_l = self.scale * F.interpolate(flow_t0_l, scale_factor=(self.scale, self.scale), mode='bilinear',align_corners=False)
+ flow_t1_l = self.scale * F.interpolate(flow_t1_l, scale_factor=(self.scale, self.scale), mode='bilinear',align_corners=False)
+
+ ## Image warping and blending
+ warped_img0_l = self.bwarp(x_l[:,:,0,:,:], flow_t0_l)
+ warped_img1_l = self.bwarp(x_l[:,:,1,:,:], flow_t1_l)
+
+ refine_out = self.refine_unet(torch.cat([F.pixel_shuffle(torch.cat([feat0_l, feat1_l, warped0_l, warped1_l],dim=1), self.scale), x_l[:,:,0,:,:], x_l[:,:,1,:,:], warped_img0_l, warped_img1_l, flow_t0_l, flow_t1_l],dim=1))
+ occ_0_l = torch.sigmoid(refine_out[:, 0:1, :, :])
+ occ_1_l = 1-occ_0_l
+
+ out_l = (1-t_value)*occ_0_l*warped_img0_l + t_value*occ_1_l*warped_img1_l
+ out_l = out_l / ( (1-t_value)*occ_0_l + t_value*occ_1_l ) + refine_out[:, 1:4, :, :]
+
+ if not is_training and level==0:
+ return out_l
+
+ if is_training:
+ if flow_l_prev is None:
+ # if level == self.args.S_trn:
+ return out_l, flow_l, flow_refine_l[:, 0:4, :, :]
+ elif level != 0:
+ return out_l, flow_l
+ else: # level==0
+ return out_l, flow_l, flow_refine_l[:, 0:4, :, :], occ_0_l
+
+ def bwarp(self, x, flo):
+ '''
+ x: [B, C, H, W] (im2)
+ flo: [B, 2, H, W] flow
+ '''
+ B, C, H, W = x.size()
+ # mesh grid
+ xx = torch.arange(0, W).view(1, 1, 1, W).expand(B, 1, H, W)
+ yy = torch.arange(0, H).view(1, 1, H, 1).expand(B, 1, H, W)
+ grid = torch.cat((xx, yy), 1).float()
+
+ grid = grid.to(self.device)
+ vgrid = torch.autograd.Variable(grid) + flo
+
+ # scale grid to [-1,1]
+ vgrid[:, 0, :, :] = 2.0 * vgrid[:, 0, :, :].clone() / max(W - 1, 1) - 1.0
+ vgrid[:, 1, :, :] = 2.0 * vgrid[:, 1, :, :].clone() / max(H - 1, 1) - 1.0
+
+ vgrid = vgrid.permute(0, 2, 3, 1) # [B,H,W,2]
+ output = nn.functional.grid_sample(x, vgrid, align_corners=True)
+ mask = torch.autograd.Variable(torch.ones(x.size())).to(self.device)
+ mask = nn.functional.grid_sample(mask, vgrid, align_corners=True)
+
+ # mask[mask<0.9999] = 0
+ # mask[mask>0] = 1
+ mask = mask.masked_fill_(mask < 0.999, 0)
+ mask = mask.masked_fill_(mask > 0, 1)
+
+ return output * mask
+
+ def fwarp(self, img, flo):
+
+ """
+ -img: image (N, C, H, W)
+ -flo: optical flow (N, 2, H, W)
+ elements of flo is in [0, H] and [0, W] for dx, dy
+ https://github.com/lyh-18/EQVI/blob/EQVI-master/models/forward_warp_gaussian.py
+ """
+
+ # (x1, y1) (x1, y2)
+ # +---------------+
+ # | |
+ # | o(x, y) |
+ # | |
+ # | |
+ # | |
+ # | |
+ # +---------------+
+ # (x2, y1) (x2, y2)
+
+ N, C, _, _ = img.size()
+
+ # translate start-point optical flow to end-point optical flow
+ y = flo[:, 0:1:, :]
+ x = flo[:, 1:2, :, :]
+
+ x = x.repeat(1, C, 1, 1)
+ y = y.repeat(1, C, 1, 1)
+
+ # Four point of square (x1, y1), (x1, y2), (x2, y1), (y2, y2)
+ x1 = torch.floor(x)
+ x2 = x1 + 1
+ y1 = torch.floor(y)
+ y2 = y1 + 1
+
+ # firstly, get gaussian weights
+ w11, w12, w21, w22 = self.get_gaussian_weights(x, y, x1, x2, y1, y2)
+
+ # secondly, sample each weighted corner
+ img11, o11 = self.sample_one(img, x1, y1, w11)
+ img12, o12 = self.sample_one(img, x1, y2, w12)
+ img21, o21 = self.sample_one(img, x2, y1, w21)
+ img22, o22 = self.sample_one(img, x2, y2, w22)
+
+ imgw = img11 + img12 + img21 + img22
+ o = o11 + o12 + o21 + o22
+
+ return imgw, o
+
+
+ def z_fwarp(self, img, flo, z):
+ """
+ -img: image (N, C, H, W)
+ -flo: optical flow (N, 2, H, W)
+ elements of flo is in [0, H] and [0, W] for dx, dy
+ modified from https://github.com/lyh-18/EQVI/blob/EQVI-master/models/forward_warp_gaussian.py
+ """
+
+ # (x1, y1) (x1, y2)
+ # +---------------+
+ # | |
+ # | o(x, y) |
+ # | |
+ # | |
+ # | |
+ # | |
+ # +---------------+
+ # (x2, y1) (x2, y2)
+
+ N, C, _, _ = img.size()
+
+ # translate start-point optical flow to end-point optical flow
+ y = flo[:, 0:1:, :]
+ x = flo[:, 1:2, :, :]
+
+ x = x.repeat(1, C, 1, 1)
+ y = y.repeat(1, C, 1, 1)
+
+ # Four point of square (x1, y1), (x1, y2), (x2, y1), (y2, y2)
+ x1 = torch.floor(x)
+ x2 = x1 + 1
+ y1 = torch.floor(y)
+ y2 = y1 + 1
+
+ # firstly, get gaussian weights
+ w11, w12, w21, w22 = self.get_gaussian_weights(x, y, x1, x2, y1, y2, z+1e-5)
+
+ # secondly, sample each weighted corner
+ img11, o11 = self.sample_one(img, x1, y1, w11)
+ img12, o12 = self.sample_one(img, x1, y2, w12)
+ img21, o21 = self.sample_one(img, x2, y1, w21)
+ img22, o22 = self.sample_one(img, x2, y2, w22)
+
+ imgw = img11 + img12 + img21 + img22
+ o = o11 + o12 + o21 + o22
+
+ return imgw, o
+
+
+ def get_gaussian_weights(self, x, y, x1, x2, y1, y2, z=1.0):
+ # z 0.0 ~ 1.0
+ w11 = z * torch.exp(-((x - x1) ** 2 + (y - y1) ** 2))
+ w12 = z * torch.exp(-((x - x1) ** 2 + (y - y2) ** 2))
+ w21 = z * torch.exp(-((x - x2) ** 2 + (y - y1) ** 2))
+ w22 = z * torch.exp(-((x - x2) ** 2 + (y - y2) ** 2))
+
+ return w11, w12, w21, w22
+
+ def sample_one(self, img, shiftx, shifty, weight):
+ """
+ Input:
+ -img (N, C, H, W)
+ -shiftx, shifty (N, c, H, W)
+ """
+
+ N, C, H, W = img.size()
+
+ # flatten all (all restored as Tensors)
+ flat_shiftx = shiftx.view(-1)
+ flat_shifty = shifty.view(-1)
+ flat_basex = torch.arange(0, H, requires_grad=False).view(-1, 1)[None, None].to(self.device).long().repeat(N, C,1,W).view(-1)
+ flat_basey = torch.arange(0, W, requires_grad=False).view(1, -1)[None, None].to(self.device).long().repeat(N, C,H,1).view(-1)
+ flat_weight = weight.view(-1)
+ flat_img = img.contiguous().view(-1)
+
+ # The corresponding positions in I1
+ idxn = torch.arange(0, N, requires_grad=False).view(N, 1, 1, 1).to(self.device).long().repeat(1, C, H, W).view(-1)
+ idxc = torch.arange(0, C, requires_grad=False).view(1, C, 1, 1).to(self.device).long().repeat(N, 1, H, W).view(-1)
+ idxx = flat_shiftx.long() + flat_basex
+ idxy = flat_shifty.long() + flat_basey
+
+ # recording the inside part the shifted
+ mask = idxx.ge(0) & idxx.lt(H) & idxy.ge(0) & idxy.lt(W)
+
+ # Mask off points out of boundaries
+ ids = (idxn * C * H * W + idxc * H * W + idxx * W + idxy)
+ ids_mask = torch.masked_select(ids, mask).clone().to(self.device)
+
+ # Note here! accmulate fla must be true for proper bp
+ img_warp = torch.zeros([N * C * H * W, ]).to(self.device)
+ img_warp.put_(ids_mask, torch.masked_select(flat_img * flat_weight, mask), accumulate=True)
+
+ one_warp = torch.zeros([N * C * H * W, ]).to(self.device)
+ one_warp.put_(ids_mask, torch.masked_select(flat_weight, mask), accumulate=True)
+
+ return img_warp.view(N, C, H, W), one_warp.view(N, C, H, W)
+
+class RefineUNet(nn.Module):
+ def __init__(self, args):
+ super(RefineUNet, self).__init__()
+ self.args = args
+ self.scale = args.module_scale_factor
+ self.nf = args.nf
+ self.conv1 = nn.Conv2d(self.nf, self.nf, [3,3], 1, [1,1])
+ self.conv2 = nn.Conv2d(self.nf, self.nf, [3,3], 1, [1,1])
+ self.lrelu = nn.ReLU()
+ self.NN = nn.UpsamplingNearest2d(scale_factor=2)
+
+ self.enc1 = nn.Conv2d((4*self.nf)//self.scale//self.scale + 4*args.img_ch + 4, self.nf, [4, 4], 2, [1, 1])
+ self.enc2 = nn.Conv2d(self.nf, 2*self.nf, [4, 4], 2, [1, 1])
+ self.enc3 = nn.Conv2d(2*self.nf, 4*self.nf, [4, 4], 2, [1, 1])
+ self.dec0 = nn.Conv2d(4*self.nf, 4*self.nf, [3, 3], 1, [1, 1])
+ self.dec1 = nn.Conv2d(4*self.nf + 2*self.nf, 2*self.nf, [3, 3], 1, [1, 1]) ## input concatenated with enc2
+ self.dec2 = nn.Conv2d(2*self.nf + self.nf, self.nf, [3, 3], 1, [1, 1]) ## input concatenated with enc1
+ self.dec3 = nn.Conv2d(self.nf, 1+args.img_ch, [3, 3], 1, [1, 1]) ## input added with warped image
+
+ def forward(self, concat):
+ enc1 = self.lrelu(self.enc1(concat))
+ enc2 = self.lrelu(self.enc2(enc1))
+ out = self.lrelu(self.enc3(enc2))
+
+ out = self.lrelu(self.dec0(out))
+ out = self.NN(out)
+
+ out = torch.cat((out,enc2),dim=1)
+ out = self.lrelu(self.dec1(out))
+
+ out = self.NN(out)
+ out = torch.cat((out,enc1),dim=1)
+ out = self.lrelu(self.dec2(out))
+
+ out = self.NN(out)
+ out = self.dec3(out)
+ return out
+
+class ResBlock2D_3D(nn.Module):
+ ## Shape of input [B,C,T,H,W]
+ ## Shape of output [B,C,T,H,W]
+ def __init__(self, args):
+ super(ResBlock2D_3D, self).__init__()
+ self.args = args
+ self.nf = args.nf
+
+ self.conv3x3_1 = nn.Conv3d(self.nf, self.nf, [1,3,3], 1, [0,1,1])
+ self.conv3x3_2 = nn.Conv3d(self.nf, self.nf, [1,3,3], 1, [0,1,1])
+ self.lrelu = nn.ReLU()
+
+ def forward(self, x):
+ '''
+ x shape : [B,C,T,H,W]
+ '''
+ B, C, T, H, W = x.size()
+
+ out = self.conv3x3_2(self.lrelu(self.conv3x3_1(x)))
+
+ return x + out
+
+class RResBlock2D_3D(nn.Module):
+
+ def __init__(self, args, T_reduce_flag=False):
+ super(RResBlock2D_3D, self).__init__()
+ self.args = args
+ self.nf = args.nf
+ self.T_reduce_flag = T_reduce_flag
+ self.resblock1 = ResBlock2D_3D(self.args)
+ self.resblock2 = ResBlock2D_3D(self.args)
+ if T_reduce_flag:
+ self.reduceT_conv = nn.Conv3d(self.nf, self.nf, [3,1,1], 1, [0,0,0])
+
+ def forward(self, x):
+ '''
+ x shape : [B,C,T,H,W]
+ '''
+ out = self.resblock1(x)
+ out = self.resblock2(out)
+ if self.T_reduce_flag:
+ return self.reduceT_conv(out + x)
+ else:
+ return out + x
+
+def weights_init(m):
+ classname = m.__class__.__name__
+ if (classname.find('Conv2d') != -1) or (classname.find('Conv3d') != -1):
+ init.xavier_normal_(m.weight)
+ # init.kaiming_normal_(m.weight, nonlinearity='relu')
+ if hasattr(m, 'bias') and m.bias is not None:
+ init.zeros_(m.bias)
\ No newline at end of file
diff --git a/custom_nodes/comfyui-frame-interpolation/vfi_utils.py b/custom_nodes/comfyui-frame-interpolation/vfi_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..7504637e63abfc8b826a36f11456e8a47d2dbf5d
--- /dev/null
+++ b/custom_nodes/comfyui-frame-interpolation/vfi_utils.py
@@ -0,0 +1,295 @@
+import yaml
+import os
+from torch.hub import download_url_to_file, get_dir
+from urllib.parse import urlparse
+import torch
+import typing
+import traceback
+import einops
+import gc
+import torchvision.transforms.functional as transform
+from comfy.model_management import soft_empty_cache, get_torch_device
+import numpy as np
+
+BASE_MODEL_DOWNLOAD_URLS = [
+ "https://github.com/styler00dollar/VSGAN-tensorrt-docker/releases/download/models/",
+ "https://github.com/Fannovel16/ComfyUI-Frame-Interpolation/releases/download/models/",
+ "https://github.com/dajes/frame-interpolation-pytorch/releases/download/v1.0.0/"
+]
+
+config_path = os.path.join(os.path.dirname(__file__), "./config.yaml")
+if os.path.exists(config_path):
+ config = yaml.load(open(config_path, "r"), Loader=yaml.FullLoader)
+else:
+ raise Exception("config.yaml file is neccessary, plz recreate the config file by downloading it from https://github.com/Fannovel16/ComfyUI-Frame-Interpolation")
+DEVICE = get_torch_device()
+
+class InterpolationStateList():
+
+ def __init__(self, frame_indices: typing.List[int], is_skip_list: bool):
+ self.frame_indices = frame_indices
+ self.is_skip_list = is_skip_list
+
+ def is_frame_skipped(self, frame_index):
+ is_frame_in_list = frame_index in self.frame_indices
+ return self.is_skip_list and is_frame_in_list or not self.is_skip_list and not is_frame_in_list
+
+
+class MakeInterpolationStateList:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "frame_indices": ("STRING", {"multiline": True, "default": "1,2,3"}),
+ "is_skip_list": ("BOOLEAN", {"default": True},),
+ },
+ }
+
+ RETURN_TYPES = ("INTERPOLATION_STATES",)
+ FUNCTION = "create_options"
+ CATEGORY = "ComfyUI-Frame-Interpolation/VFI"
+
+ def create_options(self, frame_indices: str, is_skip_list: bool):
+ frame_indices_list = [int(item) for item in frame_indices.split(',')]
+
+ interpolation_state_list = InterpolationStateList(
+ frame_indices=frame_indices_list,
+ is_skip_list=is_skip_list,
+ )
+ return (interpolation_state_list,)
+
+
+def get_ckpt_container_path(model_type):
+ return os.path.abspath(os.path.join(os.path.dirname(__file__), config["ckpts_path"], model_type))
+
+def load_file_from_url(url, model_dir=None, progress=True, file_name=None):
+ """Load file form http url, will download models if necessary.
+
+ Ref:https://github.com/1adrianb/face-alignment/blob/master/face_alignment/utils.py
+
+ Args:
+ url (str): URL to be downloaded.
+ model_dir (str): The path to save the downloaded model. Should be a full path. If None, use pytorch hub_dir.
+ Default: None.
+ progress (bool): Whether to show the download progress. Default: True.
+ file_name (str): The downloaded file name. If None, use the file name in the url. Default: None.
+
+ Returns:
+ str: The path to the downloaded file.
+ """
+ if model_dir is None: # use the pytorch hub_dir
+ hub_dir = get_dir()
+ model_dir = os.path.join(hub_dir, 'checkpoints')
+
+ os.makedirs(model_dir, exist_ok=True)
+
+ parts = urlparse(url)
+ file_name = os.path.basename(parts.path)
+ if file_name is not None:
+ file_name = file_name
+ cached_file = os.path.abspath(os.path.join(model_dir, file_name))
+ if not os.path.exists(cached_file):
+ print(f'Downloading: "{url}" to {cached_file}\n')
+ download_url_to_file(url, cached_file, hash_prefix=None, progress=progress)
+ return cached_file
+
+def load_file_from_github_release(model_type, ckpt_name):
+ error_strs = []
+ for i, base_model_download_url in enumerate(BASE_MODEL_DOWNLOAD_URLS):
+ try:
+ return load_file_from_url(base_model_download_url + ckpt_name, get_ckpt_container_path(model_type))
+ except Exception:
+ traceback_str = traceback.format_exc()
+ if i < len(BASE_MODEL_DOWNLOAD_URLS) - 1:
+ print("Failed! Trying another endpoint.")
+ error_strs.append(f"Error when downloading from: {base_model_download_url + ckpt_name}\n\n{traceback_str}")
+
+ error_str = '\n\n'.join(error_strs)
+ raise Exception(f"Tried all GitHub base urls to download {ckpt_name} but no suceess. Below is the error log:\n\n{error_str}")
+
+
+def load_file_from_direct_url(model_type, url):
+ return load_file_from_url(url, get_ckpt_container_path(model_type))
+
+def preprocess_frames(frames):
+ return einops.rearrange(frames[..., :3], "n h w c -> n c h w")
+
+def postprocess_frames(frames):
+ return einops.rearrange(frames, "n c h w -> n h w c")[..., :3].cpu()
+
+def assert_batch_size(frames, batch_size=2, vfi_name=None):
+ subject_verb = "Most VFI models require" if vfi_name is None else f"VFI model {vfi_name} requires"
+ assert len(frames) >= batch_size, f"{subject_verb} at least {batch_size} frames to work with, only found {frames.shape[0]}. Please check the frame input using PreviewImage."
+
+def _generic_frame_loop(
+ frames,
+ clear_cache_after_n_frames,
+ multiplier: typing.Union[typing.SupportsInt, typing.List],
+ return_middle_frame_function,
+ *return_middle_frame_function_args,
+ interpolation_states: InterpolationStateList = None,
+ use_timestep=True,
+ dtype=torch.float16,
+ final_logging=True):
+
+ #https://github.com/hzwer/Practical-RIFE/blob/main/inference_video.py#L169
+ def non_timestep_inference(frame0, frame1, n):
+ middle = return_middle_frame_function(frame0, frame1, None, *return_middle_frame_function_args)
+ if n == 1:
+ return [middle]
+ first_half = non_timestep_inference(frame0, middle, n=n//2)
+ second_half = non_timestep_inference(middle, frame1, n=n//2)
+ if n%2:
+ return [*first_half, middle, *second_half]
+ else:
+ return [*first_half, *second_half]
+
+ output_frames = torch.zeros(multiplier*frames.shape[0], *frames.shape[1:], dtype=dtype, device="cpu")
+ out_len = 0
+
+ number_of_frames_processed_since_last_cleared_cuda_cache = 0
+
+ for frame_itr in range(len(frames) - 1): # Skip the final frame since there are no frames after it
+ frame0 = frames[frame_itr:frame_itr+1]
+ output_frames[out_len] = frame0 # Start with first frame
+ out_len += 1
+ # Ensure that input frames are in fp32 - the same dtype as model
+ frame0 = frame0.to(dtype=torch.float32)
+ frame1 = frames[frame_itr+1:frame_itr+2].to(dtype=torch.float32)
+
+ if interpolation_states is not None and interpolation_states.is_frame_skipped(frame_itr):
+ continue
+
+ # Generate and append a batch of middle frames
+ middle_frame_batches = []
+
+ if use_timestep:
+ for middle_i in range(1, multiplier):
+ timestep = middle_i/multiplier
+
+ middle_frame = return_middle_frame_function(
+ frame0.to(DEVICE),
+ frame1.to(DEVICE),
+ timestep,
+ *return_middle_frame_function_args
+ ).detach().cpu()
+ middle_frame_batches.append(middle_frame.to(dtype=dtype))
+ else:
+ middle_frames = non_timestep_inference(frame0.to(DEVICE), frame1.to(DEVICE), multiplier - 1)
+ middle_frame_batches.extend(torch.cat(middle_frames, dim=0).detach().cpu().to(dtype=dtype))
+
+ # Copy middle frames to output
+ for middle_frame in middle_frame_batches:
+ output_frames[out_len] = middle_frame
+ out_len += 1
+
+ number_of_frames_processed_since_last_cleared_cuda_cache += 1
+ # Try to avoid a memory overflow by clearing cuda cache regularly
+ if number_of_frames_processed_since_last_cleared_cuda_cache >= clear_cache_after_n_frames:
+ print("Comfy-VFI: Clearing cache...", end=' ')
+ soft_empty_cache()
+ number_of_frames_processed_since_last_cleared_cuda_cache = 0
+ print("Done cache clearing")
+
+ gc.collect()
+
+ if final_logging:
+ print(f"Comfy-VFI done! {len(output_frames)} frames generated at resolution: {output_frames[0].shape}")
+ # Append final frame
+ output_frames[out_len] = frames[-1:]
+ out_len += 1
+ # clear cache for courtesy
+ if final_logging:
+ print("Comfy-VFI: Final clearing cache...", end = ' ')
+ soft_empty_cache()
+ if final_logging:
+ print("Done cache clearing")
+ return output_frames[:out_len]
+
+def generic_frame_loop(
+ model_name,
+ frames,
+ clear_cache_after_n_frames,
+ multiplier: typing.Union[typing.SupportsInt, typing.List],
+ return_middle_frame_function,
+ *return_middle_frame_function_args,
+ interpolation_states: InterpolationStateList = None,
+ use_timestep=True,
+ dtype=torch.float32):
+
+ assert_batch_size(frames, vfi_name=model_name.replace('_', ' ').replace('VFI', ''))
+ if type(multiplier) == int:
+ return _generic_frame_loop(
+ frames,
+ clear_cache_after_n_frames,
+ multiplier,
+ return_middle_frame_function,
+ *return_middle_frame_function_args,
+ interpolation_states=interpolation_states,
+ use_timestep=use_timestep,
+ dtype=dtype
+ )
+ if type(multiplier) == list:
+ multipliers = list(map(int, multiplier))
+ multipliers += [2] * (len(frames) - len(multipliers) - 1)
+ frame_batches = []
+ for frame_itr in range(len(frames) - 1):
+ multiplier = multipliers[frame_itr]
+ if multiplier == 0: continue
+ frame_batch = _generic_frame_loop(
+ frames[frame_itr:frame_itr+2],
+ clear_cache_after_n_frames,
+ multiplier,
+ return_middle_frame_function,
+ *return_middle_frame_function_args,
+ interpolation_states=interpolation_states,
+ use_timestep=use_timestep,
+ dtype=dtype,
+ final_logging=False
+ )
+ if frame_itr != len(frames) - 2: # Not append last frame unless this batch is the last one
+ frame_batch = frame_batch[:-1]
+ frame_batches.append(frame_batch)
+ output_frames = torch.cat(frame_batches)
+ print(f"Comfy-VFI done! {len(output_frames)} frames generated at resolution: {output_frames[0].shape}")
+ return output_frames
+ raise NotImplementedError(f"multipiler of {type(multiplier)}")
+
+class FloatToInt:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "float": ("FLOAT", {"default": 0, 'min': 0, 'step': 0.01})
+ }
+ }
+
+ RETURN_TYPES = ("INT",)
+ FUNCTION = "convert"
+ CATEGORY = "ComfyUI-Frame-Interpolation"
+
+ def convert(self, float):
+ if hasattr(float, "__iter__"):
+ return (list(map(int, float)),)
+ return (int(float),)
+
+""" def generic_4frame_loop(
+ frames,
+ clear_cache_after_n_frames,
+ multiplier: typing.SupportsInt,
+ return_middle_frame_function,
+ *return_middle_frame_function_args,
+ interpolation_states: InterpolationStateList = None,
+ use_timestep=False):
+
+ if use_timestep: raise NotImplementedError("Timestep 4 frame VFI model")
+ def non_timestep_inference(frame_0, frame_1, frame_2, frame_3, n):
+ middle = return_middle_frame_function(frame_0, frame_1, None, *return_middle_frame_function_args)
+ if n == 1:
+ return [middle]
+ first_half = non_timestep_inference(frame_0, middle, n=n//2)
+ second_half = non_timestep_inference(middle, frame_1, n=n//2)
+ if n%2:
+ return [*first_half, middle, *second_half]
+ else:
+ return [*first_half, *second_half] """
\ No newline at end of file
diff --git a/custom_nodes/comfyui-videohelpersuite/.github/workflows/publish.yml b/custom_nodes/comfyui-videohelpersuite/.github/workflows/publish.yml
new file mode 100644
index 0000000000000000000000000000000000000000..27bcdb11695ea19286da34cd5f36cf75155a4dbb
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/.github/workflows/publish.yml
@@ -0,0 +1,24 @@
+name: Publish to Comfy registry
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - main
+ paths:
+ - "pyproject.toml"
+
+permissions:
+ issues: write
+
+jobs:
+ publish-node:
+ name: Publish Custom Node to registry
+ runs-on: ubuntu-latest
+ if: ${{ github.repository_owner == 'Kosinkadink' }}
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ - name: Publish Custom Node
+ uses: Comfy-Org/publish-node-action@v1
+ with:
+ personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} ## Add your own personal access token to your Github Repository secrets and reference it here.
diff --git a/custom_nodes/comfyui-videohelpersuite/.gitignore b/custom_nodes/comfyui-videohelpersuite/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..9b5379e8f93da3909706b0a7d37f5c8ab5e2a2a5
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/.gitignore
@@ -0,0 +1,162 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+# in version control.
+# https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+# VIM swap files
+*.swp
diff --git a/custom_nodes/comfyui-videohelpersuite/.tracking b/custom_nodes/comfyui-videohelpersuite/.tracking
new file mode 100644
index 0000000000000000000000000000000000000000..8ef6e8220a0177fd6fd1bf92d1a496df1304a1f8
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/.tracking
@@ -0,0 +1,45 @@
+.github/workflows/publish.yml
+.gitignore
+LICENSE
+README.md
+__init__.py
+pyproject.toml
+requirements.txt
+testframework/README.md
+testframework/__init__.py
+testframework/server.py
+testframework/web/js/testRunner.js
+tests/README.md
+tests/audio.json
+tests/batch4x4.json
+tests/converted-format-input.json
+tests/converted-input.json
+tests/loop.json
+tests/old-prores.json
+tests/old-vae-conversion.json
+tests/simple.json
+video_formats/16bit-png.json
+video_formats/8bit-png.json
+video_formats/ProRes.json
+video_formats/av1-webm.json
+video_formats/ffmpeg-gif.json
+video_formats/ffv1-mkv.json
+video_formats/gifski.json
+video_formats/h264-mp4.json
+video_formats/h265-mp4.json
+video_formats/nvenc_av1-mp4.json
+video_formats/nvenc_h264-mp4.json
+video_formats/nvenc_hevc-mp4.json
+video_formats/webm.json
+videohelpersuite/batched_nodes.py
+videohelpersuite/documentation.py
+videohelpersuite/image_latent_nodes.py
+videohelpersuite/latent_preview.py
+videohelpersuite/load_images_nodes.py
+videohelpersuite/load_video_nodes.py
+videohelpersuite/logger.py
+videohelpersuite/nodes.py
+videohelpersuite/server.py
+videohelpersuite/utils.py
+web/js/VHS.core.js
+web/js/videoinfo.js
\ No newline at end of file
diff --git a/custom_nodes/comfyui-videohelpersuite/LICENSE b/custom_nodes/comfyui-videohelpersuite/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..f288702d2fa16d3cdf0035b15a9fcbc552cd88e7
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+ .
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/custom_nodes/comfyui-videohelpersuite/README.md b/custom_nodes/comfyui-videohelpersuite/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..753fcecf9979b40b2427869c6ad5bed1b61df482
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/README.md
@@ -0,0 +1,110 @@
+# ComfyUI-VideoHelperSuite
+Nodes related to video workflows
+
+## I/O Nodes
+### Load Video
+Converts a video file into a series of images
+- video: The video file to be loaded
+- force_rate: Discards or duplicates frames as needed to hit a target frame rate. Disabled by setting to 0. This can be used to quickly match a suggested frame rate like the 8 fps of AnimateDiff.
+- force_size: Allows for quick resizing to a number of suggested sizes. Several options allow you to set only width or height and determine the other from aspect ratio.
+- frame_load_cap: The maximum number of frames which will be returned. This could also be thought of as the maximum batch size.
+- skip_first_frames: How many frames to skip from the start of the video after adjusting for a forced frame rate. By incrementing this number by the frame_load_cap, you can easily process a longer input video in parts.
+- select_every_nth: Allows for skipping a number of frames without considering the base frame rate or risking frame duplication. Often useful when working with animated gifs
+A path variant of the Load Video node exists that allows loading videos from external paths
+
+
+If [Advanced Previews](#advanced-previews) is enabled in the options menu of the web ui, the preview will reflect the current settings on the node.
+### Load Image Sequence
+Loads all image files from a subfolder. Options are similar to Load Video.
+- image_load_cap: The maximum number of images which will be returned. This could also be thought of as the maximum batch size.
+- skip_first_images: How many images to skip. By incrementing this number by image_load_cap, you can easily divide a long sequence of images into multiple batches.
+- select_every_nth: Allows for skipping a number of images between every returned frame.
+
+A path variant of Load Image sequence also exists.
+### Video Combine
+Combines a series of images into an output video
+If the optional audio input is provided, it will also be combined into the output video
+- frame_rate: How many of the input frames are displayed per second. A higher frame rate means that the output video plays faster and has less duration. This should usually be kept to 8 for AnimateDiff, or matched to the force_rate of a Load Video node.
+- loop_count: How many additional times the video should repeat
+- filename_prefix: The base file name used for output.
+ - You can save output to a subfolder: `subfolder/video`
+ - Like the builtin Save Image node, you can add timestamps. `%date:yyyy-MM-ddThh:mm:ss%` might become 2023-10-31T6:45:25
+- format: The file format to use. Advanced information on configuring or adding additional video formats can be found in the [Video Formats](#video-formats) section.
+- pingpong: Causes the input to be played back in the reverse to create a clean loop.
+- save_output: Whether the image should be put into the output directory or the temp directory.
+Returns: a `VHS_FILENAMES` which consists of a boolean indicating if save_output is enabled and a list of the full filepaths of all generated outputs in the order created. Accordingly `output[1][-1]` will be the most complete output.
+
+Depending on the format chosen, additional options may become available, including
+- crf: Describes the quality of the output video. A lower number gives a higher quality video and a larger file size, while a higher number gives a lower quality video with a smaller size. Scaling varies by codec, but visually lossless output generally occurs around 20.
+- save_metadata: Includes a copy of the workflow in the output video which can be loaded by dragging and dropping the video, just like with images.
+- pix_fmt: Changes how the pixel data is stored. `yuv420p10le` has higher color quality, but won't work on all devices
+### Load Audio
+Provides a way to load standalone audio files.
+- seek_seconds: An optional start time for the audio file in seconds.
+
+## Latent/Image Nodes
+A number of utility nodes exist for managing latents. For each, there is an equivalent node which works on images.
+### Split Batch
+Divides the latents into two sets. The first `split_index` latents go to output A and the remainder to output B. If less then `split_index` latents are provided as input, all are passed to output A and output B is empty.
+### Merge Batch
+Combines two groups of latents into a single output. The order of the output is the latents in A followed by the latents in B.
+If the input groups are not the same size, the node provides options for rescaling the latents before merging.
+### Select Every Nth
+The first of every `select_every_nth` input is passed and the remainder are discarded
+### Get Count
+### Duplicate Batch
+
+## Video Previews
+Load Video (Upload), Load Video (Path), Load Images (Upload), Load Images (Path) and Video Combine provide animated previews.
+Nodes with previews provide additional functionality when right clicked
+- Open preview
+- Save preview
+- Pause preview: Can improve performance with very large videos
+- Hide preview: Can improve performance, save space
+- Sync preview: Restarts all previews for side-by-side comparisons
+
+### Advanced Previews
+Advanced Previews must be manually enabled by clicking the settings gear next to Queue Prompt and checking the box for VHS Advanced Previews.
+If enabled, videos which are displayed in the ui will be converted with ffmpeg on request. This has several benefits
+- Previews for Load Video nodes will reflect the settings on the node such as skip_first_frames and frame_load_cap
+ - This makes it easy to select an exact portion of an input video and sync it with outputs
+- It can use substantially less bandwidth if running the server remotely
+- It can greatly improve the browser performance by downsizing videos to the in ui resolution, particularly useful with animated gifs
+- It allows for previews of videos that would not normally be playable in browser.
+- Can be limited to subdirectories of ComyUI if `VHS_STRICT_PATHS` is set as an environment variable.
+
+This fucntionality is disabled since it comes with several downsides
+- There is a delay before videos show in the browser. This delay can become quite large if the input video is long
+- The preview videos are lower quality (The original can always be viewed with Right Click -> Open preview)
+
+## Video Formats
+Those familiar with ffmpeg are able to add json files to the video_formats folders to add new output types to Video Combine.
+Consider the following example for av1-webm
+```json
+{
+ "main_pass":
+ [
+ "-n", "-c:v", "libsvtav1",
+ "-pix_fmt", "yuv420p10le",
+ "-crf", ["crf","INT", {"default": 23, "min": 0, "max": 100, "step": 1}]
+ ],
+ "audio_pass": ["-c:a", "libopus"],
+ "extension": "webm",
+ "environment": {"SVT_LOG": "1"}
+}
+```
+Most configuration takes place in `main_pass`, which is a list of arguments that are passed to ffmpeg.
+- `"-n"` designates that the command should fail if a file of the same name already exists. This should never happen, but if some bug were to occur, it would ensure other files aren't overwritten.
+- `"-c:v", "libsvtav1"` designates that the video should be encoded with an av1 codec using the new SVT-AV1 encoder. SVT-AV1 is much faster than libaom-av1, but may not exist in older versions of ffmpeg. Alternatively, av1_nvenc could be used for gpu encoding with newer nvidia cards.
+- `"-pix_fmt", "yuv420p10le"` designates the standard pixel format with 10-bit color. It's important that some pixel format be specified to ensure a nonconfigurable input pix_fmt isn't used.
+
+`audio pass` contains a list of arguments which are passed to ffmpeg when audio is passed into Video Combine
+
+`extension` designates both the file extension and the container format that is used. If some of the above options are omitted from `main_pass` it can affect what default options are chosen.
+`environment` can optionally be provided to set environment variables during execution. For av1 it's used to reduce the verbosity of logging so that only major errors are displayed.
+`input_color_depth` effects the format in which pixels are passed to the ffmpeg subprocess. Current valid options are `8bit` and `16bit`. The later will produce higher quality output, but is experimental.
+
+Fields can be exposed in the webui as a widget using a format similar to what is used in the creation of custom nodes. In the above example, the argument for `-crf` will be exposed as a format widget in the webui. Format widgets are a list of up to 3 terms
+- The name of the widget that will be displayed in the web ui
+- Either a primitive such as "INT" or "BOOLEAN", or a list of string options
+- A dictionary of options
diff --git a/custom_nodes/comfyui-videohelpersuite/__init__.py b/custom_nodes/comfyui-videohelpersuite/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..9fa995f0ac7e296a62bcba9df68b5250a0f7d041
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/__init__.py
@@ -0,0 +1,9 @@
+from .videohelpersuite.nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
+import folder_paths
+from .videohelpersuite.server import server
+from .videohelpersuite import documentation
+from .videohelpersuite import latent_preview
+
+WEB_DIRECTORY = "./web"
+__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]
+documentation.format_descriptions(NODE_CLASS_MAPPINGS)
diff --git a/custom_nodes/comfyui-videohelpersuite/pyproject.toml b/custom_nodes/comfyui-videohelpersuite/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..39793ee53bd813c5188a2f65836a72bf541b4d9c
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/pyproject.toml
@@ -0,0 +1,15 @@
+[project]
+name = "comfyui-videohelpersuite"
+description = "Nodes related to video workflows"
+version = "1.7.9"
+license = { file = "LICENSE" }
+dependencies = ["opencv-python", "imageio-ffmpeg"]
+
+[project.urls]
+Repository = "https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite"
+
+# Used by Comfy Registry https://comfyregistry.org
+[tool.comfy]
+PublisherId = "kosinkadink"
+DisplayName = "ComfyUI-VideoHelperSuite"
+Icon = ""
diff --git a/custom_nodes/comfyui-videohelpersuite/requirements.txt b/custom_nodes/comfyui-videohelpersuite/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4fa34aa21b85c4b974e2a2b6891eae5fd6dd4164
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/requirements.txt
@@ -0,0 +1,2 @@
+opencv-python
+imageio-ffmpeg
diff --git a/custom_nodes/comfyui-videohelpersuite/testframework/README.md b/custom_nodes/comfyui-videohelpersuite/testframework/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..93cd503563080c9c7d785d419bef7dddc4c11cd8
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/testframework/README.md
@@ -0,0 +1,5 @@
+Code to automate execution of the tests and evaluate the results.
+Distributed as a `custom node`, and can be installed by copying or simlinking to the `custom_nodes` directory.
+Requires that ffprobe be available and added to the path. Note that imageio-ffmpeg does not bundle ffprobe.
+
+When installed, it adds a new sidebar tab to automate running one, or a folder of tests. This requires that the `Use new menu and workflow management` setting not be disabled
diff --git a/custom_nodes/comfyui-videohelpersuite/testframework/__init__.py b/custom_nodes/comfyui-videohelpersuite/testframework/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..c75b11c164596ef873898dd843700c7164cc0932
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/testframework/__init__.py
@@ -0,0 +1,6 @@
+from . import server
+NODE_CLASS_MAPPINGS = {}
+NODE_DISPLAY_NAME_MAPPINGS = {}
+
+WEB_DIRECTORY = "./web"
+__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]
diff --git a/custom_nodes/comfyui-videohelpersuite/testframework/server.py b/custom_nodes/comfyui-videohelpersuite/testframework/server.py
new file mode 100644
index 0000000000000000000000000000000000000000..a9c20ea3eab31bab288d6089a89410ff409d43ad
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/testframework/server.py
@@ -0,0 +1,60 @@
+import subprocess
+import json
+import os
+import torch
+import shutil
+
+import server
+import folder_paths
+
+web = server.web
+
+@server.PromptServer.instance.routes.post("/VHS_test")
+async def test(request):
+ try:
+ req_data = await request.json()
+ output = req_data['output']['gifs'][0]
+ filename = output['filename']
+ typ = output['type']
+ base_args = ["ffprobe", "-v", "error", '-count_packets', "-show_entries", "stream", "-of", "json"]
+ video = folder_paths.get_annotated_filepath(f'{filename} [{typ}]')
+ vprobe = json.loads(subprocess.run(base_args + ['-select_streams', 'v:0', video],
+ capture_output=True, check=True).stdout)['streams'][0]
+ aprobe = json.loads(subprocess.run(base_args + ['-select_streams', 'a:0', video],
+ capture_output=True, check=True).stdout)['streams']
+ probe = {'video': vprobe}
+ if len(aprobe) > 0:
+ probe['audio'] = aprobe[0]
+ errors = []
+ compare = None
+ for test in req_data['tests']:
+ if test['type'] == 'compare':
+ compare = test
+ continue
+ key = test['key']
+ expected = test['value']
+ actual = probe[test['type']][key]
+ if expected != actual:
+ #Consider always dumping type?
+ errors.append(f'{key}: {expected} != {actual}')
+ if len(errors) == 0 and compare is not None:
+ if not os.path.exists(compare['filename']):
+ os.makedirs(os.path.split(compare['filename'])[0], exist_ok=True)
+ shutil.copy(video, compare['filename'])
+ print("Missing comparison file has been initialized from output:", os.path.abspath(compare['filename']))
+ else:
+ #NOTE: This does not include the full memory optimizations of VHS
+ #Tests should be small
+ #TODO: Figure out way to do opacity comparison. May need to do blending in python
+ #(easy, but slower and more memory intensive)
+ diff = subprocess.run(['ffmpeg', '-v', 'error', '-i', video, '-i', compare['filename'], '-filter_complex', 'blend=all_mode=grainextract', '-pix_fmt', 'rgb24', '-f', 'rawvideo', '-'], stdout=subprocess.PIPE, check=True).stdout
+ diff = torch.frombuffer(diff, dtype=torch.uint8).to(dtype=torch.float32).div_(255)
+ #diff = diff.reshape((-1,4))
+ d = (diff-0.5).abs().sum()/diff.size(0)
+ if d > compare['tolerance']:
+ errors.append(f'Similarity is outside specified tolerance: {d}')
+ else:
+ print('d:', d)
+ return web.json_response(errors)
+ except Exception as e:
+ return web.json_response(str(e))
diff --git a/custom_nodes/comfyui-videohelpersuite/testframework/web/js/testRunner.js b/custom_nodes/comfyui-videohelpersuite/testframework/web/js/testRunner.js
new file mode 100644
index 0000000000000000000000000000000000000000..521a2204b9a2a3202441818461231872ea8a15c8
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/testframework/web/js/testRunner.js
@@ -0,0 +1,96 @@
+
+import {app} from "../../../scripts/app.js";
+import {api} from "../../../scripts/api.js";
+
+let watched_nodes = {}
+let resolve = undefined
+let testURL = api.apiURL("/VHS_test")
+let errors = []
+api.addEventListener("executed", async function ({detail}) {
+ if (watched_nodes && watched_nodes[detail?.node]) {
+ if (detail?.output?.unfinished_batch) {
+ return
+ }
+ let requestBody = {tests: watched_nodes[detail.node], output: detail.output}
+ try {
+ let req = await fetch(api.apiURL("/VHS_test"),
+ {method: "POST", body: JSON.stringify(requestBody)});
+ let testResult = await req.json()
+ if (testResult.length != 0) {
+ errors.push(testResult)
+ }
+ } catch(e) {
+ errors.push(e)
+ }
+ if (!(watched_nodes.length -= 1)) {
+ resolve()
+ }
+ }
+});
+
+const workflowService = app.extensionManager.workflow
+
+async function runTest(file) {
+ if (!file?.name?.endsWith(".json")) {
+ return false
+ }
+ let workflow = JSON.parse(await file.text())
+ await app.loadGraphData(workflow)
+ //NOTE: API is not used so workflow data is actually processed
+ watched_nodes = workflow.tests
+ errors = []
+ let p = new Promise((r) => resolve = r)
+ await app.queuePrompt()
+ //block until execution completes
+ await p
+ watched_nodes = {}
+ if (errors.length > 0) {
+ app.ui.dialog.show("Failed " + errors.length + " tests:\n" + errors)
+ return true
+ }
+ await workflowService.closeWorkflow(workflowService.activeWorkflow, {warnIfUnsaved: false})
+ return false
+}
+let iconOverride = document.createElement("style")
+iconOverride.innerHTML = `.VHSTestIcon:before {content: '🧪';}`
+document.body.append(iconOverride)
+
+let testSidebar = {id: 'VHStest', title: 'VHS Test', icon: 'VHSTestIcon', type: 'custom',
+ render: (e) => {
+ e.innerHTML = `Select a folder containing tests
+
+ Or select a single test
+
+ `
+
+ const folderInput = e.children[0]
+ const fileInput = e.children[1]
+ Object.assign(folderInput, {
+ type: "file",
+ webkitdirectory: true,
+ onchange: async function() {
+ const startTime = Date.now()
+ let failedTests = false
+ for(const file of this.files) {
+ failedTests ||= await runTest(file)
+ }
+ this.value=""
+ if (!failedTests) {
+ console.log("All tests passed in " + ((Date.now() - startTime)/1000) + "s")
+ }
+ },
+ });
+ Object.assign(fileInput, {
+ type: "file",
+ accept: ".json",
+ onchange: async function() {
+ if (this.files.length) {
+ if(!(await runTest(this.files[0]))) {
+ console.log("Test complete")
+ }
+ this.value=""
+ }
+ },
+ });
+ }}
+app.extensionManager.registerSidebarTab(testSidebar)
diff --git a/custom_nodes/comfyui-videohelpersuite/tests/README.md b/custom_nodes/comfyui-videohelpersuite/tests/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..ec025a7d169c7783f34523c63a0a6ae9a2e00fdb
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/tests/README.md
@@ -0,0 +1 @@
+Workflows for automated testing of VHS. Most include an additional tests key to check the properties or perform comparisons on node outputs
diff --git a/custom_nodes/comfyui-videohelpersuite/tests/audio.json b/custom_nodes/comfyui-videohelpersuite/tests/audio.json
new file mode 100644
index 0000000000000000000000000000000000000000..cae3d766731f7fe3ae4866f6fa8c0cc86a2ca46d
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/tests/audio.json
@@ -0,0 +1,313 @@
+{
+ "id": "07b812b5-5037-4878-90bc-32d3a1f36619",
+ "revision": 0,
+ "last_node_id": 7,
+ "last_link_id": 5,
+ "nodes": [
+ {
+ "id": 5,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 732,
+ -23
+ ],
+ "size": [
+ 210,
+ 334
+ ],
+ "flags": {},
+ "order": 2,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 2
+ },
+ {
+ "name": "audio",
+ "shape": 7,
+ "type": "AUDIO",
+ "link": 3
+ },
+ {
+ "name": "meta_batch",
+ "shape": 7,
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "shape": 7,
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/webm",
+ "pix_fmt": "yuv420p",
+ "crf": 20,
+ "save_metadata": true,
+ "trim_to_audio": false,
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {}
+ }
+ }
+ },
+ {
+ "id": 6,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 503,
+ 363
+ ],
+ "size": [
+ 210,
+ 334
+ ],
+ "flags": {},
+ "order": 3,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 4
+ },
+ {
+ "name": "audio",
+ "shape": 7,
+ "type": "AUDIO",
+ "link": 5
+ },
+ {
+ "name": "meta_batch",
+ "shape": 7,
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "shape": 7,
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/h264-mp4",
+ "pix_fmt": "yuv420p",
+ "crf": 19,
+ "save_metadata": true,
+ "trim_to_audio": false,
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {}
+ }
+ }
+ },
+ {
+ "id": 4,
+ "type": "VHS_LoadVideoPath",
+ "pos": [
+ 29,
+ 16
+ ],
+ "size": [
+ 221.27618408203125,
+ 413.1552734375
+ ],
+ "flags": {},
+ "order": 0,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "meta_batch",
+ "shape": 7,
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "shape": 7,
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 2,
+ 4
+ ]
+ },
+ {
+ "name": "frame_count",
+ "type": "INT",
+ "links": null
+ },
+ {
+ "name": "audio",
+ "type": "AUDIO",
+ "links": [
+ 3
+ ]
+ },
+ {
+ "name": "video_info",
+ "type": "VHS_VIDEOINFO",
+ "links": null
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_LoadVideoPath"
+ },
+ "widgets_values": {
+ "video": "input/bigbuckbunny.mp4",
+ "force_rate": 8,
+ "custom_width": 0,
+ "custom_height": 0,
+ "frame_load_cap": 30,
+ "skip_first_frames": 0,
+ "select_every_nth": 1,
+ "format": "AnimateDiff",
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "filename": "input/bigbuckbunny.mp4",
+ "type": "path",
+ "format": "video/mp4",
+ "force_rate": 8,
+ "custom_width": 0,
+ "custom_height": 0,
+ "frame_load_cap": 30,
+ "skip_first_frames": 0,
+ "select_every_nth": 1
+ }
+ }
+ }
+ },
+ {
+ "id": 7,
+ "type": "VHS_LoadAudio",
+ "pos": [
+ 83,
+ 564
+ ],
+ "size": [
+ 218.93820190429688,
+ 126
+ ],
+ "flags": {},
+ "order": 1,
+ "mode": 0,
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "audio",
+ "type": "AUDIO",
+ "links": [
+ 5
+ ]
+ },
+ {
+ "name": "duration",
+ "type": "FLOAT",
+ "links": null
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_LoadAudio"
+ },
+ "widgets_values": {
+ "audio_file": "input/bigbuckbunny.mp4",
+ "seek_seconds": 0,
+ "duration": 5
+ }
+ }
+ ],
+ "links": [
+ [
+ 2,
+ 4,
+ 0,
+ 5,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 3,
+ 4,
+ 2,
+ 5,
+ 1,
+ "AUDIO"
+ ],
+ [
+ 4,
+ 4,
+ 0,
+ 6,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 5,
+ 7,
+ 0,
+ 6,
+ 1,
+ "AUDIO"
+ ]
+ ],
+ "groups": [],
+ "config": {},
+ "extra": {
+ "frontendVersion": "1.25.0",
+ "VHS_latentpreview": true,
+ "VHS_latentpreviewrate": 0,
+ "VHS_MetadataImage": true,
+ "VHS_KeepIntermediate": true
+ },
+ "version": 0.4,
+ "tests": {
+ "5": [{"type": "audio", "key": "nb_read_packets", "value": "177"}],
+ "6": [{"type": "audio", "key": "nb_read_packets", "value": "176"}],
+ "length": 2
+ }
+}
\ No newline at end of file
diff --git a/custom_nodes/comfyui-videohelpersuite/tests/batch4x4.json b/custom_nodes/comfyui-videohelpersuite/tests/batch4x4.json
new file mode 100644
index 0000000000000000000000000000000000000000..34b9647329642a9e5ca233a60b8bbf2ca8f72aca
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/tests/batch4x4.json
@@ -0,0 +1,535 @@
+{
+ "last_node_id": 18,
+ "last_link_id": 28,
+ "nodes": [
+ {
+ "id": 16,
+ "type": "SolidMask",
+ "pos": [
+ 38,
+ 1066
+ ],
+ "size": {
+ "0": 315,
+ "1": 106
+ },
+ "flags": {},
+ "order": 0,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "MASK",
+ "type": "MASK",
+ "links": [
+ 18
+ ],
+ "slot_index": 0,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SolidMask"
+ },
+ "widgets_values": [
+ 1,
+ 512,
+ 512
+ ]
+ },
+ {
+ "id": 15,
+ "type": "ImageCompositeMasked",
+ "pos": [
+ 412.0800030517579,
+ 591.4099975585939
+ ],
+ "size": {
+ "0": 315,
+ "1": 146
+ },
+ "flags": {},
+ "order": 5,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "destination",
+ "type": "IMAGE",
+ "link": 16
+ },
+ {
+ "name": "source",
+ "type": "IMAGE",
+ "link": 17
+ },
+ {
+ "name": "mask",
+ "type": "MASK",
+ "link": 18
+ }
+ ],
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 19
+ ],
+ "slot_index": 0,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "ImageCompositeMasked"
+ },
+ "widgets_values": [
+ 0,
+ 0,
+ false
+ ]
+ },
+ {
+ "id": 18,
+ "type": "VHS_BatchManager",
+ "pos": [
+ 329.8000881958008,
+ -87.40008056640622
+ ],
+ "size": {
+ "0": 315,
+ "1": 58
+ },
+ "flags": {},
+ "order": 1,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "VHS_BatchManager",
+ "type": "VHS_BatchManager",
+ "links": [
+ 24,
+ 25,
+ 26,
+ 27
+ ],
+ "slot_index": 0,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_BatchManager"
+ },
+ "widgets_values": {
+ "frames_per_batch": 4,
+ "count": 2
+ }
+ },
+ {
+ "id": 10,
+ "type": "VHS_LoadVideoPath",
+ "pos": [
+ 24,
+ 102
+ ],
+ "size": [
+ 320,
+ 420.7188019966722
+ ],
+ "flags": {},
+ "order": 2,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "meta_batch",
+ "type": "VHS_BatchManager",
+ "link": 25,
+ "slot_index": 0
+ },
+ {
+ "name": "vae",
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 16,
+ 22
+ ],
+ "slot_index": 0,
+ "shape": 3
+ },
+ {
+ "name": "frame_count",
+ "type": "INT",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "audio",
+ "type": "AUDIO",
+ "links": [
+ 28
+ ],
+ "slot_index": 2,
+ "shape": 3
+ },
+ {
+ "name": "video_info",
+ "type": "VHS_VIDEOINFO",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_LoadVideoPath"
+ },
+ "widgets_values": {
+ "video": "input/bigbuckbunny.mp4",
+ "force_rate": 8,
+ "force_size": "512x?",
+ "custom_width": 512,
+ "custom_height": 512,
+ "frame_load_cap": 16,
+ "skip_first_frames": 64,
+ "select_every_nth": 1,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "frame_load_cap": 16,
+ "skip_first_frames": 64,
+ "force_rate": 8,
+ "filename": "input/bigbuckbunny.mp4",
+ "type": "path",
+ "format": "video/mp4",
+ "select_every_nth": 1,
+ "force_size": "512x?"
+ }
+ }
+ }
+ },
+ {
+ "id": 14,
+ "type": "VHS_LoadVideoPath",
+ "pos": [
+ 26,
+ 598
+ ],
+ "size": [
+ 320,
+ 444.7188019966722
+ ],
+ "flags": {},
+ "order": 3,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "meta_batch",
+ "type": "VHS_BatchManager",
+ "link": 26,
+ "slot_index": 0
+ },
+ {
+ "name": "vae",
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 17
+ ],
+ "slot_index": 0,
+ "shape": 3
+ },
+ {
+ "name": "frame_count",
+ "type": "INT",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "audio",
+ "type": "VHS_AUDIO",
+ "links": [],
+ "slot_index": 2,
+ "shape": 3
+ },
+ {
+ "name": "video_info",
+ "type": "VHS_VIDEOINFO",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_LoadVideoPath"
+ },
+ "widgets_values": {
+ "video": "input/bigbuckbunny.mp4",
+ "force_rate": 8,
+ "force_size": "Custom Width",
+ "custom_width": 384,
+ "custom_height": 512,
+ "frame_load_cap": 16,
+ "skip_first_frames": 64,
+ "select_every_nth": 1,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "frame_load_cap": 16,
+ "skip_first_frames": 64,
+ "force_rate": 8,
+ "filename": "input/bigbuckbunny.mp4",
+ "type": "path",
+ "format": "video/mp4",
+ "select_every_nth": 1,
+ "force_size": "512x?"
+ }
+ }
+ }
+ },
+ {
+ "id": 11,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 762,
+ 646
+ ],
+ "size": [
+ 320,
+ 492.75
+ ],
+ "flags": {},
+ "order": 6,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 19
+ },
+ {
+ "name": "audio",
+ "type": "AUDIO",
+ "link": 28
+ },
+ {
+ "name": "meta_batch",
+ "type": "VHS_BatchManager",
+ "link": 27,
+ "slot_index": 2
+ },
+ {
+ "name": "vae",
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/h264-mp4",
+ "pix_fmt": "yuv420p",
+ "crf": 19,
+ "save_metadata": true,
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "filename": "AnimateDiff_00005-audio.mp4",
+ "subfolder": "",
+ "type": "temp",
+ "format": "video/h264-mp4",
+ "frame_rate": 8
+ }
+ }
+ }
+ },
+ {
+ "id": 17,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 756,
+ 100
+ ],
+ "size": [
+ 320,
+ 492.75
+ ],
+ "flags": {},
+ "order": 4,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 22
+ },
+ {
+ "name": "audio",
+ "type": "VHS_AUDIO",
+ "link": null
+ },
+ {
+ "name": "meta_batch",
+ "type": "VHS_BatchManager",
+ "link": 24,
+ "slot_index": 2
+ },
+ {
+ "name": "vae",
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/webm",
+ "pix_fmt": "yuv420p",
+ "crf": 20,
+ "save_metadata": true,
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "filename": "AnimateDiff_00004.webm",
+ "subfolder": "",
+ "type": "temp",
+ "format": "video/webm",
+ "frame_rate": 8
+ }
+ }
+ }
+ }
+ ],
+ "links": [
+ [
+ 16,
+ 10,
+ 0,
+ 15,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 17,
+ 14,
+ 0,
+ 15,
+ 1,
+ "IMAGE"
+ ],
+ [
+ 18,
+ 16,
+ 0,
+ 15,
+ 2,
+ "MASK"
+ ],
+ [
+ 19,
+ 15,
+ 0,
+ 11,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 22,
+ 10,
+ 0,
+ 17,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 24,
+ 18,
+ 0,
+ 17,
+ 2,
+ "VHS_BatchManager"
+ ],
+ [
+ 25,
+ 18,
+ 0,
+ 10,
+ 0,
+ "VHS_BatchManager"
+ ],
+ [
+ 26,
+ 18,
+ 0,
+ 14,
+ 0,
+ "VHS_BatchManager"
+ ],
+ [
+ 27,
+ 18,
+ 0,
+ 11,
+ 2,
+ "VHS_BatchManager"
+ ],
+ [
+ 28,
+ 10,
+ 2,
+ 11,
+ 1,
+ "VHS_AUDIO"
+ ]
+ ],
+ "groups": [],
+ "config": {},
+ "extra": {},
+ "version": 0.4,
+ "tests": {
+ "17": [{"type": "video", "key": "nb_read_packets", "value": "16"}],
+ "11": [{"type": "video", "key": "nb_read_packets", "value": "16"},
+ {"type": "compare", "filename": "custom_nodes/ComfyUI-VideoHelperSuite/tests/outputs/batch.mp4", "tolerance": 0.02}
+ ],
+ "length": 1
+ }
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/tests/converted-format-input.json b/custom_nodes/comfyui-videohelpersuite/tests/converted-format-input.json
new file mode 100644
index 0000000000000000000000000000000000000000..e9722580df540b89a4b9185260a8de180ddd63aa
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/tests/converted-format-input.json
@@ -0,0 +1,253 @@
+{
+ "last_node_id": 19,
+ "last_link_id": 20,
+ "nodes": [
+ {
+ "id": 18,
+ "type": "PrimitiveNode",
+ "pos": [
+ 318,
+ 618
+ ],
+ "size": [
+ 210,
+ 82
+ ],
+ "flags": {},
+ "order": 0,
+ "mode": 0,
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "INT",
+ "type": "INT",
+ "links": [
+ 18
+ ],
+ "widget": {
+ "name": "crf"
+ }
+ }
+ ],
+ "properties": {
+ "Run widget replace on values": false
+ },
+ "widgets_values": [
+ 60,
+ "fixed"
+ ]
+ },
+ {
+ "id": 11,
+ "type": "LoadImage",
+ "pos": [
+ 260.4530029296875,
+ 233.2003173828125
+ ],
+ "size": [
+ 315,
+ 314
+ ],
+ "flags": {},
+ "order": 1,
+ "mode": 0,
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 19
+ ],
+ "slot_index": 0
+ },
+ {
+ "name": "MASK",
+ "type": "MASK",
+ "links": null
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "LoadImage"
+ },
+ "widgets_values": [
+ "example.png",
+ "image"
+ ]
+ },
+ {
+ "id": 17,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 733.3749389648438,
+ 338.28924560546875
+ ],
+ "size": [
+ 222.91415405273438,
+ 522.9141845703125
+ ],
+ "flags": {},
+ "order": 3,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 19
+ },
+ {
+ "name": "audio",
+ "type": "AUDIO",
+ "link": null,
+ "shape": 7
+ },
+ {
+ "name": "meta_batch",
+ "type": "VHS_BatchManager",
+ "link": null,
+ "shape": 7
+ },
+ {
+ "name": "vae",
+ "type": "VAE",
+ "link": null,
+ "shape": 7
+ },
+ {
+ "name": "crf",
+ "type": "INT",
+ "link": 18,
+ "widget": {
+ "name": "crf"
+ }
+ },
+ {
+ "name": "pix_fmt",
+ "type": [
+ "yuv420p",
+ "yuv420p10le"
+ ],
+ "link": 20,
+ "widget": {
+ "name": "pix_fmt"
+ }
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/h264-mp4",
+ "pix_fmt": "yuv420p10le",
+ "crf": 60,
+ "save_metadata": true,
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "filename": "AnimateDiff_00001.mp4",
+ "subfolder": "",
+ "type": "temp",
+ "format": "video/h264-mp4",
+ "frame_rate": 8
+ },
+ "muted": false
+ }
+ }
+ },
+ {
+ "id": 19,
+ "type": "PrimitiveNode",
+ "pos": [
+ 300,
+ 760
+ ],
+ "size": [
+ 290,
+ 110
+ ],
+ "flags": {},
+ "order": 2,
+ "mode": 0,
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "COMBO",
+ "type": "COMBO",
+ "links": [
+ 20
+ ],
+ "widget": {
+ "name": "pix_fmt"
+ }
+ }
+ ],
+ "properties": {
+ "Run widget replace on values": false
+ },
+ "widgets_values": [
+ "yuv420p10le",
+ "fixed",
+ ""
+ ]
+ }
+ ],
+ "links": [
+ [
+ 18,
+ 18,
+ 0,
+ 17,
+ 4,
+ "INT"
+ ],
+ [
+ 19,
+ 11,
+ 0,
+ 17,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 20,
+ 19,
+ 0,
+ 17,
+ 5,
+ [
+ "yuv420p",
+ "yuv420p10le"
+ ]
+ ]
+ ],
+ "groups": [],
+ "config": {},
+ "extra": {
+ "ds": {
+ "scale": 0.8264462809917354,
+ "offset": [
+ 45.8650452880864,
+ -157.46987175292935
+ ]
+ }
+ },
+ "version": 0.4,
+ "tests": {
+ "17": [{"type": "video", "key": "pix_fmt", "value": "yuv420p10le"}
+ ],
+ "length": 1
+ }
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/tests/converted-input.json b/custom_nodes/comfyui-videohelpersuite/tests/converted-input.json
new file mode 100644
index 0000000000000000000000000000000000000000..41a93a049ea95ea9ddda92ed3a5152b55581938f
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/tests/converted-input.json
@@ -0,0 +1,307 @@
+{
+ "last_node_id": 20,
+ "last_link_id": 23,
+ "nodes": [
+ {
+ "id": 18,
+ "type": "VHS_VideoInfoLoaded",
+ "pos": [
+ 424,
+ 427
+ ],
+ "size": {
+ "0": 304.79998779296875,
+ "1": 106
+ },
+ "flags": {},
+ "order": 2,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "video_info",
+ "type": "VHS_VIDEOINFO",
+ "link": 19
+ }
+ ],
+ "outputs": [
+ {
+ "name": "fps🟦",
+ "type": "FLOAT",
+ "links": [
+ 20
+ ],
+ "slot_index": 0,
+ "shape": 3
+ },
+ {
+ "name": "frame_count🟦",
+ "type": "INT",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "duration🟦",
+ "type": "FLOAT",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "width🟦",
+ "type": "INT",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "height🟦",
+ "type": "INT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoInfoLoaded"
+ },
+ "widgets_values": {}
+ },
+ {
+ "id": 17,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 783,
+ 223
+ ],
+ "size": [
+ 315,
+ 286
+ ],
+ "flags": {},
+ "order": 3,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 21
+ },
+ {
+ "name": "audio",
+ "type": "VHS_AUDIO",
+ "link": null
+ },
+ {
+ "name": "meta_batch",
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "frame_rate",
+ "type": "FLOAT",
+ "link": 20,
+ "widget": {
+ "name": "frame_rate"
+ }
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/h264-mp4",
+ "pix_fmt": "yuv420p",
+ "crf": 19,
+ "save_metadata": true,
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "filename": "AnimateDiff_00001.mp4",
+ "subfolder": "",
+ "type": "temp",
+ "format": "video/h264-mp4"
+ }
+ }
+ }
+ },
+ {
+ "id": 16,
+ "type": "VHS_LoadVideoPath",
+ "pos": [
+ 96,
+ 230
+ ],
+ "size": [
+ 315,
+ 449.5
+ ],
+ "flags": {},
+ "order": 1,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "meta_batch",
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "frame_load_cap",
+ "type": "INT",
+ "link": 23,
+ "slot_index": 1,
+ "widget": {
+ "name": "frame_load_cap"
+ }
+ }
+ ],
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 21
+ ],
+ "slot_index": 0,
+ "shape": 3
+ },
+ {
+ "name": "frame_count",
+ "type": "INT",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "audio",
+ "type": "VHS_AUDIO",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "video_info",
+ "type": "VHS_VIDEOINFO",
+ "links": [
+ 19
+ ],
+ "slot_index": 3,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_LoadVideoPath"
+ },
+ "widgets_values": {
+ "video": "input/leader.webm",
+ "force_rate": 0,
+ "force_size": "Disabled",
+ "custom_width": 512,
+ "custom_height": 512,
+ "frame_load_cap": 64,
+ "skip_first_frames": 0,
+ "select_every_nth": 1,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "frame_load_cap": 64,
+ "skip_first_frames": 0,
+ "force_rate": 0,
+ "filename": "input/leader.webm",
+ "type": "path",
+ "format": "video/webm",
+ "select_every_nth": 1
+ }
+ }
+ }
+ },
+ {
+ "id": 20,
+ "type": "PrimitiveNode",
+ "pos": [
+ -240,
+ 170
+ ],
+ "size": {
+ "0": 210,
+ "1": 80
+ },
+ "flags": {},
+ "order": 0,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "INT",
+ "type": "INT",
+ "links": [
+ 23
+ ],
+ "widget": {
+ "name": "frame_load_cap"
+ }
+ }
+ ],
+ "properties": {
+ "Run widget replace on values": false
+ },
+ "widgets_values": [
+ 64,
+ "fixed"
+ ]
+ }
+ ],
+ "links": [
+ [
+ 19,
+ 16,
+ 3,
+ 18,
+ 0,
+ "VHS_VIDEOINFO"
+ ],
+ [
+ 20,
+ 18,
+ 0,
+ 17,
+ 3,
+ "FLOAT"
+ ],
+ [
+ 21,
+ 16,
+ 0,
+ 17,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 23,
+ 20,
+ 0,
+ 16,
+ 1,
+ "INT"
+ ]
+ ],
+ "groups": [],
+ "config": {},
+ "extra": {},
+ "version": 0.4,
+ "tests": {
+ "17": [{"type": "video", "key": "width", "value": 1440},
+ {"type": "video", "key": "height", "value": 1080},
+ {"type": "video", "key": "nb_read_packets", "value": "64"}
+ ],
+ "length": 1
+ }
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/tests/loop.json b/custom_nodes/comfyui-videohelpersuite/tests/loop.json
new file mode 100644
index 0000000000000000000000000000000000000000..aa5dd4ecdaac29d04b71dbf3bbc8349f2d1210af
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/tests/loop.json
@@ -0,0 +1,178 @@
+{
+ "last_node_id": 3,
+ "last_link_id": 1,
+ "nodes": [
+ {
+ "id": 1,
+ "type": "VHS_LoadVideo",
+ "pos": {
+ "0": 54,
+ "1": 89
+ },
+ "size": [
+ 260,
+ 460
+ ],
+ "flags": {},
+ "order": 0,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "meta_batch",
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 1
+ ],
+ "slot_index": 0,
+ "shape": 3
+ },
+ {
+ "name": "frame_count",
+ "type": "INT",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "audio",
+ "type": "VHS_AUDIO",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "video_info",
+ "type": "VHS_VIDEOINFO",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_LoadVideo"
+ },
+ "widgets_values": {
+ "video": "leader.webm",
+ "force_rate": 8,
+ "force_size": "Disabled",
+ "custom_width": 304,
+ "custom_height": 312,
+ "frame_load_cap": 16,
+ "skip_first_frames": 1,
+ "select_every_nth": 1,
+ "choose video to upload": "image",
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "frame_load_cap": 16,
+ "skip_first_frames": 1,
+ "force_rate": 8,
+ "filename": "leader.webm",
+ "type": "input",
+ "format": "video/mp4",
+ "force_size": "410.4x?",
+ "select_every_nth": 1
+ }
+ }
+ }
+ },
+ {
+ "id": 3,
+ "type": "VHS_VideoCombine",
+ "pos": {
+ "0": 629,
+ "1": 222
+ },
+ "size": [
+ 320,
+ 550
+ ],
+ "flags": {},
+ "order": 1,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1
+ },
+ {
+ "name": "audio",
+ "type": "AUDIO",
+ "link": null
+ },
+ {
+ "name": "meta_batch",
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 1,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/h264-mp4",
+ "pix_fmt": "yuv420p",
+ "crf": 19,
+ "save_metadata": true,
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "filename": "AnimateDiff_00005.mp4",
+ "subfolder": "",
+ "type": "temp",
+ "format": "video/h264-mp4",
+ "frame_rate": 8
+ }
+ }
+ }
+ }
+ ],
+ "links": [
+ [
+ 1,
+ 1,
+ 0,
+ 3,
+ 0,
+ "IMAGE"
+ ]
+ ],
+ "groups": [],
+ "config": {},
+ "extra": {},
+ "version": 0.4,
+ "tests": {
+ "3": [{"type": "video", "key": "nb_read_packets", "value": "32"}],
+ "length": 1
+ }
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/tests/old-prores.json b/custom_nodes/comfyui-videohelpersuite/tests/old-prores.json
new file mode 100644
index 0000000000000000000000000000000000000000..17e77c1547663d39b5356ac15d74f807c69dc671
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/tests/old-prores.json
@@ -0,0 +1,423 @@
+{
+ "id": "bc7448ba-118f-4226-95ab-32227992f954",
+ "revision": 0,
+ "last_node_id": 6,
+ "last_link_id": 4,
+ "nodes": [
+ {
+ "id": 1,
+ "type": "VHS_LoadVideo",
+ "pos": [
+ 54,
+ 89
+ ],
+ "size": [
+ 245.1999969482422,
+ 492.7751770019531
+ ],
+ "flags": {},
+ "order": 0,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "meta_batch",
+ "shape": 7,
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "shape": 7,
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "slot_index": 0,
+ "links": [
+ 1,
+ 2,
+ 3,
+ 4
+ ]
+ },
+ {
+ "name": "frame_count",
+ "type": "INT",
+ "links": null
+ },
+ {
+ "name": "audio",
+ "type": "AUDIO",
+ "links": null
+ },
+ {
+ "name": "video_info",
+ "type": "VHS_VIDEOINFO",
+ "links": null
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_LoadVideo"
+ },
+ "widgets_values": {
+ "video": "leader.webm",
+ "force_rate": 8,
+ "custom_width": 512,
+ "custom_height": 0,
+ "frame_load_cap": 64,
+ "skip_first_frames": 1,
+ "select_every_nth": 1,
+ "format": "AnimateDiff",
+ "choose video to upload": "image",
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "frame_load_cap": 64,
+ "skip_first_frames": 0,
+ "force_rate": 8,
+ "filename": "leader.webm",
+ "type": "input",
+ "format": "video/mp4",
+ "select_every_nth": 1
+ }
+ }
+ }
+ },
+ {
+ "id": 4,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 630.9500122070312,
+ 136.90997314453125
+ ],
+ "size": [
+ 315,
+ 497.25
+ ],
+ "flags": {},
+ "order": 2,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 2
+ },
+ {
+ "name": "audio",
+ "shape": 7,
+ "type": "AUDIO",
+ "link": null
+ },
+ {
+ "name": "meta_batch",
+ "shape": 7,
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "shape": 7,
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/ProRes",
+ "profile": "2",
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "filename": "AnimateDiff_00004.mov",
+ "subfolder": "",
+ "type": "temp",
+ "format": "video/ProRes",
+ "frame_rate": 8,
+ "workflow": "AnimateDiff_00004.png"
+ }
+ }
+ }
+ },
+ {
+ "id": 3,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 635.0499267578125,
+ -407.1000061035156
+ ],
+ "size": [
+ 315,
+ 497.25
+ ],
+ "flags": {},
+ "order": 1,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1
+ },
+ {
+ "name": "audio",
+ "shape": 7,
+ "type": "AUDIO",
+ "link": null
+ },
+ {
+ "name": "meta_batch",
+ "shape": 7,
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "shape": 7,
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/ProRes",
+ "profile": "1",
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "filename": "AnimateDiff_00001.mov",
+ "subfolder": "",
+ "type": "temp",
+ "format": "video/ProRes",
+ "frame_rate": 8,
+ "workflow": "AnimateDiff_00001.png"
+ }
+ }
+ }
+ },
+ {
+ "id": 5,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 974.6401977539062,
+ -409.33984375
+ ],
+ "size": [
+ 315,
+ 497.25
+ ],
+ "flags": {},
+ "order": 3,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 3
+ },
+ {
+ "name": "audio",
+ "shape": 7,
+ "type": "AUDIO",
+ "link": null
+ },
+ {
+ "name": "meta_batch",
+ "shape": 7,
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "shape": 7,
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/ProRes",
+ "profile": "3",
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "filename": "AnimateDiff_00002.mov",
+ "subfolder": "",
+ "type": "temp",
+ "format": "video/ProRes",
+ "frame_rate": 8,
+ "workflow": "AnimateDiff_00002.png"
+ }
+ }
+ }
+ },
+ {
+ "id": 6,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 968.7000122070312,
+ 138.7698974609375
+ ],
+ "size": [
+ 315,
+ 497.25
+ ],
+ "flags": {},
+ "order": 4,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 4
+ },
+ {
+ "name": "audio",
+ "shape": 7,
+ "type": "AUDIO",
+ "link": null
+ },
+ {
+ "name": "meta_batch",
+ "shape": 7,
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "shape": 7,
+ "type": "VAE",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/ProRes",
+ "profile": "4",
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "filename": "AnimateDiff_00003.mov",
+ "subfolder": "",
+ "type": "temp",
+ "format": "video/ProRes",
+ "frame_rate": 8
+ }
+ }
+ }
+ }
+ ],
+ "links": [
+ [
+ 1,
+ 1,
+ 0,
+ 3,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 2,
+ 1,
+ 0,
+ 4,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 3,
+ 1,
+ 0,
+ 5,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 4,
+ 1,
+ 0,
+ 6,
+ 0,
+ "IMAGE"
+ ]
+ ],
+ "groups": [],
+ "config": {},
+ "extra": {
+ "frontendVersion": "1.17.0",
+ "VHS_latentpreview": true,
+ "VHS_latentpreviewrate": 0,
+ "VHS_MetadataImage": true,
+ "VHS_KeepIntermediate": true
+ },
+ "version": 0.4,
+ "tests": {
+ "6": [{"type": "video", "key": "pix_fmt", "value": "yuv444p12le"}],
+ "length": 1
+ }
+}
\ No newline at end of file
diff --git a/custom_nodes/comfyui-videohelpersuite/tests/old-vae-conversion.json b/custom_nodes/comfyui-videohelpersuite/tests/old-vae-conversion.json
new file mode 100644
index 0000000000000000000000000000000000000000..e751918b6473cae2f38536d8433bc40b2283a3f6
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/tests/old-vae-conversion.json
@@ -0,0 +1,229 @@
+{
+ "last_node_id": 10,
+ "last_link_id": 9,
+ "nodes": [
+ {
+ "id": 7,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 746,
+ 309
+ ],
+ "size": [
+ 320,
+ 468.7188019966722
+ ],
+ "flags": {},
+ "order": 2,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "LATENT",
+ "link": 9
+ },
+ {
+ "name": "audio",
+ "type": "AUDIO",
+ "link": null
+ },
+ {
+ "name": "meta_batch",
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "type": "VAE",
+ "link": 8
+ }
+ ],
+ "outputs": [
+ {
+ "name": "Filenames",
+ "type": "VHS_FILENAMES",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/webm",
+ "crf": 20,
+ "save_metadata": true,
+ "pingpong": false,
+ "save_output": false,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "filename": "AnimateDiff_00001.webm",
+ "subfolder": "",
+ "type": "temp",
+ "format": "video/webm",
+ "frame_rate": 8
+ }
+ }
+ }
+ },
+ {
+ "id": 6,
+ "type": "VHS_LoadVideoPath",
+ "pos": [
+ 171,
+ 239
+ ],
+ "size": [
+ 320,
+ 420.7188019966722
+ ],
+ "flags": {},
+ "order": 1,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "meta_batch",
+ "type": "VHS_BatchManager",
+ "link": null
+ },
+ {
+ "name": "vae",
+ "type": "VAE",
+ "link": 7,
+ "slot_index": 1
+ }
+ ],
+ "outputs": [
+ {
+ "name": "LATENT",
+ "type": "LATENT",
+ "links": [
+ 9
+ ],
+ "slot_index": 0,
+ "shape": 3
+ },
+ {
+ "name": "frame_count",
+ "type": "INT",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "audio",
+ "type": "AUDIO",
+ "links": [],
+ "slot_index": 2,
+ "shape": 3
+ },
+ {
+ "name": "video_info",
+ "type": "VHS_VIDEOINFO",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_LoadVideoPath"
+ },
+ "widgets_values": {
+ "video": "input/bigbuckbunny.mp4",
+ "force_rate": 8,
+ "force_size": "Disabled",
+ "custom_width": 512,
+ "custom_height": 512,
+ "frame_load_cap": 64,
+ "skip_first_frames": 0,
+ "select_every_nth": 1,
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "frame_load_cap": 64,
+ "skip_first_frames": 0,
+ "force_rate": 8,
+ "filename": "input/bigbuckbunny.mp4",
+ "type": "path",
+ "format": "video/mp4",
+ "select_every_nth": 1
+ }
+ }
+ }
+ },
+ {
+ "id": 10,
+ "type": "VAELoader",
+ "pos": [
+ -42,
+ 88
+ ],
+ "size": {
+ "0": 315,
+ "1": 58
+ },
+ "flags": {},
+ "order": 0,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "VAE",
+ "type": "VAE",
+ "links": [
+ 7,
+ 8
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VAELoader"
+ },
+ "widgets_values": [
+ "taesd"
+ ]
+ }
+ ],
+ "links": [
+ [
+ 7,
+ 10,
+ 0,
+ 6,
+ 1,
+ "VAE"
+ ],
+ [
+ 8,
+ 10,
+ 0,
+ 7,
+ 3,
+ "VAE"
+ ],
+ [
+ 9,
+ 6,
+ 0,
+ 7,
+ 0,
+ "LATENT"
+ ]
+ ],
+ "groups": [],
+ "config": {},
+ "extra": {},
+ "version": 0.4,
+ "tests": {
+ "7": [{"type": "video", "key": "width", "value": 1920},
+ {"type": "video", "key": "height", "value": 1080},
+ {"type": "video", "key": "nb_read_packets", "value": "64"}
+ ],
+ "length": 1
+ }
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/tests/simple.json b/custom_nodes/comfyui-videohelpersuite/tests/simple.json
new file mode 100644
index 0000000000000000000000000000000000000000..4d7f8ddd68a24cc90519ecd127daae9d8ab81b85
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/tests/simple.json
@@ -0,0 +1,134 @@
+{
+ "last_node_id": 3,
+ "last_link_id": 1,
+ "nodes": [
+ {
+ "id": 1,
+ "type": "VHS_LoadVideo",
+ "pos": [
+ 54,
+ 89
+ ],
+ "size": [
+ 235.1999969482422,
+ 384.56999829610186
+ ],
+ "flags": {},
+ "order": 0,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 1
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "frame_count",
+ "type": "INT",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "audio",
+ "type": "VHS_AUDIO",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "VHS_LoadVideo"
+ },
+ "widgets_values": {
+ "video": "leader.webm",
+ "force_rate": 8,
+ "force_size": "Custom Width",
+ "custom_width": 304,
+ "custom_height": 312,
+ "frame_load_cap": 16,
+ "skip_first_frames": 1,
+ "select_every_nth": 1,
+ "choose video to upload": "image",
+ "videopreview": {
+ "hidden": false,
+ "paused": false,
+ "params": {
+ "frame_load_cap": 0,
+ "skip_first_frames": 0,
+ "force_rate": 0,
+ "filename": "leader.webm",
+ "type": "input",
+ "format": "video/mp4",
+ "force_size": "410.4x?",
+ "select_every_nth": 1
+ }
+ }
+ }
+ },
+ {
+ "id": 3,
+ "type": "VHS_VideoCombine",
+ "pos": [
+ 629,
+ 222
+ ],
+ "size": {
+ "0": 315,
+ "1": 250
+ },
+ "flags": {},
+ "order": 1,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1
+ }
+ ],
+ "outputs": [],
+ "properties": {
+ "Node name for S&R": "VHS_VideoCombine"
+ },
+ "widgets_values": {
+ "frame_rate": 8,
+ "loop_count": 0,
+ "filename_prefix": "AnimateDiff",
+ "format": "video/webm",
+ "pingpong": false,
+ "save_image": false,
+ "crf": 20,
+ "save_metadata": false,
+ "audio_file": "",
+ "videopreview": {
+ "hidden": false,
+ "paused": false
+ }
+ }
+ }
+ ],
+ "links": [
+ [
+ 1,
+ 1,
+ 0,
+ 3,
+ 0,
+ "IMAGE"
+ ]
+ ],
+ "groups": [],
+ "config": {},
+ "extra": {},
+ "version": 0.4,
+ "tests": {
+ "3": [{"type": "video", "key": "width", "value": 304},
+ {"type": "video", "key": "height", "value": 232},
+ {"type": "compare", "filename": "custom_nodes/ComfyUI-VideoHelperSuite/tests/outputs/simple.webm", "tolerance": 0.02}
+ ],
+ "length": 1
+ }
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/16bit-png.json b/custom_nodes/comfyui-videohelpersuite/video_formats/16bit-png.json
new file mode 100644
index 0000000000000000000000000000000000000000..b768bdbcfe8950cb7bde37d02444f0191ad29f51
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/16bit-png.json
@@ -0,0 +1,9 @@
+{
+ "main_pass":
+ [
+ "-n",
+ "-pix_fmt", "rgba64"
+ ],
+ "input_color_depth": "16bit",
+ "extension": "%03d.png"
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/8bit-png.json b/custom_nodes/comfyui-videohelpersuite/video_formats/8bit-png.json
new file mode 100644
index 0000000000000000000000000000000000000000..88b27a75f9c979f18979ec46da8c8843a82e0759
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/8bit-png.json
@@ -0,0 +1,7 @@
+{
+ "main_pass":
+ [
+ "-n"
+ ],
+ "extension": "%03d.png"
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/ProRes.json b/custom_nodes/comfyui-videohelpersuite/video_formats/ProRes.json
new file mode 100644
index 0000000000000000000000000000000000000000..eddd3acf931c5ab3486197c18ba88a3959d3e1d6
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/ProRes.json
@@ -0,0 +1,22 @@
+{
+ "main_pass":
+ [
+ "-n", "-c:v", "prores_ks",
+ "-profile:v", [["$profile"]],
+ ["profile", {
+ "lt": [[]], "1": [[]], "standard": [[]], "2": [[]], "hq": [[]], "3": [[]],
+ "4": ["has_alpha", {"True": [["-pix_fmt", "yuva444p10le"]],
+ "False": [["-pix_fmt", "yuv444p10le"]]}],
+ "4444": ["has_alpha", {"True": [["-pix_fmt", "yuva444p10le"]],
+ "False": [["-pix_fmt", "yuv444p10le"]]}],
+ "4444xq": ["has_alpha", {"True": [["-pix_fmt", "yuva444p10le"]],
+ "False": [["-pix_fmt", "yuv444p10le"]]}]
+ }],
+ "-vf", "scale=out_color_matrix=bt709",
+ "-colorspace", "bt709", "-color_primaries", "bt709", "-color_trc", "bt709"
+ ],
+ "fake_trc": "bt709",
+ "audio_pass": ["-c:a", "pcm_s16le"],
+ "extension": "mov",
+ "extra_widgets": [["profile", ["lt", "standard", "hq", "4444", "4444xq"], {"default": "hq"}]]
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/av1-webm.json b/custom_nodes/comfyui-videohelpersuite/video_formats/av1-webm.json
new file mode 100644
index 0000000000000000000000000000000000000000..659ea166fb140e18109f09f3d5710363af9c2294
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/av1-webm.json
@@ -0,0 +1,16 @@
+{
+ "main_pass":
+ [
+ "-n", "-c:v", "libsvtav1",
+ "-pix_fmt", ["pix_fmt", ["yuv420p10le", "yuv420p"]],
+ "-crf", ["crf","INT", {"default": 23, "min": 0, "max": 100, "step": 1}],
+ "-vf", "scale=out_color_matrix=bt709",
+ "-color_range", "tv", "-colorspace", "bt709", "-color_primaries", "bt709", "-color_trc", "bt709"
+ ],
+ "fake_trc": "bt709",
+ "audio_pass": ["-c:a", "libopus"],
+ "input_color_depth": ["input_color_depth", ["8bit", "16bit"]],
+ "save_metadata": ["save_metadata", "BOOLEAN", {"default": true}],
+ "extension": "webm",
+ "environment": {"SVT_LOG": "1"}
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/ffmpeg-gif.json b/custom_nodes/comfyui-videohelpersuite/video_formats/ffmpeg-gif.json
new file mode 100644
index 0000000000000000000000000000000000000000..3ca0865033c7dabc06176c737652f375e7badb27
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/ffmpeg-gif.json
@@ -0,0 +1,8 @@
+{
+ "main_pass":
+ [
+ "-n",
+ "-filter_complex", ["dither", ["bayer", "heckbert", "floyd_steinberg", "sierra2", "sierra2_4a", "sierra3", "burkes", "atkinson", "none"], {"default": "sierra2_4a"}, "[0:v] split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse=dither=$val"]
+ ],
+ "extension": "gif"
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/ffv1-mkv.json b/custom_nodes/comfyui-videohelpersuite/video_formats/ffv1-mkv.json
new file mode 100644
index 0000000000000000000000000000000000000000..3248e5fc6425feeb1d55ccdb8bd8d49cb0e3401c
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/ffv1-mkv.json
@@ -0,0 +1,18 @@
+{
+ "main_pass": [
+ "-n",
+ "-c:v", "ffv1",
+ "-level", ["level", ["0", "1", "3"], {"default": "3"}],
+ "-coder", ["coder", ["0", "1", "2"], {"default": "1"}],
+ "-context", ["context", ["0", "1"], {"default": "1"}],
+ "-g", ["gop_size", "INT", {"default": 1, "min": 1, "max": 300, "step": 1}],
+ "-slices", ["slices", ["4", "6", "9", "12", "16", "20", "24", "30"], {"default": "16"}],
+ "-slicecrc", ["slicecrc", ["0", "1"], {"default": "1"}],
+ "-pix_fmt", ["pix_fmt", ["rgba64le", "bgra", "yuv420p", "yuv422p", "yuv444p", "yuva420p", "yuva422p", "yuva444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuv420p12le", "yuv422p12le", "yuv444p12le", "yuv420p14le", "yuv422p14le", "yuv444p14le", "yuv420p16le", "yuv422p16le", "yuv444p16le", "gray", "gray10le", "gray12le", "gray16le"], {"default": "rgba64le"}]
+ ],
+ "audio_pass": ["-c:a", "flac"],
+ "save_metadata": ["save_metadata", "BOOLEAN", {"default": true}],
+ "trim_to_audio": ["trim_to_audio", "BOOLEAN", {"default": false}],
+ "input_color_depth": "16bit",
+ "extension": "mkv"
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/gifski.json b/custom_nodes/comfyui-videohelpersuite/video_formats/gifski.json
new file mode 100644
index 0000000000000000000000000000000000000000..c96b358ab0ae59dbd97c52a699c8ee9825c5d351
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/gifski.json
@@ -0,0 +1,12 @@
+{
+ "main_pass":
+ [
+ "-pix_fmt", "yuv444p",
+ "-vf", "scale=out_color_matrix=bt709:out_range=pc",
+ "-color_range", "pc"
+ ],
+ "extension": "gif",
+ "gifski_pass": [
+ "-Q", ["quality","INT", {"default": 90, "min": 1, "max": 100, "step": 1}]
+ ]
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/h264-mp4.json b/custom_nodes/comfyui-videohelpersuite/video_formats/h264-mp4.json
new file mode 100644
index 0000000000000000000000000000000000000000..89d290c92cd44674e2fe6dca8d0a240d6bf9695b
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/h264-mp4.json
@@ -0,0 +1,15 @@
+{
+ "main_pass":
+ [
+ "-n", "-c:v", "libx264",
+ "-pix_fmt", ["pix_fmt", ["yuv420p", "yuv420p10le"]],
+ "-crf", ["crf","INT", {"default": 19, "min": 0, "max": 100, "step": 1}],
+ "-vf", "scale=out_color_matrix=bt709",
+ "-color_range", "tv", "-colorspace", "bt709", "-color_primaries", "bt709", "-color_trc", "bt709"
+ ],
+ "fake_trc": "bt709",
+ "audio_pass": ["-c:a", "aac"],
+ "save_metadata": ["save_metadata", "BOOLEAN", {"default": true}],
+ "trim_to_audio": ["trim_to_audio", "BOOLEAN", {"default": false}],
+ "extension": "mp4"
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/h265-mp4.json b/custom_nodes/comfyui-videohelpersuite/video_formats/h265-mp4.json
new file mode 100644
index 0000000000000000000000000000000000000000..b5d0150bf9cdb21f396f026a0d7721626c698822
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/h265-mp4.json
@@ -0,0 +1,17 @@
+{
+ "main_pass":
+ [
+ "-n", "-c:v", "libx265",
+ "-vtag", "hvc1",
+ "-pix_fmt", ["pix_fmt", ["yuv420p10le", "yuv420p"]],
+ "-crf", ["crf","INT", {"default": 22, "min": 0, "max": 100, "step": 1}],
+ "-preset", "medium",
+ "-x265-params", "log-level=quiet",
+ "-vf", "scale=out_color_matrix=bt709",
+ "-color_range", "tv", "-colorspace", "bt709", "-color_primaries", "bt709", "-color_trc", "bt709"
+ ],
+ "fake_trc": "bt709",
+ "audio_pass": ["-c:a", "aac"],
+ "save_metadata": ["save_metadata", "BOOLEAN", {"default": true}],
+ "extension": "mp4"
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/nvenc_av1-mp4.json b/custom_nodes/comfyui-videohelpersuite/video_formats/nvenc_av1-mp4.json
new file mode 100644
index 0000000000000000000000000000000000000000..0996c65b3f586897a2b131997ff1faaa6a4b828e
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/nvenc_av1-mp4.json
@@ -0,0 +1,15 @@
+{
+ "main_pass":
+ [
+ "-n", "-c:v", "av1_nvenc",
+ "-pix_fmt", ["pix_fmt", ["yuv420p", "p010le"]],
+ "-vf", "scale=out_color_matrix=bt709",
+ "-color_range", "tv", "-colorspace", "bt709", "-color_primaries", "bt709", "-color_trc", "bt709"
+ ],
+ "fake_trc": "bt709",
+ "audio_pass": ["-c:a", "aac"],
+ "bitrate": ["bitrate","INT", {"default": 10, "min": 1, "max": 999, "step": 1 }],
+ "megabit": ["megabit","BOOLEAN", {"default": true}],
+ "save_metadata": ["save_metadata", "BOOLEAN", {"default": true}],
+ "extension": "mp4"
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/nvenc_h264-mp4.json b/custom_nodes/comfyui-videohelpersuite/video_formats/nvenc_h264-mp4.json
new file mode 100644
index 0000000000000000000000000000000000000000..1c39913ab6419fb2f7b1c0a6241b7fea1cc2cb11
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/nvenc_h264-mp4.json
@@ -0,0 +1,15 @@
+{
+ "main_pass":
+ [
+ "-n", "-c:v", "h264_nvenc",
+ "-pix_fmt", ["pix_fmt", ["yuv420p", "p010le"]],
+ "-vf", "scale=out_color_matrix=bt709",
+ "-color_range", "tv", "-colorspace", "bt709", "-color_primaries", "bt709", "-color_trc", "bt709"
+ ],
+ "fake_trc": "bt709",
+ "audio_pass": ["-c:a", "aac"],
+ "bitrate": ["bitrate","INT", {"default": 10, "min": 1, "max": 999, "step": 1 }],
+ "megabit": ["megabit","BOOLEAN", {"default": true}],
+ "save_metadata": ["save_metadata", "BOOLEAN", {"default": true}],
+ "extension": "mp4"
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/nvenc_hevc-mp4.json b/custom_nodes/comfyui-videohelpersuite/video_formats/nvenc_hevc-mp4.json
new file mode 100644
index 0000000000000000000000000000000000000000..2ec6f4169d02466287026e4989b930ec3b64c200
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/nvenc_hevc-mp4.json
@@ -0,0 +1,16 @@
+{
+ "main_pass":
+ [
+ "-n", "-c:v", "hevc_nvenc",
+ "-vtag", "hvc1",
+ "-pix_fmt", ["pix_fmt", ["yuv420p", "p010le"]],
+ "-vf", "scale=out_color_matrix=bt709",
+ "-color_range", "tv", "-colorspace", "bt709", "-color_primaries", "bt709", "-color_trc", "bt709"
+ ],
+ "fake_trc": "bt709",
+ "audio_pass": ["-c:a", "aac"],
+ "bitrate": ["bitrate","INT", {"default": 10, "min": 1, "max": 999, "step": 1 }],
+ "megabit": ["megabit","BOOLEAN", {"default": true}],
+ "save_metadata": ["save_metadata", "BOOLEAN", {"default": true}],
+ "extension": "mp4"
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/video_formats/webm.json b/custom_nodes/comfyui-videohelpersuite/video_formats/webm.json
new file mode 100644
index 0000000000000000000000000000000000000000..6323f619ad2850ba60cd5e31b32cdfc060e030c9
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/video_formats/webm.json
@@ -0,0 +1,16 @@
+{
+ "main_pass":
+ [
+ "-n",
+ "-pix_fmt", ["pix_fmt",["yuv420p","yuva420p"]],
+ "-crf", ["crf","INT", {"default": 20, "min": 0, "max": 100, "step": 1}],
+ "-b:v", "0",
+ "-vf", "scale=out_color_matrix=bt709",
+ "-color_range", "tv", "-colorspace", "bt709", "-color_primaries", "bt709", "-color_trc", "bt709"
+ ],
+ "fake_trc": "bt709",
+ "audio_pass": ["-c:a", "libvorbis"],
+ "save_metadata": ["save_metadata", "BOOLEAN", {"default": true}],
+ "trim_to_audio": ["trim_to_audio", "BOOLEAN", {"default": false}],
+ "extension": "webm"
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/videohelpersuite/batched_nodes.py b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/batched_nodes.py
new file mode 100644
index 0000000000000000000000000000000000000000..624bb84f73cce1d8e51abf4fef0b80367ad4b9a3
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/batched_nodes.py
@@ -0,0 +1,56 @@
+import torch
+from nodes import VAEEncode
+from comfy.utils import ProgressBar
+
+
+class VAEDecodeBatched:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "samples": ("LATENT", ),
+ "vae": ("VAE", ),
+ "per_batch": ("INT", {"default": 16, "min": 1})
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/batched nodes"
+
+ RETURN_TYPES = ("IMAGE",)
+ FUNCTION = "decode"
+
+ def decode(self, vae, samples, per_batch):
+ decoded = []
+ pbar = ProgressBar(samples["samples"].shape[0])
+ for start_idx in range(0, samples["samples"].shape[0], per_batch):
+ decoded.append(vae.decode(samples["samples"][start_idx:start_idx+per_batch]))
+ pbar.update(per_batch)
+ return (torch.cat(decoded, dim=0), )
+
+
+class VAEEncodeBatched:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "pixels": ("IMAGE", ), "vae": ("VAE", ),
+ "per_batch": ("INT", {"default": 16, "min": 1})
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/batched nodes"
+
+ RETURN_TYPES = ("LATENT",)
+ FUNCTION = "encode"
+
+ def encode(self, vae, pixels, per_batch):
+ t = []
+ pbar = ProgressBar(pixels.shape[0])
+ for start_idx in range(0, pixels.shape[0], per_batch):
+ try:
+ sub_pixels = vae.vae_encode_crop_pixels(pixels[start_idx:start_idx+per_batch])
+ except:
+ sub_pixels = VAEEncode.vae_encode_crop_pixels(pixels[start_idx:start_idx+per_batch])
+ t.append(vae.encode(sub_pixels[:,:,:,:3]))
+ pbar.update(per_batch)
+ return ({"samples": torch.cat(t, dim=0)}, )
diff --git a/custom_nodes/comfyui-videohelpersuite/videohelpersuite/documentation.py b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/documentation.py
new file mode 100644
index 0000000000000000000000000000000000000000..857de6c6a5b4a3917f49d0b1c5c142f274203f22
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/documentation.py
@@ -0,0 +1,616 @@
+from .logger import logger
+
+def image(src):
+ return f' '
+def video(src):
+ return f''
+def short_desc(desc):
+ return f'{desc}
'
+
+def format_each(desc, **kwargs):
+ if isinstance(desc, dict):
+ res = {}
+ for k,v in desc.items():
+ res[format_each(k, **kwargs)] = format_each(v, **kwargs)
+ return res
+ if isinstance(desc, list):
+ res = []
+ for v in desc:
+ res.append(format_each(v, **kwargs))
+ return res
+ return desc.format(**kwargs)
+def format_type(desc, lower, lowers=None, upper=None, uppers=None, cap=None):
+ """Utility function for nodes with image/latent/mask variants"""
+ if lowers is None:
+ lowers = lower + 's'
+ if cap is None:
+ cap = lower.capitalize()
+ if upper is None:
+ upper = lower.upper()
+ if uppers is None:
+ uppers = lowers.upper()
+ return format_each(desc, lower=lower, lowers=lowers, upper=upper, uppers=uppers, cap=cap)
+
+common_descriptions = {
+ 'merge_strategy': [
+ 'Determines what the output resolution will be if input resolutions don\'t match',
+ {'match A': 'Always use the resolution for A',
+ 'match B': 'Always use the resolution for B',
+ 'match smaller': 'Pick the smaller resolution by area',
+ 'match larger': 'Pick the larger resolution by area',
+ }],
+ 'scale_method': [
+ 'Determines what method to use if scaling is required',
+ ],
+ 'crop_method': 'When sizes don\'t match, should the resized image have it\'s aspect ratio changed, or be cropped to maintain aspect ratio',
+ 'VHS_PATH': [
+ 'This is a VHS_PATH input. When edited, it provides a list of possible valid files or directories',
+ video('https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite/assets/4284322/729b7185-1fca-41d8-bc8d-a770bb2a5ce6'),
+ 'The current top-most completion may be selected with Tab',
+ 'You can navigate up a directory by pressing Ctrl+B (or Ctrl+W if supported by browser)',
+ 'The filter on suggested file types can be disabled by pressing Ctrl+G.',
+ 'If converted to an input, this functions as a string',
+ ],
+ "GetCount": ['Get {cap} Count 🎥🅥🅗🅢', short_desc('Return the number of {lowers} in an input as an INT'),
+ {'Inputs': {
+ '{lowers}': 'The input {lower}',
+ },
+ 'Outputs': {
+ 'count': 'The number of {lowers} in the input',
+ },
+ }],
+ "SelectEveryNth": ['Select Every Nth {cap} 🎥🅥🅗🅢', short_desc('Keep only 1 {lower} for every interval'),
+ {'Inputs': {
+ '{lowers}': 'The input {lower}',
+ },
+ 'Outputs': {
+ '{upper}': 'The output {lowers}',
+ 'count': 'The number of {lowers} in the input',
+ },
+ 'Widgets':{
+ 'select_every_nth': 'The interval from which one frame is kept. 1 means no frames are skipped.',
+ 'skip_first_{lowers}': 'A number of frames which that is skipped from the start. This applies before select_every_nth. As a result, multiple copies of the node can each have a different skip_first_frames to divide the {lower} into groups'
+ },
+ }],
+}
+
+descriptions = {
+ 'VHS_VideoCombine': ['Video Combine 🎥🅥🅗🅢', short_desc('Combine an image sequence into a video'), {
+ 'Inputs': {
+ 'images': 'The images to be turned into a video',
+ 'audio':'(optional) audio to add to the video',
+ 'meta_batch': '(optional) Connect to a Meta Batch manager to divide extremely long image sequences into sub batches. See the documentation for Meta Batch Manager',
+ 'vae':['(optional) If provided, the node will take latents as input instead of images. This drastically reduces the required RAM (not VRAM) when working with long (100+ frames) sequences',
+ "Unlike on Load Video, this isn't always a strict upgrade over using a standalone VAE Decode.",
+ "If you have multiple Video Combine outputs, then the VAE decode will be performed for each output node increasing execution time",
+ "If you make any change to output settings on the Video Combine (such as changing the output format), the VAE decode will be performed again as the decoded result is (by design) not cached",
+ ]
+ },
+ 'Widgets':{
+ 'frame_rate': 'The frame rate which will be used for the output video. Consider converting this to an input and connecting this to a Load Video with Video Info(Loaded)->fps. When including audio, failure to properly set this will result in audio desync',
+ 'loop_count': 'The number of additional times the video should repeat. Can cause performance issues when used with long (100+ frames) sequences',
+ 'filename_prefix': 'A prefix to add to the name of the output filename. This can include subfolders or format strings.',
+ 'format': 'The output format to use. Formats starting with, \'image\' are saved with PIL, but formats starting with \'video\' utilize the video_formats system. \'video\' options require ffmpeg and selecting one frequently adds additional options to the node.',
+ 'pingpong': 'Play the video normally, then repeat the video in reverse so that it \'pingpongs\' back and forth. This is frequently used to minimize the appearance of skips on very short animations.',
+ 'save_output': 'Specifies if output files should be saved to the output folder, or the temporary output folder',
+ 'videopreview': 'Displays a preview for the processed result. If advanced previews is enabled, the output is always converted to a format viewable from the browser. If the video has audio, it will also be previewed when moused over. Additional preview options can be accessed with right click.',
+ },
+ 'Common Format Widgets': {
+ 'crf': 'Determines how much to prioritize quality over filesize. Numbers vary between formats, but on each format that includes it, the default value provides visually loss less output',
+ 'pix_fmt': ['The pixel format to use for output. Alternative options will often have higher quality at the cost of increased file size and reduced compatibility with external software.', {
+ 'yuv420p': 'The most common and default format',
+ 'yuv420p10le': 'Use 10 bit color depth. This can improve color quality when combined with 16bit input color depth',
+ 'yuva420p': 'Include transparency in the output video'
+ }],
+ 'input_color_depth': 'VHS supports outputting 16bit images. While this produces higher quality output, the difference usually isn\'t visible without postprocessing and it significantly increases file size and processing time.',
+ 'save_metadata': 'Determines if metadata for the workflow should be included in the output video file',
+ }
+ }],
+ 'VHS_LoadVideo': ['Load Video 🎥🅥🅗🅢', short_desc('Loads a video from the input folder'),
+ {'Inputs': {
+ 'meta_batch': '(optional) Connect to a Meta Batch manager to divide extremely long sequences into sub batches. See the documentation for Meta Batch Manager',
+ 'vae': ['(optional) If provided the node will output latents instead of images. This drastically reduces the required RAM (not VRAM) when working with long (100+ frames) sequences',
+ 'Using this is strongly encouraged unless connecting to a node that requires a blue image connection such as Apply Controllnet',
+ ],
+ },
+ 'Outputs': {
+ 'IMAGE': 'The loaded images',
+ 'frame_count': 'The length of images just returned',
+ 'audio': 'The audio from the loaded video',
+ 'video_info': 'Exposes additional info about the video such as the source frame rate, or the total length',
+ 'LATENT': 'The loaded images pre-converted to latents. Only available when a vae is connected',
+ },
+ 'Widgets': {
+ 'video': 'The video file to be loaded. Lists all files with a video extension in the ComfyUI/Input folder',
+ 'force_rate': 'Drops or duplicates frames so that the produced output has the target frame rate. Many motion models are trained on videos of a specific frame rate and will give better results if input matches that frame rate. If set to 0, all frames are returned. May give unusual results with inputs that have a variable frame rate like animated gifs. Reducing this value can also greatly reduce the execution time and memory requirements.',
+ 'force_size': 'Previously was used to provide suggested resolutions. Instead, custom_width and custom_height can be disabled by setting to 0.',
+ 'custom_width': 'Allows for an arbitrary width to be entered, cropping to maintain aspect ratio if both are set',
+ 'custom_height': 'Allows for an arbitrary height to be entered, cropping to maintain aspect ratio if both are set',
+ 'frame_load_cap': 'The maximum number of frames to load. If 0, all frames are loaded.',
+ 'skip_first_frames': 'A number of frames which are discarded before producing output.',
+ 'select_every_nth': 'Similar to frame rate. Keeps only the first of every n frames and discard the rest. Has better compatibility with variable frame rate inputs such as gifs. When combined with force_rate, select_every_nth_applies after force_rate so the resulting output has a frame rate equivalent to force_rate/select_every_nth. select_every_nth does not apply to skip_first_frames',
+ 'format': 'Updates other widgets so that only values supported by the given format can be entered and provides recommended defaults.',
+ 'choose video to upload': 'An upload button is provided to upload local files to the input folder',
+ 'videopreview': 'Displays a preview for the selected video input. If advanced previews is enabled, this preview will reflect the frame_load_cap, force_rate, skip_first_frames, and select_every_nth values chosen. If the video has audio, it will also be previewed when moused over. Additional preview options can be accessed with right click.',
+ }
+ }],
+ 'VHS_LoadVideoFFmpeg': ['Load Video FFmpeg 🎥🅥🅗🅢', short_desc('Loads a video from the input folder using ffmpeg instead of opencv'),
+ 'Provides faster execution speed, transparency support, and allows specifying start time in seconds',
+ {'Inputs': {
+ 'meta_batch': '(optional) Connect to a Meta Batch manager to divide extremely long sequences into sub batches. See the documentation for Meta Batch Manager',
+ 'vae': ['(optional) If provided the node will output latents instead of images. This drastically reduces the required RAM (not VRAM) when working with long (100+ frames) sequences',
+ 'Using this is strongly encouraged unless connecting to a node that requires a blue image connection such as Apply Controllnet',
+ ],
+ },
+ 'Outputs': {
+ 'IMAGE': 'The loaded images',
+ 'mask': 'Transparency data from the loaded video',
+ 'audio': 'The audio from the loaded video',
+ 'video_info': 'Exposes additional info about the video such as the source frame rate, or the total length',
+ 'LATENT': 'The loaded images pre-converted to latents. Only available when a vae is connected',
+ },
+ 'Widgets': {
+ 'video': 'The video file to be loaded. Lists all files with a video extension in the ComfyUI/Input folder',
+ 'force_rate': 'Drops or duplicates frames so that the produced output has the target frame rate. Many motion models are trained on videos of a specific frame rate and will give better results if input matches that frame rate. If set to 0, all frames are returned. May give unusual results with inputs that have a variable frame rate like animated gifs. Reducing this value can also greatly reduce the execution time and memory requirements.',
+ 'force_size': 'Previously was used to provide suggested resolutions. Instead, custom_width and custom_height can be disabled by setting to 0.',
+ 'custom_width': 'Allows for an arbitrary width to be entered, cropping to maintain aspect ratio if both are set',
+ 'custom_height': 'Allows for an arbitrary height to be entered, cropping to maintain aspect ratio if both are set',
+ 'frame_load_cap': 'The maximum number of frames to load. If 0, all frames are loaded.',
+ 'start_time': 'A timestamp, in seconds from the start of the video, to start loading frames from. ',
+ 'format': 'Updates other widgets so that only values supported by the given format can be entered and provides recommended defaults.',
+ 'choose video to upload': 'An upload button is provided to upload local files to the input folder',
+ 'videopreview': 'Displays a preview for the selected video input. If advanced previews is enabled, this preview will reflect the frame_load_cap, force_rate, skip_first_frames, and select_every_nth values chosen. If the video has audio, it will also be previewed when moused over. Additional preview options can be accessed with right click.',
+ }
+ }],
+ 'VHS_LoadVideoPath': ['Load Video (Path) 🎥🅥🅗🅢', short_desc('Loads a video from an arbitrary path'),
+ {'Inputs': {
+ 'meta_batch': '(optional) Connect to a Meta Batch manager to divide extremely long sequences into sub batches. See the documentation for Meta Batch Manager',
+ 'vae': ['(optional) If provided the node will output latents instead of images. This drastically reduces the required RAM (not VRAM) when working with long (100+ frames) sequences',
+ 'Using this is strongly encouraged unless connecting to a node that requires a blue image connection such as Apply Controllnet',
+ ],
+ },
+ 'Outputs': {
+ 'IMAGE': 'The loaded images',
+ 'frame_count': 'The length of images just returned',
+ 'audio': 'The audio from the loaded video',
+ 'video_info': 'Exposes additional info about the video such as the source frame rate, or the total length',
+ 'LATENT': 'The loaded images pre-converted to latents. Only available when a vae is connected',
+ },
+ 'Widgets': {
+ 'video': ['The video file to be loaded.', 'You can also select an image to load it as a single frame'] + common_descriptions['VHS_PATH'],
+ 'force_rate': 'Drops or duplicates frames so that the produced output has the target frame rate. Many motion models are trained on videos of a specific frame rate and will give better results if input matches that frame rate. If set to 0, all frames are returned. May give unusual results with inputs that have a variable frame rate like animated gifs. Reducing this value can also greatly reduce the execution time and memory requirements.',
+ 'force_size': 'Previously was used to provide suggested resolutions. Instead, custom_width and custom_height can be disabled by setting to 0.',
+ 'custom_width': 'Allows for an arbitrary width to be entered, cropping to maintain aspect ratio if both are set',
+ 'custom_height': 'Allows for an arbitrary height to be entered, cropping to maintain aspect ratio if both are set',
+ 'frame_load_cap': 'The maximum number of frames to load. If 0, all frames are loaded.',
+ 'skip_first_frames': 'A number of frames which are discarded before producing output.',
+ 'select_every_nth': 'Similar to frame rate. Keeps only the first of every n frames and discard the rest. Has better compatibility with variable frame rate inputs such as gifs. When combined with force_rate, select_every_nth_applies after force_rate so the resulting output has a frame rate equivalent to force_rate/select_every_nth. select_every_nth does not apply to skip_first_frames',
+ 'format': 'Updates other widgets so that only values supported by the given format can be entered and provides recommended defaults.',
+ 'videopreview': 'Displays a preview for the selected video input. Will only be shown if Advanced Previews is enabled. This preview will reflect the frame_load_cap, force_rate, skip_first_frames, and select_every_nth values chosen. If the video has audio, it will also be previewed when moused over. Additional preview options can be accessed with right click.',
+ }
+ }],
+ 'VHS_LoadVideoFFmpegPath': ['Load Video FFmpeg (Path) 🎥🅥🅗🅢', short_desc('Loads a video from an arbitrary path using ffmpeg instead of opencv'),
+ 'Provides faster execution speed, transparency support, and allows specifying start time in seconds',
+ {'Inputs': {
+ 'meta_batch': '(optional) Connect to a Meta Batch manager to divide extremely long sequences into sub batches. See the documentation for Meta Batch Manager',
+ 'vae': ['(optional) If provided the node will output latents instead of images. This drastically reduces the required RAM (not VRAM) when working with long (100+ frames) sequences',
+ 'Using this is strongly encouraged unless connecting to a node that requires a blue image connection such as Apply Controllnet',
+ ],
+ },
+ 'Outputs': {
+ 'IMAGE': 'The loaded images',
+ 'mask': 'Transparency data from the loaded video',
+ 'audio': 'The audio from the loaded video',
+ 'video_info': 'Exposes additional info about the video such as the source frame rate, or the total length',
+ 'LATENT': 'The loaded images pre-converted to latents. Only available when a vae is connected',
+ },
+ 'Widgets': {
+ 'video': ['The video file to be loaded.', 'You can also select an image to load it as a single frame'] + common_descriptions['VHS_PATH'],
+ 'force_rate': 'Drops or duplicates frames so that the produced output has the target frame rate. Many motion models are trained on videos of a specific frame rate and will give better results if input matches that frame rate. If set to 0, all frames are returned. May give unusual results with inputs that have a variable frame rate like animated gifs. Reducing this value can also greatly reduce the execution time and memory requirements.',
+ 'force_size': 'Previously was used to provide suggested resolutions. Instead, custom_width and custom_height can be disabled by setting to 0.',
+ 'custom_width': 'Allows for an arbitrary width to be entered, cropping to maintain aspect ratio if both are set',
+ 'custom_height': 'Allows for an arbitrary height to be entered, cropping to maintain aspect ratio if both are set',
+ 'frame_load_cap': 'The maximum number of frames to load. If 0, all frames are loaded.',
+ 'skip_first_frames': 'A number of frames which are discarded before producing output.',
+ 'select_every_nth': 'Similar to frame rate. Keeps only the first of every n frames and discard the rest. Has better compatibility with variable frame rate inputs such as gifs. When combined with force_rate, select_every_nth_applies after force_rate so the resulting output has a frame rate equivalent to force_rate/select_every_nth. select_every_nth does not apply to skip_first_frames',
+ 'format': 'Updates other widgets so that only values supported by the given format can be entered and provides recommended defaults.',
+ 'videopreview': 'Displays a preview for the selected video input. Will only be shown if Advanced Previews is enabled. This preview will reflect the frame_load_cap, force_rate, skip_first_frames, and select_every_nth values chosen. If the video has audio, it will also be previewed when moused over. Additional preview options can be accessed with right click.',
+ }
+ }],
+ 'VHS_LoadImages': ['Load Images 🎥🅥🅗🅢', short_desc('Loads a sequence of images from a subdirectory of the input folder'),
+ {'Inputs': {
+ 'meta_batch': '(optional) Connect to a Meta Batch manager to divide extremely long sequences into sub batches. See the documentation for Meta Batch Manager',
+ },
+ 'Outputs': {
+ 'IMAGE': 'The loaded images',
+ 'MASK': 'The alpha channel of the loaded images.',
+ 'frame_count': 'The length of images just returned',
+ },
+ 'Widgets': {
+ 'directory': 'The directory images will be loaded from. Filtered to process jpg, png, ppm, bmp, tif, and webp files',
+ 'image_load_cap': 'The maximum number of images to load. If 0, all images are loaded.',
+ 'start_time': 'A timestamp, in seconds from the start of the video, to start loading frames from. ',
+ 'choose folder to upload': 'An upload button is provided to upload a local folder containing images to the input folder',
+ 'videopreview': 'Displays a preview for the selected video input. Will only be shown if Advanced Previews is enabled. This preview will reflect the image_load_cap, skip_first_images, and select_every_nth values chosen. Additional preview options can be accessed with right click.',
+ }
+ }],
+ 'VHS_LoadImagesPath': ['Load Images (Path) 🎥🅥🅗🅢', short_desc('Loads a sequence of images from an arbitrary path'),
+ {'Inputs': {
+ 'meta_batch': '(optional) Connect to a Meta Batch manager to divide extremely long sequences into sub batches. See the documentation for Meta Batch Manager',
+ },
+ 'Outputs': {
+ 'IMAGE': 'The loaded images',
+ 'MASK': 'The alpha channel of the loaded images.',
+ 'frame_count': 'The length of images just returned',
+ },
+ 'Widgets': {
+ 'directory': ['The directory images will be loaded from. Filtered to process jpg, png, ppm, bmp, tif, and webp files'] + common_descriptions['VHS_PATH'],
+ 'image_load_cap': 'The maximum number of images to load. If 0, all images are loaded.',
+ 'skip_first_images': 'A number of images which are discarded before producing output.',
+ 'select_every_nth': 'Keeps only the first of every n frames and discard the rest.',
+ 'videopreview': 'Displays a preview for the selected video input. Will only be shown if Advanced Previews is enabled. This preview will reflect the image_load_cap, skip_first_images, and select_every_nth values chosen. Additional preview options can be accessed with right click.',
+ }
+ }],
+ 'VHS_LoadImagePath': ['Load Image (Path) 🎥🅥🅗🅢', short_desc('Load a single image from a given path'),
+ {'Inputs': {
+ 'vae': '(optional) If provided the node will output latents instead of images.',
+ },
+ 'Outputs': {
+ 'IMAGE': 'The loaded images',
+ 'MASK': 'The alpha channel of the loaded images.',
+ },
+ 'Widgets': {
+ 'image': ['The image file to be loaded.'] + common_descriptions['VHS_PATH'],
+ 'force_size': ['Allows for conveniently scaling the input without requiring an additional node. Provides options to maintain aspect ratio or conveniently target common training formats for Animate Diff', {'custom_width': 'Allows for an arbitrary width to be entered, cropping to maintain aspect ratio if both are set',
+ 'custom_height': 'Allows for an arbitrary height to be entered, cropping to maintain aspect ratio if both are set'}],
+ 'videopreview': 'Displays a preview for the selected video input. Will only be shown if Advanced Previews is enabled. This preview will reflect the image_load_cap, skip_first_images, and select_every_nth values chosen. Additional preview options can be accessed with right click.',
+ }
+ }],
+ "VHS_LoadAudio": ['Load Audio (Path) 🎥🅥🅗🅢', short_desc('Loads an audio file from an arbitrary path'),
+ {'Outputs': {
+ 'audio': 'The loaded audio',
+ },
+ 'Widgets': {
+ 'audio_file': ['The audio file to be loaded.'] + common_descriptions['VHS_PATH'],
+ 'seek_seconds': 'An offset from the start of the sound file that the audio should start from',
+ }
+ }],
+ "VHS_LoadAudioUpload": ['Load Audio (Upload) 🎥🅥🅗🅢', short_desc('Loads an audio file from the input directory'),
+ "Very similar in functionality to the built-in LoadAudio. It was originally added before VHS swapped to use Comfy's internal AUDIO format, but provides the additional options for start time and duration",
+ {'Outputs': {
+ 'audio': 'The loaded audio',
+ },
+ 'Widgets': {
+ 'audio': 'The audio file to be loaded.',
+ 'start_time': 'An offset from the start of the sound file that the audio should start from',
+ 'duration': 'A maximum limit for the audio. Disabled if 0',
+ 'choose audio to upload': 'An upload button is provided to upload an audio file to the input folder',
+ }
+ }],
+ "VHS_AudioToVHSAudio": ['Audio to legacy VHS_AUDIO 🎥🅥🅗🅢', short_desc('utility function for compatibility with external nodes'),
+ "VHS used to use an internal VHS_AUDIO format for routing audio between inputs and outputs. This format was intended to only be used internally and was designed with a focus on performance over ease of use. Since ComfyUI now has an internal AUDIO format, VHS now uses this format. However, some custom node packs were made that are external to both ComfyUI and VHS that use VHS_AUDIO. This node was added so that those external nodes can still function",
+ {'Inputs': {
+ 'audio': 'An input in the standardized AUDIO format',
+ },
+ 'Outputs': {
+ 'vhs_audio': 'An output in the legacy VHS_AUDIO format for use with external nodes',
+ },
+ }],
+ "VHS_VHSAudioToAudio": ['Legacy VHS_AUDIO to Audio 🎥🅥🅗🅢', short_desc('utility function for compatibility with external nodes'),
+ "VHS used to use an internal VHS_AUDIO format for routing audio between inputs and outputs. This format was intended to only be used internally and was designed with a focus on performance over ease of use. Since ComfyUI now has an internal AUDIO format, VHS now uses this format. However, some custom node packs were made that are external to both ComfyUI and VHS that use VHS_AUDIO. This node was added so that those external nodes can still function",
+ {'Inputs': {
+ 'vhs_audio': 'An input in the legacy VHS_AUDIO format produced by an external node',
+ },
+ 'Outputs': {
+ 'vhs_audio': 'An output in the standardized AUDIO format',
+ },
+ }],
+ "VHS_PruneOutputs": ['Prune Outputs 🎥🅥🅗🅢', short_desc('Automates deletion of undesired outputs from a Video Combine node.'),
+ 'Video Combine produces a number of file outputs in addition to the final output. Some of these, such as a video file without audio included, are implementation limitations and are not feasible to solve. As an alternative, the Prune Outputs node is added to automate the deletion of these file outputs if they are not desired',
+ {'Inputs': {
+ 'filenames': 'A connection from a Video Combine node to indicate which outputs should be pruned',
+ },
+ 'Widgets': {
+ 'options': ['Which files should be deleted',
+ {'Intermediate': 'Delete any files that were required for intermediate processing but are not the final output, like the no-audio output file when audio is included',
+ 'Intermediate and Utility': 'Delete all produced files that aren\'t the final output, including the first frame png',
+ }]}
+ }],
+ "VHS_BatchManager": ['Meta Batch Manager 🎥🅥🅗🅢', short_desc('Split the processing of a very long video into sets of smaller Meta Batches'),
+ "The Meta Batch Manager allows for extremely long input videos to be processed when all other methods for fitting the content in RAM fail. It does not effect VRAM usage.",
+ "It must be connected to at least one Input (a Load Video or Load Images) AND at least one Video Combine",
+ image("https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite/assets/4284322/7cb3fb7e-59d8-4cb2-a09f-9c6698de8b1f"),
+ "It functions by holding both the inputs and ouputs open between executions, and automatically requeue's the workflow until one of the inputs is unable to provide additional images.",
+ "Because each sub execution only contains a subset of the total frames, each sub execution creates a hard window which temporal smoothing can not be applied across. This results in jumps in the output.",
+ {'Outputs': {
+ 'meta_batch': 'Add all connected nodes to this Meta Batch',
+ },
+ 'Widgets': {
+ 'frames_per_batch': 'How many frames to process for each sub execution. If loading as image, each frame will use about 50MB of RAM (not VRAM), and this can safely be set in the 100-1000 range, depending on available memory. When loading and combining from latent space (no blue image noodles exist), this value can be much higher, around the 2,000 to 20,000 range',
+ }
+ }],
+ "VHS_VideoInfo": ['Video Info 🎥🅥🅗🅢', short_desc('Splits information on a video into a numerous outputs'),
+ {'Inputs': {
+ 'video_info': 'A connection to a Load Video node',
+ },
+ 'Outputs': {
+ 'source_fps🟨': 'The frame rate of the video',
+ 'source_frame_count🟨': 'How many total frames the video contains before accounting for frame rate or select_every_nth',
+ 'source_duration🟨': 'The length of images just returned in seconds',
+ 'source_width🟨': 'The width',
+ 'source_height🟨': 'The height',
+ 'loaded_fps🟦': 'The frame rate after accounting for force_rate and select_every_nth. This output is of particular use as it can be connected to the converted frame_rate input of a Video Combine node to ensure audio remains synchronized.',
+ 'loaded_frame_count🟦': 'The number of frames returned by the current execution. Identical to the frame_count returned by the node itself',
+ 'loaded_duration🟦': 'The duration in seconds of returned images after accounting for frame_load_cap',
+ 'loaded_width🟦': 'The width of the video after scaling. These coordinates are in image space even if loading to latent space',
+ 'loaded_height🟦': 'The height of the video after scaling. These coordinates are in image space even if loading to latent space',
+ },
+ }],
+ "VHS_VideoInfoSource": ['Video Info Source 🎥🅥🅗🅢', short_desc('Splits information on a video into a numerous outputs describing the file itself without accounting for load options'),
+ {'Inputs': {
+ 'video_info': 'A connection to a Load Video node',
+ },
+ 'Outputs': {
+ 'source_fps🟨': 'The frame rate of the video',
+ 'source_frame_count🟨': 'How many total frames the video contains before accounting for frame rate or select_every_nth',
+ 'source_duration🟨': 'The length of images just returned in seconds',
+ 'source_width🟨': 'The original width',
+ 'source_height🟨': 'The original height',
+ }
+ }],
+ "VHS_VideoInfoLoaded": ['Video Info Loaded 🎥🅥🅗🅢', short_desc('Splits information on a video into a numerous outputs describing the file itself after accounting for load options'),
+ {'Inputs': {
+ 'video_info': 'A connection to a Load Video node',
+ },
+ 'Outputs': {
+ 'loaded_fps🟦': 'The frame rate after accounting for force_rate and select_every_nth. This output is of particular use as it can be connected to the converted frame_rate input of a Video Combine node to ensure audio remains synchronized.',
+ 'loaded_frame_count🟦': 'The number of frames returned by the current execution. Identical to the frame_count returned by the node itself',
+ 'loaded_duration🟦': 'The duration in seconds of returned images after accounting for frame_load_cap',
+ 'loaded_width🟦': 'The width of the video after scaling. This is the dimension of the corresponding image even if loading as a latent directly',
+ 'loaded_height🟦': 'The height of the video after scaling. This is the dimension of the corresponding image even if loading as a latent directly',
+ }
+ }],
+ "VHS_SelectFilename": ['VAE Select Filename 🎥🅥🅗🅢', short_desc('Select a single filename from the VHS_FILENAMES output by a Video Combine and return it as a string'),
+ 'Take care when combining this node with Prune Outputs. The VHS_FILENAMES object is immutable and will always contain the full list of output files, but execution order is undefined behavior (currently, Prune Outputs will generally execute first) and SelectFilename may return a path to a file that no longer exists.',
+ {'Inputs': {
+ 'filenames': 'A VHS_FILENAMES from a Video Combine node',
+ },
+ 'Outputs': {
+ 'filename': 'A string representation of the full output path for the chosen file',
+ },
+ 'Widgets': {
+ 'index': 'The index of which file should be selected. The default, -1, chooses the most complete output',
+ },
+ }],
+ # Batched Nodes
+ "VHS_VAEEncodeBatched": ['VAE Encode Batched 🎥🅥🅗🅢', short_desc('Encode images as latents with a manually specified batch size.'),
+ "Some people have ran into VRAM issues when encoding or decoding large batches of images. As a workaround, this node lets you manually set a batch size when encoding images.",
+ "Unless these issues have been encountered, it is simpler to use the native VAE Encode or to encode directly from a Load Video",
+ {'Inputs': {
+ 'pixels': 'The images to be encoded.',
+ 'vae': 'The VAE to use when encoding.',
+ },
+ 'Outputs': {
+ 'LATENT': 'The encoded latents.',
+ },
+ 'Widgets': {
+ 'per_batch': 'The maximum number of images to encode in each batch.',
+ },
+ }],
+ "VHS_VAEDecodeBatched": ['VAE Decode Batched 🎥🅥🅗🅢', short_desc('Decode latents to images with a manually specified batch size'),
+ "Some people have ran into VRAM issues when encoding or decoding large batches of images. As a workaround, this node lets you manually set a batch size when decoding latents.",
+ "Unless these issues have been encountered, it is simpler to use the native VAE Decode or to decode from a Video Combine directly",
+ {'Inputs': {
+ 'samples': 'The latents to be decoded.',
+ 'vae': 'The VAE to use when decoding.',
+ },
+ 'Outputs': {
+ 'IMAGE': 'The decoded images.',
+ },
+ 'Widgets': {
+ 'per_batch': 'The maximum number of images to decode in each batch.',
+ },
+ }],
+ # Latent and Image nodes
+ "VHS_SplitLatents": ['Split Latents 🎥🅥🅗🅢', short_desc('Split a set of latents into two groups'),
+ {'Inputs': {
+ 'latents': 'The latents to be split.',
+ },
+ 'Outputs': {
+ 'LATENT_A': 'The first group of latents',
+ 'A_count': 'The number of latents in group A. This will be equal to split_index unless the latents input has length less than split_index',
+ 'LATENT_B': 'The second group of latents',
+ 'B_count': 'The number of latents in group B'
+ },
+ 'Widgets': {
+ 'split_index': 'The index of the first latent that will be in the second output groups.',
+ },
+
+ }],
+ "VHS_SplitImages": ['Split Images 🎥🅥🅗🅢', short_desc('Split a set of images into two groups'),
+ {'Inputs': {
+ 'images': 'The images to be split.',
+ },
+ 'Outputs': {
+ 'IMAGE_A': 'The first group of images',
+ 'A_count': 'The number of images in group A. This will be equal to split_index unless the images input has length less than split_index',
+ 'IMAGE_B': 'The second group of images',
+ 'B_count': 'The number of images in group B'
+ },
+ 'Widgets': {
+ 'split_index': 'The index of the first latent that will be in the second output groups.',
+ },
+
+ }],
+ "VHS_SplitMasks": ['Split Masks 🎥🅥🅗🅢', short_desc('Split a set of masks into two groups'),
+ {'Inputs': {
+ 'mask': 'The masks to be split.',
+ },
+ 'Outputs': {
+ 'MASK_A': 'The first group of masks',
+ 'A_count': 'The number of masks in group A. This will be equal to split_index unless the mask input has length less than split_index',
+ 'MASK_B': 'The second group of masks',
+ 'B_count': 'The number of masks in group B'
+ },
+ 'Widgets': {
+ 'split_index': 'The index of the first latent that will be in the second output groups.',
+ },
+
+ }],
+ "VHS_MergeLatents": ['Merge Latents 🎥🅥🅗🅢', short_desc('Combine two groups of latents into a single group of latents'),
+ {'Inputs': {
+ 'latents_A': 'The first group of latents',
+ 'latents_B': 'The first group of latents',
+ },
+ 'Outputs': {
+ 'LATENT': 'The combined group of latents',
+ 'count': 'The length of the combined group',
+ },
+ 'Widgets': {
+ 'merge_strategy': common_descriptions['merge_strategy'],
+ 'scale_method': common_descriptions['scale_method'],
+ 'crop': common_descriptions['crop_method'],
+ },
+
+ }],
+ "VHS_MergeImages": ['Merge Images 🎥🅥🅗🅢', short_desc('Combine two groups of images into a single group of images'),
+ {'Inputs': {
+ 'images_A': 'The first group of images',
+ 'images_B': 'The first group of images',
+ },
+ 'Outputs': {
+ 'IMAGE': 'The combined group of images',
+ 'count': 'The length of the combined group',
+ },
+ 'Widgets': {
+ 'merge_strategy': common_descriptions['merge_strategy'],
+ 'scale_method': common_descriptions['scale_method'],
+ 'crop': common_descriptions['crop_method'],
+ },
+
+ }],
+ "VHS_MergeMasks": ['Merge Masks 🎥🅥🅗🅢', short_desc('Combine two groups of masks into a single group of masks'),
+ {'Inputs': {
+ 'mask_A': 'The first group of masks',
+ 'mask_B': 'The first group of masks',
+ },
+ 'Outputs': {
+ 'MASK': 'The combined group of masks',
+ 'count': 'The length of the combined group',
+ },
+ 'Widgets': {
+ 'merge_strategy': common_descriptions['merge_strategy'],
+ 'scale_method': common_descriptions['scale_method'],
+ 'crop': common_descriptions['crop_method'],
+ },
+
+ }],
+ "VHS_GetLatentCount": format_type(common_descriptions['GetCount'], 'latent'),
+ "VHS_GetImageCount": format_type(common_descriptions['GetCount'], 'image'),
+ "VHS_GetMaskCount": format_type(common_descriptions['GetCount'], 'mask'),
+ "VHS_DuplicateLatents": ['Repeat Latents 🎥🅥🅗🅢', short_desc('Append copies of a latent to itself so it repeats'),
+ {'Inputs': {
+ 'latents': 'The latents to be repeated',
+ },
+ 'Outputs': {
+ 'LATENT': 'The latent with repeats',
+ 'count': 'The number of latents in the output. Equal to the length of the input latent * multiply_by',
+ },
+ 'Widgets': {
+ 'multiply_by': 'Controls the number of times the latent should repeat. 1, the default, means no change.',
+ },
+ }],
+ "VHS_DuplicateImages": ['Repeat Images 🎥🅥🅗🅢', short_desc('Append copies of a image to itself so it repeats'),
+ {'Inputs': {
+ 'IMAGES': 'The image to be repeated',
+ },
+ 'Outputs': {
+ 'IMAGE': 'The image with repeats',
+ 'count': 'The number of image in the output. Equal to the length of the input image * multiply_by',
+ },
+ 'Widgets': {
+ 'multiply_by': 'Controls the number of times the mask should repeat. 1, the default, means no change.',
+ },
+ }],
+ "VHS_DuplicateMasks": ['Repeat Masks 🎥🅥🅗🅢', short_desc('Append copies of a mask to itself so it repeats'),
+ {'Inputs': {
+ 'masks': 'The masks to be repeated',
+ },
+ 'Outputs': {
+ 'LATENT': 'The mask with repeats',
+ 'count': 'The number of mask in the output. Equal to the length of the input mask * multiply_by',
+ },
+ 'Widgets': {
+ 'multiply_by': 'Controls the number of times the mask should repeat. 1, the default, means no change.',
+ },
+ }],
+ "VHS_SelectEveryNthLatent": format_type(common_descriptions['SelectEveryNth'], 'latent'),
+ "VHS_SelectEveryNthImage": format_type(common_descriptions['SelectEveryNth'], 'image'),
+ #TODO: fix discrepency of input being mask instead of masks?
+ "VHS_SelectEveryNthMask": format_type(common_descriptions['SelectEveryNth'], 'mask', lowers='mask'),
+ #TODO: port documentation for select nodes to new system
+ #"VHS_SelectLatents": None,
+ #"VHS_SelectImages": None,
+ #"VHS_SelectMasks": None,
+ "VHS_Unbatch": ['Unbatch 🎥🅥🅗🅢', short_desc('Unbatch a list of items into a single concatenated item'),
+ "Useful for when you want a single video output from a complex workflow",
+ "Has no relation to the Meta Batch system of VHS",
+ {'Inputs': {
+ 'batched': 'Any input which may or may not be batched',
+ },
+ 'Outputs': {
+ 'unbatched': 'A single output element. Torch tensors are concatenated across dim 0, all other types are added which functions as concatenation for strings and arrays, but may give undesired results for other types',
+ },
+ }],
+ "VHS_SelectLatest": ['Select Latest 🎥🅥🅗🅢', short_desc('Experimental virtual node to select the most recently modified file from a given folder'),
+ "Assists in the creation of workflows where outputs from one execution are used elsewhere in subsequent executions.",
+ {'Inputs': {
+ 'filename_prefix': 'A path which can consist of a combination of folders and a prefix which candidate files must match',
+ 'filename_postfix': 'A string which chich the selected file must end with. Useful for limiting to a target extension.',
+ },
+ 'Outputs': {
+ 'Filename': 'A string representing a file path to the most recently modified file.',
+ },
+ }],
+}
+
+def as_html(entry, depth=0):
+ if isinstance(entry, dict):
+ size = 0.8 if depth < 2 else 1
+ html = ''
+ for k in entry:
+ if k == "collapsed":
+ continue
+ collapse_single = k.endswith("_collapsed")
+ if collapse_single:
+ name = k[:-len("_collapsed")]
+ else:
+ name = k
+ collapse_flag = ' VHS_precollapse' if entry.get("collapsed", False) or collapse_single else ''
+ html += f'[- ]
{name}: {as_html(entry[k], depth=depth+1)}
'
+ return html
+ if isinstance(entry, list):
+ if depth == 0:
+ depth += 1
+ size = .8
+ else:
+ size = 1
+ html = ''
+ html += entry[0]
+ for i in entry[1:]:
+ html += f'{as_html(i, depth=depth)}
'
+ return html
+ return str(entry)
+
+def format_descriptions(nodes):
+ for k in descriptions:
+ if k.endswith("_collapsed"):
+ k = k[:-len("_collapsed")]
+ nodes[k].DESCRIPTION = as_html(descriptions[k])
+ undocumented_nodes = []
+ for k in nodes:
+ if not hasattr(nodes[k], "DESCRIPTION"):
+ undocumented_nodes.append(k)
+ if len(undocumented_nodes) > 0:
+ logger.warning('Some nodes have not been documented %s', undocumented_nodes)
+
diff --git a/custom_nodes/comfyui-videohelpersuite/videohelpersuite/image_latent_nodes.py b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/image_latent_nodes.py
new file mode 100644
index 0000000000000000000000000000000000000000..62b4e3e6452b51b42e3e49852d27a1bb9921edc2
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/image_latent_nodes.py
@@ -0,0 +1,554 @@
+from torch import Tensor
+import torch
+
+import comfy.utils
+
+from .utils import BIGMIN, BIGMAX, select_indexes_from_str, convert_str_to_indexes, select_indexes
+
+
+class MergeStrategies:
+ MATCH_A = "match A"
+ MATCH_B = "match B"
+ MATCH_SMALLER = "match smaller"
+ MATCH_LARGER = "match larger"
+
+ list_all = [MATCH_A, MATCH_B, MATCH_SMALLER, MATCH_LARGER]
+
+
+class ScaleMethods:
+ NEAREST_EXACT = "nearest-exact"
+ BILINEAR = "bilinear"
+ AREA = "area"
+ BICUBIC = "bicubic"
+ BISLERP = "bislerp"
+
+ list_all = [NEAREST_EXACT, BILINEAR, AREA, BICUBIC, BISLERP]
+
+
+class CropMethods:
+ DISABLED = "disabled"
+ CENTER = "center"
+
+ list_all = [DISABLED, CENTER]
+
+
+class SplitLatents:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "latents": ("LATENT",),
+ "split_index": ("INT", {"default": 0, "step": 1, "min": BIGMIN, "max": BIGMAX}),
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/latent"
+
+ RETURN_TYPES = ("LATENT", "INT", "LATENT", "INT")
+ RETURN_NAMES = ("LATENT_A", "A_count", "LATENT_B", "B_count")
+ FUNCTION = "split_latents"
+
+ def split_latents(self, latents: dict[str, Tensor], split_index: int):
+ latents_len = len(latents["samples"])
+ group_a = latents.copy()
+ group_b = latents.copy()
+ for key, val in latents.items():
+ if type(val) == Tensor and len(val) == latents_len:
+ group_a[key] = latents[key][:split_index]
+ group_b[key] = latents[key][split_index:]
+ return (group_a, group_a["samples"].size(0), group_b, group_b["samples"].size(0))
+
+
+class SplitImages:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "images": ("IMAGE",),
+ "split_index": ("INT", {"default": 0, "step": 1, "min": BIGMIN, "max": BIGMAX}),
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/image"
+
+ RETURN_TYPES = ("IMAGE", "INT", "IMAGE", "INT")
+ RETURN_NAMES = ("IMAGE_A", "A_count", "IMAGE_B", "B_count")
+ FUNCTION = "split_images"
+
+ def split_images(self, images: Tensor, split_index: int):
+ group_a = images[:split_index]
+ group_b = images[split_index:]
+ return (group_a, group_a.size(0), group_b, group_b.size(0))
+
+
+class SplitMasks:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "mask": ("MASK",),
+ "split_index": ("INT", {"default": 0, "step": 1, "min": BIGMIN, "max": BIGMAX}),
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/mask"
+
+ RETURN_TYPES = ("MASK", "INT", "MASK", "INT")
+ RETURN_NAMES = ("MASK_A", "A_count", "MASK_B", "B_count")
+ FUNCTION = "split_masks"
+
+ def split_masks(self, mask: Tensor, split_index: int):
+ group_a = mask[:split_index]
+ group_b = mask[split_index:]
+ return (group_a, group_a.size(0), group_b, group_b.size(0))
+
+
+class MergeLatents:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "latents_A": ("LATENT",),
+ "latents_B": ("LATENT",),
+ "merge_strategy": (MergeStrategies.list_all,),
+ "scale_method": (ScaleMethods.list_all,),
+ "crop": (CropMethods.list_all,),
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/latent"
+
+ RETURN_TYPES = ("LATENT", "INT",)
+ RETURN_NAMES = ("LATENT", "count",)
+ FUNCTION = "merge"
+
+ def merge(self, latents_A: dict, latents_B: dict, merge_strategy: str, scale_method: str, crop: str):
+ latents = []
+ latents_A = latents_A.copy()["samples"]
+ latents_B = latents_B.copy()["samples"]
+
+ # TODO: handle other properties on latents besides just "samples"
+ # if not same dimensions, do scaling
+ if latents_A.shape[3] != latents_B.shape[3] or latents_A.shape[2] != latents_B.shape[2]:
+ A_size = latents_A.shape[3] * latents_A.shape[2]
+ B_size = latents_B.shape[3] * latents_B.shape[2]
+ # determine which to use
+ use_A_as_template = True
+ if merge_strategy == MergeStrategies.MATCH_A:
+ pass
+ elif merge_strategy == MergeStrategies.MATCH_B:
+ use_A_as_template = False
+ elif merge_strategy in (MergeStrategies.MATCH_SMALLER, MergeStrategies.MATCH_LARGER):
+ if A_size <= B_size:
+ use_A_as_template = True if merge_strategy == MergeStrategies.MATCH_SMALLER else False
+ # apply scaling
+ if use_A_as_template:
+ latents_B = comfy.utils.common_upscale(latents_B, latents_A.shape[3], latents_A.shape[2], scale_method, crop)
+ else:
+ latents_A = comfy.utils.common_upscale(latents_A, latents_B.shape[3], latents_B.shape[2], scale_method, crop)
+
+ latents.append(latents_A)
+ latents.append(latents_B)
+
+ merged = {"samples": torch.cat(latents, dim=0)}
+ return (merged, len(merged["samples"]),)
+
+
+class MergeImages:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "images_A": ("IMAGE",),
+ "images_B": ("IMAGE",),
+ "merge_strategy": (MergeStrategies.list_all,),
+ "scale_method": (ScaleMethods.list_all,),
+ "crop": (CropMethods.list_all,),
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/image"
+
+ RETURN_TYPES = ("IMAGE", "INT",)
+ RETURN_NAMES = ("IMAGE", "count",)
+ FUNCTION = "merge"
+
+ def merge(self, images_A: Tensor, images_B: Tensor, merge_strategy: str, scale_method: str, crop: str):
+ images = []
+ # if not same dimensions, do scaling
+ if images_A.shape[3] != images_B.shape[3] or images_A.shape[2] != images_B.shape[2]:
+ images_A = images_A.movedim(-1,1)
+ images_B = images_B.movedim(-1,1)
+
+ A_size = images_A.shape[3] * images_A.shape[2]
+ B_size = images_B.shape[3] * images_B.shape[2]
+ # determine which to use
+ use_A_as_template = True
+ if merge_strategy == MergeStrategies.MATCH_A:
+ pass
+ elif merge_strategy == MergeStrategies.MATCH_B:
+ use_A_as_template = False
+ elif merge_strategy in (MergeStrategies.MATCH_SMALLER, MergeStrategies.MATCH_LARGER):
+ if A_size <= B_size:
+ use_A_as_template = True if merge_strategy == MergeStrategies.MATCH_SMALLER else False
+ # apply scaling
+ if use_A_as_template:
+ images_B = comfy.utils.common_upscale(images_B, images_A.shape[3], images_A.shape[2], scale_method, crop)
+ else:
+ images_A = comfy.utils.common_upscale(images_A, images_B.shape[3], images_B.shape[2], scale_method, crop)
+ images_A = images_A.movedim(1,-1)
+ images_B = images_B.movedim(1,-1)
+
+ images.append(images_A)
+ images.append(images_B)
+ all_images = torch.cat(images, dim=0)
+ return (all_images, all_images.size(0),)
+
+
+class MergeMasks:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "mask_A": ("MASK",),
+ "mask_B": ("MASK",),
+ "merge_strategy": (MergeStrategies.list_all,),
+ "scale_method": (ScaleMethods.list_all,),
+ "crop": (CropMethods.list_all,),
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/mask"
+
+ RETURN_TYPES = ("MASK", "INT",)
+ RETURN_NAMES = ("MASK", "count",)
+ FUNCTION = "merge"
+
+ def merge(self, mask_A: Tensor, mask_B: Tensor, merge_strategy: str, scale_method: str, crop: str):
+ masks = []
+ # if not same dimensions, do scaling
+ if mask_A.shape[2] != mask_B.shape[2] or mask_A.shape[1] != mask_B.shape[1]:
+ A_size = mask_A.shape[2] * mask_A.shape[1]
+ B_size = mask_B.shape[2] * mask_B.shape[1]
+ # determine which to use
+ use_A_as_template = True
+ if merge_strategy == MergeStrategies.MATCH_A:
+ pass
+ elif merge_strategy == MergeStrategies.MATCH_B:
+ use_A_as_template = False
+ elif merge_strategy in (MergeStrategies.MATCH_SMALLER, MergeStrategies.MATCH_LARGER):
+ if A_size <= B_size:
+ use_A_as_template = True if merge_strategy == MergeStrategies.MATCH_SMALLER else False
+ # add dimension where image channels would be expected to work with common_upscale
+ mask_A = torch.unsqueeze(mask_A, 1)
+ mask_B = torch.unsqueeze(mask_B, 1)
+ # apply scaling
+ if use_A_as_template:
+ mask_B = comfy.utils.common_upscale(mask_B, mask_A.shape[3], mask_A.shape[2], scale_method, crop)
+ else:
+ mask_A = comfy.utils.common_upscale(mask_A, mask_B.shape[3], mask_B.shape[2], scale_method, crop)
+ # undo dimension increase
+ mask_A = torch.squeeze(mask_A, 1)
+ mask_B = torch.squeeze(mask_B, 1)
+
+ masks.append(mask_A)
+ masks.append(mask_B)
+ all_masks = torch.cat(masks, dim=0)
+ return (all_masks, all_masks.size(0),)
+
+
+class SelectEveryNthLatent:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "latents": ("LATENT",),
+ "select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
+ "skip_first_latents": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/latent"
+
+ RETURN_TYPES = ("LATENT", "INT",)
+ RETURN_NAMES = ("LATENT", "count",)
+ FUNCTION = "select_latents"
+
+ def select_latents(self, latents: dict[str, Tensor], select_every_nth: int, skip_first_latents: int):
+ latents = latents.copy()
+ latents_len = len(latents["samples"])
+ for key, val in latents.items():
+ if type(val) == Tensor and len(val) == latents_len:
+ latents[key] = val[skip_first_latents::select_every_nth]
+ return (latents, latents["samples"].size(0))
+
+
+class SelectEveryNthImage:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "images": ("IMAGE",),
+ "select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
+ "skip_first_images": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
+
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/image"
+
+ RETURN_TYPES = ("IMAGE", "INT",)
+ RETURN_NAMES = ("IMAGE", "count",)
+ FUNCTION = "select_images"
+
+ def select_images(self, images: Tensor, select_every_nth: int, skip_first_images: int):
+ sub_images = images[skip_first_images::select_every_nth]
+ return (sub_images, sub_images.size(0))
+
+
+class SelectEveryNthMask:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "mask": ("MASK",),
+ "select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
+ "skip_first_masks": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/mask"
+
+ RETURN_TYPES = ("MASK", "INT",)
+ RETURN_NAMES = ("MASK", "count",)
+ FUNCTION = "select_masks"
+
+ def select_masks(self, mask: Tensor, select_every_nth: int, skip_first_masks: int):
+ sub_mask = mask[skip_first_masks::select_every_nth]
+ return (sub_mask, sub_mask.size(0))
+
+
+class GetLatentCount:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "latents": ("LATENT",),
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/latent"
+
+ RETURN_TYPES = ("INT",)
+ RETURN_NAMES = ("count",)
+ FUNCTION = "count_input"
+
+ def count_input(self, latents: dict):
+ return (latents["samples"].size(0),)
+
+
+class GetImageCount:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "images": ("IMAGE",),
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/image"
+
+ RETURN_TYPES = ("INT",)
+ RETURN_NAMES = ("count",)
+ FUNCTION = "count_input"
+
+ def count_input(self, images: Tensor):
+ return (images.size(0),)
+
+
+class GetMaskCount:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "mask": ("MASK",),
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/mask"
+
+ RETURN_TYPES = ("INT",)
+ RETURN_NAMES = ("count",)
+ FUNCTION = "count_input"
+
+ def count_input(self, mask: Tensor):
+ return (mask.size(0),)
+
+
+class RepeatLatents:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "latents": ("LATENT",),
+ "multiply_by": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1})
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/latent"
+
+ RETURN_TYPES = ("LATENT", "INT",)
+ RETURN_NAMES = ("LATENT", "count",)
+ FUNCTION = "duplicate_input"
+
+ def duplicate_input(self, latents: dict[str, Tensor], multiply_by: int):
+ latents = latents.copy()
+ latents_len = len(latents["samples"])
+ for key, val in latents.items():
+ if type(val) == Tensor and len(val) == latents_len:
+ full_latents = []
+ for _ in range(0, multiply_by):
+ full_latents.append(latents[key])
+ latents[key] = torch.cat(full_latents, dim=0)
+ return (latents, latents["samples"].size(0),)
+
+
+class RepeatImages:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "images": ("IMAGE",),
+ "multiply_by": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1})
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/image"
+
+ RETURN_TYPES = ("IMAGE", "INT",)
+ RETURN_NAMES = ("IMAGE", "count",)
+ FUNCTION = "duplicate_input"
+
+ def duplicate_input(self, images: Tensor, multiply_by: int):
+ full_images = []
+ for n in range(0, multiply_by):
+ full_images.append(images)
+ new_images = torch.cat(full_images, dim=0)
+ return (new_images, new_images.size(0),)
+
+
+class RepeatMasks:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "mask": ("MASK",),
+ "multiply_by": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1})
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/mask"
+
+ RETURN_TYPES = ("MASK", "INT",)
+ RETURN_NAMES = ("MASK", "count",)
+ FUNCTION = "duplicate_input"
+
+ def duplicate_input(self, mask: Tensor, multiply_by: int):
+ full_masks = []
+ for n in range(0, multiply_by):
+ full_masks.append(mask)
+ new_mask = torch.cat(full_masks, dim=0)
+ return (new_mask, new_mask.size(0),)
+
+
+select_description = """Use comma-separated indexes to select items in the given order.
+Supports negative indexes, python-style ranges (end index excluded),
+as well as range step.
+
+Acceptable entries (assuming 16 items provided, so idxs 0 to 15 exist):
+0 -> Returns [0]
+-1 -> Returns [15]
+0, 1, 13 -> Returns [0, 1, 13]
+0:5, 13 -> Returns [0, 1, 2, 3, 4, 13]
+0:-1 -> Returns [0, 1, 2, ..., 13, 14]
+0:5:-1 -> Returns [4, 3, 2, 1, 0]
+0:5:2 -> Returns [0, 2, 4]
+::-1 -> Returns [15, 14, 13, ..., 2, 1, 0]
+"""
+class SelectLatents:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "latent": ("LATENT",),
+ "indexes": ("STRING", {"default": "0"}),
+ "err_if_missing": ("BOOLEAN", {"default": True}),
+ "err_if_empty": ("BOOLEAN", {"default": True}),
+ },
+ }
+
+ DESCRIPTION = select_description
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/latent"
+
+ RETURN_TYPES = ("LATENT",)
+ FUNCTION = "select"
+
+ def select(self, latent: dict[str, Tensor], indexes: str, err_if_missing: bool, err_if_empty: bool):
+ # latents are a dict and may contain different stuff (like noise_mask), so need to account for it all
+ latent = latent.copy()
+ latents_len = len(latent["samples"])
+ real_idxs = convert_str_to_indexes(indexes, latents_len, allow_missing=not err_if_missing)
+ if err_if_empty and len(real_idxs) == 0:
+ raise Exception(f"Nothing was selected based on indexes found in '{indexes}'.")
+ for key, val in latent.items():
+ if type(val) == Tensor and len(val) == latents_len:
+ latent[key] = select_indexes(val, real_idxs)
+ return (latent,)
+
+
+class SelectImages:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "image": ("IMAGE",),
+ "indexes": ("STRING", {"default": "0"}),
+ "err_if_missing": ("BOOLEAN", {"default": True}),
+ "err_if_empty": ("BOOLEAN", {"default": True}),
+ },
+ }
+
+ DESCRIPTION = select_description
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/image"
+
+ RETURN_TYPES = ("IMAGE",)
+ FUNCTION = "select"
+
+ def select(self, image: Tensor, indexes: str, err_if_missing: bool, err_if_empty: bool):
+ to_return = select_indexes_from_str(input_obj=image, indexes=indexes,
+ err_if_missing=err_if_missing, err_if_empty=err_if_empty)
+ to_return_type = type(to_return)
+ return (to_return,)
+
+
+class SelectMasks:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "mask": ("MASK",),
+ "indexes": ("STRING", {"default": "0"}),
+ "err_if_missing": ("BOOLEAN", {"default": True}),
+ "err_if_empty": ("BOOLEAN", {"default": True}),
+ },
+ }
+
+ DESCRIPTION = select_description
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/mask"
+
+ RETURN_TYPES = ("MASK",)
+ FUNCTION = "select"
+
+ def select(self, mask: Tensor, indexes: str, err_if_missing: bool, err_if_empty: bool):
+ return (select_indexes_from_str(input_obj=mask, indexes=indexes,
+ err_if_missing=err_if_missing, err_if_empty=err_if_empty),)
diff --git a/custom_nodes/comfyui-videohelpersuite/videohelpersuite/latent_preview.py b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/latent_preview.py
new file mode 100644
index 0000000000000000000000000000000000000000..a0a22b8ad028fb9de25cb9818b857a6e4aa0f3e1
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/latent_preview.py
@@ -0,0 +1,114 @@
+from PIL import Image
+import time
+import io
+import struct
+from threading import Thread
+import torch.nn.functional as F
+import torch
+
+import latent_preview
+import server
+serv = server.PromptServer.instance
+
+from .utils import hook
+
+rates_table = {'Mochi': 24//6, 'LTXV': 24//8, 'HunyuanVideo': 24//4,
+ 'Cosmos1CV8x8x8': 24//8, 'Wan21': 16//4, 'Wan22': 24//4}
+
+class WrappedPreviewer(latent_preview.LatentPreviewer):
+ def __init__(self, previewer, rate=8):
+ self.first_preview = True
+ self.last_time = 0
+ self.c_index = 0
+ self.rate = rate
+ if hasattr(previewer, 'taesd'):
+ self.taesd = previewer.taesd
+ elif hasattr(previewer, 'latent_rgb_factors'):
+ self.latent_rgb_factors = previewer.latent_rgb_factors
+ self.latent_rgb_factors_bias = previewer.latent_rgb_factors_bias
+ self.latent_rgb_factors_reshape = getattr(previewer, 'latent_rgb_factors_reshape', None)
+ else:
+ raise Exception('Unsupported preview type for VHS animated previews')
+
+ def decode_latent_to_preview_image(self, preview_format, x0):
+ if x0.ndim == 5:
+ #Keep batch major
+ x0 = x0.movedim(2,1)
+ x0 = x0.reshape((-1,)+x0.shape[-3:])
+ num_images = x0.size(0)
+ new_time = time.time()
+ num_previews = int((new_time - self.last_time) * self.rate)
+ self.last_time = self.last_time + num_previews/self.rate
+ if num_previews > num_images:
+ num_previews = num_images
+ elif num_previews <= 0:
+ return None
+ if self.first_preview:
+ self.first_preview = False
+ serv.send_sync('VHS_latentpreview', {'length':num_images, 'rate': self.rate, 'id': serv.last_node_id})
+ self.last_time = new_time + 1/self.rate
+ if self.c_index + num_previews > num_images:
+ x0 = x0.roll(-self.c_index, 0)[:num_previews]
+ else:
+ x0 = x0[self.c_index:self.c_index + num_previews]
+ Thread(target=self.process_previews, args=(x0, self.c_index,
+ num_images)).run()
+ self.c_index = (self.c_index + num_previews) % num_images
+ return None
+ def process_previews(self, image_tensor, ind, leng):
+ image_tensor = self.decode_latent_to_preview(image_tensor)
+ if image_tensor.size(1) > 512 or image_tensor.size(2) > 512:
+ image_tensor = image_tensor.movedim(-1,0)
+ if image_tensor.size(2) < image_tensor.size(3):
+ height = (512 * image_tensor.size(2)) // image_tensor.size(3)
+ image_tensor = F.interpolate(image_tensor, (height,512), mode='bilinear')
+ else:
+ width = (512 * image_tensor.size(3)) // image_tensor.size(2)
+ image_tensor = F.interpolate(image_tensor, (512, width), mode='bilinear')
+ image_tensor = image_tensor.movedim(0,-1)
+ previews_ubyte = (((image_tensor + 1.0) / 2.0).clamp(0, 1) # change scale from -1..1 to 0..1
+ .mul(0xFF) # to 0..255
+ ).to(device="cpu", dtype=torch.uint8)
+ for preview in previews_ubyte:
+ i = Image.fromarray(preview.numpy())
+ message = io.BytesIO()
+ message.write((1).to_bytes(length=4, byteorder='big')*2)
+ message.write(ind.to_bytes(length=4, byteorder='big'))
+ message.write(struct.pack('16p', serv.last_node_id.encode('ascii')))
+ i.save(message, format="JPEG", quality=95, compress_level=1)
+ #NOTE: send sync already uses call_soon_threadsafe
+ serv.send_sync(server.BinaryEventTypes.PREVIEW_IMAGE,
+ message.getvalue(), serv.client_id)
+ ind = (ind + 1) % leng
+ def decode_latent_to_preview(self, x0):
+ if hasattr(self, 'taesd'):
+ x_sample = self.taesd.decode(x0).movedim(1, 3)
+ return x_sample
+ else:
+ if self.latent_rgb_factors_reshape is not None:
+ x0 = self.latent_rgb_factors_reshape(x0)
+ self.latent_rgb_factors = self.latent_rgb_factors.to(dtype=x0.dtype, device=x0.device)
+ if self.latent_rgb_factors_bias is not None:
+ self.latent_rgb_factors_bias = self.latent_rgb_factors_bias.to(dtype=x0.dtype, device=x0.device)
+ latent_image = F.linear(x0.movedim(1, -1), self.latent_rgb_factors,
+ bias=self.latent_rgb_factors_bias)
+ return latent_image
+
+@hook(latent_preview, 'get_previewer')
+def get_latent_video_previewer(device, latent_format, *args, **kwargs):
+ node_id = serv.last_node_id
+ previewer = get_latent_video_previewer.__wrapped__(device, latent_format, *args, **kwargs)
+ try:
+ extra_info = next(serv.prompt_queue.currently_running.values().__iter__()) \
+ [3]['extra_pnginfo']['workflow']['extra']
+ prev_setting = extra_info.get('VHS_latentpreview', False)
+ if extra_info.get('VHS_latentpreviewrate', 0) != 0:
+ rate_setting = extra_info['VHS_latentpreviewrate']
+ else:
+ rate_setting = rates_table.get(latent_format.__class__.__name__, 8)
+ except:
+ #For safety since there's lots of keys, any of which can fail
+ prev_setting = False
+ if not prev_setting or not hasattr(previewer, "decode_latent_to_preview"):
+ return previewer
+ return WrappedPreviewer(previewer, rate_setting)
diff --git a/custom_nodes/comfyui-videohelpersuite/videohelpersuite/load_images_nodes.py b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/load_images_nodes.py
new file mode 100644
index 0000000000000000000000000000000000000000..43f3387c4f907d7372c207f7f1aeb626c27b836b
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/load_images_nodes.py
@@ -0,0 +1,206 @@
+import os
+import hashlib
+import numpy as np
+import torch
+from PIL import Image, ImageOps
+import itertools
+
+import folder_paths
+from comfy.k_diffusion.utils import FolderOfImages
+from comfy.utils import common_upscale, ProgressBar
+from .logger import logger
+from .utils import BIGMAX, calculate_file_hash, get_sorted_dir_files_from_directory, validate_path, strip_path
+
+
+def is_changed_load_images(directory: str, image_load_cap: int = 0, skip_first_images: int = 0, select_every_nth: int = 1, **kwargs):
+ if not os.path.isdir(directory):
+ return False
+
+ dir_files = get_sorted_dir_files_from_directory(directory, skip_first_images, select_every_nth, FolderOfImages.IMG_EXTENSIONS)
+ if image_load_cap != 0:
+ dir_files = dir_files[:image_load_cap]
+
+ m = hashlib.sha256()
+ for filepath in dir_files:
+ m.update(calculate_file_hash(filepath).encode()) # strings must be encoded before hashing
+ return m.digest().hex()
+
+
+def validate_load_images(directory: str):
+ if not os.path.isdir(directory):
+ return f"Directory '{directory}' cannot be found."
+ dir_files = os.listdir(directory)
+ if len(dir_files) == 0:
+ return f"No files in directory '{directory}'."
+
+ return True
+
+def images_generator(directory: str, image_load_cap: int = 0, skip_first_images: int = 0, select_every_nth: int = 1, meta_batch=None, unique_id=None):
+ if not os.path.isdir(directory):
+ raise FileNotFoundError(f"Directory '{directory} cannot be found.")
+ dir_files = get_sorted_dir_files_from_directory(directory, skip_first_images, select_every_nth, FolderOfImages.IMG_EXTENSIONS)
+
+ if len(dir_files) == 0:
+ raise FileNotFoundError(f"No files in directory '{directory}'.")
+ if image_load_cap > 0:
+ dir_files = dir_files[:image_load_cap]
+ sizes = {}
+ has_alpha = False
+ for image_path in dir_files:
+ i = Image.open(image_path)
+ #exif_transpose can only ever rotate, but rotating can swap width/height
+ i = ImageOps.exif_transpose(i)
+ has_alpha |= 'A' in i.getbands()
+ count = sizes.get(i.size, 0)
+ sizes[i.size] = count +1
+ size = max(sizes.items(), key=lambda x: x[1])[0]
+ yield size[0], size[1], has_alpha
+ if meta_batch is not None:
+ yield min(image_load_cap, len(dir_files)) or len(dir_files)
+
+ iformat = "RGBA" if has_alpha else "RGB"
+ def load_image(file_path):
+ i = Image.open(file_path)
+ i = ImageOps.exif_transpose(i)
+ i = i.convert(iformat)
+ i = np.array(i, dtype=np.float32)
+ #This nonsense provides a nearly 50% speedup on my system
+ torch.from_numpy(i).div_(255)
+ if i.shape[0] != size[1] or i.shape[1] != size[0]:
+ i = torch.from_numpy(i).movedim(-1, 0).unsqueeze(0)
+ i = common_upscale(i, size[0], size[1], "lanczos", "center")
+ i = i.squeeze(0).movedim(0, -1).numpy()
+ if has_alpha:
+ i[:,:,-1] = 1 - i[:,:,-1]
+ return i
+
+ total_images = len(dir_files)
+ processed_images = 0
+ pbar = ProgressBar(total_images)
+ images = map(load_image, dir_files)
+ try:
+ prev_image = next(images)
+ while True:
+ next_image = next(images)
+ yield prev_image
+ processed_images += 1
+ pbar.update_absolute(processed_images, total_images)
+ prev_image = next_image
+ except StopIteration:
+ pass
+ if meta_batch is not None:
+ meta_batch.inputs.pop(unique_id)
+ meta_batch.has_closed_inputs = True
+ if prev_image is not None:
+ yield prev_image
+
+
+def load_images(directory: str, image_load_cap: int = 0, skip_first_images: int = 0, select_every_nth: int = 1, meta_batch=None, unique_id=None):
+ if meta_batch is None or unique_id not in meta_batch.inputs:
+ gen = images_generator(directory, image_load_cap, skip_first_images, select_every_nth, meta_batch, unique_id)
+ (width, height, has_alpha) = next(gen)
+ if meta_batch is not None:
+ meta_batch.inputs[unique_id] = (gen, width, height, has_alpha)
+ meta_batch.total_frames = min(meta_batch.total_frames, next(gen))
+ else:
+ gen, width, height, has_alpha = meta_batch.inputs[unique_id]
+
+ if meta_batch is not None:
+ gen = itertools.islice(gen, meta_batch.frames_per_batch)
+ images = torch.from_numpy(np.fromiter(gen, np.dtype((np.float32, (height, width, 3 + has_alpha)))))
+ if has_alpha:
+ #tensors are not continuous. Rewrite will be required if this is an issue
+ masks = images[:,:,:,3]
+ images = images[:,:,:,:3]
+ else:
+ masks = torch.zeros((images.size(0), 64, 64), dtype=torch.float32, device="cpu")
+ if len(images) == 0:
+ raise FileNotFoundError(f"No images could be loaded from directory '{directory}'.")
+ return images, masks, images.size(0)
+
+class LoadImagesFromDirectoryUpload:
+ @classmethod
+ def INPUT_TYPES(s):
+ input_dir = folder_paths.get_input_directory()
+ directories = []
+ for item in os.listdir(input_dir):
+ if not os.path.isfile(os.path.join(input_dir, item)) and item != "clipspace":
+ directories.append(item)
+ return {
+ "required": {
+ "directory": (directories,),
+ },
+ "optional": {
+ "image_load_cap": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
+ "skip_first_images": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
+ "select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
+ "meta_batch": ("VHS_BatchManager",),
+ },
+ "hidden": {
+ "unique_id": "UNIQUE_ID"
+ },
+ }
+
+ RETURN_TYPES = ("IMAGE", "MASK", "INT")
+ RETURN_NAMES = ("IMAGE", "MASK", "frame_count")
+ FUNCTION = "load_images"
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+
+ def load_images(self, directory: str, **kwargs):
+ directory = folder_paths.get_annotated_filepath(strip_path(directory))
+ return load_images(directory, **kwargs)
+
+ @classmethod
+ def IS_CHANGED(s, directory: str, **kwargs):
+ directory = folder_paths.get_annotated_filepath(strip_path(directory))
+ return is_changed_load_images(directory, **kwargs)
+
+ @classmethod
+ def VALIDATE_INPUTS(s, directory: str, **kwargs):
+ directory = folder_paths.get_annotated_filepath(strip_path(directory))
+ return validate_load_images(directory)
+
+
+class LoadImagesFromDirectoryPath:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "directory": ("STRING", {"placeholder": "X://path/to/images", "vhs_path_extensions": []}),
+ },
+ "optional": {
+ "image_load_cap": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
+ "skip_first_images": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
+ "select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
+ "meta_batch": ("VHS_BatchManager",),
+ },
+ "hidden": {
+ "unique_id": "UNIQUE_ID"
+ },
+ }
+
+ RETURN_TYPES = ("IMAGE", "MASK", "INT")
+ RETURN_NAMES = ("IMAGE", "MASK", "frame_count")
+ FUNCTION = "load_images"
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+
+ def load_images(self, directory: str, **kwargs):
+ directory = strip_path(directory)
+ if directory is None or validate_load_images(directory) != True:
+ raise Exception("directory is not valid: " + directory)
+
+ return load_images(directory, **kwargs)
+
+ @classmethod
+ def IS_CHANGED(s, directory: str, **kwargs):
+ if directory is None:
+ return "input"
+ return is_changed_load_images(directory, **kwargs)
+
+ @classmethod
+ def VALIDATE_INPUTS(s, directory: str, **kwargs):
+ if directory is None:
+ return True
+ return validate_load_images(strip_path(directory))
diff --git a/custom_nodes/comfyui-videohelpersuite/videohelpersuite/load_video_nodes.py b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/load_video_nodes.py
new file mode 100644
index 0000000000000000000000000000000000000000..b23e40f535c8166ae05fa6a541d159cdadb368f7
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/load_video_nodes.py
@@ -0,0 +1,671 @@
+import os
+import itertools
+import numpy as np
+import torch
+from PIL import Image, ImageOps
+import cv2
+import psutil
+import subprocess
+import re
+import time
+
+import folder_paths
+from comfy.utils import common_upscale, ProgressBar
+import nodes
+from comfy.k_diffusion.utils import FolderOfImages
+from .logger import logger
+from .utils import BIGMAX, DIMMAX, calculate_file_hash, get_sorted_dir_files_from_directory,\
+ lazy_get_audio, hash_path, validate_path, strip_path, try_download_video, \
+ is_url, imageOrLatent, ffmpeg_path, ENCODE_ARGS, floatOrInt
+
+
+video_extensions = ['webm', 'mp4', 'mkv', 'gif', 'mov']
+
+VHSLoadFormats = {
+ 'None': {},
+ 'AnimateDiff': {'target_rate': 8, 'dim': (8,0,512,512)},
+ 'Mochi': {'target_rate': 24, 'dim': (16,0,848,480), 'frames':(6,1)},
+ 'LTXV': {'target_rate': 24, 'dim': (32,0,768,512), 'frames':(8,1)},
+ 'Hunyuan': {'target_rate': 24, 'dim': (16,0,848,480), 'frames':(4,1)},
+ 'Cosmos': {'target_rate': 24, 'dim': (16,0,1280,704), 'frames':(8,1)},
+ 'Wan': {'target_rate': 16, 'dim': (8,0,832,480), 'frames':(4,1)},
+}
+"""
+External plugins may add additional formats to nodes.VHSLoadFormats
+In addition to shorthand options, direct widget names will map a given dict to options.
+Adding a third arguement to a frames tuple can enable strict checks on number
+of loaded frames, i.e (8,1,True)
+"""
+if not hasattr(nodes, 'VHSLoadFormats'):
+ nodes.VHSLoadFormats = {}
+
+def get_load_formats():
+ #TODO: check if {**extra_config.VHSLoafFormats, **VHSLoadFormats} has minimum version
+ formats = {}
+ formats.update(nodes.VHSLoadFormats)
+ formats.update(VHSLoadFormats)
+ return (list(formats.keys()),
+ {'default': 'AnimateDiff', 'formats': formats})
+def get_format(format):
+ if format in VHSLoadFormats:
+ return VHSLoadFormats[format]
+ return nodes.VHSLoadFormats.get(format, {})
+
+def is_gif(filename) -> bool:
+ file_parts = filename.split('.')
+ return len(file_parts) > 1 and file_parts[-1] == "gif"
+
+
+def target_size(width, height, custom_width, custom_height, downscale_ratio=8) -> tuple[int, int]:
+ if downscale_ratio is None:
+ downscale_ratio = 8
+ if custom_width == 0 and custom_height == 0:
+ pass
+ elif custom_height == 0:
+ height *= custom_width/width
+ width = custom_width
+ elif custom_width == 0:
+ width *= custom_height/height
+ height = custom_height
+ else:
+ width = custom_width
+ height = custom_height
+ width = int(width/downscale_ratio + 0.5) * downscale_ratio
+ height = int(height/downscale_ratio + 0.5) * downscale_ratio
+ return (width, height)
+
+def cv_frame_generator(video, force_rate, frame_load_cap, skip_first_frames,
+ select_every_nth, meta_batch=None, unique_id=None):
+ video_cap = cv2.VideoCapture(video)
+ if not video_cap.isOpened() or not video_cap.grab():
+ raise ValueError(f"{video} could not be loaded with cv.")
+
+ # extract video metadata
+ fps = video_cap.get(cv2.CAP_PROP_FPS)
+ width = int(video_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
+ height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
+ total_frames = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT))
+ duration = total_frames / fps
+
+ width = 0
+
+ if width <=0 or height <=0:
+ _, frame = video_cap.retrieve()
+ height, width, _ = frame.shape
+
+ # set video_cap to look at start_index frame
+ total_frame_count = 0
+ total_frames_evaluated = -1
+ frames_added = 0
+ base_frame_time = 1 / fps
+ prev_frame = None
+
+ if force_rate == 0:
+ target_frame_time = base_frame_time
+ else:
+ target_frame_time = 1/force_rate
+
+ if total_frames > 0:
+ if force_rate != 0:
+ yieldable_frames = int(total_frames / fps * force_rate)
+ else:
+ yieldable_frames = total_frames
+ if select_every_nth:
+ yieldable_frames //= select_every_nth
+ if frame_load_cap != 0:
+ yieldable_frames = min(frame_load_cap, yieldable_frames)
+ else:
+ yieldable_frames = 0
+ yield (width, height, fps, duration, total_frames, target_frame_time, yieldable_frames)
+ pbar = ProgressBar(yieldable_frames)
+ time_offset=target_frame_time
+ while video_cap.isOpened():
+ if time_offset < target_frame_time:
+ is_returned = video_cap.grab()
+ # if didn't return frame, video has ended
+ if not is_returned:
+ break
+ time_offset += base_frame_time
+ if time_offset < target_frame_time:
+ continue
+ time_offset -= target_frame_time
+ # if not at start_index, skip doing anything with frame
+ total_frame_count += 1
+ if total_frame_count <= skip_first_frames:
+ continue
+ else:
+ total_frames_evaluated += 1
+
+ # if should not be selected, skip doing anything with frame
+ if total_frames_evaluated%select_every_nth != 0:
+ continue
+
+ # opencv loads images in BGR format (yuck), so need to convert to RGB for ComfyUI use
+ # follow up: can videos ever have an alpha channel?
+ # To my testing: No. opencv has no support for alpha
+ unused, frame = video_cap.retrieve()
+ frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+ # convert frame to comfyui's expected format
+ # TODO: frame contains no exif information. Check if opencv2 has already applied
+ frame = np.array(frame, dtype=np.float32)
+ torch.from_numpy(frame).div_(255)
+ if prev_frame is not None:
+ inp = yield prev_frame
+ if inp is not None:
+ #ensure the finally block is called
+ return
+ prev_frame = frame
+ frames_added += 1
+ if pbar is not None:
+ pbar.update_absolute(frames_added, yieldable_frames)
+ # if cap exists and we've reached it, stop processing frames
+ if frame_load_cap > 0 and frames_added >= frame_load_cap:
+ break
+ if meta_batch is not None:
+ meta_batch.inputs.pop(unique_id)
+ meta_batch.has_closed_inputs = True
+ if prev_frame is not None:
+ yield prev_frame
+
+def ffmpeg_frame_generator(video, force_rate, frame_load_cap, start_time,
+ custom_width, custom_height, downscale_ratio=8,
+ meta_batch=None, unique_id=None):
+ args_input = ["-i", video]
+ args_dummy = [ffmpeg_path] + args_input +['-c', 'copy', '-frames:v', '1', "-f", "null", "-"]
+ size_base = None
+ fps_base = None
+ try:
+ dummy_res = subprocess.run(args_dummy, stdout=subprocess.DEVNULL,
+ stderr=subprocess.PIPE, check=True)
+ except subprocess.CalledProcessError as e:
+ raise Exception("An error occurred in the ffmpeg subprocess:\n" \
+ + e.stderr.decode(*ENCODE_ARGS))
+ lines = dummy_res.stderr.decode(*ENCODE_ARGS)
+ if "Video: vp9 " in lines:
+ args_input = ["-c:v", "libvpx-vp9"] + args_input
+ args_dummy = [ffmpeg_path] + args_input +['-c', 'copy', '-frames:v', '1', "-f", "null", "-"]
+ try:
+ dummy_res = subprocess.run(args_dummy, stdout=subprocess.DEVNULL,
+ stderr=subprocess.PIPE, check=True)
+ except subprocess.CalledProcessError as e:
+ raise Exception("An error occurred in the ffmpeg subprocess:\n" \
+ + e.stderr.decode(*ENCODE_ARGS))
+ lines = dummy_res.stderr.decode(*ENCODE_ARGS)
+
+ for line in lines.split('\n'):
+ match = re.search("^ *Stream .* Video.*, ([1-9]|\\d{2,})x(\\d+)", line)
+ if match is not None:
+ size_base = [int(match.group(1)), int(match.group(2))]
+ fps_match = re.search(", ([\\d\\.]+) fps", line)
+ if fps_match:
+ fps_base = float(fps_match.group(1))
+ else:
+ fps_base = 1
+ alpha = re.search("(yuva|rgba|bgra|gbra)", line) is not None
+ break
+ else:
+ raise Exception("Failed to parse video/image information. FFMPEG output:\n" + lines)
+
+ durs_match = re.search("Duration: (\\d+:\\d+:\\d+\\.\\d+),", lines)
+ if durs_match:
+ durs = durs_match.group(1).split(':')
+ duration = int(durs[0])*3600 + int(durs[1])*60 + float(durs[2])
+ else:
+ duration = 0
+
+ if start_time > 0:
+ if start_time > 4:
+ post_seek = ['-ss', '4']
+ args_input = ['-ss', str(start_time - 4)] + args_input
+ else:
+ post_seek = ['-ss', str(start_time)]
+ else:
+ post_seek = []
+ args_all_frames = [ffmpeg_path, "-v", "error", "-an"] + \
+ args_input + ["-pix_fmt", "rgba64le"] + post_seek
+
+ vfilters = []
+ if force_rate != 0:
+ vfilters.append("fps=fps="+str(force_rate))
+ if custom_width != 0 or custom_height != 0:
+ size = target_size(size_base[0], size_base[1], custom_width,
+ custom_height, downscale_ratio=downscale_ratio)
+ ar = float(size[0])/float(size[1])
+ if abs(size_base[0]*ar-size_base[1]) >= 1:
+ #Aspect ratio is changed. Crop to new aspect ratio before scale
+ vfilters.append(f"crop=if(gt({ar}\\,a)\\,iw\\,ih*{ar}):if(gt({ar}\\,a)\\,iw/{ar}\\,ih)")
+ size_arg = ':'.join(map(str,size))
+ vfilters.append(f"scale={size_arg}")
+ else:
+ size = size_base
+ if len(vfilters) > 0:
+ args_all_frames += ["-vf", ",".join(vfilters)]
+ yieldable_frames = (force_rate or fps_base)*duration
+ if frame_load_cap > 0:
+ args_all_frames += ["-frames:v", str(frame_load_cap)]
+ yieldable_frames = min(yieldable_frames, frame_load_cap)
+ yield (size_base[0], size_base[1], fps_base, duration, fps_base * duration,
+ 1/(force_rate or fps_base), yieldable_frames, size[0], size[1], alpha)
+
+ args_all_frames += ["-f", "rawvideo", "-"]
+ pbar = ProgressBar(yieldable_frames)
+ try:
+ with subprocess.Popen(args_all_frames, stdout=subprocess.PIPE) as proc:
+ #Manually buffer enough bytes for an image
+ bpi = size[0] * size[1] * 8
+ current_bytes = bytearray(bpi)
+ current_offset=0
+ prev_frame = None
+ while True:
+ bytes_read = proc.stdout.read(bpi - current_offset)
+ if bytes_read is None:#sleep to wait for more data
+ time.sleep(.1)
+ continue
+ if len(bytes_read) == 0:#EOF
+ break
+ current_bytes[current_offset:len(bytes_read)] = bytes_read
+ current_offset+=len(bytes_read)
+ if current_offset == bpi:
+ if prev_frame is not None:
+ yield prev_frame
+ pbar.update(1)
+ prev_frame = np.frombuffer(current_bytes, dtype=np.dtype(np.uint16).newbyteorder("<")).reshape(size[1], size[0], 4) / (2**16-1)
+ if not alpha:
+ prev_frame = prev_frame[:, :, :-1]
+ current_offset = 0
+ except BrokenPipeError as e:
+ raise Exception("An error occured in the ffmpeg subprocess:\n" \
+ + proc.stderr.read().decode(*ENCODE_ARGS))
+ if meta_batch is not None:
+ meta_batch.inputs.pop(unique_id)
+ meta_batch.has_closed_inputs = True
+ if prev_frame is not None:
+ yield prev_frame
+
+#Python 3.12 adds an itertools.batched, but it's easily replicated for legacy support
+def batched(it, n):
+ while batch := tuple(itertools.islice(it, n)):
+ yield batch
+def batched_vae_encode(images, vae, frames_per_batch):
+ for batch in batched(images, frames_per_batch):
+ image_batch = torch.from_numpy(np.array(batch))
+ yield from vae.encode(image_batch).numpy()
+def resized_cv_frame_gen(custom_width, custom_height, downscale_ratio, **kwargs):
+ gen = cv_frame_generator(**kwargs)
+ info = next(gen)
+ width, height = info[0], info[1]
+ frames_per_batch = (1920 * 1080 * 16) // (width * height) or 1
+ if kwargs.get('meta_batch', None) is not None:
+ frames_per_batch = min(frames_per_batch, kwargs['meta_batch'].frames_per_batch)
+ if custom_width != 0 or custom_height != 0 or downscale_ratio is not None:
+ new_size = target_size(width, height, custom_width, custom_height, downscale_ratio)
+ yield (*info, new_size[0], new_size[1], False)
+ if new_size[0] != width or new_size[1] != height:
+ def rescale(frame):
+ s = torch.from_numpy(np.fromiter(frame, np.dtype((np.float32, (height, width, 3)))))
+ s = s.movedim(-1,1)
+ s = common_upscale(s, new_size[0], new_size[1], "lanczos", "center")
+ return s.movedim(1,-1).numpy()
+ yield from itertools.chain.from_iterable(map(rescale, batched(gen, frames_per_batch)))
+ return
+ else:
+ yield (*info, info[0], info[1], False)
+ yield from gen
+
+def load_video(meta_batch=None, unique_id=None, memory_limit_mb=None, vae=None,
+ generator=resized_cv_frame_gen, format='None', **kwargs):
+ if 'force_size' in kwargs:
+ kwargs.pop('force_size')
+ logger.warn("force_size has been removed. Did you reload the webpage after updating?")
+ format = get_format(format)
+ kwargs['video'] = strip_path(kwargs['video'])
+ if vae is not None:
+ downscale_ratio = getattr(vae, "downscale_ratio", 8)
+ else:
+ downscale_ratio = format.get('dim', (1,))[0]
+ if meta_batch is None or unique_id not in meta_batch.inputs:
+ gen = generator(meta_batch=meta_batch, unique_id=unique_id, downscale_ratio=downscale_ratio, **kwargs)
+ (width, height, fps, duration, total_frames, target_frame_time, yieldable_frames, new_width, new_height, alpha) = next(gen)
+
+ if meta_batch is not None:
+ meta_batch.inputs[unique_id] = (gen, width, height, fps, duration, total_frames, target_frame_time, yieldable_frames, new_width, new_height, alpha)
+ if yieldable_frames:
+ meta_batch.total_frames = min(meta_batch.total_frames, yieldable_frames)
+
+ else:
+ (gen, width, height, fps, duration, total_frames, target_frame_time, yieldable_frames, new_width, new_height, alpha) = meta_batch.inputs[unique_id]
+
+ memory_limit = None
+ if memory_limit_mb is not None:
+ memory_limit *= 2 ** 20
+ else:
+ #TODO: verify if garbage collection should be performed here.
+ #leaves ~128 MB unreserved for safety
+ try:
+ memory_limit = (psutil.virtual_memory().available + psutil.swap_memory().free) - 2 ** 27
+ except:
+ logger.warn("Failed to calculate available memory. Memory load limit has been disabled")
+ memory_limit = BIGMAX
+ if vae is not None:
+ #space required to load as f32, exist as latent with wiggle room, decode to f32
+ max_loadable_frames = int(memory_limit//(width*height*3*(4+4+1/10)))
+ else:
+ #TODO: use better estimate for when vae is not None
+ #Consider completely ignoring for load_latent case?
+ max_loadable_frames = int(memory_limit//(width*height*3*(.1)))
+ if meta_batch is not None:
+ if 'frames' in format:
+ if meta_batch.frames_per_batch % format['frames'][0] != format['frames'][1]:
+ error = (meta_batch.frames_per_batch - format['frames'][1]) % format['frames'][0]
+ suggested = meta_batch.frames_per_batch - error
+ if error > format['frames'][0] / 2:
+ suggested += format['frames'][0]
+ raise RuntimeError(f"The chosen frames per batch is incompatible with the selected format. Try {suggested}")
+ if meta_batch.frames_per_batch > max_loadable_frames:
+ raise RuntimeError(f"Meta Batch set to {meta_batch.frames_per_batch} frames but only {max_loadable_frames} can fit in memory")
+ gen = itertools.islice(gen, meta_batch.frames_per_batch)
+ else:
+ original_gen = gen
+ gen = itertools.islice(gen, max_loadable_frames)
+ frames_per_batch = (1920 * 1080 * 16) // (width * height) or 1
+ if vae is not None:
+ gen = batched_vae_encode(gen, vae, frames_per_batch)
+ vw,vh = new_width//downscale_ratio, new_height//downscale_ratio
+ channels = getattr(vae, 'latent_channels', 4)
+ images = torch.from_numpy(np.fromiter(gen, np.dtype((np.float32, (channels,vh,vw)))))
+ else:
+ #Some minor wizardry to eliminate a copy and reduce max memory by a factor of ~2
+ images = torch.from_numpy(np.fromiter(gen, np.dtype((np.float32, (new_height, new_width, 4 if alpha else 3)))))
+ if meta_batch is None and memory_limit is not None:
+ try:
+ next(original_gen)
+ raise RuntimeError(f"Memory limit hit after loading {len(images)} frames. Stopping execution.")
+ except StopIteration:
+ pass
+ if len(images) == 0:
+ raise RuntimeError("No frames generated")
+ if 'frames' in format and len(images) % format['frames'][0] != format['frames'][1]:
+ err_msg = f"The number of frames loaded {len(images)}, does not match the requirements of the currently selected format."
+ if len(format['frames']) > 2 and format['frames'][2]:
+ raise RuntimeError(err_msg)
+ div, mod = format['frames'][:2]
+ frames = (len(images) - mod) // div * div + mod
+ images = images[:frames]
+ #Commenting out log message since it's displayed in UI. consider further
+ #logger.warn(err_msg + f" Output has been truncated to {len(images)} frames.")
+ if 'start_time' in kwargs:
+ start_time = kwargs['start_time']
+ else:
+ start_time = kwargs['skip_first_frames'] * target_frame_time
+ target_frame_time *= kwargs.get('select_every_nth', 1)
+ #Setup lambda for lazy audio capture
+ audio = lazy_get_audio(kwargs['video'], start_time, kwargs['frame_load_cap']*target_frame_time)
+ #Adjust target_frame_time for select_every_nth
+ video_info = {
+ "source_fps": fps,
+ "source_frame_count": total_frames,
+ "source_duration": duration,
+ "source_width": width,
+ "source_height": height,
+ "loaded_fps": 1/target_frame_time,
+ "loaded_frame_count": len(images),
+ "loaded_duration": len(images) * target_frame_time,
+ "loaded_width": new_width,
+ "loaded_height": new_height,
+ }
+ if vae is None:
+ return (images, len(images), audio, video_info)
+ else:
+ return ({"samples": images}, len(images), audio, video_info)
+
+
+
+class LoadVideoUpload:
+ @classmethod
+ def INPUT_TYPES(s):
+ input_dir = folder_paths.get_input_directory()
+ files = []
+ for f in os.listdir(input_dir):
+ if os.path.isfile(os.path.join(input_dir, f)):
+ file_parts = f.split('.')
+ if len(file_parts) > 1 and (file_parts[-1].lower() in video_extensions):
+ files.append(f)
+ return {"required": {
+ "video": (sorted(files),),
+ "force_rate": (floatOrInt, {"default": 0, "min": 0, "max": 60, "step": 1, "disable": 0}),
+ "custom_width": ("INT", {"default": 0, "min": 0, "max": DIMMAX, 'disable': 0}),
+ "custom_height": ("INT", {"default": 0, "min": 0, "max": DIMMAX, 'disable': 0}),
+ "frame_load_cap": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1, "disable": 0}),
+ "skip_first_frames": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
+ "select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
+ },
+ "optional": {
+ "meta_batch": ("VHS_BatchManager",),
+ "vae": ("VAE",),
+ "format": get_load_formats(),
+ },
+ "hidden": {
+ "force_size": "STRING",
+ "unique_id": "UNIQUE_ID"
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+
+ RETURN_TYPES = (imageOrLatent, "INT", "AUDIO", "VHS_VIDEOINFO")
+ RETURN_NAMES = ("IMAGE", "frame_count", "audio", "video_info")
+
+ FUNCTION = "load_video"
+
+ def load_video(self, **kwargs):
+ kwargs['video'] = folder_paths.get_annotated_filepath(strip_path(kwargs['video']))
+ return load_video(**kwargs)
+
+ @classmethod
+ def IS_CHANGED(s, video, **kwargs):
+ image_path = folder_paths.get_annotated_filepath(video)
+ return calculate_file_hash(image_path)
+
+ @classmethod
+ def VALIDATE_INPUTS(s, video):
+ if not folder_paths.exists_annotated_filepath(video):
+ return "Invalid video file: {}".format(video)
+ return True
+
+
+class LoadVideoPath:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "video": ("STRING", {"placeholder": "X://insert/path/here.mp4", "vhs_path_extensions": video_extensions}),
+ "force_rate": (floatOrInt, {"default": 0, "min": 0, "max": 60, "step": 1, "disable": 0}),
+ "custom_width": ("INT", {"default": 0, "min": 0, "max": DIMMAX, 'disable': 0}),
+ "custom_height": ("INT", {"default": 0, "min": 0, "max": DIMMAX, 'disable': 0}),
+ "frame_load_cap": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1, "disable": 0}),
+ "skip_first_frames": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
+ "select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
+ },
+ "optional": {
+ "meta_batch": ("VHS_BatchManager",),
+ "vae": ("VAE",),
+ "format": get_load_formats(),
+ },
+ "hidden": {
+ "force_size": "STRING",
+ "unique_id": "UNIQUE_ID"
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+
+ RETURN_TYPES = (imageOrLatent, "INT", "AUDIO", "VHS_VIDEOINFO")
+ RETURN_NAMES = ("IMAGE", "frame_count", "audio", "video_info")
+
+ FUNCTION = "load_video"
+
+ def load_video(self, **kwargs):
+ if kwargs['video'] is None or validate_path(kwargs['video']) != True:
+ raise Exception("video is not a valid path: " + kwargs['video'])
+ if is_url(kwargs['video']):
+ kwargs['video'] = try_download_video(kwargs['video']) or kwargs['video']
+ return load_video(**kwargs)
+
+ @classmethod
+ def IS_CHANGED(s, video, **kwargs):
+ return hash_path(video)
+
+ @classmethod
+ def VALIDATE_INPUTS(s, video):
+ return validate_path(video, allow_none=True)
+
+class LoadVideoFFmpegUpload:
+ @classmethod
+ def INPUT_TYPES(s):
+ input_dir = folder_paths.get_input_directory()
+ files = []
+ for f in os.listdir(input_dir):
+ if os.path.isfile(os.path.join(input_dir, f)):
+ file_parts = f.split('.')
+ if len(file_parts) > 1 and (file_parts[-1].lower() in video_extensions):
+ files.append(f)
+ return {"required": {
+ "video": (sorted(files),),
+ "force_rate": (floatOrInt, {"default": 0, "min": 0, "max": 60, "step": 1, "disable": 0}),
+ "custom_width": ("INT", {"default": 0, "min": 0, "max": DIMMAX, 'disable': 0}),
+ "custom_height": ("INT", {"default": 0, "min": 0, "max": DIMMAX, 'disable': 0}),
+ "frame_load_cap": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1, "disable": 0}),
+ "start_time": ("FLOAT", {"default": 0, "min": 0, "max": BIGMAX, "step": .001, "widgetType": "VHSTIMESTAMP"}),
+ },
+ "optional": {
+ "meta_batch": ("VHS_BatchManager",),
+ "vae": ("VAE",),
+ "format": get_load_formats(),
+ },
+ "hidden": {
+ "force_size": "STRING",
+ "unique_id": "UNIQUE_ID"
+
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+
+ RETURN_TYPES = (imageOrLatent, "MASK", "AUDIO", "VHS_VIDEOINFO")
+ RETURN_NAMES = ("IMAGE", "mask", "audio", "video_info")
+
+ FUNCTION = "load_video"
+
+ def load_video(self, **kwargs):
+ kwargs['video'] = folder_paths.get_annotated_filepath(strip_path(kwargs['video']))
+ image, _, audio, video_info = load_video(**kwargs, generator=ffmpeg_frame_generator)
+ if image.size(3) == 4:
+ return (image[:,:,:,:3], 1-image[:,:,:,3], audio, video_info)
+ return (image, torch.zeros(image.size(0), 64, 64, device="cpu"), audio, video_info)
+
+ @classmethod
+ def IS_CHANGED(s, video, **kwargs):
+ image_path = folder_paths.get_annotated_filepath(video)
+ return calculate_file_hash(image_path)
+
+ @classmethod
+ def VALIDATE_INPUTS(s, video):
+ if not folder_paths.exists_annotated_filepath(video):
+ return "Invalid video file: {}".format(video)
+ return True
+
+
+class LoadVideoFFmpegPath:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "video": ("STRING", {"placeholder": "X://insert/path/here.mp4", "vhs_path_extensions": video_extensions}),
+ "force_rate": (floatOrInt, {"default": 0, "min": 0, "max": 60, "step": 1, "disable": 0}),
+ "custom_width": ("INT", {"default": 0, "min": 0, "max": DIMMAX, 'disable': 0}),
+ "custom_height": ("INT", {"default": 0, "min": 0, "max": DIMMAX, 'disable': 0}),
+ "frame_load_cap": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1, "disable": 0}),
+ "start_time": ("FLOAT", {"default": 0, "min": 0, "max": BIGMAX, "step": .001, "widgetType": "VHSTIMESTAMP"}),
+ },
+ "optional": {
+ "meta_batch": ("VHS_BatchManager",),
+ "vae": ("VAE",),
+ "format": get_load_formats(),
+ },
+ "hidden": {
+ "force_size": "STRING",
+ "unique_id": "UNIQUE_ID"
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+
+ RETURN_TYPES = (imageOrLatent, "MASK", "AUDIO", "VHS_VIDEOINFO")
+ RETURN_NAMES = ("IMAGE", "mask", "audio", "video_info")
+
+ FUNCTION = "load_video"
+
+ def load_video(self, **kwargs):
+ if kwargs['video'] is None or validate_path(kwargs['video']) != True:
+ raise Exception("video is not a valid path: " + kwargs['video'])
+ if is_url(kwargs['video']):
+ kwargs['video'] = try_download_video(kwargs['video']) or kwargs['video']
+ image, _, audio, video_info = load_video(**kwargs, generator=ffmpeg_frame_generator)
+ if isinstance(image, dict):
+ return (image, None, audio, video_info)
+ if image.size(3) == 4:
+ return (image[:,:,:,:3], 1-image[:,:,:,3], audio, video_info)
+ return (image, torch.zeros(image.size(0), 64, 64, device="cpu"), audio, video_info)
+
+ @classmethod
+ def IS_CHANGED(s, video, **kwargs):
+ return hash_path(video)
+
+ @classmethod
+ def VALIDATE_INPUTS(s, video):
+ return validate_path(video, allow_none=True)
+
+class LoadImagePath:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "image": ("STRING", {"placeholder": "X://insert/path/here.png", "vhs_path_extensions": list(FolderOfImages.IMG_EXTENSIONS)}),
+ "custom_width": ("INT", {"default": 0, "min": 0, "max": DIMMAX, "step": 8, 'disable': 0}),
+ "custom_height": ("INT", {"default": 0, "min": 0, "max": DIMMAX, "step": 8, 'disable': 0}),
+ },
+ "optional": {
+ "vae": ("VAE",),
+ },
+ "hidden": {
+ "force_size": "STRING",
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+
+ RETURN_TYPES = (imageOrLatent, "MASK")
+ RETURN_NAMES = ("IMAGE", "mask")
+
+ FUNCTION = "load_image"
+
+ def load_image(self, **kwargs):
+ if kwargs['image'] is None or validate_path(kwargs['image']) != True:
+ raise Exception("image is not a valid path: " + kwargs['image'])
+ kwargs.update({'video': kwargs['image'], 'force_rate': 0, 'frame_load_cap': 0,
+ 'start_time': 0})
+ kwargs.pop('image')
+ image, _, _, _ = load_video(**kwargs, generator=ffmpeg_frame_generator)
+ if isinstance(image, dict):
+ return (image, None)
+ if image.size(3) == 4:
+ return (image[:,:,:,:3], 1-image[:,:,:,3])
+ return (image, torch.zeros(image.size(0), 64, 64, device="cpu"))
+
+ @classmethod
+ def IS_CHANGED(s, image, **kwargs):
+ return hash_path(image)
+
+ @classmethod
+ def VALIDATE_INPUTS(s, image):
+ return validate_path(image, allow_none=True)
diff --git a/custom_nodes/comfyui-videohelpersuite/videohelpersuite/logger.py b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/logger.py
new file mode 100644
index 0000000000000000000000000000000000000000..6e7b8d64bda275608ba6bf8ee28d2a2112e3e2be
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/logger.py
@@ -0,0 +1,36 @@
+import sys
+import copy
+import logging
+
+
+class ColoredFormatter(logging.Formatter):
+ COLORS = {
+ "DEBUG": "\033[0;36m", # CYAN
+ "INFO": "\033[0;32m", # GREEN
+ "WARNING": "\033[0;33m", # YELLOW
+ "ERROR": "\033[0;31m", # RED
+ "CRITICAL": "\033[0;37;41m", # WHITE ON RED
+ "RESET": "\033[0m", # RESET COLOR
+ }
+
+ def format(self, record):
+ colored_record = copy.copy(record)
+ levelname = colored_record.levelname
+ seq = self.COLORS.get(levelname, self.COLORS["RESET"])
+ colored_record.levelname = f"{seq}{levelname}{self.COLORS['RESET']}"
+ return super().format(colored_record)
+
+
+# Create a new logger
+logger = logging.getLogger("VideoHelperSuite")
+logger.propagate = False
+
+# Add handler if we don't have one.
+if not logger.handlers:
+ handler = logging.StreamHandler(sys.stdout)
+ handler.setFormatter(ColoredFormatter("[%(name)s] - %(levelname)s - %(message)s"))
+ logger.addHandler(handler)
+
+# Configure logger
+loglevel = logging.INFO
+logger.setLevel(loglevel)
diff --git a/custom_nodes/comfyui-videohelpersuite/videohelpersuite/nodes.py b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/nodes.py
new file mode 100644
index 0000000000000000000000000000000000000000..f40461e7b9b9e01a4d4eb1453f95aef26be9be97
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/nodes.py
@@ -0,0 +1,1111 @@
+import os
+import sys
+import json
+import subprocess
+import numpy as np
+import re
+import datetime
+from typing import List
+import torch
+from PIL import Image, ExifTags
+from PIL.PngImagePlugin import PngInfo
+from pathlib import Path
+from string import Template
+import itertools
+import functools
+
+import folder_paths
+from .logger import logger
+from .image_latent_nodes import *
+from .load_video_nodes import LoadVideoUpload, LoadVideoPath, LoadVideoFFmpegUpload, LoadVideoFFmpegPath, LoadImagePath
+from .load_images_nodes import LoadImagesFromDirectoryUpload, LoadImagesFromDirectoryPath
+from .batched_nodes import VAEEncodeBatched, VAEDecodeBatched
+from .utils import ffmpeg_path, get_audio, hash_path, validate_path, requeue_workflow, \
+ gifski_path, calculate_file_hash, strip_path, try_download_video, is_url, \
+ imageOrLatent, BIGMAX, merge_filter_args, ENCODE_ARGS, floatOrInt, cached, \
+ ContainsAll
+from comfy.utils import ProgressBar
+
+if 'VHS_video_formats' not in folder_paths.folder_names_and_paths:
+ folder_paths.folder_names_and_paths["VHS_video_formats"] = ((),{".json"})
+if len(folder_paths.folder_names_and_paths['VHS_video_formats'][1]) == 0:
+ folder_paths.folder_names_and_paths["VHS_video_formats"][1].add(".json")
+audio_extensions = ['mp3', 'mp4', 'wav', 'ogg']
+
+def flatten_list(l):
+ ret = []
+ for e in l:
+ if isinstance(e, list):
+ ret.extend(e)
+ else:
+ ret.append(e)
+ return ret
+
+def iterate_format(video_format, for_widgets=True):
+ """Provides an iterator over widgets, or arguments"""
+ def indirector(cont, index):
+ if isinstance(cont[index], list) and (not for_widgets
+ or len(cont[index])> 1 and not isinstance(cont[index][1], dict)):
+ inp = yield cont[index]
+ if inp is not None:
+ cont[index] = inp
+ yield
+ for k in video_format:
+ if k == "extra_widgets":
+ if for_widgets:
+ yield from video_format["extra_widgets"]
+ elif k.endswith("_pass"):
+ for i in range(len(video_format[k])):
+ yield from indirector(video_format[k], i)
+ if not for_widgets:
+ video_format[k] = flatten_list(video_format[k])
+ else:
+ yield from indirector(video_format, k)
+
+base_formats_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "video_formats")
+@cached(5)
+def get_video_formats():
+ format_files = {}
+ for format_name in folder_paths.get_filename_list("VHS_video_formats"):
+ format_files[format_name] = folder_paths.get_full_path("VHS_video_formats", format_name)
+ for item in os.scandir(base_formats_dir):
+ if not item.is_file() or not item.name.endswith('.json'):
+ continue
+ format_files[item.name[:-5]] = item.path
+ formats = []
+ format_widgets = {}
+ for format_name, path in format_files.items():
+ with open(path, 'r') as stream:
+ video_format = json.load(stream)
+ if "gifski_pass" in video_format and gifski_path is None:
+ #Skip format
+ continue
+ widgets = list(iterate_format(video_format))
+ formats.append("video/" + format_name)
+ if (len(widgets) > 0):
+ format_widgets["video/"+ format_name] = widgets
+ return formats, format_widgets
+
+def apply_format_widgets(format_name, kwargs):
+ if os.path.exists(os.path.join(base_formats_dir, format_name + ".json")):
+ video_format_path = os.path.join(base_formats_dir, format_name + ".json")
+ else:
+ video_format_path = folder_paths.get_full_path("VHS_video_formats", format_name)
+ with open(video_format_path, 'r') as stream:
+ video_format = json.load(stream)
+ for w in iterate_format(video_format):
+ if w[0] not in kwargs:
+ if len(w) > 2 and 'default' in w[2]:
+ default = w[2]['default']
+ else:
+ if type(w[1]) is list:
+ default = w[1][0]
+ else:
+ #NOTE: This doesn't respect max/min, but should be good enough as a fallback to a fallback to a fallback
+ default = {"BOOLEAN": False, "INT": 0, "FLOAT": 0, "STRING": ""}[w[1]]
+ kwargs[w[0]] = default
+ logger.warn(f"Missing input for {w[0][0]} has been set to {default}")
+ wit = iterate_format(video_format, False)
+ for w in wit:
+ while isinstance(w, list):
+ if len(w) == 1:
+ #TODO: mapping=kwargs should be safer, but results in key errors, investigate why
+ w = [Template(x).substitute(**kwargs) for x in w[0]]
+ break
+ elif isinstance(w[1], dict):
+ w = w[1][str(kwargs[w[0]])]
+ elif len(w) > 3:
+ w = Template(w[3]).substitute(val=kwargs[w[0]])
+ else:
+ w = str(kwargs[w[0]])
+ wit.send(w)
+ return video_format
+
+def tensor_to_int(tensor, bits):
+ tensor = tensor.cpu().numpy() * (2**bits-1) + 0.5
+ return np.clip(tensor, 0, (2**bits-1))
+def tensor_to_shorts(tensor):
+ return tensor_to_int(tensor, 16).astype(np.uint16)
+def tensor_to_bytes(tensor):
+ return tensor_to_int(tensor, 8).astype(np.uint8)
+
+def ffmpeg_process(args, video_format, video_metadata, file_path, env):
+
+ res = None
+ frame_data = yield
+ total_frames_output = 0
+ if video_format.get('save_metadata', 'False') != 'False':
+ os.makedirs(folder_paths.get_temp_directory(), exist_ok=True)
+ metadata = json.dumps(video_metadata)
+ metadata_path = os.path.join(folder_paths.get_temp_directory(), "metadata.txt")
+ #metadata from file should escape = ; # \ and newline
+ metadata = metadata.replace("\\","\\\\")
+ metadata = metadata.replace(";","\\;")
+ metadata = metadata.replace("#","\\#")
+ metadata = metadata.replace("=","\\=")
+ metadata = metadata.replace("\n","\\\n")
+ metadata = "comment=" + metadata
+ with open(metadata_path, "w") as f:
+ f.write(";FFMETADATA1\n")
+ f.write(metadata)
+ m_args = args[:1] + ["-i", metadata_path] + args[1:] + ["-metadata", "creation_time=now"]
+ with subprocess.Popen(m_args + [file_path], stderr=subprocess.PIPE,
+ stdin=subprocess.PIPE, env=env) as proc:
+ try:
+ while frame_data is not None:
+ proc.stdin.write(frame_data)
+ #TODO: skip flush for increased speed
+ frame_data = yield
+ total_frames_output+=1
+ proc.stdin.flush()
+ proc.stdin.close()
+ res = proc.stderr.read()
+ except BrokenPipeError as e:
+ err = proc.stderr.read()
+ #Check if output file exists. If it does, the re-execution
+ #will also fail. This obscures the cause of the error
+ #and seems to never occur concurrent to the metadata issue
+ if os.path.exists(file_path):
+ raise Exception("An error occurred in the ffmpeg subprocess:\n" \
+ + err.decode(*ENCODE_ARGS))
+ #Res was not set
+ print(err.decode(*ENCODE_ARGS), end="", file=sys.stderr)
+ logger.warn("An error occurred when saving with metadata")
+ if res != b'':
+ with subprocess.Popen(args + [file_path], stderr=subprocess.PIPE,
+ stdin=subprocess.PIPE, env=env) as proc:
+ try:
+ while frame_data is not None:
+ proc.stdin.write(frame_data)
+ frame_data = yield
+ total_frames_output+=1
+ proc.stdin.flush()
+ proc.stdin.close()
+ res = proc.stderr.read()
+ except BrokenPipeError as e:
+ res = proc.stderr.read()
+ raise Exception("An error occurred in the ffmpeg subprocess:\n" \
+ + res.decode(*ENCODE_ARGS))
+ yield total_frames_output
+ if len(res) > 0:
+ print(res.decode(*ENCODE_ARGS), end="", file=sys.stderr)
+
+def gifski_process(args, dimensions, frame_rate, video_format, file_path, env):
+ frame_data = yield
+ with subprocess.Popen(args + video_format['main_pass'] + ['-f', 'yuv4mpegpipe', '-'],
+ stderr=subprocess.PIPE, stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE, env=env) as procff:
+ with subprocess.Popen([gifski_path] + video_format['gifski_pass']
+ + ['-W', f'{dimensions[0]}', '-H', f'{dimensions[1]}']
+ + ['-r', f'{frame_rate}']
+ + ['-q', '-o', file_path, '-'], stderr=subprocess.PIPE,
+ stdin=procff.stdout, stdout=subprocess.PIPE,
+ env=env) as procgs:
+ try:
+ while frame_data is not None:
+ procff.stdin.write(frame_data)
+ frame_data = yield
+ procff.stdin.flush()
+ procff.stdin.close()
+ resff = procff.stderr.read()
+ resgs = procgs.stderr.read()
+ outgs = procgs.stdout.read()
+ except BrokenPipeError as e:
+ procff.stdin.close()
+ resff = procff.stderr.read()
+ resgs = procgs.stderr.read()
+ raise Exception("An error occurred while creating gifski output\n" \
+ + "Make sure you are using gifski --version >=1.32.0\nffmpeg: " \
+ + resff.decode(*ENCODE_ARGS) + '\ngifski: ' + resgs.decode(*ENCODE_ARGS))
+ if len(resff) > 0:
+ print(resff.decode(*ENCODE_ARGS), end="", file=sys.stderr)
+ if len(resgs) > 0:
+ print(resgs.decode(*ENCODE_ARGS), end="", file=sys.stderr)
+ #should always be empty as the quiet flag is passed
+ if len(outgs) > 0:
+ print(outgs.decode(*ENCODE_ARGS))
+
+def to_pingpong(inp):
+ if not hasattr(inp, "__getitem__"):
+ inp = list(inp)
+ yield from inp
+ for i in range(len(inp)-2,0,-1):
+ yield inp[i]
+
+class VideoCombine:
+ @classmethod
+ def INPUT_TYPES(s):
+ ffmpeg_formats, format_widgets = get_video_formats()
+ format_widgets["image/webp"] = [['lossless', "BOOLEAN", {'default': True}]]
+ return {
+ "required": {
+ "images": (imageOrLatent,),
+ "frame_rate": (
+ floatOrInt,
+ {"default": 8, "min": 1, "step": 1},
+ ),
+ "loop_count": ("INT", {"default": 0, "min": 0, "max": 100, "step": 1}),
+ "filename_prefix": ("STRING", {"default": "AnimateDiff"}),
+ "format": (["image/gif", "image/webp"] + ffmpeg_formats, {'formats': format_widgets}),
+ "pingpong": ("BOOLEAN", {"default": False}),
+ "save_output": ("BOOLEAN", {"default": True}),
+ },
+ "optional": {
+ "audio": ("AUDIO",),
+ "meta_batch": ("VHS_BatchManager",),
+ "vae": ("VAE",),
+ },
+ "hidden": ContainsAll({
+ "prompt": "PROMPT",
+ "extra_pnginfo": "EXTRA_PNGINFO",
+ "unique_id": "UNIQUE_ID"
+ }),
+ }
+
+ RETURN_TYPES = ("VHS_FILENAMES",)
+ RETURN_NAMES = ("Filenames",)
+ OUTPUT_NODE = True
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+ FUNCTION = "combine_video"
+
+ def combine_video(
+ self,
+ frame_rate: int,
+ loop_count: int,
+ images=None,
+ latents=None,
+ filename_prefix="AnimateDiff",
+ format="image/gif",
+ pingpong=False,
+ save_output=True,
+ prompt=None,
+ extra_pnginfo=None,
+ audio=None,
+ unique_id=None,
+ manual_format_widgets=None,
+ meta_batch=None,
+ vae=None,
+ **kwargs
+ ):
+ if latents is not None:
+ images = latents
+ if images is None:
+ return ((save_output, []),)
+ if vae is not None:
+ if isinstance(images, dict):
+ images = images['samples']
+ else:
+ vae = None
+
+ if isinstance(images, torch.Tensor) and images.size(0) == 0:
+ return ((save_output, []),)
+ num_frames = len(images)
+ pbar = ProgressBar(num_frames)
+ if vae is not None:
+ downscale_ratio = getattr(vae, "downscale_ratio", 8)
+ width = images.size(-1)*downscale_ratio
+ height = images.size(-2)*downscale_ratio
+ frames_per_batch = (1920 * 1080 * 16) // (width * height) or 1
+ #Python 3.12 adds an itertools.batched, but it's easily replicated for legacy support
+ def batched(it, n):
+ while batch := tuple(itertools.islice(it, n)):
+ yield batch
+ def batched_encode(images, vae, frames_per_batch):
+ for batch in batched(iter(images), frames_per_batch):
+ image_batch = torch.from_numpy(np.array(batch))
+ yield from vae.decode(image_batch)
+ images = batched_encode(images, vae, frames_per_batch)
+ first_image = next(images)
+ #repush first_image
+ images = itertools.chain([first_image], images)
+ #A single image has 3 dimensions. Discard higher dimensions
+ while len(first_image.shape) > 3:
+ first_image = first_image[0]
+ else:
+ first_image = images[0]
+ images = iter(images)
+ # get output information
+ output_dir = (
+ folder_paths.get_output_directory()
+ if save_output
+ else folder_paths.get_temp_directory()
+ )
+ (
+ full_output_folder,
+ filename,
+ _,
+ subfolder,
+ _,
+ ) = folder_paths.get_save_image_path(filename_prefix, output_dir)
+ output_files = []
+
+ metadata = PngInfo()
+ video_metadata = {}
+ if prompt is not None:
+ metadata.add_text("prompt", json.dumps(prompt))
+ video_metadata["prompt"] = json.dumps(prompt)
+ if extra_pnginfo is not None:
+ for x in extra_pnginfo:
+ metadata.add_text(x, json.dumps(extra_pnginfo[x]))
+ video_metadata[x] = extra_pnginfo[x]
+ extra_options = extra_pnginfo.get('workflow', {}).get('extra', {})
+ else:
+ extra_options = {}
+ metadata.add_text("CreationTime", datetime.datetime.now().isoformat(" ")[:19])
+
+ if meta_batch is not None and unique_id in meta_batch.outputs:
+ (counter, output_process) = meta_batch.outputs[unique_id]
+ else:
+ # comfy counter workaround
+ max_counter = 0
+
+ # Loop through the existing files
+ matcher = re.compile(f"{re.escape(filename)}_(\\d+)\\D*\\..+", re.IGNORECASE)
+ for existing_file in os.listdir(full_output_folder):
+ # Check if the file matches the expected format
+ match = matcher.fullmatch(existing_file)
+ if match:
+ # Extract the numeric portion of the filename
+ file_counter = int(match.group(1))
+ # Update the maximum counter value if necessary
+ if file_counter > max_counter:
+ max_counter = file_counter
+
+ # Increment the counter by 1 to get the next available value
+ counter = max_counter + 1
+ output_process = None
+
+ # save first frame as png to keep metadata
+ first_image_file = f"{filename}_{counter:05}.png"
+ file_path = os.path.join(full_output_folder, first_image_file)
+ if extra_options.get('VHS_MetadataImage', True) != False:
+ Image.fromarray(tensor_to_bytes(first_image)).save(
+ file_path,
+ pnginfo=metadata,
+ compress_level=4,
+ )
+ output_files.append(file_path)
+
+ format_type, format_ext = format.split("/")
+ if format_type == "image":
+ if meta_batch is not None:
+ raise Exception("Pillow('image/') formats are not compatible with batched output")
+ image_kwargs = {}
+ if format_ext == "gif":
+ image_kwargs['disposal'] = 2
+ if format_ext == "webp":
+ #Save timestamp information
+ exif = Image.Exif()
+ exif[ExifTags.IFD.Exif] = {36867: datetime.datetime.now().isoformat(" ")[:19]}
+ image_kwargs['exif'] = exif
+ image_kwargs['lossless'] = kwargs.get("lossless", True)
+ file = f"{filename}_{counter:05}.{format_ext}"
+ file_path = os.path.join(full_output_folder, file)
+ if pingpong:
+ images = to_pingpong(images)
+ def frames_gen(images):
+ for i in images:
+ pbar.update(1)
+ yield Image.fromarray(tensor_to_bytes(i))
+ frames = frames_gen(images)
+ # Use pillow directly to save an animated image
+ next(frames).save(
+ file_path,
+ format=format_ext.upper(),
+ save_all=True,
+ append_images=frames,
+ duration=round(1000 / frame_rate),
+ loop=loop_count,
+ compress_level=4,
+ **image_kwargs
+ )
+ output_files.append(file_path)
+ else:
+ # Use ffmpeg to save a video
+ if ffmpeg_path is None:
+ raise ProcessLookupError(f"ffmpeg is required for video outputs and could not be found.\nIn order to use video outputs, you must either:\n- Install imageio-ffmpeg with pip,\n- Place a ffmpeg executable in {os.path.abspath('')}, or\n- Install ffmpeg and add it to the system path.")
+
+ if manual_format_widgets is not None:
+ logger.warn("Format args can now be passed directly. The manual_format_widgets argument is now deprecated")
+ kwargs.update(manual_format_widgets)
+
+ has_alpha = first_image.shape[-1] == 4
+ kwargs["has_alpha"] = has_alpha
+ video_format = apply_format_widgets(format_ext, kwargs)
+ dim_alignment = video_format.get("dim_alignment", 2)
+ if (first_image.shape[1] % dim_alignment) or (first_image.shape[0] % dim_alignment):
+ #output frames must be padded
+ to_pad = (-first_image.shape[1] % dim_alignment,
+ -first_image.shape[0] % dim_alignment)
+ padding = (to_pad[0]//2, to_pad[0] - to_pad[0]//2,
+ to_pad[1]//2, to_pad[1] - to_pad[1]//2)
+ padfunc = torch.nn.ReplicationPad2d(padding)
+ def pad(image):
+ image = image.permute((2,0,1))#HWC to CHW
+ padded = padfunc(image.to(dtype=torch.float32))
+ return padded.permute((1,2,0))
+ images = map(pad, images)
+ dimensions = (-first_image.shape[1] % dim_alignment + first_image.shape[1],
+ -first_image.shape[0] % dim_alignment + first_image.shape[0])
+ logger.warn("Output images were not of valid resolution and have had padding applied")
+ else:
+ dimensions = (first_image.shape[1], first_image.shape[0])
+ if pingpong:
+ if meta_batch is not None:
+ logger.error("pingpong is incompatible with batched output")
+ images = to_pingpong(images)
+ if num_frames > 2:
+ num_frames += num_frames -2
+ pbar.total = num_frames
+ if loop_count > 0:
+ loop_args = ["-vf", "loop=loop=" + str(loop_count)+":size=" + str(num_frames)]
+ else:
+ loop_args = []
+ if video_format.get('input_color_depth', '8bit') == '16bit':
+ images = map(tensor_to_shorts, images)
+ if has_alpha:
+ i_pix_fmt = 'rgba64'
+ else:
+ i_pix_fmt = 'rgb48'
+ else:
+ images = map(tensor_to_bytes, images)
+ if has_alpha:
+ i_pix_fmt = 'rgba'
+ else:
+ i_pix_fmt = 'rgb24'
+ file = f"{filename}_{counter:05}.{video_format['extension']}"
+ file_path = os.path.join(full_output_folder, file)
+ bitrate_arg = []
+ bitrate = video_format.get('bitrate')
+ if bitrate is not None:
+ bitrate_arg = ["-b:v", str(bitrate) + "M" if video_format.get('megabit') == 'True' else str(bitrate) + "K"]
+ args = [ffmpeg_path, "-v", "error", "-f", "rawvideo", "-pix_fmt", i_pix_fmt,
+ # The image data is in an undefined generic RGB color space, which in practice means sRGB.
+ # sRGB has the same primaries and matrix as BT.709, but a different transfer function (gamma),
+ # called by the sRGB standard name IEC 61966-2-1. However, video hosting platforms like YouTube
+ # standardize on full BT.709 and will convert the colors accordingly. This last minute change
+ # in colors can be confusing to users. We can counter it by lying about the transfer function
+ # on a per format basis, i.e. for video we will lie to FFmpeg that it is already BT.709. Also,
+ # because the input data is in RGB (not YUV) it is more efficient (fewer scale filter invocations)
+ # to specify the input color space as RGB and then later, if the format actually wants YUV,
+ # to convert it to BT.709 YUV via FFmpeg's -vf "scale=out_color_matrix=bt709".
+ "-color_range", "pc", "-colorspace", "rgb", "-color_primaries", "bt709",
+ "-color_trc", video_format.get("fake_trc", "iec61966-2-1"),
+ "-s", f"{dimensions[0]}x{dimensions[1]}", "-r", str(frame_rate), "-i", "-"] \
+ + loop_args
+
+ images = map(lambda x: x.tobytes(), images)
+ env=os.environ.copy()
+ if "environment" in video_format:
+ env.update(video_format["environment"])
+
+ if "pre_pass" in video_format:
+ if meta_batch is not None:
+ #Performing a prepass requires keeping access to all frames.
+ #Potential solutions include keeping just output frames in
+ #memory or using 3 passes with intermediate file, but
+ #very long gifs probably shouldn't be encouraged
+ raise Exception("Formats which require a pre_pass are incompatible with Batch Manager.")
+ images = [b''.join(images)]
+ os.makedirs(folder_paths.get_temp_directory(), exist_ok=True)
+ in_args_len = args.index("-i") + 2 # The index after ["-i", "-"]
+ pre_pass_args = args[:in_args_len] + video_format['pre_pass']
+ merge_filter_args(pre_pass_args)
+ try:
+ subprocess.run(pre_pass_args, input=images[0], env=env,
+ capture_output=True, check=True)
+ except subprocess.CalledProcessError as e:
+ raise Exception("An error occurred in the ffmpeg prepass:\n" \
+ + e.stderr.decode(*ENCODE_ARGS))
+ if "inputs_main_pass" in video_format:
+ in_args_len = args.index("-i") + 2 # The index after ["-i", "-"]
+ args = args[:in_args_len] + video_format['inputs_main_pass'] + args[in_args_len:]
+
+ if output_process is None:
+ if 'gifski_pass' in video_format:
+ format = 'image/gif'
+ output_process = gifski_process(args, dimensions, frame_rate, video_format, file_path, env)
+ audio = None
+ else:
+ args += video_format['main_pass'] + bitrate_arg
+ merge_filter_args(args)
+ output_process = ffmpeg_process(args, video_format, video_metadata, file_path, env)
+ #Proceed to first yield
+ output_process.send(None)
+ if meta_batch is not None:
+ meta_batch.outputs[unique_id] = (counter, output_process)
+
+ for image in images:
+ pbar.update(1)
+ output_process.send(image)
+ if meta_batch is not None:
+ requeue_workflow((meta_batch.unique_id, not meta_batch.has_closed_inputs))
+ if meta_batch is None or meta_batch.has_closed_inputs:
+ #Close pipe and wait for termination.
+ try:
+ total_frames_output = output_process.send(None)
+ output_process.send(None)
+ except StopIteration:
+ pass
+ if meta_batch is not None:
+ meta_batch.outputs.pop(unique_id)
+ if len(meta_batch.outputs) == 0:
+ meta_batch.reset()
+ else:
+ #batch is unfinished
+ #TODO: Check if empty output breaks other custom nodes
+ return {"ui": {"unfinished_batch": [True]}, "result": ((save_output, []),)}
+
+ output_files.append(file_path)
+
+
+ a_waveform = None
+ if audio is not None:
+ try:
+ #safely check if audio produced by VHS_LoadVideo actually exists
+ a_waveform = audio['waveform']
+ except:
+ pass
+ if a_waveform is not None:
+ # Create audio file if input was provided
+ output_file_with_audio = f"{filename}_{counter:05}-audio.{video_format['extension']}"
+ output_file_with_audio_path = os.path.join(full_output_folder, output_file_with_audio)
+ if "audio_pass" not in video_format:
+ logger.warn("Selected video format does not have explicit audio support")
+ video_format["audio_pass"] = ["-c:a", "libopus"]
+
+
+ # FFmpeg command with audio re-encoding
+ #TODO: expose audio quality options if format widgets makes it in
+ #Reconsider forcing apad/shortest
+ channels = audio['waveform'].size(1)
+ min_audio_dur = total_frames_output / frame_rate + 1
+ if video_format.get('trim_to_audio', 'False') != 'False':
+ apad = []
+ else:
+ apad = ["-af", "apad=whole_dur="+str(min_audio_dur)]
+ mux_args = [ffmpeg_path, "-v", "error", "-n", "-i", file_path,
+ "-ar", str(audio['sample_rate']), "-ac", str(channels),
+ "-f", "f32le", "-i", "-", "-c:v", "copy"] \
+ + video_format["audio_pass"] \
+ + apad + ["-shortest", output_file_with_audio_path]
+
+ audio_data = audio['waveform'].squeeze(0).transpose(0,1) \
+ .numpy().tobytes()
+ merge_filter_args(mux_args, '-af')
+ try:
+ res = subprocess.run(mux_args, input=audio_data,
+ env=env, capture_output=True, check=True)
+ except subprocess.CalledProcessError as e:
+ raise Exception("An error occured in the ffmpeg subprocess:\n" \
+ + e.stderr.decode(*ENCODE_ARGS))
+ if res.stderr:
+ print(res.stderr.decode(*ENCODE_ARGS), end="", file=sys.stderr)
+ output_files.append(output_file_with_audio_path)
+ #Return this file with audio to the webui.
+ #It will be muted unless opened or saved with right click
+ file = output_file_with_audio
+ if extra_options.get('VHS_KeepIntermediate', True) == False:
+ for intermediate in output_files[1:-1]:
+ if os.path.exists(intermediate):
+ os.remove(intermediate)
+ preview = {
+ "filename": file,
+ "subfolder": subfolder,
+ "type": "output" if save_output else "temp",
+ "format": format,
+ "frame_rate": frame_rate,
+ "workflow": first_image_file,
+ "fullpath": output_files[-1],
+ }
+ if num_frames == 1 and 'png' in format and '%03d' in file:
+ preview['format'] = 'image/png'
+ preview['filename'] = file.replace('%03d', '001')
+ return {"ui": {"gifs": [preview]}, "result": ((save_output, output_files),)}
+
+class LoadAudio:
+ @classmethod
+ def INPUT_TYPES(s):
+ #Hide ffmpeg formats if ffmpeg isn't available
+ return {
+ "required": {
+ "audio_file": ("STRING", {"default": "input/", "vhs_path_extensions": ['wav','mp3','ogg','m4a','flac']}),
+ },
+ "optional" : {
+ "seek_seconds": ("FLOAT", {"default": 0, "min": 0, "widgetType": "VHSTIMESTAMP"}),
+ "duration": ("FLOAT" , {"default": 0, "min": 0, "max": 10000000, "step": 0.01, "widgetType": "VHSTIMESTAMP"}),
+ }
+ }
+
+ RETURN_TYPES = ("AUDIO", "FLOAT")
+ RETURN_NAMES = ("audio", "duration")
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/audio"
+ FUNCTION = "load_audio"
+ def load_audio(self, audio_file, seek_seconds=0, duration=0):
+ audio_file = strip_path(audio_file)
+ if audio_file is None or validate_path(audio_file) != True:
+ raise Exception("audio_file is not a valid path: " + audio_file)
+ if is_url(audio_file):
+ audio_file = try_download_video(audio_file) or audio_file
+ #Eagerly fetch the audio since the user must be using it if the
+ #node executes, unlike Load Video
+ audio = get_audio(audio_file, start_time=seek_seconds, duration=duration)
+ loaded_duration = audio['waveform'].size(2)/audio['sample_rate']
+ return (audio, loaded_duration)
+
+ @classmethod
+ def IS_CHANGED(s, audio_file, **kwargs):
+ return hash_path(audio_file)
+
+ @classmethod
+ def VALIDATE_INPUTS(s, audio_file, **kwargs):
+ return validate_path(audio_file, allow_none=True)
+
+class LoadAudioUpload:
+ @classmethod
+ def INPUT_TYPES(s):
+ input_dir = folder_paths.get_input_directory()
+ files = []
+ for f in os.listdir(input_dir):
+ if os.path.isfile(os.path.join(input_dir, f)):
+ file_parts = f.split('.')
+ if len(file_parts) > 1 and (file_parts[-1] in audio_extensions):
+ files.append(f)
+ return {"required": {
+ "audio": (sorted(files),),},
+ "optional": {
+ "start_time": ("FLOAT" , {"default": 0, "min": 0, "max": 10000000, "step": 0.01, "widgetType": "VHSTIMESTAMP"}),
+ "duration": ("FLOAT" , {"default": 0, "min": 0, "max": 10000000, "step": 0.01, "widgetType": "VHSTIMESTAMP"}),
+ },
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/audio"
+
+ RETURN_TYPES = ("AUDIO", "FLOAT")
+ RETURN_NAMES = ("audio", "duration")
+ FUNCTION = "load_audio"
+
+ def load_audio(self, start_time=0, duration=0, **kwargs):
+ audio_file = folder_paths.get_annotated_filepath(strip_path(kwargs['audio']))
+ if audio_file is None or validate_path(audio_file) != True:
+ raise Exception("audio_file is not a valid path: " + audio_file)
+
+ audio = get_audio(audio_file, start_time, duration)
+ loaded_duration = audio['waveform'].size(2)/audio['sample_rate']
+ return (audio, loaded_duration)
+
+ @classmethod
+ def IS_CHANGED(s, audio, **kwargs):
+ audio_file = folder_paths.get_annotated_filepath(strip_path(audio))
+ return hash_path(audio_file)
+
+ @classmethod
+ def VALIDATE_INPUTS(s, audio, **kwargs):
+ audio_file = folder_paths.get_annotated_filepath(strip_path(audio))
+ return validate_path(audio_file, allow_none=True)
+class AudioToVHSAudio:
+ """Legacy method for external nodes that utilized VHS_AUDIO,
+ VHS_AUDIO is deprecated as a format and should no longer be used"""
+ @classmethod
+ def INPUT_TYPES(s):
+ return {"required": {"audio": ("AUDIO",)}}
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/audio"
+
+ RETURN_TYPES = ("VHS_AUDIO", )
+ RETURN_NAMES = ("vhs_audio",)
+ FUNCTION = "convert_audio"
+
+ def convert_audio(self, audio):
+ ar = str(audio['sample_rate'])
+ ac = str(audio['waveform'].size(1))
+ mux_args = [ffmpeg_path, "-f", "f32le", "-ar", ar, "-ac", ac,
+ "-i", "-", "-f", "wav", "-"]
+
+ audio_data = audio['waveform'].squeeze(0).transpose(0,1) \
+ .numpy().tobytes()
+ try:
+ res = subprocess.run(mux_args, input=audio_data,
+ capture_output=True, check=True)
+ except subprocess.CalledProcessError as e:
+ raise Exception("An error occured in the ffmpeg subprocess:\n" \
+ + e.stderr.decode(*ENCODE_ARGS))
+ if res.stderr:
+ print(res.stderr.decode(*ENCODE_ARGS), end="", file=sys.stderr)
+ return (lambda: res.stdout,)
+
+class VHSAudioToAudio:
+ """Legacy method for external nodes that utilized VHS_AUDIO,
+ VHS_AUDIO is deprecated as a format and should no longer be used"""
+ @classmethod
+ def INPUT_TYPES(s):
+ return {"required": {"vhs_audio": ("VHS_AUDIO",)}}
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢/audio"
+
+ RETURN_TYPES = ("AUDIO", )
+ RETURN_NAMES = ("audio",)
+ FUNCTION = "convert_audio"
+
+ def convert_audio(self, vhs_audio):
+ if not vhs_audio or not vhs_audio():
+ raise Exception("audio input is not valid")
+ args = [ffmpeg_path, "-i", '-']
+ try:
+ res = subprocess.run(args + ["-f", "f32le", "-"], input=vhs_audio(),
+ capture_output=True, check=True)
+ audio = torch.frombuffer(bytearray(res.stdout), dtype=torch.float32)
+ except subprocess.CalledProcessError as e:
+ raise Exception("An error occured in the ffmpeg subprocess:\n" \
+ + e.stderr.decode(*ENCODE_ARGS))
+ match = re.search(', (\\d+) Hz, (\\w+), ',res.stderr.decode(*ENCODE_ARGS))
+ if match:
+ ar = int(match.group(1))
+ #NOTE: Just throwing an error for other channel types right now
+ #Will deal with issues if they come
+ ac = {"mono": 1, "stereo": 2}[match.group(2)]
+ else:
+ ar = 44100
+ ac = 2
+ audio = audio.reshape((-1,ac)).transpose(0,1).unsqueeze(0)
+ return ({'waveform': audio, 'sample_rate': ar},)
+
+class PruneOutputs:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "filenames": ("VHS_FILENAMES",),
+ "options": (["Intermediate", "Intermediate and Utility"],)
+ }
+ }
+
+ RETURN_TYPES = ()
+ OUTPUT_NODE = True
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+ FUNCTION = "prune_outputs"
+
+ def prune_outputs(self, filenames, options):
+ if len(filenames[1]) == 0:
+ return ()
+ assert(len(filenames[1]) <= 3 and len(filenames[1]) >= 2)
+ delete_list = []
+ if options in ["Intermediate", "Intermediate and Utility", "All"]:
+ delete_list += filenames[1][1:-1]
+ if options in ["Intermediate and Utility", "All"]:
+ delete_list.append(filenames[1][0])
+ if options in ["All"]:
+ delete_list.append(filenames[1][-1])
+
+ output_dirs = [folder_paths.get_output_directory(),
+ folder_paths.get_temp_directory()]
+ for file in delete_list:
+ #Check that path is actually an output directory
+ if (os.path.commonpath([output_dirs[0], file]) != output_dirs[0]) \
+ and (os.path.commonpath([output_dirs[1], file]) != output_dirs[1]):
+ raise Exception("Tried to prune output from invalid directory: " + file)
+ if os.path.exists(file):
+ os.remove(file)
+ return ()
+
+class BatchManager:
+ def __init__(self, frames_per_batch=-1):
+ self.frames_per_batch = frames_per_batch
+ self.inputs = {}
+ self.outputs = {}
+ self.unique_id = None
+ self.has_closed_inputs = False
+ self.total_frames = float('inf')
+ def reset(self):
+ self.close_inputs()
+ for key in self.outputs:
+ if getattr(self.outputs[key][-1], "gi_suspended", False):
+ try:
+ self.outputs[key][-1].send(None)
+ except StopIteration:
+ pass
+ self.__init__(self.frames_per_batch)
+ def has_open_inputs(self):
+ return len(self.inputs) > 0
+ def close_inputs(self):
+ for key in self.inputs:
+ if getattr(self.inputs[key][-1], "gi_suspended", False):
+ try:
+ self.inputs[key][-1].send(1)
+ except StopIteration:
+ pass
+ self.inputs = {}
+
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "frames_per_batch": ("INT", {"default": 16, "min": 1, "max": BIGMAX, "step": 1})
+ },
+ "hidden": {
+ "prompt": "PROMPT",
+ "unique_id": "UNIQUE_ID"
+ },
+ }
+
+ RETURN_TYPES = ("VHS_BatchManager",)
+ RETURN_NAMES = ("meta_batch",)
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+ FUNCTION = "update_batch"
+
+ def update_batch(self, frames_per_batch, prompt=None, unique_id=None):
+ if unique_id is not None and prompt is not None:
+ requeue = prompt[unique_id]['inputs'].get('requeue', 0)
+ else:
+ requeue = 0
+ if requeue == 0:
+ self.reset()
+ self.frames_per_batch = frames_per_batch
+ self.unique_id = unique_id
+ else:
+ num_batches = (self.total_frames+self.frames_per_batch-1)//frames_per_batch
+ print(f'Meta-Batch {requeue}/{num_batches}')
+ #onExecuted seems to not be called unless some message is sent
+ return (self,)
+
+
+class VideoInfo:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "video_info": ("VHS_VIDEOINFO",),
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+
+ RETURN_TYPES = ("FLOAT","INT", "FLOAT", "INT", "INT", "FLOAT","INT", "FLOAT", "INT", "INT")
+ RETURN_NAMES = (
+ "source_fps🟨",
+ "source_frame_count🟨",
+ "source_duration🟨",
+ "source_width🟨",
+ "source_height🟨",
+ "loaded_fps🟦",
+ "loaded_frame_count🟦",
+ "loaded_duration🟦",
+ "loaded_width🟦",
+ "loaded_height🟦",
+ )
+ FUNCTION = "get_video_info"
+
+ def get_video_info(self, video_info):
+ keys = ["fps", "frame_count", "duration", "width", "height"]
+
+ source_info = []
+ loaded_info = []
+
+ for key in keys:
+ source_info.append(video_info[f"source_{key}"])
+ loaded_info.append(video_info[f"loaded_{key}"])
+
+ return (*source_info, *loaded_info)
+
+
+class VideoInfoSource:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "video_info": ("VHS_VIDEOINFO",),
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+
+ RETURN_TYPES = ("FLOAT","INT", "FLOAT", "INT", "INT",)
+ RETURN_NAMES = (
+ "fps🟨",
+ "frame_count🟨",
+ "duration🟨",
+ "width🟨",
+ "height🟨",
+ )
+ FUNCTION = "get_video_info"
+
+ def get_video_info(self, video_info):
+ keys = ["fps", "frame_count", "duration", "width", "height"]
+
+ source_info = []
+
+ for key in keys:
+ source_info.append(video_info[f"source_{key}"])
+
+ return (*source_info,)
+
+
+class VideoInfoLoaded:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "video_info": ("VHS_VIDEOINFO",),
+ }
+ }
+
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+
+ RETURN_TYPES = ("FLOAT","INT", "FLOAT", "INT", "INT",)
+ RETURN_NAMES = (
+ "fps🟦",
+ "frame_count🟦",
+ "duration🟦",
+ "width🟦",
+ "height🟦",
+ )
+ FUNCTION = "get_video_info"
+
+ def get_video_info(self, video_info):
+ keys = ["fps", "frame_count", "duration", "width", "height"]
+
+ loaded_info = []
+
+ for key in keys:
+ loaded_info.append(video_info[f"loaded_{key}"])
+
+ return (*loaded_info,)
+
+class SelectFilename:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {"required": {"filenames": ("VHS_FILENAMES",), "index": ("INT", {"default": -1, "step": 1, "min": -1})}}
+ RETURN_TYPES = ("STRING",)
+ RETURN_NAMES =("Filename",)
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+ FUNCTION = "select_filename"
+
+ def select_filename(self, filenames, index):
+ return (filenames[1][index],)
+class Unbatch:
+ class Any(str):
+ def __ne__(self, other):
+ return False
+ @classmethod
+ def INPUT_TYPES(s):
+ return {"required": {"batched": ("*",)}}
+ RETURN_TYPES = (Any('*'),)
+ INPUT_IS_LIST = True
+ RETURN_NAMES =("unbatched",)
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+ FUNCTION = "unbatch"
+ def unbatch(self, batched):
+ if isinstance(batched[0], torch.Tensor):
+ return (torch.cat(batched),)
+ if isinstance(batched[0], dict):
+ out = batched[0].copy()
+ if 'samples' in out:
+ out['samples'] = torch.cat([x['samples'] for x in batched])
+ if 'waveform' in out:
+ out['waveform'] = torch.cat([x['waveform'] for x in batched])
+ out.pop('batch_index', None)
+ return (out,)
+ return (functools.reduce(lambda x,y: x+y, batched),)
+ @classmethod
+ def VALIDATE_INPUTS(cls, input_types):
+ return True
+class SelectLatest:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {"required": {"filename_prefix": ("STRING", {'default': 'output/AnimateDiff', 'vhs_path_extensions': []}),
+ "filename_postfix": ("STRING", {"placeholder": ".webm"})}}
+ RETURN_TYPES = ("STRING",)
+ RETURN_NAMES =("Filename",)
+ CATEGORY = "Video Helper Suite 🎥🅥🅗🅢"
+ FUNCTION = "select_latest"
+ EXPERIMENTAL = True
+
+ def select_latest(self, filename_prefix, filename_postfix):
+ assert False, "Not Reachable"
+
+NODE_CLASS_MAPPINGS = {
+ "VHS_VideoCombine": VideoCombine,
+ "VHS_LoadVideo": LoadVideoUpload,
+ "VHS_LoadVideoPath": LoadVideoPath,
+ "VHS_LoadVideoFFmpeg": LoadVideoFFmpegUpload,
+ "VHS_LoadVideoFFmpegPath": LoadVideoFFmpegPath,
+ "VHS_LoadImagePath": LoadImagePath,
+ "VHS_LoadImages": LoadImagesFromDirectoryUpload,
+ "VHS_LoadImagesPath": LoadImagesFromDirectoryPath,
+ "VHS_LoadAudio": LoadAudio,
+ "VHS_LoadAudioUpload": LoadAudioUpload,
+ "VHS_AudioToVHSAudio": AudioToVHSAudio,
+ "VHS_VHSAudioToAudio": VHSAudioToAudio,
+ "VHS_PruneOutputs": PruneOutputs,
+ "VHS_BatchManager": BatchManager,
+ "VHS_VideoInfo": VideoInfo,
+ "VHS_VideoInfoSource": VideoInfoSource,
+ "VHS_VideoInfoLoaded": VideoInfoLoaded,
+ "VHS_SelectFilename": SelectFilename,
+ # Batched Nodes
+ "VHS_VAEEncodeBatched": VAEEncodeBatched,
+ "VHS_VAEDecodeBatched": VAEDecodeBatched,
+ # Latent and Image nodes
+ "VHS_SplitLatents": SplitLatents,
+ "VHS_SplitImages": SplitImages,
+ "VHS_SplitMasks": SplitMasks,
+ "VHS_MergeLatents": MergeLatents,
+ "VHS_MergeImages": MergeImages,
+ "VHS_MergeMasks": MergeMasks,
+ "VHS_GetLatentCount": GetLatentCount,
+ "VHS_GetImageCount": GetImageCount,
+ "VHS_GetMaskCount": GetMaskCount,
+ "VHS_DuplicateLatents": RepeatLatents,
+ "VHS_DuplicateImages": RepeatImages,
+ "VHS_DuplicateMasks": RepeatMasks,
+ "VHS_SelectEveryNthLatent": SelectEveryNthLatent,
+ "VHS_SelectEveryNthImage": SelectEveryNthImage,
+ "VHS_SelectEveryNthMask": SelectEveryNthMask,
+ "VHS_SelectLatents": SelectLatents,
+ "VHS_SelectImages": SelectImages,
+ "VHS_SelectMasks": SelectMasks,
+ "VHS_Unbatch": Unbatch,
+ "VHS_SelectLatest": SelectLatest,
+}
+NODE_DISPLAY_NAME_MAPPINGS = {
+ "VHS_VideoCombine": "Video Combine 🎥🅥🅗🅢",
+ "VHS_LoadVideo": "Load Video (Upload) 🎥🅥🅗🅢",
+ "VHS_LoadVideoPath": "Load Video (Path) 🎥🅥🅗🅢",
+ "VHS_LoadVideoFFmpeg": "Load Video FFmpeg (Upload) 🎥🅥🅗🅢",
+ "VHS_LoadVideoFFmpegPath": "Load Video FFmpeg (Path) 🎥🅥🅗🅢",
+ "VHS_LoadImagePath": "Load Image (Path) 🎥🅥🅗🅢",
+ "VHS_LoadImages": "Load Images (Upload) 🎥🅥🅗🅢",
+ "VHS_LoadImagesPath": "Load Images (Path) 🎥🅥🅗🅢",
+ "VHS_LoadAudio": "Load Audio (Path)🎥🅥🅗🅢",
+ "VHS_LoadAudioUpload": "Load Audio (Upload)🎥🅥🅗🅢",
+ "VHS_AudioToVHSAudio": "Audio to legacy VHS_AUDIO🎥🅥🅗🅢",
+ "VHS_VHSAudioToAudio": "Legacy VHS_AUDIO to Audio🎥🅥🅗🅢",
+ "VHS_PruneOutputs": "Prune Outputs 🎥🅥🅗🅢",
+ "VHS_BatchManager": "Meta Batch Manager 🎥🅥🅗🅢",
+ "VHS_VideoInfo": "Video Info 🎥🅥🅗🅢",
+ "VHS_VideoInfoSource": "Video Info (Source) 🎥🅥🅗🅢",
+ "VHS_VideoInfoLoaded": "Video Info (Loaded) 🎥🅥🅗🅢",
+ "VHS_SelectFilename": "Select Filename 🎥🅥🅗🅢",
+ # Batched Nodes
+ "VHS_VAEEncodeBatched": "VAE Encode Batched 🎥🅥🅗🅢",
+ "VHS_VAEDecodeBatched": "VAE Decode Batched 🎥🅥🅗🅢",
+ # Latent and Image nodes
+ "VHS_SplitLatents": "Split Latents 🎥🅥🅗🅢",
+ "VHS_SplitImages": "Split Images 🎥🅥🅗🅢",
+ "VHS_SplitMasks": "Split Masks 🎥🅥🅗🅢",
+ "VHS_MergeLatents": "Merge Latents 🎥🅥🅗🅢",
+ "VHS_MergeImages": "Merge Images 🎥🅥🅗🅢",
+ "VHS_MergeMasks": "Merge Masks 🎥🅥🅗🅢",
+ "VHS_GetLatentCount": "Get Latent Count 🎥🅥🅗🅢",
+ "VHS_GetImageCount": "Get Image Count 🎥🅥🅗🅢",
+ "VHS_GetMaskCount": "Get Mask Count 🎥🅥🅗🅢",
+ "VHS_DuplicateLatents": "Repeat Latents 🎥🅥🅗🅢",
+ "VHS_DuplicateImages": "Repeat Images 🎥🅥🅗🅢",
+ "VHS_DuplicateMasks": "Repeat Masks 🎥🅥🅗🅢",
+ "VHS_SelectEveryNthLatent": "Select Every Nth Latent 🎥🅥🅗🅢",
+ "VHS_SelectEveryNthImage": "Select Every Nth Image 🎥🅥🅗🅢",
+ "VHS_SelectEveryNthMask": "Select Every Nth Mask 🎥🅥🅗🅢",
+ "VHS_SelectLatents": "Select Latents 🎥🅥🅗🅢",
+ "VHS_SelectImages": "Select Images 🎥🅥🅗🅢",
+ "VHS_SelectMasks": "Select Masks 🎥🅥🅗🅢",
+ "VHS_Unbatch": "Unbatch 🎥🅥🅗🅢",
+ "VHS_SelectLatest": "Select Latest 🎥🅥🅗🅢",
+}
diff --git a/custom_nodes/comfyui-videohelpersuite/videohelpersuite/server.py b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/server.py
new file mode 100644
index 0000000000000000000000000000000000000000..f67e342400eb250b731245554bbd495864719f8f
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/server.py
@@ -0,0 +1,294 @@
+import server
+import folder_paths
+import os
+import subprocess
+import re
+
+import asyncio
+import av
+
+from .utils import is_url, get_sorted_dir_files_from_directory, ffmpeg_path, \
+ validate_sequence, is_safe_path, strip_path, try_download_video, ENCODE_ARGS
+from comfy.k_diffusion.utils import FolderOfImages
+
+
+web = server.web
+
+@server.PromptServer.instance.routes.get("/vhs/viewvideo")
+@server.PromptServer.instance.routes.get("/viewvideo")
+async def view_video(request):
+ query = request.rel_url.query
+ path_res = await resolve_path(query)
+ if isinstance(path_res, web.Response):
+ return path_res
+ file, filename, output_dir = path_res
+
+ if ffmpeg_path is None:
+ #Don't just return file, that provides arbitrary read access to any file
+ if is_safe_path(output_dir, strict=True):
+ return web.FileResponse(path=file)
+
+ frame_rate = query.get('frame_rate', 8)
+ if query.get('format', 'video') == "folder":
+ os.makedirs(folder_paths.get_temp_directory(), exist_ok=True)
+ concat_file = os.path.join(folder_paths.get_temp_directory(), "image_sequence_preview.txt")
+ skip_first_images = int(query.get('skip_first_images', 0))
+ select_every_nth = int(query.get('select_every_nth', 1)) or 1
+ valid_images = get_sorted_dir_files_from_directory(file, skip_first_images, select_every_nth, FolderOfImages.IMG_EXTENSIONS)
+ if len(valid_images) == 0:
+ return web.Response(status=204)
+ with open(concat_file, "w") as f:
+ f.write("ffconcat version 1.0\n")
+ for path in valid_images:
+ f.write("file '" + os.path.abspath(path) + "'\n")
+ f.write("duration 0.125\n")
+ in_args = ["-safe", "0", "-i", concat_file]
+ else:
+ in_args = ["-i", file]
+ if '%' in file:
+ in_args = ['-framerate', str(frame_rate)] + in_args
+ #Do prepass to pull info
+ #breaks skip_first frames if this default is ever actually needed
+ base_fps = 30
+ try:
+ proc = await asyncio.create_subprocess_exec(ffmpeg_path, *in_args, '-t',
+ '0','-f', 'null','-', stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE, stdin=subprocess.DEVNULL)
+ _, res_stderr = await proc.communicate()
+
+ match = re.search(': Video: (\\w+) .+, (\\d+) fps,', res_stderr.decode(*ENCODE_ARGS))
+ if match:
+ base_fps = float(match.group(2))
+ if match.group(1) == 'vp9':
+ #force libvpx for transparency
+ in_args = ['-c:v', 'libvpx-vp9'] + in_args
+ except subprocess.CalledProcessError as e:
+ print("An error occurred in the ffmpeg prepass:\n" \
+ + e.stderr.decode(*ENCODE_ARGS))
+ return web.Response(status=500)
+ vfilters = []
+ target_rate = float(query.get('force_rate', 0)) or base_fps
+ modified_rate = target_rate / (float(query.get('select_every_nth',1)) or 1)
+ start_time = 0
+ if 'start_time' in query:
+ start_time = float(query['start_time'])
+ elif float(query.get('skip_first_frames', 0)) > 0:
+ start_time = float(query.get('skip_first_frames'))/target_rate
+ if start_time > 1/modified_rate:
+ start_time += 1/modified_rate
+ if start_time > 0:
+ if start_time > 4:
+ post_seek = ['-ss', '4']
+ pre_seek = ['-ss', str(start_time - 4)]
+ else:
+ post_seek = ['-ss', str(start_time)]
+ pre_seek = []
+ else:
+ pre_seek = []
+ post_seek = []
+
+ args = [ffmpeg_path, "-v", "error"] + pre_seek + in_args + post_seek
+ if target_rate != 0:
+ args += ['-r', str(modified_rate)]
+ if query.get('force_size','Disabled') != "Disabled":
+ size = query['force_size'].split('x')
+ if size[0] == '?' or size[1] == '?':
+ size[0] = "-2" if size[0] == '?' else f"'min({size[0]},iw)'"
+ size[1] = "-2" if size[1] == '?' else f"'min({size[1]},ih)'"
+ else:
+ #Aspect ratio is likely changed. A more complex command is required
+ #to crop the output to the new aspect ratio
+ ar = float(size[0])/float(size[1])
+ vfilters.append(f"crop=if(gt({ar}\\,a)\\,iw\\,ih*{ar}):if(gt({ar}\\,a)\\,iw/{ar}\\,ih)")
+ size = ':'.join(size)
+ vfilters.append(f"scale={size}")
+ if len(vfilters) > 0:
+ args += ["-vf", ",".join(vfilters)]
+ if float(query.get('frame_load_cap', 0)) > 0:
+ args += ["-frames:v", query['frame_load_cap'].split('.')[0]]
+ #TODO:reconsider adding high frame cap/setting default frame cap on node
+ if query.get('deadline', 'realtime') == 'good':
+ deadline = 'good'
+ else:
+ deadline = 'realtime'
+
+ args += ['-c:v', 'libvpx-vp9','-deadline', deadline, '-cpu-used', '8', '-f', 'webm', '-']
+
+ try:
+ proc = await asyncio.create_subprocess_exec(*args, stdout=subprocess.PIPE,
+ stdin=subprocess.DEVNULL)
+ try:
+ resp = web.StreamResponse()
+ resp.content_type = 'video/webm'
+ resp.headers["Content-Disposition"] = f"filename=\"{filename}\""
+ await resp.prepare(request)
+ while len(bytes_read := await proc.stdout.read(2**20)) != 0:
+ await resp.write(bytes_read)
+ #Of dubious value given frequency of kill calls, but more correct
+ await proc.wait()
+ except (ConnectionResetError, ConnectionError) as e:
+ proc.kill()
+ except BrokenPipeError as e:
+ pass
+ return resp
+@server.PromptServer.instance.routes.get("/vhs/viewaudio")
+async def view_audio(request):
+ query = request.rel_url.query
+ path_res = await resolve_path(query)
+ if isinstance(path_res, web.Response):
+ return path_res
+ file, filename, output_dir = path_res
+ if ffmpeg_path is None:
+ #Don't just return file, that provides arbitrary read access to any file
+ if is_safe_path(output_dir, strict=True):
+ return web.FileResponse(path=file)
+
+ in_args = ["-i", file]
+ start_time = 0
+ if 'start_time' in query:
+ start_time = float(query['start_time'])
+ args = [ffmpeg_path, "-v", "error", '-vn'] + in_args + ['-ss', str(start_time)]
+ if float(query.get('duration', 0)) > 0:
+ args += ['-t', str(query['duration'])]
+ if query.get('deadline', 'realtime') == 'good':
+ deadline = 'good'
+ else:
+ deadline = 'realtime'
+
+ args += ['-c:a', 'libopus','-deadline', deadline, '-cpu-used', '8', '-f', 'webm', '-']
+ try:
+ proc = await asyncio.create_subprocess_exec(*args, stdout=subprocess.PIPE,
+ stdin=subprocess.DEVNULL)
+ try:
+ resp = web.StreamResponse()
+ resp.content_type = 'audio/webm'
+ resp.headers["Content-Disposition"] = f"filename=\"{filename}\""
+ await resp.prepare(request)
+ while len(bytes_read := await proc.stdout.read(2**20)) != 0:
+ await resp.write(bytes_read)
+ #Of dubious value given frequency of kill calls, but more correct
+ await proc.wait()
+ except (ConnectionResetError, ConnectionError) as e:
+ proc.kill()
+ except BrokenPipeError as e:
+ pass
+ return resp
+
+query_cache = {}
+@server.PromptServer.instance.routes.get("/vhs/queryvideo")
+async def query_video(request):
+ query = request.rel_url.query
+ filepath = await resolve_path(query)
+ #TODO: cache lookup
+ if isinstance(filepath, web.Response):
+ return filepath
+ filepath = filepath[0]
+ if filepath.endswith(".webp"):
+ # ffmpeg doesn't support decoding animated WebP https://trac.ffmpeg.org/ticket/4907
+ return web.json_response({})
+ if filepath in query_cache and query_cache[filepath][0] == os.stat(filepath).st_mtime:
+ source = query_cache[filepath][1]
+ else:
+ source = {}
+ try:
+ with av.open(filepath) as cont:
+ stream = cont.streams.video[0]
+ source['fps'] = float(stream.average_rate)
+ source['duration'] = float(cont.duration / av.time_base)
+
+ if stream.codec_context.name == 'vp9':
+ cc = av.Codec('libvpx-vp9', 'r').create()
+ else:
+ cc = stream
+ def fit():
+ for packet in cont.demux(video=0):
+ yield from cc.decode(packet)
+ frame = next(fit())
+
+ source['size'] = [frame.width, frame.height]
+ source['alpha'] = 'a' in frame.format.name
+ source['frames'] = stream.metadata.get('NUMBER_OF_FRAMES', round(source['duration'] * source['fps']))
+ query_cache[filepath] = (os.stat(filepath).st_mtime, source)
+ except Exception:
+ pass
+ if not 'frames' in source:
+ return web.json_response({})
+ loaded = {}
+ loaded['duration'] = source['duration']
+ loaded['duration'] -= float(query.get('start_time',0))
+ loaded['fps'] = float(query.get('force_rate', 0)) or source.get('fps',1)
+ loaded['duration'] -= int(query.get('skip_first_frames', 0)) / loaded['fps']
+ loaded['fps'] /= int(query.get('select_every_nth', 1)) or 1
+ loaded['frames'] = round(loaded['duration'] * loaded['fps'])
+ return web.json_response({'source': source, 'loaded': loaded})
+
+async def resolve_path(query):
+ if "filename" not in query:
+ return web.Response(status=204)
+ filename = query["filename"]
+
+ #Path code misformats urls on windows and must be skipped
+ if is_url(filename):
+ file = await asyncio.to_thread(try_download_video, filename) or file
+ filname, output_dir = os.path.split(file)
+ return file, filename, output_dir
+ else:
+ filename, output_dir = folder_paths.annotated_filepath(filename)
+
+ type = query.get("type", "output")
+ if type == "path":
+ #special case for path_based nodes
+ #NOTE: output_dir may be empty, but non-None
+ output_dir, filename = os.path.split(strip_path(filename))
+ if output_dir is None:
+ output_dir = folder_paths.get_directory_by_type(type)
+
+ if output_dir is None:
+ return web.Response(status=204)
+
+ if not is_safe_path(output_dir):
+ return web.Response(status=204)
+
+ if "subfolder" in query:
+ output_dir = os.path.join(output_dir, query["subfolder"])
+
+ filename = os.path.basename(filename)
+ file = os.path.join(output_dir, filename)
+
+ if not os.path.exists(file):
+ return web.Response(status=204)
+ if query.get('format', 'video') == 'folder':
+ if not os.path.isdir(file):
+ return web.Response(status=204)
+ else:
+ if not os.path.isfile(file) and not validate_sequence(file):
+ return web.Response(status=204)
+ return file, filename, output_dir
+
+@server.PromptServer.instance.routes.get("/vhs/getpath")
+@server.PromptServer.instance.routes.get("/getpath")
+async def get_path(request):
+ query = request.rel_url.query
+ if "path" not in query:
+ return web.Response(status=204)
+ #NOTE: path always ends in `/`, so this is functionally an lstrip
+ path = os.path.abspath(strip_path(query["path"]))
+
+ if not os.path.exists(path) or not is_safe_path(path):
+ return web.json_response([])
+
+ #Use get so None is default instead of keyerror
+ valid_extensions = query.get("extensions")
+ valid_items = []
+ for item in os.scandir(path):
+ try:
+ if item.is_dir():
+ valid_items.append(item.name + "/")
+ continue
+ if valid_extensions is None or item.name.split(".")[-1].lower() in valid_extensions:
+ valid_items.append(item.name)
+ except OSError:
+ #Broken symlinks can throw a very unhelpful "Invalid argument"
+ pass
+ valid_items.sort(key=lambda f: os.stat(os.path.join(path,f)).st_mtime)
+ return web.json_response(valid_items)
diff --git a/custom_nodes/comfyui-videohelpersuite/videohelpersuite/utils.py b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..5b35ad47fa3d1412773ab561598031ba6a3b38bc
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/videohelpersuite/utils.py
@@ -0,0 +1,443 @@
+import hashlib
+import os
+from typing import Iterable
+import shutil
+import subprocess
+import re
+import time
+from collections.abc import Mapping
+from typing import Union
+import functools
+import torch
+from torch import Tensor
+
+import server
+from .logger import logger
+import folder_paths
+
+BIGMIN = -(2**53-1)
+BIGMAX = (2**53-1)
+
+DIMMAX = 8192
+
+ENCODE_ARGS = ("utf-8", 'backslashreplace')
+
+def ffmpeg_suitability(path):
+ try:
+ version = subprocess.run([path, "-version"], check=True,
+ capture_output=True).stdout.decode(*ENCODE_ARGS)
+ except:
+ return 0
+ score = 0
+ #rough layout of the importance of various features
+ simple_criterion = [("libvpx", 20),("264",10), ("265",3),
+ ("svtav1",5),("libopus", 1)]
+ for criterion in simple_criterion:
+ if version.find(criterion[0]) >= 0:
+ score += criterion[1]
+ #obtain rough compile year from copyright information
+ copyright_index = version.find('2000-2')
+ if copyright_index >= 0:
+ copyright_year = version[copyright_index+6:copyright_index+9]
+ if copyright_year.isnumeric():
+ score += int(copyright_year)
+ return score
+
+class MultiInput(str):
+ def __new__(cls, string, allowed_types="*"):
+ res = super().__new__(cls, string)
+ res.allowed_types=allowed_types
+ return res
+ def __ne__(self, other):
+ if self.allowed_types == "*" or other == "*":
+ return False
+ return other not in self.allowed_types
+imageOrLatent = MultiInput("IMAGE", ["IMAGE", "LATENT"])
+floatOrInt = MultiInput("FLOAT", ["FLOAT", "INT"])
+
+class ContainsAll(dict):
+ def __contains__(self, other):
+ return True
+ def __getitem__(self, key):
+ return super().get(key, (None, {}))
+
+if "VHS_FORCE_FFMPEG_PATH" in os.environ:
+ ffmpeg_path = os.environ.get("VHS_FORCE_FFMPEG_PATH")
+else:
+ ffmpeg_paths = []
+ try:
+ from imageio_ffmpeg import get_ffmpeg_exe
+ imageio_ffmpeg_path = get_ffmpeg_exe()
+ ffmpeg_paths.append(imageio_ffmpeg_path)
+ except:
+ if "VHS_USE_IMAGEIO_FFMPEG" in os.environ:
+ raise
+ logger.warn("Failed to import imageio_ffmpeg")
+ if "VHS_USE_IMAGEIO_FFMPEG" in os.environ:
+ ffmpeg_path = imageio_ffmpeg_path
+ else:
+ system_ffmpeg = shutil.which("ffmpeg")
+ if system_ffmpeg is not None:
+ ffmpeg_paths.append(system_ffmpeg)
+ if os.path.isfile("ffmpeg"):
+ ffmpeg_paths.append(os.path.abspath("ffmpeg"))
+ if os.path.isfile("ffmpeg.exe"):
+ ffmpeg_paths.append(os.path.abspath("ffmpeg.exe"))
+ if len(ffmpeg_paths) == 0:
+ logger.error("No valid ffmpeg found.")
+ ffmpeg_path = None
+ elif len(ffmpeg_paths) == 1:
+ #Evaluation of suitability isn't required, can take sole option
+ #to reduce startup time
+ ffmpeg_path = ffmpeg_paths[0]
+ else:
+ ffmpeg_path = max(ffmpeg_paths, key=ffmpeg_suitability)
+gifski_path = os.environ.get("VHS_GIFSKI", None)
+if gifski_path is None:
+ gifski_path = os.environ.get("JOV_GIFSKI", None)
+ if gifski_path is None:
+ gifski_path = shutil.which("gifski")
+ytdl_path = os.environ.get("VHS_YTDL", None) or shutil.which('yt-dlp') \
+ or shutil.which('youtube-dl')
+download_history = {}
+def try_download_video(url):
+ if ytdl_path is None:
+ return None
+ if url in download_history:
+ return download_history[url]
+ os.makedirs(folder_paths.get_temp_directory(), exist_ok=True)
+ #Format information could be added to only download audio for Load Audio,
+ #but this gets hairy if same url is also used for video.
+ #Best to just always keep defaults
+ #dl_format = ['-f', 'ba'] if is_audio else []
+ try:
+ res = subprocess.run([ytdl_path, "--print", "after_move:filepath",
+ "-P", folder_paths.get_temp_directory(), url],
+ capture_output=True, check=True)
+ #strip newline
+ file = res.stdout.decode(*ENCODE_ARGS)[:-1]
+ except subprocess.CalledProcessError as e:
+ raise Exception("An error occurred in the yt-dl process:\n" \
+ + e.stderr.decode(*ENCODE_ARGS))
+ file = None
+ download_history[url] = file
+ return file
+
+def is_safe_path(path, strict=False):
+ if "VHS_STRICT_PATHS" not in os.environ and not strict:
+ return True
+ basedir = os.path.abspath('.')
+ try:
+ common_path = os.path.commonpath([basedir, path])
+ except:
+ #Different drive on windows
+ return False
+ return common_path == basedir
+
+def get_sorted_dir_files_from_directory(directory: str, skip_first_images: int=0, select_every_nth: int=1, extensions: Iterable=None):
+ directory = strip_path(directory)
+ dir_files = os.listdir(directory)
+ dir_files = sorted(dir_files)
+ dir_files = [os.path.join(directory, x) for x in dir_files]
+ dir_files = list(filter(lambda filepath: os.path.isfile(filepath), dir_files))
+ # filter by extension, if needed
+ if extensions is not None:
+ extensions = list(extensions)
+ new_dir_files = []
+ for filepath in dir_files:
+ ext = "." + filepath.split(".")[-1]
+ if ext.lower() in extensions:
+ new_dir_files.append(filepath)
+ dir_files = new_dir_files
+ # start at skip_first_images
+ dir_files = dir_files[skip_first_images:]
+ dir_files = dir_files[0::select_every_nth]
+ return dir_files
+
+
+# modified from https://stackoverflow.com/questions/22058048/hashing-a-file-in-python
+def calculate_file_hash(filename: str, hash_every_n: int = 1):
+ #Larger video files were taking >.5 seconds to hash even when cached,
+ #so instead the modified time from the filesystem is used as a hash
+ h = hashlib.sha256()
+ h.update(filename.encode())
+ h.update(str(os.path.getmtime(filename)).encode())
+ return h.hexdigest()
+
+prompt_queue = server.PromptServer.instance.prompt_queue
+def requeue_workflow_unchecked():
+ """Requeues the current workflow without checking for multiple requeues"""
+ currently_running = prompt_queue.currently_running
+ value = next(iter(currently_running.values()))
+
+ # Handle both old (5 values) and new (6 values) ComfyUI versions
+ if len(value) == 6:
+ (_, prompt_id, prompt, extra_data, outputs_to_execute, _) = value
+ else:
+ (_, prompt_id, prompt, extra_data, outputs_to_execute) = value
+
+ #Ensure batch_managers are marked stale
+ prompt = prompt.copy()
+ for uid in prompt:
+ if prompt[uid]['class_type'] == 'VHS_BatchManager':
+ prompt[uid]['inputs']['requeue'] = prompt[uid]['inputs'].get('requeue',0)+1
+
+ #execution.py has guards for concurrency, but server doesn't.
+ #TODO: Check that this won't be an issue
+ number = -server.PromptServer.instance.number
+ server.PromptServer.instance.number += 1
+ prompt_id = str(server.uuid.uuid4())
+ # Put back with 6 elements to match what ComfyUI expects
+ sensitive = value[5] if len(value) > 5 else {}
+ prompt_queue.put((number, prompt_id, prompt, extra_data, outputs_to_execute, sensitive))
+
+requeue_guard = [None, 0, 0, {}]
+
+def requeue_workflow(requeue_required=(-1,True)):
+ assert(len(prompt_queue.currently_running) == 1)
+ global requeue_guard
+
+ value = next(iter(prompt_queue.currently_running.values()))
+
+ # Handle both old (5 values) and new (6 values) ComfyUI versions
+ if len(value) == 6:
+ (run_number, _, prompt, extra_data, outputs_to_execute, _) = value
+ else:
+ (run_number, _, prompt, extra_data, outputs_to_execute) = value
+
+ if requeue_guard[0] != run_number:
+ #Calculate a count of how many outputs are managed by a batch manager
+ managed_outputs=0
+ for bm_uid in prompt:
+ if prompt[bm_uid]['class_type'] == 'VHS_BatchManager':
+ for output_uid in prompt:
+ if prompt[output_uid]['class_type'] in ["VHS_VideoCombine"]:
+ for inp in prompt[output_uid]['inputs'].values():
+ if inp == [bm_uid, 0]:
+ managed_outputs+=1
+ requeue_guard = [run_number, 0, managed_outputs, {}]
+ requeue_guard[1] = requeue_guard[1]+1
+ requeue_guard[3][requeue_required[0]] = requeue_required[1]
+ if requeue_guard[1] == requeue_guard[2] and max(requeue_guard[3].values()):
+ requeue_workflow_unchecked()
+
+def get_audio(file, start_time=0, duration=0):
+ args = [ffmpeg_path, "-i", file]
+ if start_time > 0:
+ args += ["-ss", str(start_time)]
+ if duration > 0:
+ args += ["-t", str(duration)]
+ try:
+ #TODO: scan for sample rate and maintain
+ res = subprocess.run(args + ["-f", "f32le", "-"],
+ capture_output=True, check=True)
+ audio = torch.frombuffer(bytearray(res.stdout), dtype=torch.float32)
+ match = re.search(', (\\d+) Hz, (\\w+), ',res.stderr.decode(*ENCODE_ARGS))
+ except subprocess.CalledProcessError as e:
+ raise Exception(f"VHS failed to extract audio from {file}:\n" \
+ + e.stderr.decode(*ENCODE_ARGS))
+ if match:
+ ar = int(match.group(1))
+ #NOTE: Just throwing an error for other channel types right now
+ #Will deal with issues if they come
+ ac = {"mono": 1, "stereo": 2}[match.group(2)]
+ else:
+ ar = 44100
+ ac = 2
+ audio = audio.reshape((-1,ac)).transpose(0,1).unsqueeze(0)
+ return {'waveform': audio, 'sample_rate': ar}
+
+class LazyAudioMap(Mapping):
+ def __init__(self, file, start_time, duration):
+ self.file = file
+ self.start_time=start_time
+ self.duration=duration
+ self._dict=None
+ def __getitem__(self, key):
+ if self._dict is None:
+ self._dict = get_audio(self.file, self.start_time, self.duration)
+ return self._dict[key]
+ def __iter__(self):
+ if self._dict is None:
+ self._dict = get_audio(self.file, self.start_time, self.duration)
+ return iter(self._dict)
+ def __len__(self):
+ if self._dict is None:
+ self._dict = get_audio(self.file, self.start_time, self.duration)
+ return len(self._dict)
+def lazy_get_audio(file, start_time=0, duration=0, **kwargs):
+ return LazyAudioMap(file, start_time, duration)
+
+def is_url(url):
+ return url.split("://")[0] in ["http", "https"]
+
+def validate_sequence(path):
+ #Check if path is a valid ffmpeg sequence that points to at least one file
+ (path, file) = os.path.split(path)
+ if not os.path.isdir(path):
+ return False
+ match = re.search('%0?\\d+d', file)
+ if not match:
+ return False
+ seq = match.group()
+ if seq == '%d':
+ seq = '\\\\d+'
+ else:
+ seq = '\\\\d{%s}' % seq[1:-1]
+ file_matcher = re.compile(re.sub('%0?\\d+d', seq, file))
+ for file in os.listdir(path):
+ if file_matcher.fullmatch(file):
+ return True
+ return False
+
+def strip_path(path):
+ #This leaves whitespace inside quotes and only a single "
+ #thus ' ""test"' -> '"test'
+ #consider path.strip(string.whitespace+"\"")
+ #or weightier re.fullmatch("[\\s\"]*(.+?)[\\s\"]*", path).group(1)
+ path = path.strip()
+ if path.startswith("\""):
+ path = path[1:]
+ if path.endswith("\""):
+ path = path[:-1]
+ return path
+def hash_path(path):
+ if path is None:
+ return "input"
+ if is_url(path):
+ return "url"
+ if not os.path.isfile(path):
+ return "DNE"
+ return calculate_file_hash(strip_path(path))
+
+
+def validate_path(path, allow_none=False, allow_url=True):
+ if path is None:
+ return allow_none
+ if is_url(path):
+ #Probably not feasible to check if url resolves here
+ if not allow_url:
+ return "URLs are unsupported for this path"
+ return is_safe_path(path)
+ if not os.path.isfile(strip_path(path)):
+ return "Invalid file path: {}".format(path)
+ return is_safe_path(path)
+
+
+def validate_index(index: int, length: int=0, is_range: bool=False, allow_negative=False, allow_missing=False) -> int:
+ # if part of range, do nothing
+ if is_range:
+ return index
+ # otherwise, validate index
+ # validate not out of range - only when latent_count is passed in
+ if length > 0 and index > length-1 and not allow_missing:
+ raise IndexError(f"Index '{index}' out of range for {length} item(s).")
+ # if negative, validate not out of range
+ if index < 0:
+ if not allow_negative:
+ raise IndexError(f"Negative indeces not allowed, but was '{index}'.")
+ conv_index = length+index
+ if conv_index < 0 and not allow_missing:
+ raise IndexError(f"Index '{index}', converted to '{conv_index}' out of range for {length} item(s).")
+ index = conv_index
+ return index
+
+
+def convert_to_index_int(raw_index: str, length: int=0, is_range: bool=False, allow_negative=False, allow_missing=False) -> int:
+ try:
+ return validate_index(int(raw_index), length=length, is_range=is_range, allow_negative=allow_negative, allow_missing=allow_missing)
+ except ValueError as e:
+ raise ValueError(f"Index '{raw_index}' must be an integer.", e)
+
+
+def convert_str_to_indexes(indexes_str: str, length: int=0, allow_missing=False) -> list[int]:
+ if not indexes_str:
+ return []
+ int_indexes = list(range(0, length))
+ allow_negative = length > 0
+ chosen_indexes = []
+ # parse string - allow positive ints, negative ints, and ranges separated by ':'
+ groups = indexes_str.split(",")
+ groups = [g.strip() for g in groups]
+ for g in groups:
+ # parse range of indeces (e.g. 2:16)
+ if ':' in g:
+ index_range = g.split(":", 2)
+ index_range = [r.strip() for r in index_range]
+
+ start_index = index_range[0]
+ if len(start_index) > 0:
+ start_index = convert_to_index_int(start_index, length=length, is_range=True, allow_negative=allow_negative, allow_missing=allow_missing)
+ else:
+ start_index = 0
+ end_index = index_range[1]
+ if len(end_index) > 0:
+ end_index = convert_to_index_int(end_index, length=length, is_range=True, allow_negative=allow_negative, allow_missing=allow_missing)
+ else:
+ end_index = length
+ # support step as well, to allow things like reversing, every-other, etc.
+ step = 1
+ if len(index_range) > 2:
+ step = index_range[2]
+ if len(step) > 0:
+ step = convert_to_index_int(step, length=length, is_range=True, allow_negative=True, allow_missing=True)
+ else:
+ step = 1
+ # if latents were passed in, base indeces on known latent count
+ if len(int_indexes) > 0:
+ chosen_indexes.extend(int_indexes[start_index:end_index][::step])
+ # otherwise, assume indeces are valid
+ else:
+ chosen_indexes.extend(list(range(start_index, end_index, step)))
+ # parse individual indeces
+ else:
+ chosen_indexes.append(convert_to_index_int(g, length=length, allow_negative=allow_negative, allow_missing=allow_missing))
+ return chosen_indexes
+
+
+def select_indexes(input_obj: Union[Tensor, list], idxs: list):
+ if type(input_obj) == Tensor:
+ return input_obj[idxs]
+ else:
+ return [input_obj[i] for i in idxs]
+
+def merge_filter_args(args, ftype="-vf"):
+ #TODO This doesn't account for filter_complex
+ #Will likely need to convert all filters to filter complex in the future
+ #But that requires source/output deduplication
+ try:
+ start_index = args.index(ftype)+1
+ index = start_index
+ while True:
+ index = args.index(ftype, index)
+ args[start_index] += ',' + args[index+1]
+ args.pop(index)
+ args.pop(index)
+ except ValueError:
+ pass
+
+def select_indexes_from_str(input_obj: Union[Tensor, list], indexes: str, err_if_missing=True, err_if_empty=True):
+ real_idxs = convert_str_to_indexes(indexes, len(input_obj), allow_missing=not err_if_missing)
+ if err_if_empty and len(real_idxs) == 0:
+ raise Exception(f"Nothing was selected based on indexes found in '{indexes}'.")
+ return select_indexes(input_obj, real_idxs)
+
+def hook(obj, attr):
+ def dec(f):
+ f = functools.update_wrapper(f, getattr(obj,attr))
+ setattr(obj,attr,f)
+ return f
+ return dec
+
+def cached(duration):
+ def dec(f):
+ cached_ret = None
+ cache_time = 0
+ def cached_func():
+ nonlocal cache_time, cached_ret
+ if time.time() > cache_time + duration or cached_ret is None:
+ cache_time = time.time()
+ cached_ret = f()
+ return cached_ret
+ return cached_func
+ return dec
diff --git a/custom_nodes/comfyui-videohelpersuite/web/js/VHS.core.js b/custom_nodes/comfyui-videohelpersuite/web/js/VHS.core.js
new file mode 100644
index 0000000000000000000000000000000000000000..3f9dabc7880834170896b5f2d624b51b79a800f7
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/web/js/VHS.core.js
@@ -0,0 +1,2562 @@
+import { app } from '../../../scripts/app.js'
+import { api } from '../../../scripts/api.js'
+import { setWidgetConfig } from '../../../extensions/core/widgetInputs.js'
+import { applyTextReplacements } from "../../../scripts/utils.js";
+
+function chainCallback(object, property, callback) {
+ if (object == undefined) {
+ //This should not happen.
+ console.error("Tried to add callback to non-existant object")
+ return;
+ }
+ if (property in object && object[property]) {
+ const callback_orig = object[property]
+ object[property] = function () {
+ const r = callback_orig.apply(this, arguments);
+ return callback.apply(this, arguments) ?? r
+ };
+ } else {
+ object[property] = callback;
+ }
+}
+
+function getNodeById(id, graph=app.graph) {
+ let cg = graph
+ let node = undefined
+ for (let sid of (''+id).split(':')) {
+ node = cg?.getNodeById?.(sid)
+ cg = node?.subgraph
+ }
+ return node
+}
+
+const convDict = {
+ VHS_LoadImages : ["directory", null, "image_load_cap", "skip_first_images", "select_every_nth"],
+ VHS_LoadImagesPath : ["directory", "image_load_cap", "skip_first_images", "select_every_nth"],
+ VHS_VideoCombine : ["frame_rate", "loop_count", "filename_prefix", "format", "pingpong", "save_image"],
+ VHS_LoadVideo : ["video", "force_rate", "force_size", "frame_load_cap", "skip_first_frames", "select_every_nth"],
+ VHS_LoadVideoPath : ["video", "force_rate", "force_size", "frame_load_cap", "skip_first_frames", "select_every_nth"],
+};
+const renameDict = {VHS_VideoCombine : {save_output : "save_image"}}
+function useKVState(nodeType) {
+ chainCallback(nodeType.prototype, "onNodeCreated", function () {
+ chainCallback(this, "onConfigure", function(info) {
+ if (!this.widgets) {
+ //Node has no widgets, there is nothing to restore
+ return
+ }
+ if (typeof(info.widgets_values) != "object") {
+ //widgets_values is in some unknown inactionable format
+ return
+ }
+ let widgetDict = info.widgets_values
+ if (info.widgets_values.length) {
+ //widgets_values is in the old list format
+ if (this.type in convDict) {
+ //widget does not have a conversion format provided
+ let convList = convDict[this.type];
+ if(info.widgets_values.length >= convList.length) {
+ //has all required fields
+ widgetDict = {}
+ for (let i = 0; i < convList.length; i++) {
+ if(!convList[i]) {
+ //Element should not be processed (upload button on load image sequence)
+ continue
+ }
+ widgetDict[convList[i]] = info.widgets_values[i];
+ }
+ } else {
+ //widgets_values is missing elements marked as required
+ //let it fall through to failure state
+ }
+ }
+ }
+ if ('force_size' in widgetDict) {
+ //force size has been phased out, Migrate state
+ if (widgetDict.force_size.includes?.('x')) {
+ let sizes = widgetDict.force_size.split('x')
+ if (sizes[0] != '?') {
+ widgetDict.custom_width = parseInt(sizes[0])
+ } else {
+ widgetDict.custom_width = 0
+ }
+ if (sizes[1] != '?') {
+ widgetDict.custom_height = parseInt(sizes[1])
+ } else {
+ widgetDict.custom_height = 0
+ }
+ } else {
+ if (['Disabled', 'Custom Height'].includes(widgetDict.force_size)) {
+ widgetDict.custom_width = 0
+ }
+ if (['Disabled', 'Custom Width'].includes(widgetDict.force_size)) {
+ widgetDict.custom_height = 0
+ }
+ }
+ }
+ if (widgetDict.videopreview?.params?.force_size) {
+ delete widgetDict.videopreview.params.force_size
+ }
+ let inputs = {}
+ for (let i of this.inputs) {
+ inputs[i.name] = i
+ }
+ if (widgetDict.length == undefined) {
+ for (let w of this.widgets) {
+ if (w.type =="button") {
+ continue
+ }
+ if (w.name in widgetDict) {
+ w.value = widgetDict[w.name];
+ w.callback?.(w.value)
+ } else {
+ //Check for a legacy name that needs migrating
+ if (this.type in renameDict && w.name in renameDict[this.type]) {
+ if (renameDict[this.type][w.name] in widgetDict) {
+ w.value = widgetDict[renameDict[this.type][w.name]]
+ w.callback?.(w.value)
+ continue
+ }
+ }
+ //attempt to restore default value
+ let inputs = LiteGraph.getNodeType(this.type).nodeData.input;
+ let initialValue = null;
+ if (inputs?.required?.hasOwnProperty(w.name)) {
+ if (inputs.required[w.name][1]?.hasOwnProperty("default")) {
+ initialValue = inputs.required[w.name][1].default;
+ } else if (inputs.required[w.name][0].length) {
+ initialValue = inputs.required[w.name][0][0];
+ }
+ } else if (inputs?.optional?.hasOwnProperty(w.name)) {
+ if (inputs.optional[w.name][1]?.hasOwnProperty("default")) {
+ initialValue = inputs.optional[w.name][1].default;
+ } else if (inputs.optional[w.name][0].length) {
+ initialValue = inputs.optional[w.name][0][0];
+ }
+ }
+ if (initialValue) {
+ w.value = initialValue;
+ w.callback?.(w.value)
+ }
+ }
+ if (w.name in inputs && w.config) {
+ setWidgetConfig(inputs[w.name], w.config)
+ }
+ }
+ } else {
+ //Saved data was not a map made by this method
+ //and a conversion dict for it does not exist
+ //It's likely an array and that has been blindly applied
+ if (info?.widgets_values?.length != this.widgets.length) {
+ //Widget could not have restored properly
+ //Note if multiple node loads fail, only the latest error dialog displays
+ app.ui.dialog.show("Failed to restore node: " + this.title + "\nPlease remove and re-add it.")
+ this.bgcolor = "#C00"
+ }
+ }
+ });
+ chainCallback(this, "onSerialize", function(info) {
+ info.widgets_values = {};
+ if (!this.widgets) {
+ //object has no widgets, there is nothing to store
+ return;
+ }
+ for (let w of this.widgets) {
+ info.widgets_values[w.name] = w.value;
+ }
+ });
+ })
+}
+var helpDOM;
+if (!app.helpDOM) {
+ helpDOM = document.createElement("div");
+ app.VHSHelp = helpDOM
+}
+function initHelpDOM() {
+ let parentDOM = document.createElement("div");
+ parentDOM.className = "VHS_floatinghelp"
+ document.body.appendChild(parentDOM)
+ parentDOM.appendChild(helpDOM)
+ helpDOM.className = "litegraph";
+ let scrollbarStyle = document.createElement('style');
+ scrollbarStyle.innerHTML = `
+ .VHS_floatinghelp {
+ scrollbar-width: 6px;
+ scrollbar-color: #0003 #0000;
+ &::-webkit-scrollbar {
+ background: transparent;
+ width: 6px;
+ }
+ &::-webkit-scrollbar-thumb {
+ background: #0005;
+ border-radius: 20px
+ }
+ &::-webkit-scrollbar-button {
+ display: none;
+ }
+ }
+ .VHS_loopedvideo::-webkit-media-controls-mute-button {
+ display:none;
+ }
+ .VHS_loopedvideo::-webkit-media-controls-fullscreen-button {
+ display:none;
+ }
+ `
+ scrollbarStyle.id = 'scroll-properties'
+ parentDOM.appendChild(scrollbarStyle)
+ chainCallback(app.canvas, "onDrawForeground", function (ctx, visible_rect){
+ let n = helpDOM.node
+ if (!n || !n?.graph) {
+ parentDOM.style['left'] = '-5000px'
+ return
+ }
+ //draw : function(ctx, node, widgetWidth, widgetY, height) {
+ //update widget position, even if off screen
+ const transform = ctx.getTransform();
+ const scale = app.canvas.ds.scale;//gets the litegraph zoom
+ //calculate coordinates with account for browser zoom
+ const bcr = app.canvas.canvas.getBoundingClientRect()
+ const x = transform.e*scale/transform.a + bcr.x;
+ const y = transform.f*scale/transform.a + bcr.y;
+ //TODO: text reflows at low zoom. investigate alternatives
+ Object.assign(parentDOM.style, {
+ left: (x+(n.pos[0] + n.size[0]+15)*scale) + "px",
+ top: (y+(n.pos[1]-LiteGraph.NODE_TITLE_HEIGHT)*scale) + "px",
+ width: "400px",
+ minHeight: "100px",
+ maxHeight: "600px",
+ overflowY: 'scroll',
+ transformOrigin: '0 0',
+ transform: 'scale(' + scale + ',' + scale +')',
+ fontSize: '18px',
+ backgroundColor: LiteGraph.NODE_DEFAULT_BGCOLOR,
+ boxShadow: '0 0 10px black',
+ borderRadius: '4px',
+ padding: '3px',
+ zIndex: 3,
+ position: "absolute",
+ display: 'inline',
+ });
+ });
+ function setCollapse(el, doCollapse) {
+ if (doCollapse) {
+ el.children[0].children[0].innerHTML = '+'
+ Object.assign(el.children[1].style, {
+ color: '#CCC',
+ overflowX: 'hidden',
+ width: '0px',
+ minWidth: 'calc(100% - 20px)',
+ textOverflow: 'ellipsis',
+ whiteSpace: 'nowrap',
+ })
+ for (let child of el.children[1].children) {
+ if (child.style.display != 'none'){
+ child.origDisplay = child.style.display
+ }
+ child.style.display = 'none'
+ }
+ } else {
+ el.children[0].children[0].innerHTML = '-'
+ Object.assign(el.children[1].style, {
+ color: '',
+ overflowX: '',
+ width: '100%',
+ minWidth: '',
+ textOverflow: '',
+ whiteSpace: '',
+ })
+ for (let child of el.children[1].children) {
+ child.style.display = child.origDisplay
+ }
+ }
+ }
+ helpDOM.collapseOnClick = function() {
+ let doCollapse = this.children[0].innerHTML == '-'
+ setCollapse(this.parentElement, doCollapse)
+ }
+ helpDOM.selectHelp = function(name, value) {
+ //attempt to navigate to name in help
+ function collapseUnlessMatch(items,t) {
+ var match = items.querySelector('[vhs_title="' + t + '"]')
+ if (!match) {
+ for (let i of items.children) {
+ if (i.innerHTML.slice(0,t.length+5).includes(t)) {
+ match = i
+ break
+ }
+ }
+ }
+ if (!match) {
+ return null
+ }
+ //For longer documentation items with fewer collapsable elements,
+ //scroll to make sure the entirety of the selected item is visible
+ //This has the unfortunate side effect of trying to scroll the main
+ //window if the documentation windows is forcibly offscreen,
+ //but it's easy to simply scroll the main window back and seems to
+ //have no visual side effects
+ match.scrollIntoView(false)
+ window.scrollTo(0,0)
+ for (let i of items.querySelectorAll('.VHS_collapse')) {
+ if (i.contains(match)) {
+ setCollapse(i, false)
+ } else {
+ setCollapse(i, true)
+ }
+ }
+ return match
+ }
+ let target = collapseUnlessMatch(helpDOM, name)
+ if (target && value) {
+ collapseUnlessMatch(target, value)
+ }
+ }
+ let titleContext = document.createElement("canvas").getContext("2d")
+ titleContext.font = app.canvas.title_text_font;
+ helpDOM.calculateTitleLength = function(text) {
+ return titleContext.measureText(text).width
+ }
+ helpDOM.addHelp = function(node, nodeType, description) {
+ if (!description) {
+ return
+ }
+ //Pad computed size for the clickable question mark
+ let originalComputeSize = node.computeSize
+ node.computeSize = function() {
+ let size = originalComputeSize.apply(this, arguments)
+ if (!this.title) {
+ return size
+ }
+ let title_width = helpDOM.calculateTitleLength(this.title)
+ size[0] = Math.max(size[0], title_width + LiteGraph.NODE_TITLE_HEIGHT*2)
+ return size
+ }
+
+ node.description = description
+ chainCallback(node, "onDrawForeground", function (ctx) {
+ if (this?.flags?.collapsed) {
+ return
+ }
+ //draw question mark
+ ctx.save()
+ ctx.font = 'bold 20px Arial'
+ ctx.fillText("?", this.size[0]-17, -8)
+ ctx.restore()
+ })
+ chainCallback(node, "onMouseDown", function (e, pos, canvas) {
+ if (this?.flags?.collapsed) {
+ return
+ }
+ //On click would be preferred, but this'll be good enough
+ if (pos[1] < 0 && pos[0] + LiteGraph.NODE_TITLE_HEIGHT > this.size[0]) {
+ //corner question mark clicked
+ if (helpDOM.node == this) {
+ helpDOM.node = undefined
+ } else {
+ helpDOM.node = this;
+ helpDOM.innerHTML = this.description || "no help provided "
+ for (let e of helpDOM.querySelectorAll('.VHS_collapse')) {
+ e.children[0].onclick = helpDOM.collapseOnClick
+ e.children[0].style.cursor = 'pointer'
+ }
+ for (let e of helpDOM.querySelectorAll('.VHS_precollapse')) {
+ setCollapse(e, true)
+ }
+ for (let e of helpDOM.querySelectorAll('.VHS_loopedvideo')) {
+ e?.play()
+ }
+ helpDOM.parentElement.scrollTo(0,0)
+ }
+ return true
+ }
+ })
+ let timeout = null
+ chainCallback(node, "onMouseMove", function (e, pos, canvas) {
+ if (timeout) {
+ clearTimeout(timeout)
+ timeout = null
+ }
+ if (helpDOM.node != this) {
+ return
+ }
+ timeout = setTimeout(() => {
+ let n = this
+ if (pos[0] > 0 && pos[0] < n.size[0]
+ && pos[1] > 0 && pos[1] < n.size[1]) {
+ //TODO: provide help specific to element clicked
+ let inputRows = Math.max(n.inputs?.length || 0, n.outputs?.length || 0)
+ if (pos[1] < LiteGraph.NODE_SLOT_HEIGHT * inputRows) {
+ let row = Math.floor((pos[1] - 7) / LiteGraph.NODE_SLOT_HEIGHT)
+ if (pos[0] < n.size[0]/2) {
+ if (row < n.inputs.length) {
+ helpDOM.selectHelp(n.inputs[row].name)
+ }
+ } else {
+ if (row < n.outputs.length) {
+ helpDOM.selectHelp(n.outputs[row].name)
+ }
+ }
+ } else {
+ //probably widget, but widgets have variable height.
+ let basey = LiteGraph.NODE_SLOT_HEIGHT * inputRows + 6
+ for (let w of n.widgets) {
+ if (w.y) {
+ basey = w.y
+ }
+ let wheight = LiteGraph.NODE_WIDGET_HEIGHT+4
+ if (w.computeSize) {
+ wheight = w.computeSize(n.size[0])[1]
+ }
+ if (pos[1] < basey + wheight) {
+ helpDOM.selectHelp(w.name, w.value)
+ break
+ }
+ basey += wheight
+ }
+ }
+ }
+ }, 500)
+ })
+ chainCallback(node, "onMouseLeave", function (e, pos, canvas) {
+ if (timeout) {
+ clearTimeout(timeout)
+ timeout = null
+ }
+ });
+ }
+}
+
+function fitHeight(node) {
+ node.setSize([node.size[0], node.computeSize([node.size[0], node.size[1]])[1]])
+ node?.graph?.setDirtyCanvas(true);
+}
+function startDraggingItems(node, pointer) {
+ app.canvas.emitBeforeChange()
+ app.canvas.graph?.beforeChange()
+ // Ensure that dragging is properly cleaned up, on success or failure.
+ pointer.finally = () => {
+ app.canvas.isDragging = false
+ app.canvas.graph?.afterChange()
+ app.canvas.emitAfterChange()
+ }
+ app.canvas.processSelect(node, pointer.eDown, true)
+ app.canvas.isDragging = true
+}
+function processDraggedItems(e) {
+ if (e.shiftKey || LiteGraph.alwaysSnapToGrid)
+ app.canvas?.graph?.snapToGrid(app.canvas.selectedItems)
+ app.canvas.dirty_canvas = true
+ app.canvas.dirty_bgcanvas = true
+ app.canvas.onNodeMoved?.(findFirstNode(app.canvas.selectedItems))
+}
+function allowDragFromWidget(widget) {
+ widget.onPointerDown = function(pointer, node) {
+ pointer.onDragStart = () => startDraggingItems(node, pointer)
+ pointer.onDragEnd = processDraggedItems
+ app.canvas.dirty_canvas = true
+ return true
+ }
+}
+
+//Cloud specific auth code. Short circuits if not on cloud
+async function getAuthHeader() {
+ try {
+ const authStore = await api.getAuthStore()
+ return authStore ? await authStore.getAuthHeader() : null
+ } catch (error) {
+ console.warn('Failed to get auth header:', error)
+ return null
+ }
+}
+
+async function uploadFile(file, progressCallback) {
+ try {
+ // Wrap file in formdata so it includes filename
+ const body = new FormData();
+ const i = file.webkitRelativePath.lastIndexOf('/');
+ const subfolder = file.webkitRelativePath.slice(0,i+1)
+ const new_file = new File([file], file.name, {
+ type: file.type,
+ lastModified: file.lastModified,
+ });
+ body.append("image", new_file);
+ if (i > 0) {
+ body.append("subfolder", subfolder);
+ }
+ const url = api.apiURL("/upload/image")
+ const resp = await new Promise((resolve) => {
+ let req = new XMLHttpRequest()
+ req.upload.onprogress = (e) => progressCallback?.(e.loaded/e.total)
+ req.onload = () => resolve(req)
+ req.open('post', url, true)
+ getAuthHeader().then((headers) => {
+ headers ??= {}
+ for (const key in headers)
+ req.setRequestHeader(key, headers[key])
+ req.send(body)
+ })
+ })
+
+ if (resp.status !== 200) {
+ alert(resp.status + " - " + resp.statusText);
+ }
+ return resp
+ } catch (error) {
+ alert(error);
+ }
+}
+
+function addVAEOutputToggle(nodeType, nodeData) {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ this.reject_ue_connection = (input) => input?.name == "vae"
+ })
+ chainCallback(nodeType.prototype, "onConnectionsChange", function(contype, slot, iscon, linfo) {
+ let slotType = this.inputs[slot]?.type
+ if (contype == LiteGraph.INPUT && slotType == "VAE") {
+ if (iscon && linfo) {
+ if (this.linkTimeout) {
+ clearTimeout(this.linkTimeout)
+ this.linkTimeout = false
+ } else if (this.outputs[0].type == "IMAGE") {
+ this.linkTimeout = setTimeout(() => {
+ if (this.outputs[0].type != "IMAGE") {
+ return
+ }
+ this.linkTimeout = false
+ this.disconnectOutput(0);
+ }, 50)
+ }
+ this.outputs[0].name = 'LATENT';
+ this.outputs[0].type = 'LATENT';
+ } else{
+ if (this.outputs[0].type == "LATENT") {
+ this.linkTimeout = setTimeout(() => {
+ this.linkTimeout = false
+ this.disconnectOutput(0);
+ }, 50)
+ }
+ this.outputs[0].name = "IMAGE";
+ this.outputs[0].type = "IMAGE";
+ }
+ }
+ });
+}
+function addVAEInputToggle(nodeType, nodeData) {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ this.reject_ue_connection = (input) => input?.name == "vae"
+ })
+ chainCallback(nodeType.prototype, "onConnectionsChange", function(contype, slot, iscon, linf) {
+ if (contype == LiteGraph.INPUT && slot == 3 && this.inputs[3].type == "VAE") {
+ if (iscon && linf) {
+ if (this.linkTimeout) {
+ clearTimeout(this.linkTimeout)
+ this.linkTimeout = false
+ } else if (this.inputs[0].type == "IMAGE") {
+ this.linkTimeout = setTimeout(() => {
+ //workaround for out of order loading
+ if (this.inputs[0].type != "IMAGE") {
+ return
+ }
+ this.linkTimeout = false
+ this.disconnectInput(0);
+ }, 50)
+ }
+ this.inputs[0].type = 'LATENT';
+ } else {
+ if (this.inputs[0].type == "LATENT") {
+ this.linkTimeout = setTimeout(() => {
+ this.linkTimeout = false
+ this.disconnectInput(0);
+ }, 50)
+ }
+ this.inputs[0].type = "IMAGE";
+ }
+ }
+ });
+}
+function cloneType(nodeType, nodeData) {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ this.changeOutputType = function (new_type) {
+ this.linkTimeout = setTimeout(() => {
+ this.linkTimeout = false
+ if (this.outputs[0].type != new_type) {
+ this.outputs[0].type = new_type
+ //check and potentially remove links
+ if (!this.outputs[0].links) {
+ return
+ }
+ let removed_links = []
+ for (let link_id of this.outputs[0].links) {
+ let link = app.graph.links[link_id]
+ if (!link)
+ debugger
+ let target_node = app.graph.getNodeById(link.target_id)
+ let target_input = target_node.inputs[link.target_slot]
+ let keep = LiteGraph.isValidConnection(new_type, target_input.type)
+ if (!keep) {
+ link.disconnect(app.graph, 'input')
+ removed_links.push(link_id)
+ }
+ target_node.onConnectionsChange?.(LiteGraph.INPUT,
+ link.target_slot, keep, link, target_input)
+ }
+ this.outputs[0].links = this.outputs[0].links
+ .filter((v) => !removed_links.includes(v))
+ }
+ }, 50)
+ }
+ this.changeOutputType("VHS_DUMMY_NONE")
+ });
+ chainCallback(nodeType.prototype, "onConnectionsChange", function(contype, slot, iscon, linf) {
+ if (contype == LiteGraph.INPUT && slot == 0) {
+ let new_type = "VHS_DUMMY_NONE"
+ if (iscon && linf) {
+ new_type = app.graph.getNodeById(linf.origin_id).outputs[linf.origin_slot].type
+ }
+ if (this.linkTimeout) {
+ clearTimeout(this.linkTimeout)
+ }
+ this.changeOutputType(new_type)
+ }
+ });
+}
+
+function addDateFormatting(nodeType, field, timestamp_widget = false) {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ const widget = this.widgets.find((w) => w.name === field);
+ widget.serializeValue = () => {
+ return applyTextReplacements(app, widget.value);
+ };
+ });
+}
+function addTimestampWidget(nodeType, nodeData, targetWidget) {
+ const newWidgets = {};
+ for (let key in nodeData.input.required) {
+ if (key == targetWidget) {
+ //TODO: account for duplicate entries?
+ newWidgets["timestamp_directory"] = ["BOOLEAN", {"default": true}]
+ }
+ newWidgets[key] = nodeData.input.required[key];
+ }
+ nodeDta.input.required = newWidgets;
+ chainCallback(nodeType.prototype, "onNodeCreated", function () {
+ const directoryWidget = this.widgets.find((w) => w.name === "directory_name");
+ const timestampWidget = this.widgets.find((w) => w.name === "timestamp_directory");
+ directoryWidget.serializeValue = () => {
+ if (timestampWidget.value) {
+ //ignore actual value and return timestamp
+ return formatDate("yyyy-MM-ddThh:mm:ss", new Date());
+ }
+ return directoryWidget.value
+ };
+ timestampWidget._value = value;
+ Object.definteProperty(timestampWidget, "value", {
+ set : function(value) {
+ this._value = value;
+ directoryWidget.disabled = value;
+ },
+ get : function() {
+ return this._value;
+ }
+ });
+ });
+}
+function initializeLoadFormat(nodeType, nodeData) {
+ if (!nodeData?.input?.optional?.format) {
+ return
+ }
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ let node = this
+ let formatWidget = this.widgets.find((w) => w.name === "format")
+ formatWidget.options.formats = nodeData.input.optional.format[1].formats
+ let base = {}
+ for (let widget of this.widgets) {
+ if (['force_rate', 'custom_width', 'custom_height',
+ 'frame_load_cap'].includes(widget.name)) {
+ //TODO: filter these options?
+ base[widget.name] = widget.options
+ }
+ }
+ chainCallback(formatWidget, "callback", function(value) {
+ let format = this.options.formats[value]
+ if (!format) {
+ return
+ }
+ if ('target_rate' in format) {
+ format.force_rate = {'reset': format.target_rate}
+ }
+ if ('dim' in format) {
+ format.custom_width = {'step': format.dim[0], 'mod': format.dim[1]}
+ format.custom_height = {'step': format.dim[0], 'mod': format.dim[1]}
+ if (format.dim[2]) {
+ format.custom_width.reset = format.dim[2]
+ }
+ if (format.dim[3]) {
+ format.custom_height.reset = format.dim[3]
+ }
+ }
+ if ('frames' in format) {
+ format.frame_load_cap = {'step': format.frames[0], 'mod': format.frames[1]}
+ }
+ for (let widget of node.widgets) {
+ if (widget.name in base) {
+ let wasDefault = widget.options?.reset == widget.value
+ widget.options = Object.assign({}, base[widget.name], format[widget.name])
+ if (wasDefault && widget.options.reset != undefined) {
+ widget.value = widget.options.reset
+ }
+ widget.callback(widget.value)
+ }
+ }
+
+ });
+ let capWidget = this.widgets.find((w) => w.name === "frame_load_cap")
+ capWidget.annotation = (value, width) => {
+ let max_frames = this.video_query?.loaded?.frames
+ if (!max_frames || value && value < max_frames) {
+ return
+ }
+ let format = formatWidget.options.formats[formatWidget.value]
+ const div = format?.frames?.[0] ?? 1
+ const mod = format?.frames?.[1] ?? 0
+ let loadable_frames = max_frames
+ if ((max_frames % div) != mod) {
+ loadable_frames = ((max_frames - mod)/div|0) * div + mod
+ }
+ return loadable_frames + "\u21FD"
+ }
+ let rateWidget = this.widgets.find((w) => w.name === "force_rate")
+ rateWidget.annotation = (value, width) => {
+ if (value == 0 && this.video_query?.source?.fps != undefined) {
+ return roundToPrecision(this.video_query.source.fps, 2) + "\u21FD"
+ }
+ }
+ });
+}
+
+function addUploadWidget(nodeType, nodeData, widgetName, type="video") {
+ let accept = {'video': ["video/webm","video/mp4","video/x-matroska","image/gif"],
+ 'audio': ["audio/mpeg","audio/wav","audio/x-wav","audio/ogg"]}
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ const node = this
+ const pathWidget = this.widgets.find((w) => w.name === widgetName);
+ const fileInput = document.createElement("input");
+ chainCallback(this, "onRemoved", () => {
+ fileInput?.remove();
+ });
+ if (type == "folder") {
+ Object.assign(fileInput, {
+ type: "file",
+ style: "display: none",
+ webkitdirectory: true,
+ onchange: async () => {
+ const directory = fileInput.files[0].webkitRelativePath;
+ const i = directory.lastIndexOf('/');
+ if (i <= 0) {
+ throw "No directory found";
+ }
+ const path = directory.slice(0,directory.lastIndexOf('/'))
+ if (pathWidget.options.values.includes(path)) {
+ alert("A folder of the same name already exists");
+ return;
+ }
+ let successes = 0;
+ const onProg = (p) => this.progress = (successes + p) / fileInput.files.length
+ for(const file of fileInput.files) {
+ if ((await uploadFile(file, onProg)).status == 200) {
+ successes++;
+ } else {
+ this.progress = undefined
+ //Upload failed, but some prior uploads may have succeeded
+ //Stop future uploads to prevent cascading failures
+ //and only add to list if an upload has succeeded
+ if (successes > 0) {
+ break
+ } else {
+ return;
+ }
+ }
+ }
+ this.progress = undefined
+ pathWidget.options.values.push(path);
+ pathWidget.value = path;
+ if (pathWidget.callback) {
+ pathWidget.callback(path)
+ }
+ },
+ });
+ } else {
+ let accept = {'video': ["video/webm","video/mp4","video/x-matroska","image/gif"],
+ 'audio': ["audio/mpeg","audio/wav","audio/x-wav","audio/ogg"]}[type]
+ async function doUpload(file) {
+ let resp = await uploadFile(file, (p) => node.progress = p)
+ node.progress = undefined
+ if (resp.status != 200) {
+ return false
+ }
+ const filename = JSON.parse(resp.responseText).name;
+ pathWidget.options.values.push(filename);
+ pathWidget.value = filename;
+ if (pathWidget.callback) {
+ pathWidget.callback(filename)
+ }
+ return true
+ }
+ Object.assign(fileInput, {
+ type: "file",
+ accept: accept.join(','),
+ style: "display: none",
+ onchange: async () => {
+ if (fileInput.files.length) {
+ return await doUpload(fileInput.files[0])
+ }
+ },
+ });
+ this.onDragOver = (e) => !!e?.dataTransfer?.types?.includes?.('Files')
+ this.onDragDrop = async function(e) {
+ if (!e?.dataTransfer?.types?.includes?.('Files')) {
+ return false
+ }
+ //TODO: Allow dragging multiple files at once?
+ const item = e.dataTransfer?.files?.[0]
+ if (accept.includes(item?.type)) {
+ return await doUpload(item)
+ }
+ return false
+ }
+ }
+ document.body.append(fileInput);
+ let uploadWidget = this.addWidget("button", "choose " + type + " to upload", "image", () => {
+ //clear the active click event
+ app.canvas.node_widget = null
+
+ fileInput.click();
+ });
+ uploadWidget.options.serialize = false;
+
+
+ });
+}
+function addAudioPreview(nodeType, isInput=true) {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ var element = document.createElement("audio");
+ element.controls = true
+ const previewNode = this;
+ var previewWidget = this.addDOMWidget("audiopreview", "preview", element, {
+ serialize: false,
+ hideOnZoom: true,
+ getValue() {
+ return element.value;
+ },
+ setValue(v) {
+ element.value = v;
+ },
+ });
+ previewWidget.computeSize = function(width) {
+ return [width, 50];
+ }
+ var timeout = null;
+ this.updateParameters = (params, force_update) => {
+ if (!previewWidget.value.params) {
+ if(typeof(previewWidget.value) != 'object') {
+ previewWidget.value = {}
+ }
+ previewWidget.value.params = {}
+ }
+ Object.assign(previewWidget.value.params, params)
+ if (!force_update &&
+ app.ui.settings.getSettingValue("VHS.AdvancedPreviews") == 'Never') {
+ return;
+ }
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ if (force_update) {
+ previewWidget.updateSource();
+ } else {
+ timeout = setTimeout(() => previewWidget.updateSource(),100);
+ }
+ };
+ previewWidget.updateSource = function () {
+ if (this.value.params == undefined) {
+ return;
+ }
+ let params = {}
+ let advp = app.ui.settings.getSettingValue("VHS.AdvancedPreviews")
+ if (advp == 'Never') {
+ advp = false
+ } else if (advp == 'Input Only') {
+ advp = isInput
+ } else {
+ advp = true
+ }
+ Object.assign(params, this.value.params);//shallow copy
+ params.timestamp = Date.now()
+ if (!advp) {
+ element.src = api.apiURL('/view?' + new URLSearchParams(params));
+ } else {
+ params.deadline = app.ui.settings.getSettingValue("VHS.AdvancedPreviewsDeadline")
+ element.src = api.apiURL('/vhs/viewaudio?' + new URLSearchParams(params));
+ }
+ }
+ previewWidget.callback = previewWidget.updateSource
+
+
+ //setup widget tracking
+ function update(key) {
+ return function(value) {
+ let params = {}
+ params[key] = this.value
+ previewNode?.updateParameters(params)
+ }
+ }
+ let widgetMap = { 'seek_seconds': 'start_time', 'duration': 'duration',
+ 'start_time': 'start_time' }
+ for (let widget of this.widgets) {
+ if (widget.name in widgetMap) {
+ if (typeof(widgetMap[widget.name]) == 'function') {
+ chainCallback(widget, "callback", widgetMap[widget.name]);
+ } else {
+ chainCallback(widget, "callback", update(widgetMap[widget.name]))
+ }
+ }
+ if (widget.type != "button") {
+ widget.callback?.(widget.value)
+ }
+ }
+ });
+}
+
+function addVideoPreview(nodeType, isInput=true) {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ var element = document.createElement("div");
+ const previewNode = this;
+ var previewWidget = this.addDOMWidget("videopreview", "preview", element, {
+ serialize: false,
+ hideOnZoom: false,
+ getValue() {
+ return element.value;
+ },
+ setValue(v) {
+ element.value = v;
+ },
+ });
+ allowDragFromWidget(previewWidget)
+ previewWidget.computeSize = function(width) {
+ if (this.aspectRatio && !this.parentEl.hidden) {
+ let height = (previewNode.size[0]-20)/ this.aspectRatio + 10;
+ if (!(height > 0)) {
+ height = 0;
+ }
+ this.computedHeight = height + 10;
+ return [width, height];
+ }
+ return [width, -4];//no loaded src, widget should not display
+ }
+ element.addEventListener('contextmenu', (e) => {
+ e.preventDefault()
+ return app.canvas._mousedown_callback(e)
+ }, true);
+ element.addEventListener('pointerdown', (e) => {
+ e.preventDefault()
+ return app.canvas._mousedown_callback(e)
+ }, true);
+ element.addEventListener('mousewheel', (e) => {
+ e.preventDefault()
+ return app.canvas._mousewheel_callback(e)
+ }, true);
+ element.addEventListener('pointermove', (e) => {
+ e.preventDefault()
+ return app.canvas._mousemove_callback(e)
+ }, true);
+ element.addEventListener('pointerup', (e) => {
+ e.preventDefault()
+ return app.canvas._mouseup_callback(e)
+ }, true);
+ element.addEventListener('dragover', (e) => {
+ //A little hacky, but allows drag events onto the preview itself
+ e.preventDefault();
+ e.dataTransfer.dropEffect = "copy";
+ app.dragOverNode = this
+ })
+ previewWidget.value = {hidden: false, paused: false, params: {},
+ muted: app.ui.settings.getSettingValue("VHS.DefaultMute")}
+ previewWidget.parentEl = document.createElement("div");
+ previewWidget.parentEl.className = "vhs_preview";
+ previewWidget.parentEl.style['width'] = "100%"
+ element.appendChild(previewWidget.parentEl);
+ previewWidget.videoEl = document.createElement("video");
+ previewWidget.videoEl.controls = false;
+ previewWidget.videoEl.loop = true;
+ previewWidget.videoEl.muted = true;
+ previewWidget.videoEl.style['width'] = "100%"
+ previewWidget.videoEl.addEventListener("loadedmetadata", () => {
+
+ previewWidget.aspectRatio = previewWidget.videoEl.videoWidth / previewWidget.videoEl.videoHeight;
+ fitHeight(this);
+ });
+ previewWidget.videoEl.addEventListener("error", () => {
+ //TODO: consider a way to properly notify the user why a preview isn't shown.
+ previewWidget.parentEl.hidden = true;
+ fitHeight(this);
+ });
+ previewWidget.videoEl.onmouseenter = () => {
+ previewWidget.videoEl.muted = previewWidget.value.muted
+ };
+ previewWidget.videoEl.onmouseleave = () => {
+ previewWidget.videoEl.muted = true;
+ };
+
+ previewWidget.imgEl = document.createElement("img");
+ previewWidget.imgEl.style['width'] = "100%"
+ previewWidget.imgEl.hidden = true;
+ previewWidget.imgEl.onload = () => {
+ previewWidget.aspectRatio = previewWidget.imgEl.naturalWidth / previewWidget.imgEl.naturalHeight;
+ fitHeight(this);
+ };
+ previewWidget.parentEl.appendChild(previewWidget.videoEl)
+ previewWidget.parentEl.appendChild(previewWidget.imgEl)
+ var timeout = null;
+ this.updateParameters = (params, force_update) => {
+ if (!previewWidget.value.params) {
+ if(typeof(previewWidget.value) != 'object') {
+ previewWidget.value = {hidden: false, paused: false}
+ }
+ previewWidget.value.params = {}
+ }
+ if (!Object.entries(params).some(([k,v]) => previewWidget.value.params[k] !== v)) {
+ return
+ }
+ Object.assign(previewWidget.value.params, params)
+ if (!force_update &&
+ app.ui.settings.getSettingValue("VHS.AdvancedPreviews") == 'Never') {
+ return;
+ }
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ if (force_update) {
+ previewWidget.updateSource();
+ } else {
+ timeout = setTimeout(() => previewWidget.updateSource(),100);
+ }
+ };
+ previewWidget.updateSource = function () {
+ if (this.value.params == undefined) {
+ return;
+ }
+ let params = {}
+ let advp = app.ui.settings.getSettingValue("VHS.AdvancedPreviews")
+ if (advp == 'Never') {
+ advp = false
+ } else if (advp == 'Input Only') {
+ advp = isInput
+ } else {
+ advp = true
+ }
+ Object.assign(params, this.value.params);//shallow copy
+ params.timestamp = Date.now()
+ this.parentEl.hidden = this.value.hidden;
+ if (params.format?.split('/')[0] == 'video'
+ || advp && (params.format?.split('/')[1] == 'gif')
+ || params.format == 'folder') {
+
+ this.videoEl.autoplay = !this.value.paused && !this.value.hidden;
+ if (!advp) {
+ this.videoEl.src = api.apiURL('/view?' + new URLSearchParams(params));
+ } else {
+ let target_width = (previewNode.size[0]-20)*2 || 256;
+ let minWidth = app.ui.settings.getSettingValue("VHS.AdvancedPreviewsMinWidth")
+ if (target_width < minWidth) {
+ target_width = minWidth
+ }
+ if (!params.custom_width || !params.custom_height) {
+ params.force_size = target_width+"x?"
+ } else {
+ let ar = params.custom_width/params.custom_height
+ params.force_size = target_width+"x"+(target_width/ar)
+ }
+ params.deadline = app.ui.settings.getSettingValue("VHS.AdvancedPreviewsDeadline")
+ this.videoEl.src = api.apiURL('/vhs/viewvideo?' + new URLSearchParams(params));
+ }
+ this.videoEl.hidden = false;
+ this.imgEl.hidden = true;
+ } else if (params.format?.split('/')[0] == 'image'){
+ //Is animated image
+ this.imgEl.src = api.apiURL('/view?' + new URLSearchParams(params));
+ this.videoEl.hidden = true;
+ this.imgEl.hidden = false;
+ }
+ delete previewNode.video_query
+ const doQuery = async () => {
+ if (!previewWidget?.value?.params?.filename) {
+ return
+ }
+ let qurl = api.apiURL('/vhs/queryvideo?' + new URLSearchParams(previewWidget.value.params))
+ let query = undefined
+ try {
+ let query_res = await fetch(qurl)
+ query = await query_res.json()
+ } catch(e) {
+ return
+ }
+ previewNode.video_query = query
+ }
+ doQuery()
+ }
+ previewWidget.callback = previewWidget.updateSource
+ previewWidget.parentEl.appendChild(previewWidget.videoEl)
+ previewWidget.parentEl.appendChild(previewWidget.imgEl)
+ });
+}
+let copiedPath = undefined
+function addPreviewOptions(nodeType) {
+ chainCallback(nodeType.prototype, "getExtraMenuOptions", function(_, options) {
+ // The intended way of appending options is returning a list of extra options,
+ // but this isn't used in widgetInputs.js and would require
+ // less generalization of chainCallback
+ let optNew = []
+ const previewWidget = this.widgets.find((w) => w.name === "videopreview");
+
+ let url = null
+ if (previewWidget.videoEl?.hidden == false && previewWidget.videoEl.src) {
+ if (['input', 'output', 'temp'].includes(previewWidget.value.params.type)) {
+ //Use full quality video
+ url = api.apiURL('/view?' + new URLSearchParams(previewWidget.value.params));
+ //Workaround for 16bit png: Just do first frame
+ url = url.replace('%2503d', '001')
+ }
+ } else if (previewWidget.imgEl?.hidden == false && previewWidget.imgEl.src) {
+ url = previewWidget.imgEl.src;
+ url = new URL(url);
+ }
+ if (this.video_query?.source) {
+ let info_string = this.video_query.source.size.join('x') +
+ '@' + this.video_query.source.fps + 'fps ' +
+ this.video_query.source.frames + 'frames'
+ optNew.push({content: info_string, disabled: true})
+ }
+ if (url) {
+ optNew.push(
+ {
+ content: "Open preview",
+ callback: () => {
+ window.open(url, "_blank")
+ },
+ },
+ {
+ content: "Save preview",
+ callback: () => {
+ const a = document.createElement("a");
+ a.href = url;
+ a.setAttribute("download", previewWidget.value.params.filename);
+ document.body.append(a);
+ a.click();
+ requestAnimationFrame(() => a.remove());
+ },
+ }
+ );
+ if (previewWidget.value.params.fullpath) {
+ copiedPath = previewWidget.value.params.fullpath
+ const blob = new Blob([previewWidget.value.params.fullpath],
+ { type: 'text/plain'})
+ optNew.push({
+ content: "Copy output filepath",
+ callback: async () => {
+ await navigator.clipboard.write([
+ new ClipboardItem({
+ 'text/plain': blob
+ })])}
+ });
+ }
+ if (previewWidget.value.params.workflow) {
+ let wParams = {...previewWidget.value.params,
+ filename: previewWidget.value.params.workflow}
+ let wUrl = api.apiURL('/view?' + new URLSearchParams(wParams));
+ optNew.push({
+ content: "Save workflow image",
+ callback: () => {
+ const a = document.createElement("a");
+ a.href = wUrl;
+ a.setAttribute("download", previewWidget.value.params.workflow);
+ document.body.append(a);
+ a.click();
+ requestAnimationFrame(() => a.remove());
+ }
+ });
+ }
+ }
+ const PauseDesc = (previewWidget.value.paused ? "Resume" : "Pause") + " preview";
+ if(previewWidget.videoEl.hidden == false) {
+ optNew.push({content: PauseDesc, callback: () => {
+ //animated images can't be paused and are more likely to cause performance issues.
+ //changing src to a single keyframe is possible,
+ //For now, the option is disabled if an animated image is being displayed
+ if(previewWidget.value.paused) {
+ previewWidget.videoEl?.play();
+ } else {
+ previewWidget.videoEl?.pause();
+ }
+ previewWidget.value.paused = !previewWidget.value.paused;
+ }});
+ }
+ //TODO: Consider hiding elements if no video preview is available yet.
+ //It would reduce confusion at the cost of functionality
+ //(if a video preview lags the computer, the user should be able to hide in advance)
+ const visDesc = (previewWidget.value.hidden ? "Show" : "Hide") + " preview";
+ optNew.push({content: visDesc, callback: () => {
+ if (!previewWidget.videoEl.hidden && !previewWidget.value.hidden) {
+ previewWidget.videoEl.pause();
+ } else if (previewWidget.value.hidden && !previewWidget.videoEl.hidden && !previewWidget.value.paused) {
+ previewWidget.videoEl.play();
+ }
+ previewWidget.value.hidden = !previewWidget.value.hidden;
+ previewWidget.parentEl.hidden = previewWidget.value.hidden;
+ fitHeight(this);
+
+ }});
+ optNew.push({content: "Sync preview", callback: () => {
+ //TODO: address case where videos have varying length
+ //Consider a system of sync groups which are opt-in?
+ for (let p of document.getElementsByClassName("vhs_preview")) {
+ for (let child of p.children) {
+ if (child.tagName == "VIDEO") {
+ child.currentTime=0;
+ } else if (child.tagName == "IMG") {
+ child.src = child.src;
+ }
+ }
+ }
+ }});
+ const muteDesc = (previewWidget.value.muted ? "Unmute" : "Mute") + " Preview"
+ optNew.push({content: muteDesc, callback: () => {
+ previewWidget.value.muted = !previewWidget.value.muted
+ }})
+ if(options.length > 0 && options[0] != null && optNew.length > 0) {
+ optNew.push(null);
+ }
+ options.unshift(...optNew);
+ });
+}
+function addFormatWidgets(nodeType, nodeData) {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ var formatWidget = null;
+ var formatWidgetIndex = -1;
+ for(let i = 0; i < this.widgets.length; i++) {
+ if (this.widgets[i].name === "format"){
+ formatWidget = this.widgets[i];
+ formatWidgetIndex = i+1;
+ break
+ }
+ }
+ let formatWidgetsCount = 0;
+ chainCallback(formatWidget, "callback", (value) => {
+ const formats = (LiteGraph.registered_node_types[this.type]
+ ?.nodeData?.input?.required?.format?.[1]?.formats)
+ let newWidgets = [];
+ if (formats?.[value]) {
+ let formatWidgets = formats[value]
+ for (let wDef of formatWidgets) {
+ let type = wDef[2]?.widgetType ?? wDef[1]
+ if (Array.isArray(type)) {
+ type = "COMBO"
+ }
+ app.widgets[type](this, wDef[0], wDef.slice(1), app)
+ let w = this.widgets.pop()
+ w.config = wDef.slice(1)
+ newWidgets.push(w)
+ }
+ }
+ let removed = this.widgets.splice(formatWidgetIndex,
+ formatWidgetsCount, ...newWidgets);
+ let newNames = new Set(newWidgets.map((w) => w.name))
+ for (let w of removed) {
+ w?.onRemove?.()
+ if (w.name in newNames) {
+ continue
+ }
+ //I do not like the performance of this, but it's safe
+ let slot = this.inputs.findIndex((i) => i.name == w.name)
+ if (slot >= 0) {
+ this.removeInput(slot)
+ }
+ }
+ for (let w of newWidgets) {
+ let existingInput = this.inputs.find((i) => i.name == w.name)
+ if (existingInput) {
+ setWidgetConfig(existingInput, w.config)
+ //TODO: Consider forcing disconnection if props change?
+ } else {
+ //NOTE: config is applied in wrapped addInput call
+ this.addInput(w.name, w.config[0], {widget: {name: w.name}})
+ }
+ }
+ fitHeight(this);
+ formatWidgetsCount = newWidgets.length;
+ });
+ });
+}
+function addLoadCommon(nodeType, nodeData) {
+ addVideoPreview(nodeType);
+ initializeLoadFormat(nodeType, nodeData)
+ addPreviewOptions(nodeType);
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ //widget.callback adds unused arguements which need culling
+ const node = this
+ function update(key) {
+ return function(value) {
+ let params = {}
+ params[key] = this.value
+ node?.updateParameters(params)
+ }
+ }
+ let prior_ar = -2
+ const widthWidget = this.widgets.find((w) => w.name === "custom_width");
+ const heightWidget = this.widgets.find((w) => w.name === "custom_height");
+ function updateAR(value) {
+ let new_ar = -1
+ if (widthWidget.value & heightWidget.value) {
+ new_ar = widthWidget.value / heightWidget.value
+ }
+ if (new_ar != prior_ar) {
+ node?.updateParameters({'custom_width': widthWidget.value,
+ 'custom_height': heightWidget.value})
+ prior_ar = new_ar
+ }
+ }
+ const offsetWidget = this.widgets.find((w) => w.name === "start_time");
+ if (offsetWidget) {
+ Object.defineProperty(offsetWidget.options, "step", {
+ set : (value) => {},
+ get : () => {
+ return 1 / (this.video_query?.loaded?.fps ?? 1)
+ }
+ })
+ }
+ let widgetMap = {'frame_load_cap': 'frame_load_cap',
+ 'skip_first_frames': 'skip_first_frames', 'select_every_nth': 'select_every_nth',
+ 'start_time': 'start_time', 'force_rate': 'force_rate',
+ 'custom_width': updateAR, 'custom_height': updateAR,
+ 'image_load_cap': 'image_load_cap', 'skip_first_images': 'skip_first_images'
+ }
+ for (let widget of this.widgets) {
+ if (widget.name in widgetMap) {
+ if (typeof(widgetMap[widget.name]) == 'function') {
+ chainCallback(widget, "callback", widgetMap[widget.name]);
+ } else {
+ chainCallback(widget, "callback", update(widgetMap[widget.name]))
+ }
+ }
+ if (widget.type != "button") {
+ widget.callback?.(widget.value)
+ }
+ }
+ });
+}
+
+function path_stem(path) {
+ let i = path.lastIndexOf("/");
+ if (i >= 0) {
+ return [path.slice(0,i+1),path.slice(i+1)];
+ }
+ return ["",path];
+}
+function searchBox(event, [x,y], node) {
+ //Ensure only one dialogue shows at a time
+ if (this.prompt)
+ return;
+ this.prompt = true;
+
+ let pathWidget = this;
+ let dialog = document.createElement("div");
+ dialog.className = "litegraph litesearchbox graphdialog rounded"
+ dialog.innerHTML = 'Path OK
'
+ dialog.close = () => {
+ dialog.remove();
+ }
+ document.body.append(dialog);
+ if (app.canvas.ds.scale > 1) {
+ dialog.style.transform = "scale(" + app.canvas.ds.scale + ")";
+ }
+ var name_element = dialog.querySelector(".name");
+ var input = dialog.querySelector(".value");
+ var options_element = dialog.querySelector(".helper");
+ input.value = pathWidget.value;
+
+ var timeout = null;
+ let last_path = null;
+ let extensions = pathWidget.options.vhs_path_extensions
+
+ input.addEventListener("keydown", (e) => {
+ dialog.is_modified = true;
+ if (e.keyCode == 27) {
+ //ESC
+ dialog.close();
+ } else if (e.keyCode == 13 && e.target.localName != "textarea") {
+ pathWidget.value = input.value;
+ if (pathWidget.callback) {
+ pathWidget.callback(pathWidget.value);
+ }
+ dialog.close();
+ } else {
+ if (e.keyCode == 9) {
+ //TAB
+ input.value = last_path + options_element.firstChild.innerText;
+ e.preventDefault();
+ e.stopPropagation();
+ } else if (e.ctrlKey && (e.keyCode == 87 || e.keyCode == 66)) {
+ //Ctrl+w or Ctrl+b
+ //most browsers won't support, but it's good QOL for those that do
+ input.value = path_stem(input.value.slice(0,-1))[0]
+ e.preventDefault();
+ e.stopPropagation();
+ } else if (e.ctrlKey && e.keyCode == 71) {
+ //Ctrl+g
+ //Temporarily disables extension filtering to show all files
+ e.preventDefault();
+ e.stopPropagation();
+ extensions = undefined
+ last_path = null;
+ }
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ timeout = setTimeout(updateOptions, 10);
+ return;
+ }
+ this.prompt=false;
+ e.preventDefault();
+ e.stopPropagation();
+ });
+
+ var button = dialog.querySelector("button");
+ button.addEventListener("click", (e) => {
+ pathWidget.value = input.value;
+ if (pathWidget.callback) {
+ pathWidget.callback(pathWidget.value);
+ }
+ //unsure why dirty is set here, but not on enter-key above
+ node.graph.setDirtyCanvas(true);
+ dialog.close();
+ this.prompt = false;
+ });
+ var rect = app.canvas.canvas.getBoundingClientRect();
+ var offsetx = -20;
+ var offsety = -20;
+ if (rect) {
+ offsetx -= rect.left;
+ offsety -= rect.top;
+ }
+
+ if (event) {
+ dialog.style.left = event.clientX + offsetx + "px";
+ dialog.style.top = event.clientY + offsety + "px";
+ } else {
+ dialog.style.left = canvas.width * 0.5 + offsetx + "px";
+ dialog.style.top = canvas.height * 0.5 + offsety + "px";
+ }
+ //Search code
+ let options = []
+ function addResult(name, isDir) {
+ let el = document.createElement("div");
+ el.innerText = name;
+ el.className = "litegraph lite-search-item";
+ if (isDir) {
+ el.className += " is-dir";
+ el.addEventListener("click", (e) => {
+ input.value = last_path+name
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ timeout = setTimeout(updateOptions, 10);
+ });
+ } else {
+ el.addEventListener("click", (e) => {
+ pathWidget.value = last_path+name;
+ if (pathWidget.callback) {
+ pathWidget.callback(pathWidget.value);
+ }
+ dialog.close();
+ pathWidget.prompt = false;
+ });
+ }
+ options_element.appendChild(el);
+ }
+ async function updateOptions() {
+ timeout = null;
+ let [path, remainder] = path_stem(input.value);
+ if (last_path != path) {
+ //fetch options. Must block execution here, so update should be async?
+ let params = {path : path}
+ if (extensions) {
+ params.extensions = extensions
+ }
+ let optionsURL = api.apiURL('/vhs/getpath?' + new URLSearchParams(params));
+ try {
+ let resp = await fetch(optionsURL);
+ options = await resp.json();
+ options = options.map((o) => o.replace('.','\0'))
+ options = options.sort()
+ options = options.map((o) => o.replace('\0','.'))
+ } catch(e) {
+ options = []
+ }
+ last_path = path;
+ }
+ options_element.innerHTML = '';
+ //filter options based on remainder
+ for (let option of options) {
+ if (option.startsWith(remainder)) {
+ let isDir = option.endsWith('/')
+ addResult(option, isDir);
+ }
+ }
+ }
+
+ setTimeout(async function() {
+ input.focus();
+ await updateOptions();
+ }, 10);
+
+ return dialog;
+}
+function button_action(widget) {
+ if (
+ widget.options?.reset == undefined &&
+ widget.options?.disable == undefined
+ ) {
+ return 'None'
+ }
+ if (
+ widget.options.reset != undefined &&
+ widget.value != widget.options.reset
+ ) {
+ return 'Reset'
+ }
+ if (
+ widget.options.disable != undefined &&
+ widget.value != widget.options.disable
+ ) {
+ return 'Disable'
+ }
+ if (widget.options.reset != undefined) {
+ return 'No Reset'
+ }
+ return 'No Disable'
+}
+function fitText(ctx, text, maxLength) {
+ if (maxLength <= 0) {
+ return ['', 0]
+ }
+ let fullLength = ctx.measureText(text).width
+ if (fullLength < maxLength) {
+ return [text, fullLength]
+ }
+ //determine approx safe cutoff
+ let cutoff = maxLength / fullLength * text.length | 0
+ let shortened = text.slice(0, Math.max(0, cutoff - 2)) + '…'
+ return [shortened, ctx.measureText(shortened).width]
+}
+function fitPath(ctx, path, maxLength) {
+ let fullLength = ctx.measureText(path).width
+ if (fullLength < maxLength) {
+ return [path, fullLength]
+ }
+ //determine approx safe cutoff
+ let len = (maxLength / fullLength * path.length | 0) - 1
+
+ let displayPath = ''
+ let filename = path_stem(path)[1]
+ if (filename.length > len-2) {
+ //may all fit, but can't squeeze more info
+ displayPath = filename.substr(0,len);
+ } else {
+ //TODO: find solution for windows, path[1] == ':'?
+ let isAbs = path[0] == '/';
+ let partial = path.substr(path.length - (isAbs ? len-2:len-1))
+ let cutoff = partial.indexOf('/');
+ if (cutoff < 0) {
+ //Can occur, but there isn't a nicer way to format
+ displayPath = path.substr(path.length-len);
+ } else {
+ displayPath = (isAbs ? '/…':'…') + partial.substr(cutoff);
+ }
+ }
+ return [displayPath, ctx.measureText(displayPath).width]
+}
+function roundToPrecision(num, precision) {
+ let strnum = Number(num).toFixed(precision)
+ let deci = strnum.indexOf('.')
+ if (deci > 0) {
+ let i = strnum.length - 1
+ while (i > deci && strnum[i] == '0') {
+ i--
+ }
+ if (i == deci) {
+ i--
+ }
+ return strnum.slice(0, i+1)
+ }
+ return strnum
+}
+function inner_value_change(widget, value, node, pos) {
+ widget.value = value
+ if (widget.options?.property && widget.options.property in node.properties) {
+ node.setProperty(widget.options.property, value)
+ }
+ if (widget.callback) {
+ widget.callback(widget.value, app.canvas, node, event)
+ }
+}
+function drawAnnotated(ctx, node, widget_width, y, H) {
+ const litegraph_base = LiteGraph
+ const show_text = app.canvas.ds.scale >= (app.canvas.low_quality_zoom_threshold ?? 0.5)
+ const margin = 15
+ ctx.strokeStyle = litegraph_base.WIDGET_OUTLINE_COLOR
+ ctx.fillStyle = litegraph_base.WIDGET_BGCOLOR
+ ctx.beginPath()
+ if (show_text)
+ ctx.roundRect(margin, y, widget_width - margin * 2, H, [H * 0.5])
+ else ctx.rect(margin, y, widget_width - margin * 2, H)
+ ctx.fill()
+ if (show_text) {
+ if (!this.disabled) ctx.stroke()
+ const button = button_action(this)
+ if (button != 'None') {
+ ctx.save()
+ if (button.startsWith('No ')) {
+ ctx.fillStyle = litegraph_base.WIDGET_OUTLINE_COLOR
+ ctx.strokeStyle = litegraph_base.WIDGET_OUTLINE_COLOR
+ } else {
+ ctx.fillStyle = litegraph_base.WIDGET_TEXT_COLOR
+ ctx.strokeStyle = litegraph_base.WIDGET_TEXT_COLOR
+ }
+ ctx.beginPath()
+ if (button.endsWith('Reset')) {
+ ctx.arc(widget_width - margin - 26, y + H/2, 4, Math.PI*3/2, Math.PI)
+ ctx.stroke()
+ ctx.beginPath()
+ ctx.moveTo(widget_width - margin - 26, y + H/2 - 1.5)
+ ctx.lineTo(widget_width - margin - 26, y + H/2 - 6.5)
+ ctx.lineTo(widget_width - margin - 30, y + H/2 - 3.5)
+ ctx.fill()
+ } else {
+ ctx.arc(widget_width - margin - 26, y + H/2, 4, Math.PI*2/3, Math.PI*8/3)
+ ctx.moveTo(widget_width - margin - 26 - 8 ** .5, y + H/2 + 8 ** .5)
+ ctx.lineTo(widget_width - margin - 26 + 8 ** .5, y + H/2 - 8 ** .5)
+ ctx.stroke()
+ }
+ ctx.restore()
+ }
+ ctx.fillStyle = litegraph_base.WIDGET_TEXT_COLOR
+ if (!this.disabled) {
+ ctx.beginPath()
+ ctx.moveTo(margin + 16, y + 5)
+ ctx.lineTo(margin + 6, y + H * 0.5)
+ ctx.lineTo(margin + 16, y + H - 5)
+ ctx.fill()
+ ctx.beginPath()
+ ctx.moveTo(widget_width - margin - 16, y + 5)
+ ctx.lineTo(widget_width - margin - 6, y + H * 0.5)
+ ctx.lineTo(widget_width - margin - 16, y + H - 5)
+ ctx.fill()
+ }
+ let freeWidth = widget_width - (40 + margin * 2 + 20)
+ let [valueText, valueWidth] = fitText(ctx, (this.displayValue?.() ?? ""), freeWidth)
+ freeWidth -= valueWidth
+
+ ctx.textAlign = 'left'
+ ctx.fillStyle = litegraph_base.WIDGET_SECONDARY_TEXT_COLOR
+ if (freeWidth > 20) {
+ let [name, nameWidth] = fitText(ctx, this.label || this.name, freeWidth)
+ freeWidth -= nameWidth
+ ctx.fillText(name, margin * 2 + 5, y + H * 0.7)
+ }
+
+ let value_offset = margin * 2 + 20
+ ctx.textAlign = 'right'
+ if (this.options.unit) {
+ ctx.fillStyle = litegraph_base.WIDGET_OUTLINE_COLOR
+ let [unitText, unitWidth] = fitText(ctx, this.options.unit, freeWidth)
+ if (unitText == this.options.unit) {
+ ctx.fillText(this.options.unit, widget_width - value_offset, y + H * 0.7)
+ value_offset += unitWidth
+ freeWidth -= unitWidth
+ }
+ }
+ ctx.fillStyle = litegraph_base.WIDGET_TEXT_COLOR
+ ctx.fillText(valueText, widget_width - value_offset, y + H * 0.7)
+ ctx.fillStyle = litegraph_base.WIDGET_SECONDARY_TEXT_COLOR
+
+
+ let annotation = ''
+ if (this.annotation) {
+ annotation = this.annotation(this.value, freeWidth)
+ } else if (
+ this.options.annotation &&
+ this.value in this.options.annotation
+ ) {
+ annotation = this.options.annotation[this.value]
+ }
+ if (annotation) {
+ ctx.fillStyle = litegraph_base.WIDGET_OUTLINE_COLOR
+ let [annoDisplay, annoWidth] = fitText(ctx, annotation, freeWidth)
+ ctx.fillText(
+ annoDisplay,
+ widget_width - 5 - valueWidth - value_offset,
+ y + H * 0.7
+ )
+ }
+ }
+}
+function mouseAnnotated(event, [x, y], node) {
+ //NOTE: Mouse actions contain no history element.
+ //This can cause overlapping actions since each triggers on different event type (down/move/up)
+ //TODO: Consider further rework
+ const widget_width = this.width || node.size[0]
+ const old_value = this.value
+ const margin = 15
+ let isButton = 0
+ if (x > margin + 6 && x < margin + 16) {
+ isButton = -1
+ } else if (x > widget_width - margin - 16 & x < widget_width - margin - 6) {
+ isButton = 1
+ } else if (x > widget_width - margin - 34 && x < widget_width - margin - 18) {
+ isButton = 2
+ }
+ var allow_scroll = true
+ if (allow_scroll && event.type == 'pointermove') {
+ if (event.deltaX)
+ this.value += event.deltaX * (this.options.step || 1)
+ if (this.options.min != null && this.value < this.options.min) {
+ this.value = this.options.min
+ }
+ if (this.options.max != null && this.value > this.options.max) {
+ this.value = this.options.max
+ }
+ } else if (event.type == 'pointerdown') {
+ const buttonType = button_action(this)
+ if (isButton == 2) {
+ if (buttonType == 'Reset') {
+ this.value = this.options.reset
+ } else if (buttonType == 'Disable') {
+ this.value = this.options.disable
+ }
+ } else {
+ this.value += isButton * (this.options.step || 1)
+ if (this.options.min != null && this.value < this.options.min) {
+ this.value = this.options.min
+ }
+ if (this.options.max != null && this.value > this.options.max) {
+ this.value = this.options.max
+ }
+ }
+ } //end mousedown
+ else if (event.type == 'pointerup') {
+ if (event.click_time < 200 && !isButton) {
+ const d_callback = (v) => {
+ this.value = this.parseValue?.(v) ?? Number(v)
+ inner_value_change(this, this.value, node, [x, y])
+ }
+ const dialog = app.canvas.prompt(
+ 'Value',
+ this.value,//TODO: Consider making this displayValue?
+ d_callback,
+ event
+ )
+ const input = dialog.querySelector(".value")
+ input.addEventListener("keydown", (e) => {
+ if (e.keyCode == 9) {
+ e.preventDefault();
+ e.stopPropagation();
+ d_callback(input.value)
+ dialog.close()
+ node?.graph?.setDirtyCanvas(true);
+ let i = node.widgets.findIndex((w) => w == this)
+ if (e.shiftKey)
+ i--
+ else
+ i++
+ if (node.widgets[i]?.type == "VHS.ANNOTATED") {//restrict to annotatedNUmbers
+ node.widgets[i]?.mouse(event, [x, y+24], node)
+ }
+ }
+ })
+ }
+ }
+
+ if (old_value != this.value)
+ setTimeout(
+ function () {
+ inner_value_change(this, this.value, node, [x, y])
+ }.bind(this),
+ 20
+ )
+ return true
+}
+let latentPreviewNodes = new Set()
+app.registerExtension({
+ name: "VideoHelperSuite.Core",
+ settings: [
+ {
+ id: 'VHS.AdvancedPreviews',
+ category: ['🎥🅥🅗🅢', 'Previews', 'Advanced Previews'],
+ name: 'Advanced Previews',
+ tooltip: 'Automatically transcode previews on request. Required for advanced functionality',
+ type: 'combo',
+ options: ['Never', 'Always', 'Input Only'],
+ defaultValue: 'Input Only',
+ },
+ {
+ id: 'VHS.AdvancedPreviewsMinWidth',
+ category: ['🎥🅥🅗🅢', 'Previews', 'Min Width'],
+ name: 'Minimum preview width',
+ tooltip: 'Advanced previews have their resolution downscaled to the node size for performance. While a node can be resized to increase preview quality, a minimum width can be set that previews won\'t be downscaled beneath. Preveiws will never be upscaled, so this can safely be set large.',
+ type: 'number',
+ attrs: {
+ min: 0,
+ step: 1,
+ max: 3840,
+ },
+ defaultValue: 0,
+ },
+ {
+ id: 'VHS.AdvancedPreviewsDeadline',
+ category: ['🎥🅥🅗🅢', 'Previews', 'Deadline'],
+ name: 'Deadline',
+ tooltip: 'Determines how much time can be spent when encoding advanced previews. Realtime results in reduced quality, but good will likely cause the preview to stutter as initial generation occurs',
+ type: 'combo',
+ options: ['realtime', 'good'],
+ defaultValue: 'realtime',
+ },
+ {
+ id: 'VHS.AdvancedPreviewsDefaultMute',
+ category: ['🎥🅥🅗🅢', 'Previews', 'Default Mute'],
+ name: 'Mute videos by default',
+ type: 'boolean',
+ defaultValue: false,
+ },
+ {
+ id: 'VHS.LatentPreview',
+ category: ['🎥🅥🅗🅢', 'Sampling', 'Latent Previews'],
+ name: 'Display animated previews when sampling',
+ type: 'boolean',
+ defaultValue: false,
+ onChange(value) {
+ if (!value) {
+ //Remove any previewWidgets
+ for (let id of latentPreviewNodes) {
+ let n = app.graph.getNodeById(id)
+ let i = n?.widgets?.findIndex((w) => w.name == 'vhslatentpreview')
+ if (i >= 0) {
+ n.widgets.splice(i,1)[0].onRemove()
+ }
+ }
+ latentPreviewNodes = new Set()
+ }
+ },
+ },
+ {
+ id: "VHS.LatentPreviewRate",
+ category: ['🎥🅥🅗🅢', 'Sampling', 'Latent Preview Rate'],
+ name: "Playback rate override.",
+ type: 'number',
+ attrs: {
+ min: 0,
+ step: 1,
+ max: 60
+ },
+ tooltip:
+ 'Force a specific frame rate for the playback of latent frames. This should not be confused with the output frame rate and will not match for video models.',
+ defaultValue: 0,
+ },
+ {
+ id: 'VHS.MetadataImage',
+ category: ['🎥🅥🅗🅢', 'Output', 'MetadataImage'],
+ name: 'Save png of first frame for metadata',
+ type: 'boolean',
+ defaultValue: true,
+ },
+ {
+ id: 'VHS.KeepIntermediate',
+ category: ['🎥🅥🅗🅢', 'Output', 'Keep Intermediate'],
+ name: 'Keep required intermediate files after sucessful execution',
+ type: 'boolean',
+ defaultValue: true,
+ },
+ ],
+
+ async beforeRegisterNodeDef(nodeType, nodeData, app) {
+ if(nodeData?.name?.startsWith("VHS_")) {
+ useKVState(nodeType);
+ if (nodeData.description) {
+ let description = nodeData.description
+ let el = document.createElement("div")
+ el.innerHTML = description
+ if (!el.children.length) {
+ //Is plaintext. Do minor convenience formatting
+ let chunks = description.split('\n')
+ nodeData.description = chunks[0]
+ description = chunks.join(' ')
+ } else {
+ nodeData.description = el.querySelector('#VHS_shortdesc')?.innerHTML || el.children[1]?.firstChild?.innerHTML
+ }
+ chainCallback(nodeType.prototype, "onNodeCreated", function () {
+ helpDOM.addHelp(this, nodeType, description)
+ this.setSize(this.computeSize())
+ })
+ }
+ //set widgetType to use VHS widgets where possible
+ for(let inp of Object.values({...nodeData.input?.required, ...nodeData.input?.optional})) {
+ if (["INT", "FLOAT"].includes(inp[0])) {
+ if (!inp[1]) {
+ inp[1] = {}
+ }
+ inp[1].widgetType ??= "VHS" + inp[0]
+ }
+ }
+ chainCallback(nodeType.prototype, "onNodeCreated", function () {
+ let new_widgets = []
+ if (this.widgets) {
+ for (let w of this.widgets) {
+ let input = this.constructor.nodeData.input
+ let config = input?.required[w.name] ?? input.optional[w.name]
+ if (!config) {
+ continue
+ }
+ if (w?.type == "text" && config[1].vhs_path_extensions) {
+ new_widgets.push(app.widgets.VHSPATH({}, w.name, ["VHSPATH", config[1]]));
+ } else {
+ new_widgets.push(w)
+ }
+ }
+ this.widgets = new_widgets;
+ }
+ const originalAddInput = this.addInput;
+ this.addInput = function(name, type, options) {
+ if (options.widget) {
+ //Is Converted Widget
+ const widget = this.widgets.find((w) => w.name == name)
+ if (widget?.config) {
+ //Has override for type
+ type = widget.config[0]
+ if (type == 'FLOAT') {
+ type = "FLOAT,INT"
+ }
+ setWidgetConfig(options, widget.config)
+ }
+ }
+ return originalAddInput.apply(this, [name, type, options])
+ }
+ });
+ }
+ if (nodeData?.name == "VHS_LoadImages") {
+ addUploadWidget(nodeType, nodeData, "directory", "folder");
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ const pathWidget = this.widgets.find((w) => w.name === "directory");
+ chainCallback(pathWidget, "callback", (value) => {
+ if (!value) {
+ return;
+ }
+ let params = {filename : value, type : "input", format: "folder"};
+ this.updateParameters(params, true);
+ });
+ });
+ addLoadCommon(nodeType, nodeData);
+ } else if (nodeData?.name == "VHS_LoadImagesPath") {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ const pathWidget = this.widgets.find((w) => w.name === "directory");
+ chainCallback(pathWidget, "callback", (value) => {
+ if (!value) {
+ return;
+ }
+ let params = {filename : value, type : "path", format: "folder"};
+ this.updateParameters(params, true);
+ });
+ });
+ addLoadCommon(nodeType, nodeData);
+ } else if (nodeData?.name == "VHS_LoadVideo" || nodeData?.name == "VHS_LoadVideoFFmpeg") {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ const pathWidget = this.widgets.find((w) => w.name === "video");
+ chainCallback(pathWidget, "callback", (value) => {
+ if (!value) {
+ return;
+ }
+ let parts = ["input", value];
+ let extension_index = parts[1].lastIndexOf(".");
+ let extension = parts[1].slice(extension_index+1);
+ let format = "video"
+ if (["gif", "webp", "avif"].includes(extension)) {
+ format = "image"
+ }
+ format += "/" + extension;
+ let params = {filename : parts[1], type : parts[0], format: format};
+ this.updateParameters(params, true);
+ });
+ });
+ addUploadWidget(nodeType, nodeData, "video");
+ addLoadCommon(nodeType, nodeData);
+ addVAEOutputToggle(nodeType, nodeData);
+ } else if (nodeData?.name == "VHS_LoadAudio") {
+ addAudioPreview(nodeType)
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ const pathWidget = this.widgets.find((w) => w.name === "audio_file");
+ chainCallback(pathWidget, "callback", (filename) => {
+ this.updateParameters({filename, type: 'path'}, true);
+ });
+ });
+ } else if (nodeData?.name == "VHS_LoadAudioUpload") {
+ addUploadWidget(nodeType, nodeData, "audio", "audio");
+ addAudioPreview(nodeType)
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ const pathWidget = this.widgets.find((w) => w.name === "audio");
+ chainCallback(pathWidget, "callback", (filename) => {
+ if (!filename) return
+ let params = {filename, type : "input"};
+ this.updateParameters(params, true);
+ });
+ });
+ } else if (nodeData?.name == "VHS_LoadVideoPath" || nodeData?.name == "VHS_LoadVideoFFmpegPath") {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ const pathWidget = this.widgets.find((w) => w.name === "video");
+ chainCallback(pathWidget, "callback", (value) => {
+ let extension_index = value.lastIndexOf(".");
+ let extension = value.slice(extension_index+1);
+ let format = "video"
+ if (["gif", "webp", "avif"].includes(extension)) {
+ format = "image"
+ }
+ format += "/" + extension;
+ let params = {filename : value, type: "path", format: format};
+ this.updateParameters(params, true);
+ });
+ });
+ addLoadCommon(nodeType, nodeData);
+ addVAEOutputToggle(nodeType, nodeData);
+ } else if (nodeData?.name == "VHS_LoadImagePath") {
+ addLoadCommon(nodeType, nodeData);
+ addVAEOutputToggle(nodeType, nodeData);
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ const pathWidget = this.widgets.find((w) => w.name === "image");
+ chainCallback(pathWidget, "callback", (value) => {
+ let extension_index = value.lastIndexOf(".");
+ let extension = value.slice(extension_index+1);
+ let format = "video" + "/" + extension;
+ let params = {filename : value, type: "path", format: format};
+ this.updateParameters(params, true);
+ });
+ });
+ } else if (nodeData?.name == "VHS_VideoCombine") {
+ addDateFormatting(nodeType, "filename_prefix");
+ chainCallback(nodeType.prototype, "onExecuted", function(message) {
+ if (message?.gifs) {
+ this.updateParameters(message.gifs[0], true);
+ }
+ });
+ addVideoPreview(nodeType, false);
+ addPreviewOptions(nodeType);
+ addFormatWidgets(nodeType, nodeData);
+ addVAEInputToggle(nodeType, nodeData)
+ } else if (nodeData?.name == "VHS_SaveImageSequence") {
+ //Disabled for safety as VHS_SaveImageSequence is not currently merged
+ //addDateFormating(nodeType, "directory_name", timestamp_widget=true);
+ //addTimestampWidget(nodeType, nodeData, "directory_name")
+ } else if (nodeData?.name == "VHS_BatchManager") {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ this.widgets.push({name: "count", type: "dummy", value: 0,
+ computeSize: () => {return [0,-4]},
+ afterQueued: function() {this.value++;}});
+ });
+ } else if (nodeData?.name == "VHS_Unbatch") {
+ cloneType(nodeType, nodeData)
+ } else if (nodeData?.name == "VHS_SelectLatest") {
+ chainCallback(nodeType.prototype, "onNodeCreated", function() {
+ this.isVirtualNode = true
+ chainCallback(this, "onConnectionsChange", function (contype, slot, iscon, linfo) {
+ if (iscon) {
+ this.update_links()
+ }
+ })
+
+ this.update_links = function(extraLinks = []) {
+ if (!this.outputs[0].links?.length) return
+
+ function get_links(node) {
+ let links = []
+ for (const l of node.outputs[0].links) {
+ const linkInfo = node.graph.links[l]
+ const n = node.graph.getNodeById(linkInfo.target_id)
+ if (n.type == 'Reroute') {
+ links = links.concat(get_links(n))
+ } else {
+ links.push(l)
+ }
+ }
+ return links
+ }
+
+ let links = [
+ ...get_links(this).map((l) => this.graph.links[l]),
+ ...extraLinks
+ ]
+ let v = this.latest_file
+ if (!v) {
+ return
+ }
+
+ // For each output link copy our value over the original widget value
+ for (const linkInfo of links) {
+ const node = this.graph.getNodeById(linkInfo.target_id)
+ const input = node.inputs[linkInfo.target_slot]
+ const widgetName = input.widget.name
+ const widget = node.widgets.find((w) => w.name === widgetName)
+ if (widget) {
+ widget.value = v
+ if (widget.callback) {
+ widget.callback( widget.value, app.canvas,
+ node, app.canvas.graph_mouse, {})
+ }
+ }
+ }
+ }
+ let fetch_files = async () => {
+ let [path, remainder] = path_stem(this.widgets[0].value)
+ let params = {path : path}
+ let optionsURL = api.apiURL('/vhs/getpath?' + new URLSearchParams(params));
+ let options = []
+ try {
+ let resp = await fetch(optionsURL);
+ options = await resp.json();
+ } catch(e) {}
+ options = options.filter((file) => file.startsWith(remainder) && file.endsWith(this.widgets[1].value))
+ if (options.length && this.latest_file != options[options.length-1]) {
+ this.latest_file = path + options[options.length-1]
+ this.update_links()
+ }
+ }
+ this.widgets[0].callback = fetch_files
+ this.widgets[1].callback = fetch_files
+ this.onPromptExecuted = fetch_files
+ this.applyToGraph = this.update_links
+ })
+ }
+ },
+ async getCustomWidgets() {
+ return {
+ VHSPATH(node, inputName, inputData) {
+ let w = {
+ name : inputName,
+ type : "VHS.PATH",
+ value : "",
+ draw : function(ctx, node, widget_width, y, H) {
+ //Adapted from litegraph.core.js:drawNodeWidgets
+ var show_text = app.canvas.ds.scale >= (app.canvas.low_quality_zoom_threshold ?? 0.5)
+ var margin = 15;
+ var text_color = LiteGraph.WIDGET_TEXT_COLOR;
+ var secondary_text_color = LiteGraph.WIDGET_SECONDARY_TEXT_COLOR;
+ ctx.textAlign = "left";
+ ctx.strokeStyle = LiteGraph.WIDGET_OUTLINE_COLOR;
+ ctx.fillStyle = LiteGraph.WIDGET_BGCOLOR;
+ ctx.beginPath();
+ if (show_text)
+ ctx.roundRect(margin, y, widget_width - margin * 2, H, [H * 0.5]);
+ else
+ ctx.rect( margin, y, widget_width - margin * 2, H );
+ ctx.fill();
+ if (show_text) {
+ if(!this.disabled)
+ ctx.stroke();
+ ctx.save();
+ ctx.beginPath();
+ ctx.rect(margin, y, widget_width - margin * 2, H);
+ ctx.clip();
+
+ //ctx.stroke();
+ let freeWidth = widget_width - (margin * 2 + 40)
+ ctx.fillStyle = secondary_text_color;
+ const label = this.label || this.name;
+ if (label != null) {
+ let [labelDisplay, labelWidth] = fitText(ctx, label, freeWidth)
+ freeWidth -= labelWidth
+ ctx.fillText(labelDisplay, margin * 2, y + H * 0.7);
+ }
+ ctx.fillStyle = this.value ? text_color : '#777';
+ ctx.textAlign = "right";
+ let disp_text = fitPath(ctx, String(this.value || this.options.placeholder), freeWidth)[0]
+ ctx.fillText(disp_text, widget_width - margin * 2, y + H * 0.7);
+ ctx.restore();
+ }
+ },
+ mouse : searchBox,
+ options : {},
+ };
+ if (inputData.length > 1) {
+ w.options = inputData[1]
+ if (inputData[1].default) {
+ w.value = inputData[1].default;
+ }
+ }
+
+ if (!node.widgets) {
+ node.widgets = [];
+ }
+ node.widgets.push(w);
+ return w;
+ },
+ VHSFLOAT(node, inputName, inputData) {
+ let w = {
+ name: inputName,
+ type: "VHS.ANNOTATED",
+ value: inputData[1]?.default ?? 0,
+ draw: drawAnnotated,
+ mouse: mouseAnnotated,
+ computeSize(width) {
+ return [width, 20]
+ },
+ callback(v) {
+ if (this.options.round) {
+ //TODO adopt ComfyUI_frontend#4291?
+ v = Math.round((v + Number.EPSILON) /
+ this.options.round) * this.options.round
+ }
+ if (this.options.max && v > this.options.max) {
+ v = this.options.max
+ }
+ if (this.options.min && v < this.options.max) {
+ v = this.options.min
+ }
+ this.value = v
+ },
+ config: inputData,
+ displayValue: function() {
+ return roundToPrecision(this.value, this.options.precision ?? 3)
+ },
+ options: Object.assign({}, inputData[1])
+ }
+ if (!node.widgets) {
+ node.widgets = []
+ }
+ node.widgets.push(w)
+ return w
+ },
+ VHSINT(node, inputName, inputData) {
+ let w = {
+ name: inputName,
+ type: "VHS.ANNOTATED",
+ value: inputData[1]?.default ?? 0,
+ draw: drawAnnotated,
+ mouse: mouseAnnotated,
+ computeSize(width) {
+ return [width, 20]
+ },
+ callback(v) {
+ if (this.options.max && v > this.options.max) {
+ v = this.options.max
+ }
+ if (this.options.min && v < this.options.min) {
+ v = this.options.min
+ }
+ if (v == 0) {
+ return
+ }
+ const s = this.options.step
+ let sh = this.options.mod ?? 0
+ this.value = Math.round((v - sh) / s) * s + sh
+ },
+ config: inputData,
+ displayValue: function() {
+ return this.value | 0
+ },
+ options: Object.assign({}, inputData[1])
+ }
+ if (!node.widgets) {
+ node.widgets = []
+ }
+ node.widgets.push(w)
+ return w
+ },
+ VHSTIMESTAMP(node, inputName, inputData) {
+ let w = {
+ name: inputName,
+ type: "VHS.TIMESTAMP",
+ value: inputData[1]?.default ?? 0,
+ draw: drawAnnotated,
+ mouse: mouseAnnotated,
+ computeSize(width) {
+ return [width, 20]
+ },
+ parseValue(v) {
+ if (typeof(v) == "string") {
+ let val = 0
+ for (let chunk of v.split(":")) {
+ val = val * 60 + parseFloat(chunk)
+ }
+ return val
+ }
+ },
+ callback(v) {},
+ config: inputData,
+ options: Object.assign({}, inputData[1]),
+ displayValue() {
+ let seconds = this.value
+ let hours = seconds / 3600 | 0
+ seconds -= 3600 * hours
+ let minutes = seconds / 60 | 0
+ seconds -= 60 * minutes
+ let display = ""
+ if (hours > 0) {
+ display += hours + ":"
+ }
+ if (hours > 0 || minutes > 0) {
+ if (hours > 0) {
+ minutes = (''+minutes).padStart(2,'0')
+ }
+ display += minutes + ":"
+ }
+ seconds = roundToPrecision(seconds, 4)
+ if ((seconds[1] == '.' || seconds.length == 1) && (minutes > 0 || hours > 0)) {
+ seconds = '0'+seconds
+ }
+ display += seconds
+ return display
+ }
+ }
+ if (!node.widgets) {
+ node.widgets = []
+ }
+ node.widgets.push(w)
+ return w
+ },
+ }
+ },
+ async loadedGraphNode(node) {
+ //Check and migrate inputs named batch_manager from old workflows
+ if (node.type?.startsWith("VHS_") && node.inputs) {
+ const batchInput = node.inputs.find((i) => i.name == "batch_manager")
+ if (batchInput) {
+ batchInput.name = "meta_batch"
+ }
+ }
+ },
+ async beforeConfigureGraph(graphData, missingNodeTypes) {
+ if(helpDOM?.node) {
+ helpDOM.node = undefined
+ }
+ },
+ async setup() {
+ let originalGraphToPrompt = app.graphToPrompt
+ let graphToPrompt = async function() {
+ let res = await originalGraphToPrompt.apply(this, arguments);
+ res.workflow.extra['VHS_latentpreview'] = app.ui.settings.getSettingValue("VHS.LatentPreview")
+ res.workflow.extra['VHS_latentpreviewrate'] = app.ui.settings.getSettingValue("VHS.LatentPreviewRate")
+ res.workflow.extra['VHS_MetadataImage'] = app.ui.settings.getSettingValue("VHS.MetadataImage")
+ res.workflow.extra['VHS_KeepIntermediate'] = app.ui.settings.getSettingValue("VHS.KeepIntermediate")
+ return res
+ }
+ app.graphToPrompt = graphToPrompt
+ //Add a handler for pasting video data
+ document.addEventListener('paste', async (e) => {
+ if (!e.target.classList.contains('litegraph') &&
+ !e.target.classList.contains('graph-canvas-container')) {
+ return
+ }
+ let data = e.clipboardData || window.clipboardData
+ let filepath = data.getData('text/plain')
+ let video
+ for (const item of data.items) {
+ if (item.type.startsWith('video/')) {
+ video = item
+ break
+ }
+ }
+ if (filepath && copiedPath == filepath) {
+ //Add a Load Video (Path) and populate filepath
+ const pastedNode = LiteGraph.createNode('VHS_LoadVideoPath')
+ app.canvas.graph.add(pastedNode)
+ pastedNode.pos[0] = app.canvas.graph_mouse[0]
+ pastedNode.pos[1] = app.canvas.graph_mouse[1]
+ pastedNode.widgets[0].value = filepath
+ pastedNode.widgets[0].callback?.(filepath)
+ } else if (video && false) {
+ //Disabled due to lack of testing
+ //Add a Load Video (Upload), then upload the file, then select the file
+ const pastedNode = LiteGraph.createNode('VHS_LoadVideo')
+ app.canvas.graph.add(pastedNode)
+ pastedNode.pos[0] = app.canvas.graph_mouse[0]
+ pastedNode.pos[1] = app.canvas.graph_mouse[1]
+ const pathWidget = pastedNode.widgets[0]
+ //TODO: upload to pasted dir?
+ const blob = video.getAsFile()
+ const resp = await uploadFile(blob)
+ if (resp.status != 200) {
+ //upload failed and file can not be added to options
+ return;
+ }
+ const filename = (await resp.json()).name;
+ pathWidget.options.values.push(filename);
+ pathWidget.value = filename;
+ pathWidget.callback?.(filename)
+ } else {
+ return
+ }
+ e.preventDefault()
+ e.stopImmediatePropagation()
+ return false
+ }, true)
+ },
+ async init() {
+ if (app.ui.settings.getSettingValue("VHS.AdvancedPreviews") == true) {
+ app.ui.settings.setSettingValue("VHS.AdvancedPreviews", 'Always')
+ }
+ if (app.ui.settings.getSettingValue("VHS.AdvancedPreviews") == false) {
+ app.ui.settings.setSettingValue("VHS.AdvancedPreviews", 'Never')
+ }
+ if (app.VHSHelp != helpDOM) {
+ helpDOM = app.VHSHelp
+ } else {
+ initHelpDOM()
+ }
+ let e = app.extensions.filter((w) => w.name == 'UVR5.AudioPreviewer')
+ if (e.length) {
+ let orig = e[0].beforeRegisterNodeDef
+ e[0].beforeRegisterNodeDef = function(nodeType, nodeData, app) {
+ if(!nodeData?.name?.startsWith("VHS_")) {
+ return orig.apply(this, arguments);
+ }
+ }
+ }
+ },
+});
+let previewImages = []
+api.addEventListener('executing', ({ detail }) => {
+ if (detail === null) {
+ for (let graph of [app.graph, ...app.graph.subgraphs.values()]) {
+ for (let node of graph._nodes) {
+ if (node.type.startsWith("VHS_")) {
+ node.onPromptExecuted?.()
+ }
+ }
+ }
+ }
+})
+function getLatentPreviewCtx(id, width, height) {
+ const node = getNodeById(id)
+ if (!node) {
+ return undefined
+ }
+
+ let previewWidget = node.widgets.find((w) => w.name == "vhslatentpreview")
+ if (!previewWidget) {
+ //check for and remove any native preview
+ let nativePreview = node.widgets.findIndex((w) => w.name == '$$canvas-image-preview')
+ if (nativePreview >= 0) {
+ node.imgs = []
+ node.widgets.splice(nativePreview,1)
+ }
+ let canvasEl = document.createElement("canvas")
+ canvasEl.style.width = "100%"
+ previewWidget = node.addDOMWidget("vhslatentpreview", "vhscanvas", canvasEl, {
+ serialize: false,
+ hideOnZoom: false,
+ });
+ previewWidget.serialize = false
+ allowDragFromWidget(previewWidget)
+ canvasEl.addEventListener('contextmenu', (e) => {
+ e.preventDefault()
+ return app.canvas._mousedown_callback(e)
+ }, true);
+ canvasEl.addEventListener('pointerdown', (e) => {
+ e.preventDefault()
+ return app.canvas._mousedown_callback(e)
+ }, true);
+ canvasEl.addEventListener('mousewheel', (e) => {
+ e.preventDefault()
+ return app.canvas._mousewheel_callback(e)
+ }, true);
+ canvasEl.addEventListener('pointermove', (e) => {
+ e.preventDefault()
+ return app.canvas._mousemove_callback(e)
+ }, true);
+ canvasEl.addEventListener('pointerup', (e) => {
+ e.preventDefault()
+ return app.canvas._mouseup_callback(e)
+ }, true);
+
+ previewWidget.computeSize = function(width) {
+ if (this.aspectRatio) {
+ let height = (node.size[0]-20)/ this.aspectRatio + 10;
+ if (!(height > 0)) {
+ height = 0;
+ }
+ this.computedHeight = height + 10;
+ return [width, height];
+ }
+ return [width, -4];//no loaded src, widget should not display
+ }
+ }
+ let canvasEl = previewWidget.element
+ if (!previewWidget.ctx || canvasEl.width != width
+ || canvasEl.height != height) {
+ previewWidget.aspectRatio = width / height
+ canvasEl.width = width
+ canvasEl.height = height
+ fitHeight(node)
+ }
+ return canvasEl.getContext("2d")
+}
+let animateIntervals = {}
+function beginLatentPreview(id, previewImages, rate) {
+ latentPreviewNodes.add(id)
+ if (animateIntervals[id]) {
+ clearTimeout(animateIntervals[id])
+ }
+ let displayIndex = 0
+ let node = getNodeById(id)
+ //While progress is safely cleared on execution completion.
+ //Initial progress must be started here to avoid a race condition
+ node.progress = 0
+ animateIntervals[id] = setInterval(() => {
+ if (getNodeById(id)?.progress == undefined
+ || app.canvas.graph.rootGraph != node.graph.rootGraph) {
+ clearTimeout(animateIntervals[id])
+ delete animateIntervals[id]
+ return
+ }
+ if (!previewImages[displayIndex]) {
+ return
+ }
+ getLatentPreviewCtx(id, previewImages[displayIndex].width,
+ previewImages[displayIndex].height)?.drawImage?.(previewImages[displayIndex],0,0)
+ displayIndex = (displayIndex + 1) % previewImages.length
+ }, 1000/rate);
+
+}
+let previewImagesDict = {}
+api.addEventListener('VHS_latentpreview', ({ detail }) => {
+ if (detail.id == null) {
+ return
+ }
+ let previewImages = previewImagesDict[detail.id] = []
+ previewImages.length = detail.length
+
+ let idParts = detail.id.split(':')
+ for (let i=1; i <= idParts.length; i++) {
+ let id = idParts.slice(0,i).join(':')
+ beginLatentPreview(id, previewImages, detail.rate)
+ }
+});
+let td = new TextDecoder()
+api.addEventListener('b_preview', async (e) => {
+ if (Object.keys(animateIntervals).length == 0) {
+ return
+ }
+ e.preventDefault()
+ e.stopImmediatePropagation()
+ e.stopPropagation()
+ const dv = new DataView(await e.detail.slice(0,24).arrayBuffer())
+ const index = dv.getUint32(4)
+ const idlen = dv.getUint8(8)
+ const id = td.decode(dv.buffer.slice(9,9+idlen))
+ previewImagesDict[id][index] = await window.createImageBitmap(e.detail.slice(24))
+ return false
+}, true);
diff --git a/custom_nodes/comfyui-videohelpersuite/web/js/videoinfo.js b/custom_nodes/comfyui-videohelpersuite/web/js/videoinfo.js
new file mode 100644
index 0000000000000000000000000000000000000000..b1a9871067e07dc09b37a8dd666ce531c2c5f56b
--- /dev/null
+++ b/custom_nodes/comfyui-videohelpersuite/web/js/videoinfo.js
@@ -0,0 +1,101 @@
+import { app } from '../../../scripts/app.js'
+
+
+function getVideoMetadata(file) {
+ return new Promise((r) => {
+ const reader = new FileReader();
+ reader.onload = (event) => {
+ const videoData = new Uint8Array(event.target.result);
+ const dataView = new DataView(videoData.buffer);
+
+ let decoder = new TextDecoder();
+ // Check for known valid magic strings
+ if (dataView.getUint32(0) == 0x1A45DFA3) {
+ //webm/mkv (both use EBML/Matroska format)
+ //see http://wiki.webmproject.org/webm-metadata/global-metadata
+ //and https://www.matroska.org/technical/elements.html
+ //contrary to specs, tag seems consistently at start
+ //COMMENT + 0x4487 + packed length?
+ //length 0x8d8 becomes 0x48d8
+ //
+ //description for variable length ints https://github.com/ietf-wg-cellar/ebml-specification/blob/master/specification.markdown
+ let offset = 4 + 8; //COMMENT is 7 chars + 1 to realign
+ while(offset < videoData.length-16) {
+ //Check for text tags
+ if (dataView.getUint16(offset) == 0x4487) {
+ //check that name of tag is COMMENT
+ const name = String.fromCharCode(...videoData.slice(offset-7,offset));
+ if (name === "COMMENT") {
+ let vint = dataView.getUint32(offset+2);
+ let n_octets = Math.clz32(vint)+1;
+ if (n_octets < 4) {//250MB sanity cutoff
+ let length = (vint >> (8*(4-n_octets))) & ~(1 << (7*n_octets));
+ const content = decoder.decode(videoData.slice(offset+2+n_octets, offset+2+n_octets+length));
+ let json = JSON.parse(content);
+ r(json);
+ return;
+ }
+ }
+ }
+ offset+=1;
+ }
+ } else if (dataView.getUint32(4) == 0x66747970 && dataView.getUint32(8) == 0x69736F6D) {
+ //mp4
+ //see https://developer.apple.com/documentation/quicktime-file-format
+ //Seems to make no guarantee for alignment
+ let offset = videoData.length-4;
+ while (offset > 16) {//rough safe guess
+ if (dataView.getUint32(offset) == 0x64617461) {//any data tag
+ if (dataView.getUint32(offset - 8) == 0xa9636d74) {//cmt data tag
+ let type = dataView.getUint32(offset+4); //seemingly 1
+ let locale = dataView.getUint32(offset+8); //seemingly 0
+ let size = dataView.getUint32(offset-4) - 4*4;
+ const content = decoder.decode(videoData.slice(offset+12, offset+12+size));
+ const json = JSON.parse(content);
+ r(json);
+ return;
+ }
+ }
+
+ offset-=1;
+ }
+ } else {
+ console.error("Unknown magic: " + dataView.getUint32(0))
+ }
+ r();
+ return;
+ };
+
+ reader.readAsArrayBuffer(file);
+ });
+}
+function isVideoFile(file) {
+ if (file?.name?.endsWith(".webm")) {
+ return true;
+ }
+ if (file?.name?.endsWith(".mp4")) {
+ return true;
+ }
+ if (file?.name?.endsWith(".mkv")) {
+ return true;
+ }
+
+ return false;
+}
+
+let originalHandleFile = app.handleFile;
+app.handleFile = handleFile;
+let fileInput = document.getElementById("comfy-file-input")
+//hijack comfy-file-input to allow webm/mp4/mkv
+fileInput.accept += ",video/webm,video/mp4,video/x-matroska";
+
+async function handleFile(file) {
+ if (file?.type?.startsWith("video/") || isVideoFile(file)) {
+ const videoInfo = await getVideoMetadata(file);
+ if (videoInfo?.workflow) {
+ await app.loadGraphData(videoInfo.workflow);
+ return
+ }
+ }
+ return await originalHandleFile.apply(this, arguments);
+}
diff --git a/custom_nodes/example_node.py.example b/custom_nodes/example_node.py.example
new file mode 100644
index 0000000000000000000000000000000000000000..779c35787ea8a3f3e13f0383702106b85fe3f2f5
--- /dev/null
+++ b/custom_nodes/example_node.py.example
@@ -0,0 +1,130 @@
+from typing_extensions import override
+
+from comfy_api.latest import ComfyExtension, io
+
+
+class Example(io.ComfyNode):
+ """
+ An example node
+
+ Class methods
+ -------------
+ define_schema (io.Schema):
+ Tell the main program the metadata, input, output parameters of nodes.
+ fingerprint_inputs:
+ optional method to control when the node is re executed.
+ check_lazy_status:
+ optional method to control list of input names that need to be evaluated.
+
+ """
+
+ @classmethod
+ def define_schema(cls) -> io.Schema:
+ """
+ Return a schema which contains all information about the node.
+ Some types: "Model", "Vae", "Clip", "Conditioning", "Latent", "Image", "Int", "String", "Float", "Combo".
+ For outputs the "io.Model.Output" should be used, for inputs the "io.Model.Input" can be used.
+ The type can be a "Combo" - this will be a list for selection.
+ """
+ return io.Schema(
+ node_id="Example",
+ display_name="Example Node",
+ category="Example",
+ inputs=[
+ io.Image.Input("image"),
+ io.Int.Input(
+ "int_field",
+ min=0,
+ max=4096,
+ step=64, # Slider's step
+ display_mode=io.NumberDisplay.number, # Cosmetic only: display as "number" or "slider"
+ lazy=True, # Will only be evaluated if check_lazy_status requires it
+ ),
+ io.Float.Input(
+ "float_field",
+ default=1.0,
+ min=0.0,
+ max=10.0,
+ step=0.01,
+ round=0.001, #The value representing the precision to round to, will be set to the step value by default. Can be set to False to disable rounding.
+ display_mode=io.NumberDisplay.number,
+ lazy=True,
+ ),
+ io.Combo.Input("print_to_screen", options=["enable", "disable"]),
+ io.String.Input(
+ "string_field",
+ multiline=False, # True if you want the field to look like the one on the ClipTextEncode node
+ default="Hello world!",
+ lazy=True,
+ )
+ ],
+ outputs=[
+ io.Image.Output(),
+ ],
+ )
+
+ @classmethod
+ def check_lazy_status(cls, image, string_field, int_field, float_field, print_to_screen):
+ """
+ Return a list of input names that need to be evaluated.
+
+ This function will be called if there are any lazy inputs which have not yet been
+ evaluated. As long as you return at least one field which has not yet been evaluated
+ (and more exist), this function will be called again once the value of the requested
+ field is available.
+
+ Any evaluated inputs will be passed as arguments to this function. Any unevaluated
+ inputs will have the value None.
+ """
+ if print_to_screen == "enable":
+ return ["int_field", "float_field", "string_field"]
+ else:
+ return []
+
+ @classmethod
+ def execute(cls, image, string_field, int_field, float_field, print_to_screen) -> io.NodeOutput:
+ if print_to_screen == "enable":
+ print(f"""Your input contains:
+ string_field aka input text: {string_field}
+ int_field: {int_field}
+ float_field: {float_field}
+ """)
+ #do some processing on the image, in this example I just invert it
+ image = 1.0 - image
+ return io.NodeOutput(image)
+
+ """
+ The node will always be re executed if any of the inputs change but
+ this method can be used to force the node to execute again even when the inputs don't change.
+ You can make this node return a number or a string. This value will be compared to the one returned the last time the node was
+ executed, if it is different the node will be executed again.
+ This method is used in the core repo for the LoadImage node where they return the image hash as a string, if the image hash
+ changes between executions the LoadImage node is executed again.
+ """
+ #@classmethod
+ #def fingerprint_inputs(s, image, string_field, int_field, float_field, print_to_screen):
+ # return ""
+
+# Set the web directory, any .js file in that directory will be loaded by the frontend as a frontend extension
+# WEB_DIRECTORY = "./somejs"
+
+
+# Add custom API routes, using router
+from aiohttp import web
+from server import PromptServer
+
+@PromptServer.instance.routes.get("/hello")
+async def get_hello(request):
+ return web.json_response("hello")
+
+
+class ExampleExtension(ComfyExtension):
+ @override
+ async def get_node_list(self) -> list[type[io.ComfyNode]]:
+ return [
+ Example,
+ ]
+
+
+async def comfy_entrypoint() -> ExampleExtension: # ComfyUI calls this to load your extension and its nodes.
+ return ExampleExtension()
diff --git a/custom_nodes/websocket_image_save.py b/custom_nodes/websocket_image_save.py
new file mode 100644
index 0000000000000000000000000000000000000000..15f87f9f56175f33df18c6142f9e13c4503b1186
--- /dev/null
+++ b/custom_nodes/websocket_image_save.py
@@ -0,0 +1,44 @@
+from PIL import Image
+import numpy as np
+import comfy.utils
+import time
+
+#You can use this node to save full size images through the websocket, the
+#images will be sent in exactly the same format as the image previews: as
+#binary images on the websocket with a 8 byte header indicating the type
+#of binary message (first 4 bytes) and the image format (next 4 bytes).
+
+#Note that no metadata will be put in the images saved with this node.
+
+class SaveImageWebsocket:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {"required":
+ {"images": ("IMAGE", ),}
+ }
+
+ RETURN_TYPES = ()
+ FUNCTION = "save_images"
+
+ OUTPUT_NODE = True
+
+ CATEGORY = "api/image"
+
+ def save_images(self, images):
+ pbar = comfy.utils.ProgressBar(images.shape[0])
+ step = 0
+ for image in images:
+ i = 255. * image.cpu().numpy()
+ img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
+ pbar.update_absolute(step, images.shape[0], ("PNG", img, None))
+ step += 1
+
+ return {}
+
+ @classmethod
+ def IS_CHANGED(s, images):
+ return time.time()
+
+NODE_CLASS_MAPPINGS = {
+ "SaveImageWebsocket": SaveImageWebsocket,
+}