Compare commits

...

12 Commits

Author SHA1 Message Date
David
ef5ad43f3a
Merge f2a05b096f into c7f03ad64e 2025-12-15 11:00:13 -05:00
Dr.Lt.Data
c7f03ad64e update DB
Some checks are pending
Python Linting / Run Ruff (push) Waiting to run
2025-12-15 22:28:27 +09:00
Dr.Lt.Data
1232989d7d update DB 2025-12-15 22:04:50 +09:00
Dr.Lt.Data
8f66a7997f update DB
Some checks are pending
Python Linting / Run Ruff (push) Waiting to run
2025-12-15 12:57:52 +09:00
David
f2a05b096f
Merge pull request #2 from Comfy-Org/main
Catch up with official fork
2025-12-13 20:51:26 +08:00
David
9b6b0676e1 - Themed model manager and snapshot manager
- fixed incorrect id in gui builder
2025-12-13 20:46:31 +08:00
David
5e2ca4fe1a - Took gui building out and put into its own .js
- Applied theme to Nodes Manager
- Made theme respect user theme colors
2025-12-11 16:23:11 +08:00
David
975642c9bf
Merge pull request #1 from Comfy-Org/main
Bring up to date with official
2025-12-11 12:26:59 +08:00
David
76fd32f146 Matched buttons and drop downs to match style of ComfyUI interface while keeping the colours the same as OG ComfyUI Manager 2025-12-05 13:47:30 +08:00
David
3ae99bc761 Removed this.close() I added before finding z-index issue. 2025-12-05 12:46:40 +08:00
David
1dde3c3ef0 - Added layout formatting to components of the Manager dialog box
- Pulled name from select and put it into a label (eg "DB: Channel" now has a label of DB and a dropdown with channel, etc)
- Fixed incorrect z-index
2025-12-05 12:38:54 +08:00
David
457c93cd19 Started changing UI to match the rest of ComfyUI
Completed Main Container
2025-12-04 11:58:22 +08:00
17 changed files with 10829 additions and 9532 deletions

View File

@ -3325,6 +3325,16 @@
"install_type": "git-clone",
"description": "Mel-Band RoFormer for Music Source Separation"
},
{
"author": "kijai",
"title": "ComfyUI-SCAIL-Pose",
"reference": "https://github.com/kijai/ComfyUI-SCAIL-Pose",
"files": [
"https://github.com/kijai/ComfyUI-SCAIL-Pose"
],
"install_type": "git-clone",
"description": "ComfyUI nodes for SCAIL input processing"
},
{
"author": "hhhzzyang",
"title": "Comfyui-Lama",
@ -13708,6 +13718,16 @@
"install_type": "git-clone",
"description": "You'll get a new node called SD3 Latent Select Resolution, you can pick the x and y sizes from a list."
},
{
"author": "GavChap",
"title": "ComfyUI_ExtractLora",
"reference": "https://github.com/GavChap/ComfyUI_ExtractLora",
"files": [
"https://github.com/GavChap/ComfyUI_ExtractLora"
],
"install_type": "git-clone",
"description": "Creates lora from two checkpoints by extracting the difference."
},
{
"author": "BenNarum",
"title": "SigmaWaveFormNodes",
@ -21830,6 +21850,16 @@
"install_type": "git-clone",
"description": "A custom node for ComfyUI that integrates Video-As-Prompt for motion-guided video generation from image inputs."
},
{
"author": "HM-RunningHub",
"title": "ComfyUI_RH_QwenImageI2L",
"reference": "https://github.com/HM-RunningHub/ComfyUI_RH_QwenImageI2L",
"files": [
"https://github.com/HM-RunningHub/ComfyUI_RH_QwenImageI2L"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node that generates Image-to-LoRA (I2L) LoRA from training images using DiffSynth-Studio Qwen-Image i2L pipelines."
},
{
"author": "wqjuser",
"title": "ComfyUI-Chat-Image",
@ -27483,6 +27513,16 @@
"install_type": "git-clone",
"description": "A custom ComfyUI node for integrating with the Fal Kontext API for advanced image editing and generation."
},
{
"author": "SanDiegoDude",
"title": "SCG_LocalVLM",
"reference": "https://github.com/SanDiegoDude/SCG_LocalVLM",
"files": [
"https://github.com/SanDiegoDude/SCG_LocalVLM"
],
"install_type": "git-clone",
"description": "This is an implementation of [Qwen3-VL](https://github.com/QwenLM/Qwen3-VL) for [ComfyUI](https://github.com/comfyanonymous/ComfyUI), which supports for text-based and single-image queries."
},
{
"author": "tavyra",
"title": "ComfyUI_Curves",
@ -32125,6 +32165,16 @@
"install_type": "git-clone",
"description": "ComfyUI-SoulX-Podcast is a custom node plugin for ComfyUI that packages the core functionality of SoulX-Podcast (long-form, multi-speaker, multi-dialect podcast voice generation) into a visual node workflow."
},
{
"author": "flybirdxx",
"title": "ComfyUI-Prompt_Helper",
"reference": "https://github.com/flybirdxx/ComfyUI-Prompt_Helper",
"files": [
"https://github.com/flybirdxx/ComfyUI-Prompt_Helper"
],
"install_type": "git-clone",
"description": "ComfyUI node that loads Qwen3-4B locally and expands short prompts into detailed, image-generation-friendly descriptions via GGUF. (Description by CC)"
},
{
"author": "DenRakEiw",
"title": "ComfyUI Latent Color Tools",
@ -34090,6 +34140,16 @@
"install_type": "git-clone",
"description": "Remove background scenery from an image of a person. The output image is saved as an RGBA PNG. The alpha channel is included."
},
{
"author": "Sean-Bradley",
"title": "ComfyUI-Get-Line",
"reference": "https://github.com/Sean-Bradley/ComfyUI-Get-Line",
"files": [
"https://github.com/Sean-Bradley/ComfyUI-Get-Line"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node used to get one line of string from a multi line string. Search in the manager for `get line`, or `getline` or `get-line`."
},
{
"author": "LukeCoulson1",
"title": "ComfyUI LoRA Combine Node",
@ -34778,6 +34838,16 @@
"install_type": "git-clone",
"description": "View Image Metadata of ComfyUI as well as of ForgeUI or Automatic 1111 generated images in Easily Readable Format"
},
{
"author": "ShammiG",
"title": "ComfyUI-Show_Any_Text_in_CMD_Console-SG",
"reference": "https://github.com/ShammiG/ComfyUI-Show_Any_Text_in_CMD_Console-SG",
"files": [
"https://github.com/ShammiG/ComfyUI-Show_Any_Text_in_CMD_Console-SG"
],
"install_type": "git-clone",
"description": "Simple node to show ANY output text in the CMD console with color options"
},
{
"author": "bgreene2",
"title": "ComfyUI-Hunyuan-Image-3",
@ -38146,6 +38216,16 @@
"install_type": "git-clone",
"description": "Custom node for building keyframe timelines in Wan video generation with adjustable influence strength, supporting 1-8 keyframes. (Description by CC)"
},
{
"author": "ckinpdx",
"title": "comfyui-humo-audio-motion",
"reference": "https://github.com/ckinpdx/comfyui-humo-audio-motion",
"files": [
"https://github.com/ckinpdx/comfyui-humo-audio-motion"
],
"install_type": "git-clone",
"description": "ComfyUI custom node for granular Q/K/V/O attention boosting in HuMo models. Provides 12 independent controls for fine-tuning audio-driven motion response."
},
{
"author": "jessesep",
"title": "SimpleVariables",
@ -38669,7 +38749,36 @@
"install_type": "git-clone",
"description": "Comprehensive set of ComfyUI custom nodes for interacting with a Sora-compatible REST API, supporting text-to-video, image-to-video, and video-to-video generation."
},
{
"author": "logicalor",
"title": "comfyui_text_to_pose",
"reference": "https://github.com/logicalor/comfyui_text_to_pose",
"files": [
"https://github.com/logicalor/comfyui_text_to_pose"
],
"install_type": "git-clone",
"description": "Generate human poses from text descriptions using T2P Transformer for ControlNet/T2I-Adapter workflows"
},
{
"author": "ssspace1",
"title": "SSpack_ComfyUI",
"reference": "https://github.com/ssspace1/SSpack_ComfyUI",
"files": [
"https://github.com/ssspace1/SSpack_ComfyUI"
],
"install_type": "git-clone",
"description": "Compact, UI-friendly nodes for ComfyUI with LoRA/checkpoint selectors with thumbnails, text utilities, image helpers, and a lightweight cache cleaner script."
},
{
"author": "SofianeAlla",
"title": "ComfyUI-BespokeAI-3D",
"reference": "https://github.com/SofianeAlla/ComfyUI-BespokeAI-3D",
"files": [
"https://github.com/SofianeAlla/ComfyUI-BespokeAI-3D"
],
"install_type": "git-clone",
"description": "ComfyUI custom nodes for BespokeAI image-to-3D generation\nNOTE: The files in the repo are not organized."
},

View File

@ -2250,6 +2250,7 @@
"ForceDetectPixelateScale",
"ImageScaleDownByFactor",
"ImageUpscaleByInt",
"ImagesToRGB",
"NearestImageScaleDown",
"PixelUpscale2Target",
"RemoveBackgroundPixel",
@ -2934,6 +2935,7 @@
"https://github.com/Aryan185/ComfyUI-VertexAPI": [
[
"GeminiChatVertexNode",
"GeminiDiarisationNode",
"GeminiSegmentationVertexNode",
"GeminiTTSVertexNode",
"GoogleImagenEditNode",
@ -7965,6 +7967,14 @@
"title_aux": "ComfyUI-SD3LatentSelectRes"
}
],
"https://github.com/GavChap/ComfyUI_ExtractLora": [
[
"ExtractLoRA"
],
{
"title_aux": "ComfyUI_ExtractLora"
}
],
"https://github.com/GeekatplayStudio/ComfyUI-Text2Speech": [
[
"HttpTTSToAudio",
@ -8529,6 +8539,16 @@
"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"
@ -11259,7 +11279,6 @@
"LG_InstallDependencies",
"LG_LatentBatchToList",
"LG_LoadImage",
"LG_LoadImage_V2",
"LG_MaskBatchMerge",
"LG_MaskHoleFiller",
"LG_Noise",
@ -11378,6 +11397,7 @@
"Texturaizer_ApplyStyleToPrompt",
"Texturaizer_CachedCNLoader",
"Texturaizer_CachedCheckpointLoader",
"Texturaizer_CircularVAEDecode",
"Texturaizer_ClipEncodeSwitchVersion",
"Texturaizer_CombinedConditioningFromColors",
"Texturaizer_ExtractCNData",
@ -11402,11 +11422,13 @@
"Texturaizer_KSamplerAdvanced",
"Texturaizer_Placeholder",
"Texturaizer_PowerLoraLoader",
"Texturaizer_SeamlessTilingPatch",
"Texturaizer_SendImage",
"Texturaizer_SetGlobalDir",
"Texturaizer_SigmasSelector",
"Texturaizer_SwitchAny",
"Texturaizer_SwitchLazy",
"Texturaizer_SwitchSmart",
"Texturaizer_UseSDXL"
],
{
@ -14612,6 +14634,7 @@
],
"https://github.com/PozzettiAndrea/ComfyUI-GeometryPack": [
[
"GeomPackAddNormalsToPointCloud",
"GeomPackBackdraftView",
"GeomPackBooleanOp",
"GeomPackCheckNormals",
@ -14637,6 +14660,7 @@
"GeomPackMeshQuality",
"GeomPackMeshToMeshDistance",
"GeomPackMeshToPointCloud",
"GeomPackNormalizeMeshToBBox",
"GeomPackPointToMeshDistance",
"GeomPackPreviewMesh",
"GeomPackPreviewMeshDual",
@ -15323,6 +15347,7 @@
"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",
@ -15365,20 +15390,27 @@
"Runware Refiner",
"Runware Runway Provider Settings",
"Runware Safety Inputs",
"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 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",
"RunwareAlibabaProviderSettings",
"RunwareAudioInferenceInputs",
"RunwareAudioInput",
"RunwareAudioInputCombine",
"RunwareBriaProviderSettings",
"RunwareBytedanceProviderSettings",
"RunwareFrameImages",
@ -15391,6 +15423,10 @@
"RunwarePixverseProviderSettings",
"RunwareRunwayProviderSettings",
"RunwareSafetyInputs",
"RunwareSpeechInput",
"RunwareSpeechInputCombine",
"RunwareSyncProviderSettings",
"RunwareSyncSegment",
"RunwareVectorize",
"RunwareVideoAdvancedFeatureInputs",
"RunwareVideoBgRemoval",
@ -15849,6 +15885,17 @@
"title_aux": "ComfyUI-SaveAudioMP3"
}
],
"https://github.com/SanDiegoDude/SCG_LocalVLM": [
[
"Qwen",
"Qwen2.5",
"Qwen2.5VL",
"QwenVL"
],
{
"title_aux": "SCG_LocalVLM"
}
],
"https://github.com/Santat2023/ComfyUiRagNodes": [
[
"MyNodesForDB",
@ -16046,6 +16093,14 @@
"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"
@ -16308,6 +16363,14 @@
"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": [
[
"Simple Readable Metadata Text Viewer-SG",
@ -17009,6 +17072,16 @@
"title_aux": "JPG & Noise Remover for ComfyUI"
}
],
"https://github.com/SofianeAlla/ComfyUI-BespokeAI-3D": [
[
"BespokeAI3DGeneration",
"BespokeAI3DGenerationFromURL",
"BespokeAI3DPreview"
],
{
"title_aux": "ComfyUI-BespokeAI-3D"
}
],
"https://github.com/SoftMeng/ComfyUI-DeepCache-Fix": [
[
"DeepCache_Fix"
@ -17689,6 +17762,7 @@
"StarIconExporter",
"StarImageEditQwenKontext",
"StarImageLoader1by1",
"StarImageLoop",
"StarImageSwitch",
"StarImageSwitch2",
"StarInfiniteYouAdvancedPatchMaker",
@ -17734,6 +17808,7 @@
"StarTextFilter",
"StarTextInput",
"StarTextStorage",
"StarVideoLoop",
"StarWatermark",
"StarWildcardsAdvanced",
"StarWildsAdv",
@ -22076,6 +22151,7 @@
"AKSamplerSettings",
"AKSettingsOut",
"CLIPEncodeMultiple",
"CLIPTextEncodeCached",
"IndexMultiple",
"IsOneOfGroupsActive",
"PreviewRawText",
@ -22169,6 +22245,7 @@
[
"AF_Edit_Generated_Prompt",
"AF_Load_Prompt_History",
"AF_Model_Switch",
"AF_Save_Prompt_History",
"AF_Show_Text"
],
@ -25668,6 +25745,7 @@
[
"Cubemap Faces Extract",
"Cubemap To Equirectangular",
"Cubemap To Equirectangular (Flexible)",
"Equirectangular Crop 180",
"Equirectangular Crop Square",
"Equirectangular Edge Blender",
@ -25678,6 +25756,15 @@
"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 Roll Image",
"LatLong Roll Mask",
"LatLong Split Cubemap Faces",
"LatLong Stack Cubemap Faces",
"PanoramaVideoViewerNode",
"PanoramaViewerNode"
],
@ -27301,6 +27388,15 @@
"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",
@ -30896,7 +30992,8 @@
"MeuxAdvancedImageCrop",
"MeuxImageLoader",
"MeuxMultiSaveImage",
"MeuxSimpleLLMNode"
"MeuxSimpleLLMNode",
"MeuxTextAreaInput"
],
{
"title_aux": "BaiduMeux_Comfy Tools"
@ -30907,7 +31004,8 @@
"MeuxAdvancedImageCrop",
"MeuxImageLoader",
"MeuxMultiSaveImage",
"MeuxSimpleLLMNode"
"MeuxSimpleLLMNode",
"MeuxTextAreaInput"
],
{
"title_aux": "MultiSaveImage Node"
@ -31428,6 +31526,14 @@
"title_aux": "ComfyUI-hvBlockswap"
}
],
"https://github.com/flybirdxx/ComfyUI-Prompt_Helper": [
[
"QwenImageEngineer"
],
{
"title_aux": "ComfyUI-Prompt_Helper"
}
],
"https://github.com/flybirdxx/ComfyUI-RexOmni": [
[
"RexOmniDetector",
@ -36827,6 +36933,7 @@
"https://github.com/kijai/ComfyUI-KJNodes": [
[
"AddLabel",
"AddNoiseToTrackPath",
"AppendInstanceDiffusionTracking",
"AppendStringsToList",
"ApplyRifleXRoPE_HunuyanVideo",
@ -37201,6 +37308,15 @@
"title_aux": "ComfyUI PyramidFlow Wrapper"
}
],
"https://github.com/kijai/ComfyUI-SCAIL-Pose": [
[
"PoseDetectionVitPoseToDWPose",
"RenderNLFPoses"
],
{
"title_aux": "ComfyUI-SCAIL-Pose"
}
],
"https://github.com/kijai/ComfyUI-SUPIR": [
[
"SUPIR_Upscale",
@ -38992,6 +39108,18 @@
"title_aux": "Comfyui_three_js"
}
],
"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",
@ -41567,6 +41695,7 @@
"https://github.com/morino-kumasan/comfyui-toml-prompt": [
[
"CheckPointLoaderSimpleFromString",
"DropFirstImage",
"IntSelector",
"JsonExtractFloat",
"JsonExtractInt",
@ -41586,7 +41715,8 @@
"StringSelector",
"StringViewer",
"SummaryReader",
"TomlPromptDecode"
"TomlPromptDecode",
"UNETLoaderFromString"
],
{
"title_aux": "comfyui-toml-prompt"
@ -41893,7 +42023,8 @@
"ShellAgentPluginSaveAudios",
"ShellAgentPluginSaveImage",
"ShellAgentPluginSaveImages",
"ShellAgentPluginSaveVideoVHS"
"ShellAgentPluginSaveVideoVHS",
"ShellAgentPluginVideoCombineEncrypt"
],
{
"author": "MyShell",
@ -43472,8 +43603,7 @@
"RescaleCFGPost",
"SamplerGradientEstimation",
"SkipFirstStepCFG",
"TCFGAdvanced",
"VAEPadding"
"TCFGAdvanced"
],
{
"title_aux": "ComfyUI-ppm"
@ -48276,6 +48406,26 @@
"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",
@ -49287,8 +49437,11 @@
"FullPipeOut",
"ModelPresetNode",
"MultiStringConditioning",
"ResolutionSelector",
"SeedWithOverride",
"StylePresetNode",
"TagReplacementNode",
"UpscaleNode",
"WildcardNode"
],
{

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

227
js/comfyui-gui-builder.js Normal file
View File

@ -0,0 +1,227 @@
import { $el } from "../../scripts/ui.js";
function normalizeContent(content) {
const tmp = document.createElement('div');
if (typeof content === 'string') {
tmp.innerHTML = content;
return Array.from(tmp.childNodes);
}
if (content instanceof Node) {
return content;
}
return content;
}
export function createSettingsCombo(label, content) {
const settingItem = $el("div.setting-item", {}, [
$el("div.flex.flex-row.items-center.gap-2",[
$el("div.form-label.flex.grow.items-center", [
$el("span.text-muted", { textContent: label },)
]),
$el("div.form-input.flex.justify-end",
[content]
)
]
)
]);
return settingItem;
}
export function buildGuiFrame(dialogId, title, iconClass, content, owner) {
const dialog_mask = $el("div.p-dialog-mask.p-overlay-mask.p-overlay-mask-enter", {
parent: document.body,
style: {
position: "fixed",
height: "100%",
width: "100%",
left: "0px",
top: "0px",
display: "flex",
justifyContent: "center",
alignItems: "center",
pointerEvents: "auto",
zIndex: "1000"
},
onclick: (e) => {
if (e.target === dialog_mask) {
owner.close();
}
}
// data-pc-section="mask"
});
const header_actions = $el("div.p-dialog-header-actions", {
// [TODO]
// data-pc-section="headeractions"
}
);
const close_button = $el("button.p-button.p-component.p-button-icon-only.p-button-secondary.p-button-rounded.p-button-text.p-dialog-close-button", {
parent: header_actions,
type: "button",
ariaLabel: "Close",
onclick: () => owner.close(),
// "data-pc-name": "pcclosebutton",
// "data-p-disabled": "false",
// "data-p-severity": "secondary",
// "data-pc-group-section": "headericon",
// "data-pc-extend": "button",
// "data-pc-section": "root",
// [FIXME] Not sure how to do most of the SVG using $el
innerHTML: '<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="p-icon p-button-icon" aria-hidden="true"><path d="M8.01186 7.00933L12.27 2.75116C12.341 2.68501 12.398 2.60524 12.4375 2.51661C12.4769 2.42798 12.4982 2.3323 12.4999 2.23529C12.5016 2.13827 12.4838 2.0419 12.4474 1.95194C12.4111 1.86197 12.357 1.78024 12.2884 1.71163C12.2198 1.64302 12.138 1.58893 12.0481 1.55259C11.9581 1.51625 11.8617 1.4984 11.7647 1.50011C11.6677 1.50182 11.572 1.52306 11.4834 1.56255C11.3948 1.60204 11.315 1.65898 11.2488 1.72997L6.99067 5.98814L2.7325 1.72997C2.59553 1.60234 2.41437 1.53286 2.22718 1.53616C2.03999 1.53946 1.8614 1.61529 1.72901 1.74767C1.59663 1.88006 1.5208 2.05865 1.5175 2.24584C1.5142 2.43303 1.58368 2.61419 1.71131 2.75116L5.96948 7.00933L1.71131 11.2675C1.576 11.403 1.5 11.5866 1.5 11.7781C1.5 11.9696 1.576 12.1532 1.71131 12.2887C1.84679 12.424 2.03043 12.5 2.2219 12.5C2.41338 12.5 2.59702 12.424 2.7325 12.2887L6.99067 8.03052L11.2488 12.2887C11.3843 12.424 11.568 12.5 11.7594 12.5C11.9509 12.5 12.1346 12.424 12.27 12.2887C12.4053 12.1532 12.4813 11.9696 12.4813 11.7781C12.4813 11.5866 12.4053 11.403 12.27 11.2675L8.01186 7.00933Z" fill="currentColor"></path></svg><span class="p-button-label" data-pc-section="label">&nbsp;</span><!---->'
}
);
const dialog_header = $el("div.p-dialog-header",
[
$el("div", [
$el("div",
{
id: "frame-title-container",
},
[
$el("h2.px-4", [
$el(iconClass, {
style: {
"font-size": "1.25rem",
"margin-right": ".5rem"
}
}),
$el("span", { textContent: title })
])
]
)
]),
header_actions
]
);
const contentFrame = $el("div.p-dialog-content", {}, normalizeContent(content));
const manager_dialog = $el("div.p-dialog.p-component.global-dialog", {
id: dialogId,
parent: dialog_mask,
style: {
'display': 'flex',
'flex-direction': 'column',
'pointer-events': 'auto',
'margin': '0px',
},
role: 'dialog',
ariaModal: 'true',
// [TODO]
// ariaLabbelledby: 'cm-title',
// maximized: 'false',
// data-pc-name: 'dialog',
// data-pc-section: 'root',
// data-pd-focustrap: 'true'
},
[ dialog_header, contentFrame ]
);
const hidden_accessible = $el("span.p-hidden-accessible.p-hidden-focusable", {
parent: manager_dialog,
tabindex: "0",
role: "presentation",
ariaHidden: "true",
"data-p-hidden-accessible": "true",
"data-p-hidden-focusable": "true",
"data-pc-section": "firstfocusableelement"
});
return dialog_mask;
}
export function buildGuiFrameCustomHeader(dialogId, customHeader, content, owner) {
const dialog_mask = $el("div.p-dialog-mask.p-overlay-mask.p-overlay-mask-enter", {
parent: document.body,
style: {
position: "fixed",
height: "100%",
width: "100%",
left: "0px",
top: "0px",
display: "flex",
justifyContent: "center",
alignItems: "center",
pointerEvents: "auto",
zIndex: "1000"
},
onclick: (e) => {
if (e.target === dialog_mask) {
owner.close();
}
}
// data-pc-section="mask"
});
const header_actions = $el("div.p-dialog-header-actions", {
// [TODO]
// data-pc-section="headeractions"
}
);
const close_button = $el("button.p-button.p-component.p-button-icon-only.p-button-secondary.p-button-rounded.p-button-text.p-dialog-close-button", {
parent: header_actions,
type: "button",
ariaLabel: "Close",
onclick: () => owner.close(),
// "data-pc-name": "pcclosebutton",
// "data-p-disabled": "false",
// "data-p-severity": "secondary",
// "data-pc-group-section": "headericon",
// "data-pc-extend": "button",
// "data-pc-section": "root",
// [FIXME] Not sure how to do most of the SVG using $el
innerHTML: '<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="p-icon p-button-icon" aria-hidden="true"><path d="M8.01186 7.00933L12.27 2.75116C12.341 2.68501 12.398 2.60524 12.4375 2.51661C12.4769 2.42798 12.4982 2.3323 12.4999 2.23529C12.5016 2.13827 12.4838 2.0419 12.4474 1.95194C12.4111 1.86197 12.357 1.78024 12.2884 1.71163C12.2198 1.64302 12.138 1.58893 12.0481 1.55259C11.9581 1.51625 11.8617 1.4984 11.7647 1.50011C11.6677 1.50182 11.572 1.52306 11.4834 1.56255C11.3948 1.60204 11.315 1.65898 11.2488 1.72997L6.99067 5.98814L2.7325 1.72997C2.59553 1.60234 2.41437 1.53286 2.22718 1.53616C2.03999 1.53946 1.8614 1.61529 1.72901 1.74767C1.59663 1.88006 1.5208 2.05865 1.5175 2.24584C1.5142 2.43303 1.58368 2.61419 1.71131 2.75116L5.96948 7.00933L1.71131 11.2675C1.576 11.403 1.5 11.5866 1.5 11.7781C1.5 11.9696 1.576 12.1532 1.71131 12.2887C1.84679 12.424 2.03043 12.5 2.2219 12.5C2.41338 12.5 2.59702 12.424 2.7325 12.2887L6.99067 8.03052L11.2488 12.2887C11.3843 12.424 11.568 12.5 11.7594 12.5C11.9509 12.5 12.1346 12.424 12.27 12.2887C12.4053 12.1532 12.4813 11.9696 12.4813 11.7781C12.4813 11.5866 12.4053 11.403 12.27 11.2675L8.01186 7.00933Z" fill="currentColor"></path></svg><span class="p-button-label" data-pc-section="label">&nbsp;</span><!---->'
}
);
const _customHeader = normalizeContent(customHeader);
const dialog_header = $el("div.p-dialog-header",
[
$el("div", [
$el("div",
{
id: "frame-title-container",
},
Array.isArray(_customHeader) ? _customHeader : [_customHeader]
)
]),
header_actions
]
);
const contentFrame = $el("div.p-dialog-content", {}, normalizeContent(content));
const manager_dialog = $el("div.p-dialog.p-component.global-dialog", {
id: dialogId,
parent: dialog_mask,
style: {
'display': 'flex',
'flex-direction': 'column',
'pointer-events': 'auto',
'margin': '0px',
},
role: 'dialog',
ariaModal: 'true',
// [TODO]
// ariaLabbelledby: 'cm-title',
// maximized: 'false',
// data-pc-name: 'dialog',
// data-pc-section: 'root',
// data-pd-focustrap: 'true'
},
[ dialog_header, contentFrame ]
);
const hidden_accessible = $el("span.p-hidden-accessible.p-hidden-focusable", {
parent: manager_dialog,
tabindex: "0",
role: "presentation",
ariaHidden: "true",
"data-p-hidden-accessible": "true",
"data-p-hidden-focusable": "true",
"data-pc-section": "firstfocusableelement"
});
return dialog_mask;
}

View File

@ -20,6 +20,7 @@ import { ComponentBuilderDialog, getPureName, load_components, set_component_pol
import { CustomNodesManager } from "./custom-nodes-manager.js";
import { ModelManager } from "./model-manager.js";
import { SnapshotManager } from "./snapshot.js";
import { buildGuiFrame, createSettingsCombo } from "./comfyui-gui-builder.js";
let manager_version = await getVersion();
@ -44,12 +45,16 @@ docStyle.innerHTML = `
#cm-manager-dialog {
width: 1000px;
height: 455px;
height: auto;
box-sizing: content-box;
z-index: 1000;
overflow-y: auto;
}
#cm-manager-dialog br {
margin-bottom: 1em;
}
.cb-widget {
width: 400px;
height: 25px;
@ -80,6 +85,7 @@ docStyle.innerHTML = `
}
.cm-menu-container {
padding : calc(var(--spacing)*2);
column-gap: 20px;
display: flex;
flex-wrap: wrap;
@ -140,8 +146,8 @@ docStyle.innerHTML = `
}
.cm-notice-board {
width: 290px;
height: 230px;
width: auto;
height: 280px;
overflow: auto;
color: var(--input-text);
border: 1px solid var(--descrip-text);
@ -238,68 +244,50 @@ var is_updating = false;
// copied style from https://github.com/pythongosssss/ComfyUI-Custom-Scripts
const style = `
#workflowgallery-button {
width: 310px;
height: 27px;
height: 50px;
padding: 0px !important;
position: relative;
overflow: hidden;
font-size: 17px !important;
}
#cm-nodeinfo-button {
width: 310px;
height: 27px;
padding: 0px !important;
position: relative;
overflow: hidden;
font-size: 17px !important;
}
#cm-manual-button {
width: 310px;
height: 27px;
position: relative;
overflow: hidden;
}
.cm-button {
width: 310px;
height: 30px;
width: auto;
position: relative;
overflow: hidden;
font-size: 17px !important;
background-color: var(--comfy-menu-secondary-bg);
border-color: var(--border-color);
color: color: var(--input-text);
}
.cm-button:hover {
filter: brightness(125%);
}
.cm-button-red {
width: 310px;
height: 30px;
position: relative;
overflow: hidden;
font-size: 17px !important;
background-color: #500000 !important;
border-color: #88181b !important;
color: white !important;
}
.cm-button-red:hover {
background-color: #88181b !important;
}
.cm-button-orange {
width: 310px;
height: 30px;
position: relative;
overflow: hidden;
font-size: 17px !important;
font-weight: bold;
background-color: orange !important;
color: black !important;
}
.cm-experimental-button {
width: 290px;
height: 30px;
position: relative;
overflow: hidden;
font-size: 17px !important;
width: 100%;
}
.cm-experimental {
width: 310px;
border: 1px solid #555;
border-radius: 5px;
padding: 10px;
@ -326,8 +314,14 @@ const style = `
.cm-menu-combo {
cursor: pointer;
width: 310px;
box-sizing: border-box;
padding: 0.5em 0.5em;
border: 1px solid var(--border-color);
border-radius: 6px;
background: var(--comfy-menu-secondary-bg);
}
.cm-menu-combo:hover {
filter: brightness(125%);
}
.cm-small-button {
@ -831,7 +825,7 @@ class ManagerMenuDialog extends ComfyDialog {
const isElectron = 'electronAPI' in window;
update_comfyui_button =
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Update ComfyUI",
style: {
@ -842,7 +836,7 @@ class ManagerMenuDialog extends ComfyDialog {
});
switch_comfyui_button =
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Switch ComfyUI",
style: {
@ -853,7 +847,7 @@ class ManagerMenuDialog extends ComfyDialog {
});
restart_stop_button =
$el("button.cm-button-red", {
$el("button.p-button.p-component.cm-button-red", {
type: "button",
textContent: "Restart",
onclick: () => restartOrStop()
@ -861,7 +855,7 @@ class ManagerMenuDialog extends ComfyDialog {
if(isElectron) {
update_all_button =
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Update All Custom Nodes",
onclick:
@ -870,7 +864,7 @@ class ManagerMenuDialog extends ComfyDialog {
}
else {
update_all_button =
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Update All",
onclick:
@ -880,7 +874,7 @@ class ManagerMenuDialog extends ComfyDialog {
const res =
[
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Custom Nodes Manager",
onclick:
@ -892,7 +886,7 @@ class ManagerMenuDialog extends ComfyDialog {
}
}),
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Install Missing Custom Nodes",
onclick:
@ -904,7 +898,7 @@ class ManagerMenuDialog extends ComfyDialog {
}
}),
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Custom Nodes In Workflow",
onclick:
@ -916,8 +910,8 @@ class ManagerMenuDialog extends ComfyDialog {
}
}),
$el("br", {}, []),
$el("button.cm-button", {
$el("div", {}, []),
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Model Manager",
onclick:
@ -929,7 +923,7 @@ class ManagerMenuDialog extends ComfyDialog {
}
}),
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Install via Git URL",
onclick: async () => {
@ -941,13 +935,13 @@ class ManagerMenuDialog extends ComfyDialog {
}
}),
$el("br", {}, []),
$el("div", {}, []),
update_all_button,
update_comfyui_button,
switch_comfyui_button,
// fetch_updates_button,
$el("br", {}, []),
$el("div", {}, []),
restart_stop_button,
];
@ -960,12 +954,13 @@ class ManagerMenuDialog extends ComfyDialog {
let self = this;
// db mode
this.datasrc_combo = document.createElement("select");
this.datasrc_combo.setAttribute("title", "Configure where to retrieve node/model information. If set to 'local,' the channel is ignored, and if set to 'channel (remote),' it fetches the latest information each time the list is opened.");
this.datasrc_combo.className = "cm-menu-combo";
this.datasrc_combo.appendChild($el('option', { value: 'cache', text: 'DB: Channel (1day cache)' }, []));
this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'DB: Local' }, []));
this.datasrc_combo.appendChild($el('option', { value: 'remote', text: 'DB: Channel (remote)' }, []));
this.datasrc_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled ";
this.datasrc_combo.appendChild($el('option', { value: 'cache', text: 'Channel (1day cache)' }, []));
this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'Local' }, []));
this.datasrc_combo.appendChild($el('option', { value: 'remote', text: 'Channel (remote)' }, []));
api.fetchApi('/manager/db_mode')
.then(response => response.text())
@ -975,14 +970,16 @@ class ManagerMenuDialog extends ComfyDialog {
api.fetchApi(`/manager/db_mode?value=${event.target.value}`);
});
const dbRetrievalSetttingItem = createSettingsCombo("DB", this.datasrc_combo);
// preview method
let preview_combo = document.createElement("select");
preview_combo.setAttribute("title", "Configure how latent variables will be decoded during preview in the sampling process.");
preview_combo.className = "cm-menu-combo";
preview_combo.appendChild($el('option', { value: 'auto', text: 'Preview method: Auto' }, []));
preview_combo.appendChild($el('option', { value: 'taesd', text: 'Preview method: TAESD (slow)' }, []));
preview_combo.appendChild($el('option', { value: 'latent2rgb', text: 'Preview method: Latent2RGB (fast)' }, []));
preview_combo.appendChild($el('option', { value: 'none', text: 'Preview method: None (very fast)' }, []));
preview_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
preview_combo.appendChild($el('option', { value: 'auto', text: 'Auto' }, []));
preview_combo.appendChild($el('option', { value: 'taesd', text: 'TAESD (slow)' }, []));
preview_combo.appendChild($el('option', { value: 'latent2rgb', text: 'Latent2RGB (fast)' }, []));
preview_combo.appendChild($el('option', { value: 'none', text: 'None (very fast)' }, []));
api.fetchApi('/manager/preview_method')
.then(response => response.text())
@ -992,10 +989,12 @@ class ManagerMenuDialog extends ComfyDialog {
api.fetchApi(`/manager/preview_method?value=${event.target.value}`);
});
const previewSetttingItem = createSettingsCombo("Preview method", preview_combo);
// channel
let channel_combo = document.createElement("select");
channel_combo.setAttribute("title", "Configure the channel for retrieving data from the Custom Node list (including missing nodes) or the Model list.");
channel_combo.className = "cm-menu-combo";
channel_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
api.fetchApi('/manager/channel_url_list')
.then(response => response.json())
.then(async data => {
@ -1004,7 +1003,7 @@ class ManagerMenuDialog extends ComfyDialog {
for (let i in urls) {
if (urls[i] != '') {
let name_url = urls[i].split('::');
channel_combo.appendChild($el('option', { value: name_url[0], text: `Channel: ${name_url[0]}` }, []));
channel_combo.appendChild($el('option', { value: name_url[0], text: `${name_url[0]}` }, []));
}
}
@ -1019,11 +1018,13 @@ class ManagerMenuDialog extends ComfyDialog {
}
});
const channelSetttingItem = createSettingsCombo("Channel", channel_combo);
// share
let share_combo = document.createElement("select");
share_combo.setAttribute("title", "Hide the share button in the main menu or set the default action upon clicking it. Additionally, configure the default share site when sharing via the context menu's share button.");
share_combo.className = "cm-menu-combo";
share_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
const share_options = [
['none', 'None'],
['openart', 'OpenArt AI'],
@ -1034,7 +1035,7 @@ class ManagerMenuDialog extends ComfyDialog {
['all', 'All'],
];
for (const option of share_options) {
share_combo.appendChild($el('option', { value: option[0], text: `Share: ${option[1]}` }, []));
share_combo.appendChild($el('option', { value: option[0], text: `${option[1]}` }, []));
}
api.fetchApi('/manager/share_option')
@ -1056,12 +1057,14 @@ class ManagerMenuDialog extends ComfyDialog {
}
});
const shareSetttingItem = createSettingsCombo("Share", share_combo);
let component_policy_combo = document.createElement("select");
component_policy_combo.setAttribute("title", "When loading the workflow, configure which version of the component to use.");
component_policy_combo.className = "cm-menu-combo";
component_policy_combo.appendChild($el('option', { value: 'workflow', text: 'Component: Use workflow version' }, []));
component_policy_combo.appendChild($el('option', { value: 'higher', text: 'Component: Use higher version' }, []));
component_policy_combo.appendChild($el('option', { value: 'mine', text: 'Component: Use my version' }, []));
component_policy_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
component_policy_combo.appendChild($el('option', { value: 'workflow', text: 'Use workflow version' }, []));
component_policy_combo.appendChild($el('option', { value: 'higher', text: 'Use higher version' }, []));
component_policy_combo.appendChild($el('option', { value: 'mine', text: 'Use my version' }, []));
api.fetchApi('/manager/policy/component')
.then(response => response.text())
.then(data => {
@ -1074,15 +1077,14 @@ class ManagerMenuDialog extends ComfyDialog {
set_component_policy(event.target.value);
});
update_policy_combo = document.createElement("select");
const componentSetttingItem = createSettingsCombo("Component", component_policy_combo);
if(isElectron)
update_policy_combo.style.display = 'none';
update_policy_combo = document.createElement("select");
update_policy_combo.setAttribute("title", "Sets the policy to be applied when performing an update.");
update_policy_combo.className = "cm-menu-combo";
update_policy_combo.appendChild($el('option', { value: 'stable-comfyui', text: 'Update: ComfyUI Stable Version' }, []));
update_policy_combo.appendChild($el('option', { value: 'nightly-comfyui', text: 'Update: ComfyUI Nightly Version' }, []));
update_policy_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
update_policy_combo.appendChild($el('option', { value: 'stable-comfyui', text: 'ComfyUI Stable Version' }, []));
update_policy_combo.appendChild($el('option', { value: 'nightly-comfyui', text: 'ComfyUI Nightly Version' }, []));
api.fetchApi('/manager/policy/update')
.then(response => response.text())
.then(data => {
@ -1093,20 +1095,22 @@ class ManagerMenuDialog extends ComfyDialog {
api.fetchApi(`/manager/policy/update?value=${event.target.value}`);
});
return [
$el("br", {}, []),
this.datasrc_combo,
channel_combo,
preview_combo,
share_combo,
component_policy_combo,
update_policy_combo,
$el("br", {}, []),
const updateSetttingItem = createSettingsCombo("Update", update_policy_combo);
if(isElectron)
updateSetttingItem.style.display = 'none';
$el("br", {}, []),
$el("filedset.cm-experimental", {}, [
return [
dbRetrievalSetttingItem,
channelSetttingItem,
previewSetttingItem,
shareSetttingItem,
componentSetttingItem,
updateSetttingItem,
//[TODO] replace mt-2 with wrapper div with flex column gap
$el("filedset.cm-experimental.mt-auto", {}, [
$el("legend.cm-experimental-legend", {}, ["EXPERIMENTAL"]),
$el("button.cm-experimental-button", {
$el("button.p-button.p-component.cm-button.cm-experimental-button", {
type: "button",
textContent: "Snapshot Manager",
onclick:
@ -1116,7 +1120,7 @@ class ManagerMenuDialog extends ComfyDialog {
SnapshotManager.instance.show();
}
}),
$el("button.cm-experimental-button", {
$el("button.p-button.p-component.cm-button.cm-experimental-button.mt-2", {
type: "button",
textContent: "Install PIP packages",
onclick:
@ -1134,7 +1138,7 @@ class ManagerMenuDialog extends ComfyDialog {
createControlsRight() {
const elts = [
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
id: 'cm-manual-button',
type: "button",
textContent: "Community Manual",
@ -1185,11 +1189,11 @@ class ManagerMenuDialog extends ComfyDialog {
})
]),
$el("button", {
$el("button.p-button.p-component.cm-button", {
id: 'workflowgallery-button',
type: "button",
style: {
...(localStorage.getItem("wg_last_visited") ? {height: '50px'} : {})
// ...(localStorage.getItem("wg_last_visited") ? {height: '50px'} : {})
},
onclick: (e) => {
const last_visited_site = localStorage.getItem("wg_last_visited")
@ -1212,7 +1216,7 @@ class ManagerMenuDialog extends ComfyDialog {
}, [
$el("p", {
id: 'workflowgallery-button-last-visited-label',
textContent: `(${localStorage.getItem("wg_last_visited") ? localStorage.getItem("wg_last_visited").split('/')[2] : ''})`,
textContent: `(${localStorage.getItem("wg_last_visited") ? localStorage.getItem("wg_last_visited").split('/')[2] : 'none selected'})`,
style: {
'text-align': 'center',
'color': 'var(--input-text)',
@ -1228,13 +1232,12 @@ class ManagerMenuDialog extends ComfyDialog {
})
]),
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
id: 'cm-nodeinfo-button',
type: "button",
textContent: "Nodes Info",
onclick: () => { window.open("https://ltdrdata.github.io/", "comfyui-node-info"); }
}),
$el("br", {}, []),
];
var textarea = document.createElement("div");
@ -1249,31 +1252,23 @@ class ManagerMenuDialog extends ComfyDialog {
constructor() {
super();
const close_button = $el("button", { id: "cm-close-button", type: "button", textContent: "Close", onclick: () => this.close() });
const content = $el("div.cm-menu-container",
[
$el("div.cm-menu-column.gap-2", [...this.createControlsLeft()]),
$el("div.cm-menu-column.gap-2", [...this.createControlsMid()]),
$el("div.cm-menu-column.gap-2", [...this.createControlsRight()])
]
);
const content =
$el("div.comfy-modal-content",
[
$el("tr.cm-title", {}, [
$el("font", {size:6, color:"white"}, [`ComfyUI Manager ${manager_version}`])]
),
$el("br", {}, []),
$el("div.cm-menu-container",
[
$el("div.cm-menu-column", [...this.createControlsLeft()]),
$el("div.cm-menu-column", [...this.createControlsMid()]),
$el("div.cm-menu-column", [...this.createControlsRight()])
]),
const frame = buildGuiFrame(
'cm-manager-dialog', // dialog id
`ComfyUI Manager ${manager_version}`, // dialog title
"i.mdi.mdi-puzzle", // dialog icon class to show before title
content, // dialog content element
this
); // send this so we can attach close functions
$el("br", {}, []),
close_button,
]
);
content.style.width = '100%';
content.style.height = '100%';
this.element = $el("div.comfy-modal", { id:'cm-manager-dialog', parent: document.body }, [ content ]);
this.element = frame;
}
get isVisible() {
@ -1281,7 +1276,7 @@ class ManagerMenuDialog extends ComfyDialog {
}
show() {
this.element.style.display = "block";
this.element.style.display = "flex";
}
toggleVisibility() {

View File

@ -1,8 +1,9 @@
.cn-manager {
--grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
z-index: 1099;
width: 80%;
height: 80%;
width: 80vw;
height: 75vh;
min-height: 30em;
display: flex;
flex-direction: column;
gap: 10px;
@ -10,6 +11,7 @@
font-family: arial, sans-serif;
text-underline-offset: 3px;
outline: none;
margin: calc(var(--spacing)*2);
}
.cn-manager .cn-flex-auto {
@ -17,17 +19,21 @@
}
.cn-manager button {
width: auto;
position: relative;
overflow: hidden;
font-size: 16px;
color: var(--input-text);
background-color: var(--comfy-input-bg);
border-radius: 8px;
border-color: var(--border-color);
border-style: solid;
margin: 0;
padding: 4px 8px;
min-width: 100px;
}
.cn-manager button:hover {
filter: brightness(125%);
}
.cn-manager button:disabled,
.cn-manager input:disabled,
.cn-manager select:disabled {
@ -40,8 +46,13 @@
.cn-manager .cn-manager-restart {
display: none;
background-color: #500000;
color: white;
background-color: #500000 !important;
border-color: #88181b !important;
color: white !important;
}
.cn-manager .cn-manager-restart:hover {
background-color: #88181b !important;
}
.cn-manager .cn-manager-stop {
@ -79,7 +90,6 @@
flex-wrap: wrap;
gap: 5px;
align-items: center;
padding: 0 5px;
}
.cn-manager-header label {
@ -91,16 +101,32 @@
.cn-manager-filter {
height: 28px;
line-height: 28px;
cursor: pointer;
padding: 0.5em 0.5em;
border: 1px solid var(--border-color);
border-radius: 6px;
background: var(--comfy-input-bg);
}
.cn-manager-filter:hover {
filter: brightness(125%);
}
.cn-manager-keywords {
height: 28px;
line-height: 28px;
padding: 0 5px 0 26px;
background: var(--comfy-input-bg);
background-size: 16px;
background-position: 5px center;
background-repeat: no-repeat;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20pointer-events%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22none%22%20stroke%3D%22%23888%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%222%22%20d%3D%22m21%2021-4.486-4.494M19%2010.5a8.5%208.5%200%201%201-17%200%208.5%208.5%200%200%201%2017%200%22%2F%3E%3C%2Fsvg%3E");
border: 1px solid var(--border-color);
border-radius: 6px;
outline-color: transparent;
}
.cn-manager-status {
@ -588,6 +614,10 @@
height: 100%;
}
.cn-install-buttons button {
padding: 4px 8px;
}
.cn-selected-buttons {
display: flex;
gap: 5px;

View File

@ -1,6 +1,7 @@
import { app } from "../../scripts/app.js";
import { ComfyDialog, $el } from "../../scripts/ui.js";
import { api } from "../../scripts/api.js";
import { buildGuiFrameCustomHeader, createSettingsCombo } from "./comfyui-gui-builder.js";
import {
manager_instance, rebootAPI, install_via_git_url,
@ -18,32 +19,19 @@ loadCss("./custom-nodes-manager.css");
const gridId = "node";
const pageHtml = `
<div class="cn-manager-header">
<label>Filter
<select class="cn-manager-filter"></select>
</label>
<input class="cn-manager-keywords" type="search" placeholder="Search" />
<div class="cn-manager-status"></div>
<div class="cn-flex-auto"></div>
<div class="cn-manager-channel"></div>
</div>
<div class="cn-manager-grid"></div>
<div class="cn-manager-selection"></div>
<div class="cn-manager-message"></div>
<div class="cn-manager-footer">
<button class="cn-manager-back">
<svg class="arrow-icon" width="14" height="14" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 8H18M2 8L8 2M2 8L8 14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
Back
</button>
<button class="cn-manager-restart">Restart</button>
<button class="cn-manager-stop">Stop</button>
<div class="cn-flex-auto"></div>
<button class="cn-manager-used-in-workflow">Used In Workflow</button>
<button class="cn-manager-check-update">Check Update</button>
<button class="cn-manager-check-missing">Check Missing</button>
<button class="cn-manager-install-url">Install via Git URL</button>
<div class="cn-manager cn-manager-dark">
<div class="cn-manager-grid"></div>
<div class="cn-manager-selection"></div>
<div class="cn-manager-message"></div>
<div class="cn-manager-footer">
<button class="cn-manager-restart p-button p-component">Restart</button>
<button class="cn-manager-stop p-button p-component">Stop</button>
<div class="cn-flex-auto"></div>
<button class="cn-manager-used-in-workflow p-button p-component">Used In Workflow</button>
<button class="cn-manager-check-update p-button p-component">Check Update</button>
<button class="cn-manager-check-missing p-button p-component">Check Missing</button>
<button class="cn-manager-install-url p-button p-component">Install via Git URL</button>
</div>
</div>
`;
@ -89,11 +77,26 @@ export class CustomNodesManager {
}
init() {
this.element = $el("div", {
parent: document.body,
className: "comfy-modal cn-manager"
});
this.element.innerHTML = pageHtml;
const header = $el("div.cn-manager-header.px-2", {}, [
// $el("label", {}, [
// $el("span", { textContent: "Filter" }),
// $el("select.cn-manager-filter")
// ]),
createSettingsCombo("Filter", $el("select.cn-manager-filter")),
$el("input.cn-manager-keywords.p-inputtext.p-component", { type: "search", placeholder: "Search" }),
$el("div.cn-manager-status"),
$el("div.cn-flex-auto"),
$el("div.cn-manager-channel")
]);
const frame = buildGuiFrameCustomHeader(
'cn-manager-dialog', // dialog id
header, // custom header element
pageHtml, // dialog content element
this
); // send this so we can attach close functions
this.element = frame;
this.element.setAttribute("tabindex", 0);
this.element.focus();
@ -372,7 +375,7 @@ export class CustomNodesManager {
return list.map(id => {
const bt = buttons[id];
return `<button class="cn-btn-${id}" group="${action}" mode="${bt.mode}">${bt.label}</button>`;
return `<button class="cn-btn-${id} p-button p-component" group="${action}" mode="${bt.mode}">${bt.label}</button>`;
}).join("");
}
@ -655,7 +658,6 @@ export class CustomNodesManager {
}
renderGrid() {
// update theme
const globalStyle = window.getComputedStyle(document.body);
this.colorVars = {

View File

@ -1,13 +1,15 @@
.cmm-manager {
--grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
z-index: 1099;
width: 80%;
height: 80%;
width: 80vw;
height: 75vh;
min-height: 30em;
display: flex;
flex-direction: column;
gap: 10px;
color: var(--fg-color);
font-family: arial, sans-serif;
margin: calc(var(--spacing)*2);
}
.cmm-manager .cmm-flex-auto {
@ -18,14 +20,15 @@
font-size: 16px;
color: var(--input-text);
background-color: var(--comfy-input-bg);
border-radius: 8px;
border-color: var(--border-color);
border-style: solid;
margin: 0;
padding: 4px 8px;
min-width: 100px;
}
.cmm-manager button:hover {
filter: brightness(125%);
}
.cmm-manager button:disabled,
.cmm-manager input:disabled,
.cmm-manager select:disabled {
@ -38,7 +41,7 @@
.cmm-manager .cmm-manager-refresh {
display: none;
background-color: #000080;
background-color: #000080 !important;
color: white;
}
@ -53,7 +56,6 @@
flex-wrap: wrap;
gap: 5px;
align-items: center;
padding: 0 5px;
}
.cmm-manager-header label {
@ -67,16 +69,34 @@
.cmm-manager-filter {
height: 28px;
line-height: 28px;
cursor: pointer;
padding: 0.5em 0.5em;
border: 1px solid var(--border-color);
border-radius: 6px;
background: var(--comfy-input-bg);
}
.cmm-manager-type:hover,
.cmm-manager-base:hover,
.cmm-manager-filter:hover {
filter: brightness(125%);
}
.cmm-manager-keywords {
height: 28px;
line-height: 28px;
padding: 0 5px 0 26px;
background: var(--comfy-input-bg);
background-size: 16px;
background-position: 5px center;
background-repeat: no-repeat;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20pointer-events%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22none%22%20stroke%3D%22%23888%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%222%22%20d%3D%22m21%2021-4.486-4.494M19%2010.5a8.5%208.5%200%201%201-17%200%208.5%208.5%200%200%201%2017%200%22%2F%3E%3C%2Fsvg%3E");
border: 1px solid var(--border-color);
border-radius: 6px;
outline-color: transparent;
}
.cmm-manager-status {
@ -148,6 +168,10 @@
color: white;
}
.cmm-btn-install {
padding: 4px 8px;
}
.cmm-btn-download {
width: 18px;
height: 18px;

View File

@ -9,39 +9,22 @@ import { api } from "../../scripts/api.js";
// https://cenfun.github.io/turbogrid/api.html
import TG from "./turbogrid.esm.js";
import { buildGuiFrameCustomHeader, createSettingsCombo } from "./comfyui-gui-builder.js";
loadCss("./model-manager.css");
const gridId = "model";
const pageHtml = `
<div class="cmm-manager-header">
<label>Filter
<select class="cmm-manager-filter"></select>
</label>
<label>Type
<select class="cmm-manager-type"></select>
</label>
<label>Base
<select class="cmm-manager-base"></select>
</label>
<input class="cmm-manager-keywords" type="search" placeholder="Search" />
<div class="cmm-manager-status"></div>
<div class="cmm-flex-auto"></div>
</div>
<div class="cmm-manager-grid"></div>
<div class="cmm-manager-selection"></div>
<div class="cmm-manager-message"></div>
<div class="cmm-manager-footer">
<button class="cmm-manager-back">
<svg class="arrow-icon" width="14" height="14" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 8H18M2 8L8 2M2 8L8 14" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
Back
</button>
<button class="cmm-manager-refresh">Refresh</button>
<button class="cmm-manager-stop">Stop</button>
<div class="cmm-flex-auto"></div>
<div class="cmm-manager cmm-manager-dark">
<div class="cmm-manager-grid"></div>
<div class="cmm-manager-selection"></div>
<div class="cmm-manager-message"></div>
<div class="cmm-manager-footer">
<button class="cmm-manager-refresh p-button p-component">Refresh</button>
<button class="cmm-manager-stop p-button p-component">Stop</button>
<div class="cmm-flex-auto"></div>
</div>
</div>
`;
@ -64,11 +47,23 @@ export class ModelManager {
}
init() {
this.element = $el("div", {
parent: document.body,
className: "comfy-modal cmm-manager"
});
this.element.innerHTML = pageHtml;
const header = $el("div.cmm-manager-header", {}, [
createSettingsCombo("Filter", $el("select.cmm-manager-filter")),
createSettingsCombo("Type", $el("select.cmm-manager-type")),
createSettingsCombo("Base", $el("select.cmm-manager-base")),
$el("input.cmm-manager-keywords.p-inputtext.p-component", { type: "search", placeholder: "Search" }),
$el("div.cmm-manager-status"),
$el("div.cmm-flex-auto")
]);
const frame = buildGuiFrameCustomHeader(
'cmm-manager-dialog', // dialog id
header, // custom header element
pageHtml, // dialog content element
this
); // send this so we can attach close functions
this.element = frame;
this.initFilter();
this.bindEvents();
this.initGrid();
@ -347,7 +342,7 @@ export class ModelManager {
if (installed === "True") {
return `<div class="cmm-icon-passed">${icons.passed}</div>`;
}
return `<button class="cmm-btn-install" mode="install">Install</button>`;
return `<button class="cmm-btn-install p-button p-component" mode="install">Install</button>`;
}
}, {
id: 'url',
@ -420,7 +415,7 @@ export class ModelManager {
}
this.selectedModels = selectedList;
this.showSelection(`<span>Selected <b>${selectedList.length}</b> models <button class="cmm-btn-install" mode="install">Install</button>`);
this.showSelection(`<span>Selected <b>${selectedList.length}</b> models <button class="cmm-btn-install p-button p-component" mode="install">Install</button>`);
}
focusInstall(item) {

65
js/snapshot.css Normal file
View File

@ -0,0 +1,65 @@
.snapshot-manager {
--grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
z-index: 1099;
width: 80vw;
height: 75vh;
min-height: 30em;
display: flex;
flex-direction: column;
gap: 10px;
color: var(--fg-color);
font-family: arial, sans-serif;
text-underline-offset: 3px;
outline: none;
margin: calc(var(--spacing)*2);
}
.snapshot-manager button {
width: auto;
position: relative;
overflow: hidden;
font-size: 16px;
color: var(--input-text);
background-color: var(--comfy-input-bg);
border-color: var(--border-color);
margin: 0;
min-width: 100px;
padding: 4px 8px;
}
.snapshot-manager .snapshot-restore-btn {
background-color: #00158f !important;
border-color: #2025b9 !important;
color: white !important;
}
.snapshot-manager .snapshot-remove-btn {
background-color: #970000 !important;
border-color: #be2127 !important;
color: white !important;
}
.snapshot-manager button:hover {
filter: brightness(125%);
}
.snapshot-manager .data-btns {
display: flex;
flex-direction: column;
gap: calc(var(--spacing)*2);
padding: calc(var(--spacing)*2);
align-items: center;
justify-content: center;
height: 100%;
}
.snapshot-footer {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
}
.snapshot-manager .cn-flex-auto {
flex: auto;
}

View File

@ -1,8 +1,10 @@
import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js"
import { ComfyDialog, $el } from "../../scripts/ui.js";
import { manager_instance, rebootAPI, show_message, handle403Response } from "./common.js";
import { manager_instance, rebootAPI, show_message, handle403Response, loadCss } from "./common.js";
import { buildGuiFrame } from "./comfyui-gui-builder.js";
loadCss("./snapshot.css");
async function restore_snapshot(target) {
if(SnapshotManager.instance) {
@ -27,7 +29,7 @@ async function restore_snapshot(target) {
}
finally {
await SnapshotManager.instance.invalidateControl();
SnapshotManager.instance.updateMessage("<BR>To apply the snapshot, please <button id='cm-reboot-button2' class='cm-small-button'>RESTART</button> ComfyUI. And refresh browser.", 'cm-reboot-button2');
SnapshotManager.instance.updateMessage("<BR>To apply the snapshot, please <button id='cm-reboot-button2' class='p-button p-component'>RESTART</button> ComfyUI. And refresh browser.", 'cm-reboot-button2');
}
}
}
@ -88,6 +90,8 @@ export class SnapshotManager extends ComfyDialog {
message_box = null;
data = null;
content = $el("div.snapshot-manager");
clear() {
this.restore_buttons = [];
this.message_box = null;
@ -96,9 +100,18 @@ export class SnapshotManager extends ComfyDialog {
constructor(app, manager_dialog) {
super();
this.manager_dialog = manager_dialog;
// this.manager_dialog = manager_dialog;
this.search_keyword = '';
this.element = $el("div.comfy-modal", { parent: document.body }, []);
const frame = buildGuiFrame(
'snapshot-manager-dialog', // dialog id
'Snapshot Manager', // title
'i.mdi.mdi-puzzle', // icon class
this.content, // dialog content element
this
); // send this so we can attach close functions
this.element = frame;
}
async remove_item() {
@ -109,7 +122,7 @@ export class SnapshotManager extends ComfyDialog {
createControls() {
return [
$el("button.cm-small-button", {
$el("button.p-button.p-component", {
type: "button",
textContent: "Close",
onclick: () => { this.close(); }
@ -132,8 +145,8 @@ export class SnapshotManager extends ComfyDialog {
this.clear();
this.data = (await getSnapshotList()).items;
while (this.element.children.length) {
this.element.removeChild(this.element.children[0]);
while (this.content.children.length) {
this.content.removeChild(this.content.children[0]);
}
await this.createGrid();
@ -204,20 +217,21 @@ export class SnapshotManager extends ComfyDialog {
data2.innerHTML = `&nbsp;${data}`;
var data_button = document.createElement('td');
data_button.style.textAlign = "center";
data_button.className = "data-btns";
var restoreBtn = document.createElement('button');
restoreBtn.className = "snapshot-restore-btn p-button p-component";
restoreBtn.innerHTML = 'Restore';
restoreBtn.style.width = "100px";
restoreBtn.style.backgroundColor = 'blue';
restoreBtn.addEventListener('click', function() {
restore_snapshot(data);
});
var removeBtn = document.createElement('button');
removeBtn.className = "snapshot-remove-btn p-button p-component";
removeBtn.innerHTML = 'Remove';
removeBtn.style.width = "100px";
removeBtn.style.backgroundColor = 'red';
removeBtn.addEventListener('click', function() {
remove_snapshot(data);
@ -241,13 +255,14 @@ export class SnapshotManager extends ComfyDialog {
let self = this;
const panel = document.createElement('div');
panel.style.width = "100%";
panel.style.height = "100%";
panel.appendChild(grid);
function handleResize() {
const parentHeight = self.element.clientHeight;
const gridHeight = parentHeight - 200;
grid.style.height = gridHeight + "px";
// grid.style.height = gridHeight + "px";
}
window.addEventListener("resize", handleResize);
@ -256,25 +271,17 @@ export class SnapshotManager extends ComfyDialog {
grid.style.width = "100%";
grid.style.height = "100%";
grid.style.overflowY = "scroll";
this.element.style.height = "85%";
this.element.style.width = "80%";
this.element.appendChild(panel);
this.content.appendChild(panel);
handleResize();
}
async createBottomControls() {
var close_button = document.createElement("button");
close_button.className = "cm-small-button";
close_button.innerHTML = "Close";
close_button.onclick = () => { this.close(); }
close_button.style.display = "inline-block";
var save_button = document.createElement("button");
save_button.className = "cm-small-button";
save_button.className = "p-button p-component";
save_button.innerHTML = "Save snapshot";
save_button.onclick = () => { save_current_snapshot(); }
save_button.style.display = "inline-block";
save_button.style.horizontalAlign = "right";
save_button.style.width = "170px";
@ -282,15 +289,19 @@ export class SnapshotManager extends ComfyDialog {
this.message_box.style.height = '60px';
this.message_box.style.verticalAlign = 'middle';
this.element.appendChild(this.message_box);
this.element.appendChild(close_button);
this.element.appendChild(save_button);
const footer = $el("div.snapshot-footer");
const spacer = $el("div.cn-flex-auto");
footer.appendChild(spacer);
footer.appendChild(save_button);
this.content.appendChild(this.message_box);
this.content.appendChild(footer);
}
async show() {
try {
this.invalidateControl();
this.element.style.display = "block";
this.element.style.display = "flex";
this.element.style.zIndex = 1099;
}
catch(exception) {

View File

@ -1,5 +1,155 @@
{
"custom_nodes": [
{
"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": "tardey07",
"title": "ComfyUI-PT-TTM",
"reference": "https://github.com/tardey07/ComfyUI-PT-TTM",
"files": [
"https://github.com/tardey07/ComfyUI-PT-TTM"
],
"install_type": "git-clone",
"description": "This application provides a user-friendly interface for easy comfort. (Description by CC)"
},
{
"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 renderingEdit images using natural language instructions..\nNOTE: The files in the repo are not organized."
},
{
"author": "saltchicken",
"title": "ComfyUI-Identity-Mixer",

View File

@ -2581,6 +2581,14 @@
"title_aux": "comfyui_LK_selfuse"
}
],
"https://github.com/LMietkiewicz/HiggsfieldAPI_Node": [
[
"HiggsfieldAPI"
],
{
"title_aux": "HiggsfieldAPI_Node"
}
],
"https://github.com/LSDJesus/ComfyUI-Luna-Collection": [
[
"LunaBatchPromptExtractor",
@ -2611,6 +2619,7 @@
"LunaModelRouter",
"LunaMultiSaver",
"LunaOptimizedWeightsManager",
"LunaPipeExpander",
"LunaPromptCraft",
"LunaPromptCraftDebug",
"LunaSecondaryModelLoader",
@ -4006,6 +4015,17 @@
"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"
@ -4419,6 +4439,17 @@
"title_aux": "ComfyUI_Remaker_FaceSwap"
}
],
"https://github.com/Spicely/ComfyUI-Luma": [
[
"AddVideoTextWatermark",
"GetDeviceType",
"SeparateVideoAudio",
"Wav2Srt"
],
{
"title_aux": "[WIP] ComfyUI-Luma"
}
],
"https://github.com/Stable-X/ComfyUI-Hi3DGen": [
[
"DifferenceExtractorNode",
@ -5822,6 +5853,15 @@
"title_aux": "BigModelPipe [WIP]"
}
],
"https://github.com/baoanhng/ComfyUI-utils": [
[
"TextJoiner",
"TextSplitter"
],
{
"title_aux": "ComfyUI-utils"
}
],
"https://github.com/barakapa/barakapa-nodes": [
[
"brkp_ConcatenateString",
@ -7291,6 +7331,15 @@
"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"
@ -8129,6 +8178,7 @@
[
"HolafBypasser",
"HolafGroupBypasser",
"HolafImageBatchSlice",
"HolafImageComparer",
"HolafInstagramResize",
"HolafKSampler",
@ -8141,6 +8191,7 @@
"HolafRemote",
"HolafResolutionPreset",
"HolafSaveImage",
"HolafSaveVideo",
"HolafShortcut",
"HolafShortcutUser",
"HolafTiledKSampler",
@ -8859,6 +8910,17 @@
"title_aux": "ComfyUI-AliCloud-Bailian [WIP]"
}
],
"https://github.com/jinchanz/ComfyUI-Midjourney": [
[
"MidjourneyAPI",
"MidjourneyAPIPoll",
"MidjourneyAPISubmit",
"MidjourneyJSONExtractor"
],
{
"title_aux": "ComfyUI-Midjourney"
}
],
"https://github.com/jn-jairo/jn_node_suite_comfyui": [
[
"JN_AreaInfo",
@ -9663,7 +9725,6 @@
"MaskToSAMCoordsV2",
"MorseCode",
"PoseReformer",
"SaveITAsZip",
"SaveImageAsZip",
"SaveTextAsZip",
"StrFormat",
@ -9739,6 +9800,28 @@
"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",
@ -11170,6 +11253,15 @@
"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",
@ -11524,6 +11616,15 @@
"title_aux": "ComfyUI-Identity-Mixer"
}
],
"https://github.com/saltchicken/ComfyUI-Local-Loader": [
[
"LoadImageFromDir",
"LoadImageFromPath"
],
{
"title_aux": "ComfyUI-Local-Loader"
}
],
"https://github.com/saltchicken/ComfyUI-Prompter": [
[
"CustomizablePromptGenerator"
@ -11532,6 +11633,14 @@
"title_aux": "ComfyUI-Prompter"
}
],
"https://github.com/satyasairazole/ComfyUI-Turbandetection": [
[
"TurbanDetectorNode"
],
{
"title_aux": "ComfyUI-Turbandetection [WIP]"
}
],
"https://github.com/saulchiu/comfy_saul_plugin": [
[
"Blend Images",
@ -11969,6 +12078,39 @@
"title_aux": "comfyui-lingshang"
}
],
"https://github.com/stalkervr/ComfyUI-StalkerVr": [
[
"AnyCollector",
"ImageAspectRatioFixer",
"ImageBatchCrop",
"ImageGridCropper",
"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",
@ -12011,6 +12153,16 @@
"title_aux": "ComfyUI-Audio-Subtitle [WIP]"
}
],
"https://github.com/starsFriday/ComfyUI-LongCat-Image": [
[
"LongCatImageEdit",
"LongCatImageModelLoader",
"LongCatImageTextToImage"
],
{
"title_aux": "ComfyUI-LongCat-Image [WIP]"
}
],
"https://github.com/starsFriday/ComfyUI-Tracker-Person": [
[
"YoloTrackNode"
@ -12206,6 +12358,14 @@
"title_aux": "comfyuiCustomNode"
}
],
"https://github.com/tardey07/ComfyUI-PT-TTM": [
[
"PT_TTM"
],
{
"title_aux": "ComfyUI-PT-TTM"
}
],
"https://github.com/tc888/ComfyUI_Save_Flux_Image": [
[
"Cfg Literal",
@ -12548,6 +12708,23 @@
"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/umisetokikaze/comfyui_mergekit": [
[
"DefineSaveName",
@ -13066,6 +13243,16 @@
"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",

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,105 @@
{
"custom_nodes": [
{
"author": "SanDiegoDude",
"title": "SCG_LocalVLM",
"reference": "https://github.com/SanDiegoDude/SCG_LocalVLM",
"files": [
"https://github.com/SanDiegoDude/SCG_LocalVLM"
],
"install_type": "git-clone",
"description": "This is an implementation of [Qwen3-VL](https://github.com/QwenLM/Qwen3-VL) for [ComfyUI](https://github.com/comfyanonymous/ComfyUI), which supports for text-based and single-image queries."
},
{
"author": "HM-RunningHub",
"title": "ComfyUI_RH_QwenImageI2L",
"reference": "https://github.com/HM-RunningHub/ComfyUI_RH_QwenImageI2L",
"files": [
"https://github.com/HM-RunningHub/ComfyUI_RH_QwenImageI2L"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node that generates Image-to-LoRA (I2L) LoRA from training images using DiffSynth-Studio Qwen-Image i2L pipelines."
},
{
"author": "ckinpdx",
"title": "comfyui-humo-audio-motion",
"reference": "https://github.com/ckinpdx/comfyui-humo-audio-motion",
"files": [
"https://github.com/ckinpdx/comfyui-humo-audio-motion"
],
"install_type": "git-clone",
"description": "ComfyUI custom node for granular Q/K/V/O attention boosting in HuMo models. Provides 12 independent controls for fine-tuning audio-driven motion response."
},
{
"author": "flybirdxx",
"title": "ComfyUI-Prompt_Helper",
"reference": "https://github.com/flybirdxx/ComfyUI-Prompt_Helper",
"files": [
"https://github.com/flybirdxx/ComfyUI-Prompt_Helper"
],
"install_type": "git-clone",
"description": "ComfyUI node that loads Qwen3-4B locally and expands short prompts into detailed, image-generation-friendly descriptions via GGUF. (Description by CC)"
},
{
"author": "Sean-Bradley",
"title": "ComfyUI-Get-Line",
"reference": "https://github.com/Sean-Bradley/ComfyUI-Get-Line",
"files": [
"https://github.com/Sean-Bradley/ComfyUI-Get-Line"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node used to get one line of string from a multi line string. Search in the manager for `get line`, or `getline` or `get-line`."
},
{
"author": "GavChap",
"title": "ComfyUI_ExtractLora",
"reference": "https://github.com/GavChap/ComfyUI_ExtractLora",
"files": [
"https://github.com/GavChap/ComfyUI_ExtractLora"
],
"install_type": "git-clone",
"description": "Creates lora from two checkpoints by extracting the difference."
},
{
"author": "ssspace1",
"title": "SSpack_ComfyUI",
"reference": "https://github.com/ssspace1/SSpack_ComfyUI",
"files": [
"https://github.com/ssspace1/SSpack_ComfyUI"
],
"install_type": "git-clone",
"description": "Compact, UI-friendly nodes for ComfyUI with LoRA/checkpoint selectors with thumbnails, text utilities, image helpers, and a lightweight cache cleaner script."
},
{
"author": "logicalor",
"title": "comfyui_text_to_pose",
"reference": "https://github.com/logicalor/comfyui_text_to_pose",
"files": [
"https://github.com/logicalor/comfyui_text_to_pose"
],
"install_type": "git-clone",
"description": "Generate human poses from text descriptions using T2P Transformer for ControlNet/T2I-Adapter workflows"
},
{
"author": "kijai",
"title": "ComfyUI-SCAIL-Pose",
"reference": "https://github.com/kijai/ComfyUI-SCAIL-Pose",
"files": [
"https://github.com/kijai/ComfyUI-SCAIL-Pose"
],
"install_type": "git-clone",
"description": "ComfyUI nodes for SCAIL input processing"
},
{
"author": "ShammiG",
"title": "ComfyUI-Show_Any_Text_in_CMD_Console-SG",
"reference": "https://github.com/ShammiG/ComfyUI-Show_Any_Text_in_CMD_Console-SG",
"files": [
"https://github.com/ShammiG/ComfyUI-Show_Any_Text_in_CMD_Console-SG"
],
"install_type": "git-clone",
"description": "Simple node to show ANY output text in the CMD console with color options"
},
{
"author": "ubisoft",
"title": "ComfyUI-Chord",
@ -597,106 +697,6 @@
],
"install_type": "git-clone",
"description": "A collection of helper nodes for working with LLM APIs in ComfyUI, intended to complement other LLM custom nodes."
},
{
"author": "febogallo",
"title": "ComfyUI-Freepik",
"reference": "https://github.com/febogallo/ComfyUI-Freepik",
"files": [
"https://github.com/febogallo/ComfyUI-Freepik"
],
"install_type": "git-clone",
"description": "Integrates Freepik's AI capabilities into ComfyUI workflows with features for photorealistic generation, upscaling, and background removal, plus smart caching and cost management. (Description by CC)"
},
{
"author": "karas17",
"title": "comfyui_GLM_TTS",
"reference": "https://github.com/karas17/comfyui_GLM_TTS",
"files": [
"https://github.com/karas17/comfyui_GLM_TTS"
],
"install_type": "git-clone",
"description": "ComfyUI nodes for GLM-TTS, a high-quality text-to-speech system supporting zero-shot voice cloning."
},
{
"author": "pantaleone-ai",
"title": "Comfy-Firefly",
"reference": "https://github.com/pantaleone-ai/Comfy-Firefly",
"files": [
"https://github.com/pantaleone-ai/Comfy-Firefly"
],
"install_type": "git-clone",
"description": "Custom ComfyUI node for generating images using Adobe Firefly Services API v3 with automatic authentication and standard tensor output."
},
{
"author": "NOLABEL-VFX",
"title": "ComfyUI-NL_Nodes",
"reference": "https://github.com/NOLABEL-VFX/ComfyUI-NL_Nodes",
"files": [
"https://github.com/NOLABEL-VFX/ComfyUI-NL_Nodes"
],
"install_type": "git-clone",
"description": "Custom ComfyUI nodes by NOLABEL for studio workflows, featuring Shot Path Builder that generates standardized, sanitized file and folder names with versioning for renders."
},
{
"author": "ARM64-EC",
"title": "ComfyUI-LongCatPlugin",
"reference": "https://github.com/ARM64-EC/ComfyUI-LongCatPlugin",
"files": [
"https://github.com/ARM64-EC/ComfyUI-LongCatPlugin"
],
"install_type": "git-clone",
"description": "ComfyUI nodes wrapping LongCat image generation and editing pipelines with text-to-image and multi-image edit flows using diffusers framework. (Description by CC)"
},
{
"author": "fabbarix",
"title": "comfyui-promptstore",
"reference": "https://github.com/fabbarix/comfyui-promptstore",
"files": [
"https://github.com/fabbarix/comfyui-promptstore"
],
"install_type": "git-clone",
"description": "Custom node system for ComfyUI enabling efficient prompt management with YAML-based datastore, categories, selection interface, and dynamic text interpolation for creating complex prompts."
},
{
"author": "hubo502",
"title": "ComfyUI-Env-Loader",
"reference": "https://github.com/hubo502/ComfyUI-Env-Loader",
"files": [
"https://github.com/hubo502/ComfyUI-Env-Loader"
],
"install_type": "git-clone",
"description": "ComfyUI custom node set that reads .env files at startup and provides dropdown selection or dynamic multi-port output for environment variable access in workflows. (Description by CC)"
},
{
"author": "BobRandomNumber",
"title": "ComfyUI-BasicOllama",
"reference": "https://github.com/BobRandomNumber/ComfyUI-BasicOllama",
"files": [
"https://github.com/BobRandomNumber/ComfyUI-BasicOllama"
],
"install_type": "git-clone",
"description": "A simplified node that provides access to Ollama. It allows you to send prompts, system prompts, and images to your Ollama instance and receive text-based responses."
},
{
"author": "jonstreeter",
"title": "comfyui-Lora-Tag-Power-Loader",
"reference": "https://github.com/jonstreeter/comfyui-Lora-Tag-Power-Loader",
"files": [
"https://github.com/jonstreeter/comfyui-Lora-Tag-Power-Loader"
],
"install_type": "git-clone",
"description": "A powerful ComfyUI custom node that combines text-based LoRA tag detection with advanced dual noise weight support, perfect for WanVideo/Hunyuan Video workflows."
},
{
"author": "KAVVATARE",
"title": "ComfyUI_SimpleGoogleTranslate",
"reference": "https://github.com/KAVVATARE/ComfyUI_SimpleGoogleTranslate",
"files": [
"https://github.com/KAVVATARE/ComfyUI_SimpleGoogleTranslate"
],
"install_type": "git-clone",
"description": "Minimal and easy-to-use Google Translate text node for ComfyUI using the googletrans library with automatic language detection and full language support. (Description by CC)"
}
]
}

View File

@ -2250,6 +2250,7 @@
"ForceDetectPixelateScale",
"ImageScaleDownByFactor",
"ImageUpscaleByInt",
"ImagesToRGB",
"NearestImageScaleDown",
"PixelUpscale2Target",
"RemoveBackgroundPixel",
@ -2934,6 +2935,7 @@
"https://github.com/Aryan185/ComfyUI-VertexAPI": [
[
"GeminiChatVertexNode",
"GeminiDiarisationNode",
"GeminiSegmentationVertexNode",
"GeminiTTSVertexNode",
"GoogleImagenEditNode",
@ -7965,6 +7967,14 @@
"title_aux": "ComfyUI-SD3LatentSelectRes"
}
],
"https://github.com/GavChap/ComfyUI_ExtractLora": [
[
"ExtractLoRA"
],
{
"title_aux": "ComfyUI_ExtractLora"
}
],
"https://github.com/GeekatplayStudio/ComfyUI-Text2Speech": [
[
"HttpTTSToAudio",
@ -8529,6 +8539,16 @@
"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"
@ -11259,7 +11279,6 @@
"LG_InstallDependencies",
"LG_LatentBatchToList",
"LG_LoadImage",
"LG_LoadImage_V2",
"LG_MaskBatchMerge",
"LG_MaskHoleFiller",
"LG_Noise",
@ -11378,6 +11397,7 @@
"Texturaizer_ApplyStyleToPrompt",
"Texturaizer_CachedCNLoader",
"Texturaizer_CachedCheckpointLoader",
"Texturaizer_CircularVAEDecode",
"Texturaizer_ClipEncodeSwitchVersion",
"Texturaizer_CombinedConditioningFromColors",
"Texturaizer_ExtractCNData",
@ -11402,11 +11422,13 @@
"Texturaizer_KSamplerAdvanced",
"Texturaizer_Placeholder",
"Texturaizer_PowerLoraLoader",
"Texturaizer_SeamlessTilingPatch",
"Texturaizer_SendImage",
"Texturaizer_SetGlobalDir",
"Texturaizer_SigmasSelector",
"Texturaizer_SwitchAny",
"Texturaizer_SwitchLazy",
"Texturaizer_SwitchSmart",
"Texturaizer_UseSDXL"
],
{
@ -14612,6 +14634,7 @@
],
"https://github.com/PozzettiAndrea/ComfyUI-GeometryPack": [
[
"GeomPackAddNormalsToPointCloud",
"GeomPackBackdraftView",
"GeomPackBooleanOp",
"GeomPackCheckNormals",
@ -14637,6 +14660,7 @@
"GeomPackMeshQuality",
"GeomPackMeshToMeshDistance",
"GeomPackMeshToPointCloud",
"GeomPackNormalizeMeshToBBox",
"GeomPackPointToMeshDistance",
"GeomPackPreviewMesh",
"GeomPackPreviewMeshDual",
@ -15323,6 +15347,7 @@
"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",
@ -15365,20 +15390,27 @@
"Runware Refiner",
"Runware Runway Provider Settings",
"Runware Safety Inputs",
"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 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",
"RunwareAlibabaProviderSettings",
"RunwareAudioInferenceInputs",
"RunwareAudioInput",
"RunwareAudioInputCombine",
"RunwareBriaProviderSettings",
"RunwareBytedanceProviderSettings",
"RunwareFrameImages",
@ -15391,6 +15423,10 @@
"RunwarePixverseProviderSettings",
"RunwareRunwayProviderSettings",
"RunwareSafetyInputs",
"RunwareSpeechInput",
"RunwareSpeechInputCombine",
"RunwareSyncProviderSettings",
"RunwareSyncSegment",
"RunwareVectorize",
"RunwareVideoAdvancedFeatureInputs",
"RunwareVideoBgRemoval",
@ -15849,6 +15885,17 @@
"title_aux": "ComfyUI-SaveAudioMP3"
}
],
"https://github.com/SanDiegoDude/SCG_LocalVLM": [
[
"Qwen",
"Qwen2.5",
"Qwen2.5VL",
"QwenVL"
],
{
"title_aux": "SCG_LocalVLM"
}
],
"https://github.com/Santat2023/ComfyUiRagNodes": [
[
"MyNodesForDB",
@ -16046,6 +16093,14 @@
"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"
@ -16308,6 +16363,14 @@
"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": [
[
"Simple Readable Metadata Text Viewer-SG",
@ -17009,6 +17072,16 @@
"title_aux": "JPG & Noise Remover for ComfyUI"
}
],
"https://github.com/SofianeAlla/ComfyUI-BespokeAI-3D": [
[
"BespokeAI3DGeneration",
"BespokeAI3DGenerationFromURL",
"BespokeAI3DPreview"
],
{
"title_aux": "ComfyUI-BespokeAI-3D"
}
],
"https://github.com/SoftMeng/ComfyUI-DeepCache-Fix": [
[
"DeepCache_Fix"
@ -17689,6 +17762,7 @@
"StarIconExporter",
"StarImageEditQwenKontext",
"StarImageLoader1by1",
"StarImageLoop",
"StarImageSwitch",
"StarImageSwitch2",
"StarInfiniteYouAdvancedPatchMaker",
@ -17734,6 +17808,7 @@
"StarTextFilter",
"StarTextInput",
"StarTextStorage",
"StarVideoLoop",
"StarWatermark",
"StarWildcardsAdvanced",
"StarWildsAdv",
@ -22076,6 +22151,7 @@
"AKSamplerSettings",
"AKSettingsOut",
"CLIPEncodeMultiple",
"CLIPTextEncodeCached",
"IndexMultiple",
"IsOneOfGroupsActive",
"PreviewRawText",
@ -22169,6 +22245,7 @@
[
"AF_Edit_Generated_Prompt",
"AF_Load_Prompt_History",
"AF_Model_Switch",
"AF_Save_Prompt_History",
"AF_Show_Text"
],
@ -25668,6 +25745,7 @@
[
"Cubemap Faces Extract",
"Cubemap To Equirectangular",
"Cubemap To Equirectangular (Flexible)",
"Equirectangular Crop 180",
"Equirectangular Crop Square",
"Equirectangular Edge Blender",
@ -25678,6 +25756,15 @@
"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 Roll Image",
"LatLong Roll Mask",
"LatLong Split Cubemap Faces",
"LatLong Stack Cubemap Faces",
"PanoramaVideoViewerNode",
"PanoramaViewerNode"
],
@ -27301,6 +27388,15 @@
"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",
@ -30896,7 +30992,8 @@
"MeuxAdvancedImageCrop",
"MeuxImageLoader",
"MeuxMultiSaveImage",
"MeuxSimpleLLMNode"
"MeuxSimpleLLMNode",
"MeuxTextAreaInput"
],
{
"title_aux": "BaiduMeux_Comfy Tools"
@ -30907,7 +31004,8 @@
"MeuxAdvancedImageCrop",
"MeuxImageLoader",
"MeuxMultiSaveImage",
"MeuxSimpleLLMNode"
"MeuxSimpleLLMNode",
"MeuxTextAreaInput"
],
{
"title_aux": "MultiSaveImage Node"
@ -31428,6 +31526,14 @@
"title_aux": "ComfyUI-hvBlockswap"
}
],
"https://github.com/flybirdxx/ComfyUI-Prompt_Helper": [
[
"QwenImageEngineer"
],
{
"title_aux": "ComfyUI-Prompt_Helper"
}
],
"https://github.com/flybirdxx/ComfyUI-RexOmni": [
[
"RexOmniDetector",
@ -36827,6 +36933,7 @@
"https://github.com/kijai/ComfyUI-KJNodes": [
[
"AddLabel",
"AddNoiseToTrackPath",
"AppendInstanceDiffusionTracking",
"AppendStringsToList",
"ApplyRifleXRoPE_HunuyanVideo",
@ -37201,6 +37308,15 @@
"title_aux": "ComfyUI PyramidFlow Wrapper"
}
],
"https://github.com/kijai/ComfyUI-SCAIL-Pose": [
[
"PoseDetectionVitPoseToDWPose",
"RenderNLFPoses"
],
{
"title_aux": "ComfyUI-SCAIL-Pose"
}
],
"https://github.com/kijai/ComfyUI-SUPIR": [
[
"SUPIR_Upscale",
@ -38992,6 +39108,18 @@
"title_aux": "Comfyui_three_js"
}
],
"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",
@ -41567,6 +41695,7 @@
"https://github.com/morino-kumasan/comfyui-toml-prompt": [
[
"CheckPointLoaderSimpleFromString",
"DropFirstImage",
"IntSelector",
"JsonExtractFloat",
"JsonExtractInt",
@ -41586,7 +41715,8 @@
"StringSelector",
"StringViewer",
"SummaryReader",
"TomlPromptDecode"
"TomlPromptDecode",
"UNETLoaderFromString"
],
{
"title_aux": "comfyui-toml-prompt"
@ -41893,7 +42023,8 @@
"ShellAgentPluginSaveAudios",
"ShellAgentPluginSaveImage",
"ShellAgentPluginSaveImages",
"ShellAgentPluginSaveVideoVHS"
"ShellAgentPluginSaveVideoVHS",
"ShellAgentPluginVideoCombineEncrypt"
],
{
"author": "MyShell",
@ -43472,8 +43603,7 @@
"RescaleCFGPost",
"SamplerGradientEstimation",
"SkipFirstStepCFG",
"TCFGAdvanced",
"VAEPadding"
"TCFGAdvanced"
],
{
"title_aux": "ComfyUI-ppm"
@ -48276,6 +48406,26 @@
"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",
@ -49287,8 +49437,11 @@
"FullPipeOut",
"ModelPresetNode",
"MultiStringConditioning",
"ResolutionSelector",
"SeedWithOverride",
"StylePresetNode",
"TagReplacementNode",
"UpscaleNode",
"WildcardNode"
],
{