mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 06:20:11 +00:00
Merge branch 'main' into deepme987/feat/missing-node-telemetry
This commit is contained in:
1
.github/workflows/release-version-bump.yaml
vendored
1
.github/workflows/release-version-bump.yaml
vendored
@@ -30,6 +30,7 @@ concurrency:
|
||||
|
||||
jobs:
|
||||
bump-version:
|
||||
if: github.repository == 'Comfy-Org/ComfyUI_frontend'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
1
.github/workflows/weekly-docs-check.yaml
vendored
1
.github/workflows/weekly-docs-check.yaml
vendored
@@ -18,6 +18,7 @@ concurrency:
|
||||
|
||||
jobs:
|
||||
docs-check:
|
||||
if: github.repository == 'Comfy-Org/ComfyUI_frontend'
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 45
|
||||
steps:
|
||||
|
||||
@@ -51,6 +51,9 @@
|
||||
# Manager
|
||||
/src/workbench/extensions/manager/ @viva-jinyi @christian-byrne @ltdrdata
|
||||
|
||||
# Model-to-node mappings (cloud team)
|
||||
/src/platform/assets/mappings/ @deepme987
|
||||
|
||||
# LLM Instructions (blank on purpose)
|
||||
.claude/
|
||||
.cursor/
|
||||
|
||||
@@ -30,6 +30,7 @@ describe('PrimitiveFloat widget type bridging', () => {
|
||||
})
|
||||
|
||||
Object.defineProperty(widget.options, 'gradient_stops', {
|
||||
enumerable: true,
|
||||
get: () => properties.gradient_stops,
|
||||
set: (v) => {
|
||||
properties.gradient_stops = v
|
||||
@@ -82,6 +83,20 @@ describe('PrimitiveFloat widget type bridging', () => {
|
||||
expect(widget.options.gradient_stops).toBe(stops)
|
||||
})
|
||||
|
||||
it('gradient_stops survives object spread', () => {
|
||||
const { properties, widget } = createMockNodeAndWidget()
|
||||
applyFloatPropertyBridges(properties, widget)
|
||||
|
||||
const stops = [
|
||||
{ offset: 0, color: [0, 255, 255] },
|
||||
{ offset: 1, color: [255, 0, 0] }
|
||||
]
|
||||
properties.gradient_stops = stops
|
||||
|
||||
const spread = { ...widget.options }
|
||||
expect(spread.gradient_stops).toBe(stops)
|
||||
})
|
||||
|
||||
it('writes gradient_stops back to properties', () => {
|
||||
const { properties, widget } = createMockNodeAndWidget()
|
||||
applyFloatPropertyBridges(properties, widget)
|
||||
|
||||
@@ -169,6 +169,7 @@ function onCustomFloatCreated(this: LGraphNode) {
|
||||
})
|
||||
|
||||
Object.defineProperty(valueWidget.options, 'gradient_stops', {
|
||||
enumerable: true,
|
||||
get: () => this.properties.gradient_stops,
|
||||
set: (v) => {
|
||||
this.properties.gradient_stops = v
|
||||
|
||||
@@ -7,7 +7,8 @@ import {
|
||||
LGraph,
|
||||
LGraphNode,
|
||||
LiteGraph,
|
||||
LLink
|
||||
LLink,
|
||||
Reroute
|
||||
} from '@/lib/litegraph/src/litegraph'
|
||||
import type { SerialisableGraph } from '@/lib/litegraph/src/types/serialisation'
|
||||
import type { UUID } from '@/lib/litegraph/src/utils/uuid'
|
||||
@@ -17,6 +18,7 @@ import {
|
||||
createTestSubgraphData,
|
||||
createTestSubgraphNode
|
||||
} from './subgraph/__fixtures__/subgraphHelpers'
|
||||
import { subgraphTest } from './subgraph/__fixtures__/subgraphFixtures'
|
||||
|
||||
import {
|
||||
duplicateLinksRoot,
|
||||
@@ -98,6 +100,42 @@ describe('LGraph', () => {
|
||||
const fromOldSchema = new LGraph(oldSchemaGraph)
|
||||
expect(fromOldSchema).toMatchSnapshot('oldSchemaGraph')
|
||||
})
|
||||
subgraphTest('should snap slots to same y-level', ({ emptySubgraph }) => {
|
||||
const node = new LGraphNode('testname')
|
||||
node.addInput('test', 'IMAGE')
|
||||
emptySubgraph.add(node)
|
||||
|
||||
emptySubgraph.inputNode.pos = [0, 0]
|
||||
// Reroute needs offset of ~20y to align with first slot
|
||||
const reroute = new Reroute(1, emptySubgraph, [0, 20])
|
||||
|
||||
node.snapToGrid(10)
|
||||
reroute.snapToGrid(10)
|
||||
emptySubgraph.inputNode.snapToGrid(10)
|
||||
|
||||
node.arrange()
|
||||
emptySubgraph.inputNode.arrange()
|
||||
|
||||
const yPos = node.getInputPos(0)[1]
|
||||
expect(reroute.pos[1]).toBe(yPos)
|
||||
expect(emptySubgraph.inputNode.emptySlot.pos[1]).toBe(yPos)
|
||||
|
||||
// Assign non-equal positions and repeat
|
||||
emptySubgraph.inputNode.pos = [0, 43]
|
||||
node.pos = [0, 50]
|
||||
reroute.pos = [0, 63]
|
||||
|
||||
node.snapToGrid(10)
|
||||
reroute.snapToGrid(10)
|
||||
emptySubgraph.inputNode.snapToGrid(10)
|
||||
|
||||
node.arrange()
|
||||
emptySubgraph.inputNode.arrange()
|
||||
|
||||
const yPos2 = node.getInputPos(0)[1]
|
||||
expect(reroute.pos[1]).toBe(yPos2)
|
||||
expect(emptySubgraph.inputNode.emptySlot.pos[1]).toBe(yPos2)
|
||||
})
|
||||
})
|
||||
|
||||
describe('Floating Links / Reroutes', () => {
|
||||
|
||||
@@ -5882,7 +5882,8 @@ export class LGraphCanvas implements CustomEventDispatcher<LGraphCanvasEventMap>
|
||||
drawSnapGuide(
|
||||
ctx: CanvasRenderingContext2D,
|
||||
item: Positionable,
|
||||
shape = RenderShape.ROUND
|
||||
shape = RenderShape.ROUND,
|
||||
{ offsetToSlot }: { offsetToSlot?: boolean } = {}
|
||||
) {
|
||||
const snapGuide = temp
|
||||
snapGuide.set(item.boundingRect)
|
||||
@@ -5890,7 +5891,10 @@ export class LGraphCanvas implements CustomEventDispatcher<LGraphCanvasEventMap>
|
||||
// Not all items have pos equal to top-left of bounds
|
||||
const { pos } = item
|
||||
const offsetX = pos[0] - snapGuide[0]
|
||||
const offsetY = pos[1] - snapGuide[1]
|
||||
const offsetY =
|
||||
pos[1] -
|
||||
snapGuide[1] -
|
||||
(offsetToSlot ? LiteGraph.NODE_SLOT_HEIGHT * 0.7 : 0)
|
||||
|
||||
// Normalise boundingRect to pos to snap
|
||||
snapGuide[0] += offsetX
|
||||
@@ -6067,7 +6071,9 @@ export class LGraphCanvas implements CustomEventDispatcher<LGraphCanvasEventMap>
|
||||
this.isDragging &&
|
||||
this.selectedItems.has(reroute)
|
||||
) {
|
||||
this.drawSnapGuide(ctx, reroute, RenderShape.CIRCLE)
|
||||
this.drawSnapGuide(ctx, reroute, RenderShape.CIRCLE, {
|
||||
offsetToSlot: true
|
||||
})
|
||||
}
|
||||
reroute.draw(ctx, this._pattern)
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ import type {
|
||||
ReadOnlyRect,
|
||||
ReadonlyLinkNetwork
|
||||
} from './interfaces'
|
||||
import { LiteGraph } from './litegraph'
|
||||
import { distance, isPointInRect } from './measure'
|
||||
import type { Serialisable, SerialisableReroute } from './types/serialisation'
|
||||
|
||||
@@ -428,9 +429,10 @@ export class Reroute
|
||||
snapToGrid(snapTo: number): boolean {
|
||||
if (!snapTo) return false
|
||||
|
||||
const offsetY = LiteGraph.NODE_SLOT_HEIGHT * 0.7
|
||||
const { pos } = this
|
||||
pos[0] = snapTo * Math.round(pos[0] / snapTo)
|
||||
pos[1] = snapTo * Math.round(pos[1] / snapTo)
|
||||
pos[1] = snapTo * Math.round((pos[1] - offsetY) / snapTo) + offsetY
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ export abstract class SubgraphIONodeBase<
|
||||
{
|
||||
static margin = 10
|
||||
static minWidth = 100
|
||||
static roundedRadius = 10
|
||||
static roundedRadius = 14 // Matches NODE_SLOT_HEIGHT * 0.7 for slot alignment
|
||||
|
||||
private readonly _boundingRect: Rectangle = new Rectangle()
|
||||
|
||||
|
||||
174
src/platform/assets/mappings/modelNodeMappings.ts
Normal file
174
src/platform/assets/mappings/modelNodeMappings.ts
Normal file
@@ -0,0 +1,174 @@
|
||||
/**
|
||||
* Default mappings from model directories to loader nodes.
|
||||
*
|
||||
* Each entry maps a model folder (as it appears in the model browser)
|
||||
* to the node class that loads models from that folder and the
|
||||
* input key where the model name is inserted.
|
||||
*
|
||||
* An empty key ('') means the node auto-loads models without a widget
|
||||
* selector (createModelNodeFromAsset skips widget assignment).
|
||||
*
|
||||
* Hierarchical fallback is handled by the store: "a/b/c" tries
|
||||
* "a/b/c" → "a/b" → "a", so registering a parent directory covers
|
||||
* all its children unless a more specific entry exists.
|
||||
*
|
||||
* Format: [modelDirectory, nodeClass, inputKey]
|
||||
*/
|
||||
export const MODEL_NODE_MAPPINGS: ReadonlyArray<
|
||||
readonly [string, string, string]
|
||||
> = [
|
||||
// ---- ComfyUI core loaders ----
|
||||
['checkpoints', 'CheckpointLoaderSimple', 'ckpt_name'],
|
||||
['checkpoints', 'ImageOnlyCheckpointLoader', 'ckpt_name'],
|
||||
['loras', 'LoraLoader', 'lora_name'],
|
||||
['loras', 'LoraLoaderModelOnly', 'lora_name'],
|
||||
['vae', 'VAELoader', 'vae_name'],
|
||||
['controlnet', 'ControlNetLoader', 'control_net_name'],
|
||||
['diffusion_models', 'UNETLoader', 'unet_name'],
|
||||
['upscale_models', 'UpscaleModelLoader', 'model_name'],
|
||||
['style_models', 'StyleModelLoader', 'style_model_name'],
|
||||
['gligen', 'GLIGENLoader', 'gligen_name'],
|
||||
['clip_vision', 'CLIPVisionLoader', 'clip_name'],
|
||||
['text_encoders', 'CLIPLoader', 'clip_name'],
|
||||
['audio_encoders', 'AudioEncoderLoader', 'audio_encoder_name'],
|
||||
['model_patches', 'ModelPatchLoader', 'name'],
|
||||
['latent_upscale_models', 'LatentUpscaleModelLoader', 'model_name'],
|
||||
['clip', 'CLIPVisionLoader', 'clip_name'],
|
||||
|
||||
// ---- AnimateDiff (comfyui-animatediff-evolved) ----
|
||||
['animatediff_models', 'ADE_LoadAnimateDiffModel', 'model_name'],
|
||||
['animatediff_motion_lora', 'ADE_AnimateDiffLoRALoader', 'name'],
|
||||
|
||||
// ---- Chatterbox TTS (ComfyUI-Fill-Nodes) ----
|
||||
['chatterbox/chatterbox', 'FL_ChatterboxTTS', ''],
|
||||
['chatterbox/chatterbox_turbo', 'FL_ChatterboxTurboTTS', ''],
|
||||
['chatterbox/chatterbox_multilingual', 'FL_ChatterboxMultilingualTTS', ''],
|
||||
['chatterbox/chatterbox_vc', 'FL_ChatterboxVC', ''],
|
||||
|
||||
// ---- SAM / SAM2 (comfyui-segment-anything-2, comfyui-impact-pack) ----
|
||||
['sam2', 'DownloadAndLoadSAM2Model', 'model'],
|
||||
['sams', 'SAMLoader', 'model_name'],
|
||||
|
||||
// ---- SAM3 3D segmentation (comfyui-sam3) ----
|
||||
['sam3', 'LoadSAM3Model', 'model_path'],
|
||||
|
||||
// ---- Ultralytics detection (comfyui-impact-subpack) ----
|
||||
['ultralytics', 'UltralyticsDetectorProvider', 'model_name'],
|
||||
|
||||
// ---- DepthAnything (comfyui-depthanythingv2, comfyui-depthanythingv3) ----
|
||||
['depthanything', 'DownloadAndLoadDepthAnythingV2Model', 'model'],
|
||||
['depthanything3', 'DownloadAndLoadDepthAnythingV3Model', 'model'],
|
||||
|
||||
// ---- IP-Adapter (comfyui_ipadapter_plus) ----
|
||||
['ipadapter', 'IPAdapterModelLoader', 'ipadapter_file'],
|
||||
|
||||
// ---- Segformer (comfyui_layerstyle) ----
|
||||
['segformer_b2_clothes', 'LS_LoadSegformerModel', 'model_name'],
|
||||
['segformer_b3_clothes', 'LS_LoadSegformerModel', 'model_name'],
|
||||
['segformer_b3_fashion', 'LS_LoadSegformerModel', 'model_name'],
|
||||
|
||||
// ---- NLF pose estimation (ComfyUI-WanVideoWrapper) ----
|
||||
['nlf', 'LoadNLFModel', 'nlf_model'],
|
||||
|
||||
// ---- FlashVSR video super-resolution (ComfyUI-FlashVSR_Ultra_Fast) ----
|
||||
['FlashVSR', 'FlashVSRNode', ''],
|
||||
['FlashVSR-v1.1', 'FlashVSRNode', ''],
|
||||
|
||||
// ---- SEEDVR2 video upscaling (comfyui-seedvr2) ----
|
||||
['SEEDVR2', 'SeedVR2LoadDiTModel', 'model'],
|
||||
|
||||
// ---- Qwen VL vision-language (comfyui-qwen-vl) ----
|
||||
['LLM/Qwen-VL/Qwen2.5-VL-3B-Instruct', 'AILab_QwenVL', 'model_name'],
|
||||
['LLM/Qwen-VL/Qwen2.5-VL-7B-Instruct', 'AILab_QwenVL', 'model_name'],
|
||||
['LLM/Qwen-VL/Qwen3-VL-2B-Instruct', 'AILab_QwenVL', 'model_name'],
|
||||
['LLM/Qwen-VL/Qwen3-VL-2B-Thinking', 'AILab_QwenVL', 'model_name'],
|
||||
['LLM/Qwen-VL/Qwen3-VL-4B-Instruct', 'AILab_QwenVL', 'model_name'],
|
||||
['LLM/Qwen-VL/Qwen3-VL-4B-Thinking', 'AILab_QwenVL', 'model_name'],
|
||||
['LLM/Qwen-VL/Qwen3-VL-8B-Instruct', 'AILab_QwenVL', 'model_name'],
|
||||
['LLM/Qwen-VL/Qwen3-VL-8B-Thinking', 'AILab_QwenVL', 'model_name'],
|
||||
['LLM/Qwen-VL/Qwen3-VL-32B-Instruct', 'AILab_QwenVL', 'model_name'],
|
||||
['LLM/Qwen-VL/Qwen3-VL-32B-Thinking', 'AILab_QwenVL', 'model_name'],
|
||||
['LLM/Qwen-VL/Qwen3-0.6B', 'AILab_QwenVL_PromptEnhancer', 'model_name'],
|
||||
[
|
||||
'LLM/Qwen-VL/Qwen3-4B-Instruct-2507',
|
||||
'AILab_QwenVL_PromptEnhancer',
|
||||
'model_name'
|
||||
],
|
||||
['LLM/checkpoints', 'LoadChatGLM3', 'chatglm3_checkpoint'],
|
||||
|
||||
// ---- Qwen3 TTS (ComfyUI-FunBox) ----
|
||||
['qwen-tts', 'FB_Qwen3TTSVoiceClone', 'model_choice'],
|
||||
|
||||
// ---- LivePortrait (comfyui-liveportrait) ----
|
||||
['liveportrait', 'DownloadAndLoadLivePortraitModels', ''],
|
||||
|
||||
// ---- MimicMotion (ComfyUI-MimicMotionWrapper) ----
|
||||
['mimicmotion', 'DownloadAndLoadMimicMotionModel', 'model'],
|
||||
['dwpose', 'MimicMotionGetPoses', ''],
|
||||
|
||||
// ---- Face parsing (comfyui_face_parsing) ----
|
||||
['face_parsing', 'FaceParsingModelLoader(FaceParsing)', ''],
|
||||
|
||||
// ---- Kolors (ComfyUI-KolorsWrapper) ----
|
||||
['diffusers', 'DownloadAndLoadKolorsModel', 'model'],
|
||||
|
||||
// ---- RIFE video frame interpolation (ComfyUI-RIFE) ----
|
||||
['rife', 'RIFE VFI', 'ckpt_name'],
|
||||
|
||||
// ---- UltraShape 3D model generation ----
|
||||
['UltraShape', 'UltraShapeLoadModel', 'checkpoint'],
|
||||
|
||||
// ---- SHaRP depth estimation ----
|
||||
['sharp', 'LoadSharpModel', 'checkpoint_path'],
|
||||
|
||||
// ---- ONNX upscale models ----
|
||||
['onnx', 'UpscaleModelLoader', 'model_name'],
|
||||
|
||||
// ---- Detection models (vitpose, yolo) ----
|
||||
['detection', 'OnnxDetectionModelLoader', 'yolo_model'],
|
||||
|
||||
// ---- HunyuanVideo text encoders (ComfyUI-HunyuanVideoWrapper) ----
|
||||
[
|
||||
'LLM/llava-llama-3-8b-text-encoder-tokenizer',
|
||||
'DownloadAndLoadHyVideoTextEncoder',
|
||||
'llm_model'
|
||||
],
|
||||
[
|
||||
'LLM/llava-llama-3-8b-v1_1-transformers',
|
||||
'DownloadAndLoadHyVideoTextEncoder',
|
||||
'llm_model'
|
||||
],
|
||||
|
||||
// ---- CogVideoX (comfyui-cogvideoxwrapper) ----
|
||||
['CogVideo', 'DownloadAndLoadCogVideoModel', ''],
|
||||
['CogVideo/GGUF', 'DownloadAndLoadCogVideoGGUFModel', 'model'],
|
||||
['CogVideo/ControlNet', 'DownloadAndLoadCogVideoControlNet', ''],
|
||||
|
||||
// ---- DynamiCrafter (ComfyUI-DynamiCrafterWrapper) ----
|
||||
['checkpoints/dynamicrafter', 'DownloadAndLoadDynamiCrafterModel', 'model'],
|
||||
[
|
||||
'checkpoints/dynamicrafter/controlnet',
|
||||
'DownloadAndLoadDynamiCrafterCNModel',
|
||||
'model'
|
||||
],
|
||||
|
||||
// ---- LayerStyle (ComfyUI_LayerStyle_Advance) ----
|
||||
['BEN', 'LS_LoadBenModel', 'model'],
|
||||
['BiRefNet/pth', 'LS_LoadBiRefNetModel', 'model'],
|
||||
['onnx/human-parts', 'LS_HumanPartsUltra', ''],
|
||||
['lama', 'LaMa', 'lama_model'],
|
||||
|
||||
// ---- Inpaint (comfyui-inpaint-nodes) ----
|
||||
['inpaint', 'INPAINT_LoadInpaintModel', 'model_name'],
|
||||
|
||||
// ---- LayerDiffuse (comfyui-layerdiffuse) ----
|
||||
['layer_model', 'LayeredDiffusionApply', 'config'],
|
||||
|
||||
// ---- LTX Video prompt enhancer (ComfyUI-LTXTricks) ----
|
||||
['LLM/Llama-3.2-3B-Instruct', 'LTXVPromptEnhancerLoader', 'llm_name'],
|
||||
[
|
||||
'LLM/Florence-2-large-PromptGen-v2.0',
|
||||
'LTXVPromptEnhancerLoader',
|
||||
'image_captioner_name'
|
||||
]
|
||||
] as const satisfies ReadonlyArray<readonly [string, string, string]>
|
||||
@@ -1,6 +1,7 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { computed, ref } from 'vue'
|
||||
|
||||
import { MODEL_NODE_MAPPINGS } from '@/platform/assets/mappings/modelNodeMappings'
|
||||
import type { ComfyNodeDefImpl } from '@/stores/nodeDefStore'
|
||||
import { useNodeDefStore } from '@/stores/nodeDefStore'
|
||||
|
||||
@@ -156,254 +157,9 @@ export const useModelToNodeStore = defineStore('modelToNode', () => {
|
||||
}
|
||||
haveDefaultsLoaded.value = true
|
||||
|
||||
quickRegister('checkpoints', 'CheckpointLoaderSimple', 'ckpt_name')
|
||||
quickRegister('checkpoints', 'ImageOnlyCheckpointLoader', 'ckpt_name')
|
||||
quickRegister('loras', 'LoraLoader', 'lora_name')
|
||||
quickRegister('loras', 'LoraLoaderModelOnly', 'lora_name')
|
||||
quickRegister('vae', 'VAELoader', 'vae_name')
|
||||
quickRegister('controlnet', 'ControlNetLoader', 'control_net_name')
|
||||
quickRegister('diffusion_models', 'UNETLoader', 'unet_name')
|
||||
quickRegister('upscale_models', 'UpscaleModelLoader', 'model_name')
|
||||
quickRegister('style_models', 'StyleModelLoader', 'style_model_name')
|
||||
quickRegister('gligen', 'GLIGENLoader', 'gligen_name')
|
||||
quickRegister('clip_vision', 'CLIPVisionLoader', 'clip_name')
|
||||
quickRegister('text_encoders', 'CLIPLoader', 'clip_name')
|
||||
quickRegister('audio_encoders', 'AudioEncoderLoader', 'audio_encoder_name')
|
||||
quickRegister('model_patches', 'ModelPatchLoader', 'name')
|
||||
quickRegister(
|
||||
'animatediff_models',
|
||||
'ADE_LoadAnimateDiffModel',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'animatediff_motion_lora',
|
||||
'ADE_AnimateDiffLoRALoader',
|
||||
'name'
|
||||
)
|
||||
|
||||
// Chatterbox TTS nodes: empty key means the node auto-loads models without
|
||||
// a widget selector (createModelNodeFromAsset skips widget assignment)
|
||||
quickRegister('chatterbox/chatterbox', 'FL_ChatterboxTTS', '')
|
||||
quickRegister('chatterbox/chatterbox_turbo', 'FL_ChatterboxTurboTTS', '')
|
||||
quickRegister(
|
||||
'chatterbox/chatterbox_multilingual',
|
||||
'FL_ChatterboxMultilingualTTS',
|
||||
''
|
||||
)
|
||||
quickRegister('chatterbox/chatterbox_vc', 'FL_ChatterboxVC', '')
|
||||
|
||||
// Latent upscale models (ComfyUI core - nodes_hunyuan.py)
|
||||
quickRegister(
|
||||
'latent_upscale_models',
|
||||
'LatentUpscaleModelLoader',
|
||||
'model_name'
|
||||
)
|
||||
|
||||
// SAM/SAM2 segmentation models (comfyui-segment-anything-2, comfyui-impact-pack)
|
||||
quickRegister('sam2', 'DownloadAndLoadSAM2Model', 'model')
|
||||
quickRegister('sams', 'SAMLoader', 'model_name')
|
||||
|
||||
// Ultralytics detection models (comfyui-impact-subpack)
|
||||
// Note: ultralytics/bbox and ultralytics/segm fall back to this via hierarchical lookup
|
||||
quickRegister('ultralytics', 'UltralyticsDetectorProvider', 'model_name')
|
||||
|
||||
// DepthAnything models (comfyui-depthanythingv2)
|
||||
quickRegister(
|
||||
'depthanything',
|
||||
'DownloadAndLoadDepthAnythingV2Model',
|
||||
'model'
|
||||
)
|
||||
|
||||
// IP-Adapter models (comfyui_ipadapter_plus)
|
||||
quickRegister('ipadapter', 'IPAdapterModelLoader', 'ipadapter_file')
|
||||
|
||||
// Segformer clothing/fashion segmentation models (comfyui_layerstyle)
|
||||
quickRegister('segformer_b2_clothes', 'LS_LoadSegformerModel', 'model_name')
|
||||
quickRegister('segformer_b3_clothes', 'LS_LoadSegformerModel', 'model_name')
|
||||
quickRegister('segformer_b3_fashion', 'LS_LoadSegformerModel', 'model_name')
|
||||
|
||||
// NLF pose estimation models (ComfyUI-WanVideoWrapper)
|
||||
quickRegister('nlf', 'LoadNLFModel', 'nlf_model')
|
||||
|
||||
// FlashVSR video super-resolution (ComfyUI-FlashVSR_Ultra_Fast)
|
||||
// Empty key means the node auto-loads models without a widget selector
|
||||
quickRegister('FlashVSR', 'FlashVSRNode', '')
|
||||
quickRegister('FlashVSR-v1.1', 'FlashVSRNode', '')
|
||||
|
||||
// SEEDVR2 video upscaling (comfyui-seedvr2)
|
||||
quickRegister('SEEDVR2', 'SeedVR2LoadDiTModel', 'model')
|
||||
|
||||
// Qwen VL vision-language models (comfyui-qwen-vl)
|
||||
// Register each specific path to avoid LLM fallback catching unrelated models
|
||||
// (e.g., LLM/llava-* should NOT map to AILab_QwenVL)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen2.5-VL-3B-Instruct',
|
||||
'AILab_QwenVL',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen2.5-VL-7B-Instruct',
|
||||
'AILab_QwenVL',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen3-VL-2B-Instruct',
|
||||
'AILab_QwenVL',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen3-VL-2B-Thinking',
|
||||
'AILab_QwenVL',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen3-VL-4B-Instruct',
|
||||
'AILab_QwenVL',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen3-VL-4B-Thinking',
|
||||
'AILab_QwenVL',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen3-VL-8B-Instruct',
|
||||
'AILab_QwenVL',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen3-VL-8B-Thinking',
|
||||
'AILab_QwenVL',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen3-VL-32B-Instruct',
|
||||
'AILab_QwenVL',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen3-VL-32B-Thinking',
|
||||
'AILab_QwenVL',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen3-0.6B',
|
||||
'AILab_QwenVL_PromptEnhancer',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Qwen-VL/Qwen3-4B-Instruct-2507',
|
||||
'AILab_QwenVL_PromptEnhancer',
|
||||
'model_name'
|
||||
)
|
||||
quickRegister('LLM/checkpoints', 'LoadChatGLM3', 'chatglm3_checkpoint')
|
||||
|
||||
// Qwen3 TTS speech models (ComfyUI-FunBox)
|
||||
// Top-level 'qwen-tts' catches all qwen-tts/* subdirs via hierarchical fallback
|
||||
quickRegister('qwen-tts', 'FB_Qwen3TTSVoiceClone', 'model_choice')
|
||||
|
||||
// DepthAnything V3 models (comfyui-depthanythingv2)
|
||||
quickRegister(
|
||||
'depthanything3',
|
||||
'DownloadAndLoadDepthAnythingV3Model',
|
||||
'model'
|
||||
)
|
||||
|
||||
// LivePortrait face animation models (comfyui-liveportrait)
|
||||
quickRegister('liveportrait', 'DownloadAndLoadLivePortraitModels', '')
|
||||
|
||||
// MimicMotion video generation models (ComfyUI-MimicMotionWrapper)
|
||||
quickRegister('mimicmotion', 'DownloadAndLoadMimicMotionModel', 'model')
|
||||
quickRegister('dwpose', 'MimicMotionGetPoses', '')
|
||||
|
||||
// Face parsing segmentation models (comfyui_face_parsing)
|
||||
quickRegister('face_parsing', 'FaceParsingModelLoader(FaceParsing)', '')
|
||||
|
||||
// Kolors image generation models (ComfyUI-KolorsWrapper)
|
||||
// Top-level 'diffusers' catches diffusers/Kolors/* subdirs
|
||||
quickRegister('diffusers', 'DownloadAndLoadKolorsModel', 'model')
|
||||
|
||||
// CLIP models for HunyuanVideo (clip/clip-vit-large-patch14 subdir)
|
||||
quickRegister('clip', 'CLIPVisionLoader', 'clip_name')
|
||||
|
||||
// RIFE video frame interpolation (ComfyUI-RIFE)
|
||||
quickRegister('rife', 'RIFE VFI', 'ckpt_name')
|
||||
|
||||
// SAM3 3D segmentation models (comfyui-sam3)
|
||||
quickRegister('sam3', 'LoadSAM3Model', 'model_path')
|
||||
|
||||
// UltraShape 3D model generation
|
||||
quickRegister('UltraShape', 'UltraShapeLoadModel', 'checkpoint')
|
||||
|
||||
// SHaRP depth estimation
|
||||
quickRegister('sharp', 'LoadSharpModel', 'checkpoint_path')
|
||||
|
||||
// ONNX upscale models (used by OnnxDetectionModelLoader and upscale nodes)
|
||||
quickRegister('onnx', 'UpscaleModelLoader', 'model_name')
|
||||
|
||||
// Detection models (vitpose, yolo)
|
||||
quickRegister('detection', 'OnnxDetectionModelLoader', 'yolo_model')
|
||||
|
||||
// HunyuanVideo text encoders (ComfyUI-HunyuanVideoWrapper)
|
||||
quickRegister(
|
||||
'LLM/llava-llama-3-8b-text-encoder-tokenizer',
|
||||
'DownloadAndLoadHyVideoTextEncoder',
|
||||
'llm_model'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/llava-llama-3-8b-v1_1-transformers',
|
||||
'DownloadAndLoadHyVideoTextEncoder',
|
||||
'llm_model'
|
||||
)
|
||||
|
||||
// CogVideoX models (comfyui-cogvideoxwrapper)
|
||||
quickRegister('CogVideo/GGUF', 'DownloadAndLoadCogVideoGGUFModel', 'model')
|
||||
// Empty key: HF-download node — don't activate asset browser for the combo widget
|
||||
quickRegister(
|
||||
'CogVideo/ControlNet',
|
||||
'DownloadAndLoadCogVideoControlNet',
|
||||
''
|
||||
)
|
||||
|
||||
// DynamiCrafter models (ComfyUI-DynamiCrafterWrapper)
|
||||
quickRegister(
|
||||
'checkpoints/dynamicrafter',
|
||||
'DownloadAndLoadDynamiCrafterModel',
|
||||
'model'
|
||||
)
|
||||
quickRegister(
|
||||
'checkpoints/dynamicrafter/controlnet',
|
||||
'DownloadAndLoadDynamiCrafterCNModel',
|
||||
'model'
|
||||
)
|
||||
|
||||
// LayerStyle models (ComfyUI_LayerStyle_Advance)
|
||||
quickRegister('BEN', 'LS_LoadBenModel', 'model')
|
||||
quickRegister('BiRefNet/pth', 'LS_LoadBiRefNetModel', 'model')
|
||||
quickRegister('onnx/human-parts', 'LS_HumanPartsUltra', '')
|
||||
quickRegister('lama', 'LaMa', 'lama_model')
|
||||
|
||||
// CogVideoX video generation models (comfyui-cogvideoxwrapper)
|
||||
// Empty key: HF-download node — don't activate asset browser for the combo widget
|
||||
quickRegister('CogVideo', 'DownloadAndLoadCogVideoModel', '')
|
||||
|
||||
// Inpaint models (comfyui-inpaint-nodes)
|
||||
quickRegister('inpaint', 'INPAINT_LoadInpaintModel', 'model_name')
|
||||
|
||||
// LayerDiffuse transparent image generation (comfyui-layerdiffuse)
|
||||
quickRegister('layer_model', 'LayeredDiffusionApply', 'config')
|
||||
|
||||
// LTX Video prompt enhancer models (ComfyUI-LTXTricks)
|
||||
quickRegister(
|
||||
'LLM/Llama-3.2-3B-Instruct',
|
||||
'LTXVPromptEnhancerLoader',
|
||||
'llm_name'
|
||||
)
|
||||
quickRegister(
|
||||
'LLM/Florence-2-large-PromptGen-v2.0',
|
||||
'LTXVPromptEnhancerLoader',
|
||||
'image_captioner_name'
|
||||
)
|
||||
for (const [modelType, nodeClass, key] of MODEL_NODE_MAPPINGS) {
|
||||
quickRegister(modelType, nodeClass, key)
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user