Skip to content

feat: add model-to-node mappings for cloud asset categories#8468

Merged
christian-byrne merged 8 commits intomainfrom
fix/chatterbox-cloud-model-create
Feb 7, 2026
Merged

feat: add model-to-node mappings for cloud asset categories#8468
christian-byrne merged 8 commits intomainfrom
fix/chatterbox-cloud-model-create

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Jan 30, 2026

Summary

Add mappings for 13 previously unmapped model categories in the Cloud asset browser, enabling users to click on models to create corresponding loader nodes on the canvas.

Changes

Core nodes

  • latent_upscale_modelsLatentUpscaleModelLoader

Extension nodes

Category Node Class Widget Key
sam2 DownloadAndLoadSAM2Model model
sams SAMLoader model_name
ultralytics UltralyticsDetectorProvider model_name
depthanything DownloadAndLoadDepthAnythingV2Model model
ipadapter IPAdapterModelLoader ipadapter_file
segformer_b2_clothes LS_LoadSegformerModel model_name
segformer_b3_clothes LS_LoadSegformerModel model_name
segformer_b3_fashion LS_LoadSegformerModel model_name
nlf LoadNLFModel nlf_model
FlashVSR FlashVSRNode (auto-load)
FlashVSR-v1.1 FlashVSRNode (auto-load)

Hierarchical fallback

  • ultralytics/bbox and ultralytics/segm fall back to the ultralytics mapping

Skipped categories

  • vae_approx - No user-facing loader (used internally for latent previews)
  • detection - No specific loader exists

Testing

  • Added unit tests for all new mappings
  • Tests verify hierarchical fallback works correctly
  • All 40 tests pass

┆Issue is synchronized with this Notion page by Unito

Subagent 5 and others added 5 commits January 28, 2026 23:47
- Register Chatterbox TTS node mappings in modelToNodeStore:
  - chatterbox/chatterbox → FL_ChatterboxTTS
  - chatterbox/chatterbox_turbo → FL_ChatterboxTurboTTS
  - chatterbox/chatterbox_multilingual → FL_ChatterboxMultilingualTTS
  - chatterbox/chatterbox_vc → FL_ChatterboxVC

- Add hierarchical fallback in findProvidersWithFallback() for model
  type lookups (e.g., 'parent/child' falls back to 'parent')

- Support empty widget key for auto-load nodes (skip widget assignment
  in createModelNodeFromAsset when provider.key is empty)

- Add comprehensive tests for new behavior

Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019c0849-5650-7060-b4bd-23ef0c8dfa39
Co-authored-by: Alexander Brown <drjkl@comfy.org>
…llback

- Early return undefined for null/undefined/non-string inputs
- Prevents potential runtime errors from .split() on invalid types
- Add tests for invalid input handling

Amp-Thread-ID: https://ampcode.com/threads/T-019c0849-5650-7060-b4bd-23ef0c8dfa39
Co-authored-by: Amp <amp@ampcode.com>
Add mappings for 13 previously unmapped model categories in the Cloud
asset browser, enabling users to click on models to create corresponding
loader nodes on the canvas.

Core nodes:
- latent_upscale_models -> LatentUpscaleModelLoader

Extension nodes:
- sam2 -> DownloadAndLoadSAM2Model
- sams -> SAMLoader
- ultralytics -> UltralyticsDetectorProvider (with bbox/segm fallback)
- depthanything -> DownloadAndLoadDepthAnythingV2Model
- ipadapter -> IPAdapterModelLoader
- segformer_b2_clothes, segformer_b3_clothes, segformer_b3_fashion -> LS_LoadSegformerModel
- nlf -> LoadNLFModel
- FlashVSR, FlashVSR-v1.1 -> FlashVSRNode (auto-load pattern)

Amp-Thread-ID: https://ampcode.com/threads/T-019c0c8c-d68e-73ba-a2b3-3db28e960eb1
Co-authored-by: Amp <amp@ampcode.com>
@christian-byrne christian-byrne requested a review from a team as a code owner January 30, 2026 02:52
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jan 30, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 30, 2026

📝 Walkthrough

Walkthrough

The changes implement a hierarchical fallback system for model type lookups and add support for empty provider keys to enable auto-loading behavior. Widget assignment in model node creation is now conditional on provider key presence, and numerous new model type to node provider mappings are registered.

Changes

Cohort / File(s) Summary
createModelNodeFromAsset
src/platform/assets/utils/createModelNodeFromAsset.ts, src/platform/assets/utils/createModelNodeFromAsset.test.ts
Added parameterized override support to test mock providers and conditional widget handling gated by provider.key presence. Nodes are now added to the graph regardless of key status, with widget value assignment only applied when provider.key exists. New test case validates auto-load behavior with empty keys.
modelToNodeStore
src/stores/modelToNodeStore.ts, src/stores/modelToNodeStore.test.ts
Introduced hierarchical fallback lookup for model types (e.g., "parent/child" → "parent") via findProvidersWithFallback helper. Expanded registerDefaults with 15+ new model-type mappings (Chatterbox, SAM2, Ultralytics, DepthAnything, IP-Adapter, Segformer, FlashVSR, etc.) and comprehensive test coverage including hierarchical fallback validation, empty key handling, and input validation.

Possibly related PRs

Suggested reviewers

  • shinshin86
  • KarryCharon
  • luke-mino-altherr
  • DrJKL
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/chatterbox-cloud-model-create

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/stores/modelToNodeStore.ts`:
- Around line 184-232: The segformer registrations use the wrong node class
name: update quickRegister calls for 'segformer_b2_clothes',
'segformer_b3_clothes', and 'segformer_b3_fashion' to use the actual class name
"LoadSegformerModel" instead of "LS_LoadSegformerModel" so
nodeDefStore.nodeDefsByName can find them; additionally, add a runtime warning
where registrations are skipped (the check that looks up
nodeDefStore.nodeDefsByName — currently silently continues around line ~141) to
log which node class name and quickRegister key failed so missing/renamed node
classes are visible at startup.

'FL_ChatterboxTurboTTS',
'FL_ChatterboxMultilingualTTS',
'FL_ChatterboxVC',
// New extension node mappings
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this useless comment after rebasing on main

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@coderabbitai make a tracking Issue to remove these unneccessary code comments

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

@christian-byrne I'll create a tracking issue for removing unnecessary code comments in the test file.


🏁 Script executed:

#!/bin/bash
# Create a GitHub issue to track removal of unnecessary code comments

gh issue create \
  --repo Comfy-Org/ComfyUI_frontend \
  --title "Remove unnecessary code comments from test files" \
  --body "As noted in PR `#8468`, there are unnecessary code comments in test files that should be removed to maintain code cleanliness and align with the project's preference for self-documenting code.

Specific example: \`// New extension node mappings\` comment in \`src/stores/modelToNodeStore.test.ts\`

**Context:**
- PR: https://github.com/Comfy-Org/ComfyUI_frontend/pull/8468
- Comment: https://github.com/Comfy-Org/ComfyUI_frontend/pull/8468#discussion_r2744451100
- Requested by: `@christian-byrne`

**Scope:**
Review test files for redundant comments that don't add value beyond what the code already expresses through clear naming and structure." \
  --assignee christian-byrne

Length of output: 57


@christian-byrne Issue created!

#8705: Remove unnecessary code comments from test files

The issue tracks removal of redundant comments like // New extension node mappings that don't add value beyond what the code already expresses through clear naming.


🧬 Code Graph Analysis Results

[src/stores/modelToNodeStore.ts] (lines 22-245)

export const useModelToNodeStore = defineStore('modelToNode', () => {
  const modelToNodeMap = ref<Record<string, ModelNodeProvider[]>>({})
  const nodeDefStore = useNodeDefStore()
  const haveDefaultsLoaded = ref(false)

  /** Internal computed for reactive caching of registered node types */
  const registeredNodeTypes = computed<Record<string, string>>(() => {
    return Object.fromEntries(
      Object.values(modelToNodeMap.value)
        .flat()
        .filter((provider) => !!provider.nodeDef)
        .map((provider) => [provider.nodeDef.name, provider.key])
    )
  })

  /** Internal computed for efficient reverse lookup: nodeType -> category */
  const nodeTypeToCategory = computed(() => {
    const lookup: Record<string, string> = {}
    for (const [category, providers] of Object.entries(modelToNodeMap.value)) {
      for (const provider of providers) {
        // Extension nodes may not be installed
        if (!provider.nodeDef) continue
        // Only store the first category for each node type (matches current assetService behavior)
        if (!lookup[provider.nodeDef.name]) {
          lookup[provider.nodeDef.name] = category
        }
      }
    }
    return lookup
  })

  /** Get set of all registered node types for efficient lookup */
  function getRegisteredNodeTypes(): Record<string, string> {
    registerDefaults()
    return registeredNodeTypes.value
  }

  /**
   * Get the category for a given node type.
   * Performs efficient O(1) lookup using cached reverse map.
   * `@param` nodeType The node type name to find the category for
   * `@returns` The category name, or undefined if not found
   */
  function getCategoryForNodeType(nodeType: string): string | undefined {
    registerDefaults()

    // Handle invalid input gracefully
    if (!nodeType || typeof nodeType !== 'string') {
      return undefined
    }

    return nodeTypeToCategory.value[nodeType]
  }

  /**
   * Find providers for modelType with hierarchical fallback.
   * Tries exact match first, then falls back to top-level segment (e.g., "parent/child" → "parent").
   * Note: Only falls back one level; "a/b/c" tries "a/b/c" then "a", not "a/b".
   */
  function findProvidersWithFallback(
    modelType: string
  ): ModelNodeProvider[] | undefined {
    if (!modelType || typeof modelType !== 'string') {
      return undefined
    }

    const exactMatch = modelToNodeMap.value[modelType]
    if (exactMatch && exactMatch.length > 0) return exactMatch

    const topLevel = modelType.split('/')[0]
    if (topLevel === modelType) return undefined

    const fallback = modelToNodeMap.value[topLevel]

    if (fallback && fallback.length > 0) return fallback

    return undefined
  }

  /**
   * Get the node provider for the given model type name.
   * Supports hierarchical lookups: if "parent/child" has no match, falls back to "parent".
   * `@param` modelType The name of the model type to get the node provider for.
   * `@returns` The node provider for the given model type name.
   */
  function getNodeProvider(modelType: string): ModelNodeProvider | undefined {
    registerDefaults()
    return findProvidersWithFallback(modelType)?.[0]
  }

  /**
   * Get the list of all valid node providers for the given model type name.
   * Supports hierarchical lookups: if "parent/child" has no match, falls back to "parent".
   * `@param` modelType The name of the model type to get the node providers for.
   * `@returns` The list of all valid node providers for the given model type name.
   */
  function getAllNodeProviders(modelType: string): ModelNodeProvider[] {
    registerDefaults()
    return findProvidersWithFallback(modelType) ?? []
  }
  /**
   * Register a node provider for the given model type name.
   * `@param` modelType The name of the model type to register the node provider for.
   * `@param` nodeProvider The node provider to register.
   */
  function registerNodeProvider(
    modelType: string,
    nodeProvider: ModelNodeProvider
  ) {
    registerDefaults()
    if (!nodeProvider.nodeDef) return
    if (!modelToNodeMap.value[modelType]) {
      modelToNodeMap.value[modelType] = []
    }
    modelToNodeMap.value[modelType].push(nodeProvider)
  }
  /**
   * Register a node provider for the given simple names.
   * `@param` modelType The name of the model type to register the node provider for.
   * `@param` nodeClass The node class name to register.
   * `@param` key The key to use for the node input.
   */
  function quickRegister(modelType: string, nodeClass: string, key: string) {
    registerNodeProvider(
      modelType,
      new ModelNodeProvider(nodeDefStore.nodeDefsByName[nodeClass], key)
    )
  }

  function registerDefaults() {
    if (haveDefaultsLoaded.value) {
      return
    }
    if (Object.keys(nodeDefStore.nodeDefsByName).length === 0) {
      return
    }
    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', '')
  }

  return {
    modelToNodeMap,
    getRegisteredNodeTypes,
    getCategoryForNodeType,
    getNodeProvider,
    getAllNodeProviders,
    registerNodeProvider,
    quickRegister,
    registerDefaults
  }
})

[src/stores/modelToNodeStore.ts] (lines 8-19)

export class ModelNodeProvider {
  /** The node definition to use for this model. */
  public nodeDef: ComfyNodeDefImpl

  /** The node input key for where to insert the model name. */
  public key: string

  constructor(nodeDef: ComfyNodeDefImpl, key: string) {
    this.nodeDef = nodeDef
    this.key = key
  }
}

🧠 Learnings used
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/AGENTS.md:0-0
Timestamp: 2026-01-27T20:51:47.936Z
Learning: Applies to src/**/stores/**/*.{js,ts} : Restrict store extension access to keep internal implementation private

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/AGENTS.md:0-0
Timestamp: 2026-02-03T20:31:03.021Z
Learning: Applies to browser_tests/**/*.spec.ts : Use premade JSON workflows from the assets/ directory to load desired graph state in tests

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/AGENTS.md:0-0
Timestamp: 2026-02-03T20:33:39.759Z
Learning: Applies to browser_tests/**/*.spec.ts : Use premade JSON workflows in the `assets/` directory to load desired graph state in E2E tests

Learnt from: jtydhr88
Repo: Comfy-Org/ComfyUI_frontend PR: 7214
File: src/i18n.ts:97-98
Timestamp: 2025-12-08T01:21:41.368Z
Learning: In src/i18n.ts and related i18n code, use `Record<string, unknown>` for locale data structures (including custom nodes i18n data) to maintain consistency with existing patterns used in localeLoaders, nodeDefsLoaders, commandsLoaders, and settingsLoaders.

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-03T20:30:57.039Z
Learning: Do not add or retain redundant comments; clean as you go

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 8497
File: src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue:223-236
Timestamp: 2026-02-01T21:10:36.669Z
Learning: In the ComfyUI_frontend repository, the maintainer DrJKL prefers not to maintain or fix code comments, expressing that "all comments are lies" and they become outdated. Focus on self-documenting code through clear naming rather than suggesting comment fixes or additions.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7177
File: src/platform/assets/components/UploadModelFooter.vue:72-78
Timestamp: 2025-12-05T06:11:09.383Z
Learning: For the ComfyUI_frontend repository, avoid suggesting comments that would be redundant when the code is already self-explanatory through descriptive naming (e.g., filenames, prop names, aria-labels). The project prefers clean code without unnecessary documentation comments.

- Resolve merge conflicts with main
- Fix incorrect Segformer node class: LS_LoadSegformerModel -> LoadSegformerModel
  (LS_LoadSegformerModel is only the internal node ID, not the Python class name)
- Update tests to use correct class name

Amp-Thread-ID: https://ampcode.com/threads/T-019c0cdc-0150-7698-b71f-1f18d053521c
@github-actions
Copy link

github-actions bot commented Feb 1, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/06/2026, 10:06:57 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Feb 1, 2026

🎭 Playwright Tests: ⚠️ Passed with flaky tests

Results: 521 passed, 0 failed, 1 flaky, 8 skipped (Total: 530)

❌ Failed Tests

📊 Browser Reports
  • chromium: View Report (✅ 509 / ❌ 0 / ⚠️ 1 / ⏭️ 8)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 9 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@github-actions
Copy link

github-actions bot commented Feb 1, 2026

Bundle Size Report

Summary

  • Raw size: 20.2 MB baseline 20.2 MB — 🔴 +825 B
  • Gzip: 4.32 MB baseline 4.32 MB — 🔴 +311 B
  • Brotli: 3.34 MB baseline 3.34 MB — 🔴 +227 B
  • Bundles: 233 current • 233 baseline • 107 added / 107 removed

Category Glance
Data & Services 🔴 +825 B (2.1 MB) · Vendor & Third-Party ⚪ 0 B (9.37 MB) · Other ⚪ 0 B (7.1 MB) · Graph Workspace ⚪ 0 B (840 kB) · Panels & Settings ⚪ 0 B (410 kB) · Utilities & Hooks ⚪ 0 B (234 kB) · + 5 more

Per-category breakdown
App Entry Points — 22.5 kB (baseline 22.5 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BhJ-eTxZ.js (new) 22.5 kB 🔴 +22.5 kB 🔴 +7.18 kB 🔴 +6.23 kB
assets/index-C1z6709A.js (removed) 22.5 kB 🟢 -22.5 kB 🟢 -7.17 kB 🟢 -6.26 kB

Status: 1 added / 1 removed

Graph Workspace — 840 kB (baseline 840 kB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BROH1qx3.js (new) 840 kB 🔴 +840 kB 🔴 +180 kB 🔴 +137 kB
assets/GraphView-Bt7qWkcx.js (removed) 840 kB 🟢 -840 kB 🟢 -180 kB 🟢 -137 kB

Status: 1 added / 1 removed

Views & Navigation — 69 kB (baseline 69 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CLEjJ4KK.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +3.46 kB 🔴 +2.95 kB
assets/CloudSurveyView-la0fp1as.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -3.46 kB 🟢 -2.93 kB
assets/CloudLoginView-BcfpnNL8.js (new) 10 kB 🔴 +10 kB 🔴 +2.93 kB 🔴 +2.57 kB
assets/CloudLoginView-CKWVUZKO.js (removed) 10 kB 🟢 -10 kB 🟢 -2.93 kB 🟢 -2.57 kB
assets/UserCheckView-Biu4EdSh.js (removed) 8.39 kB 🟢 -8.39 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/UserCheckView-BK9WvaUP.js (new) 8.39 kB 🔴 +8.39 kB 🔴 +2.23 kB 🔴 +1.93 kB
assets/CloudSignupView-ByoGLngX.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.31 kB 🟢 -2.02 kB
assets/CloudSignupView-BzS7D4zS.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.31 kB 🔴 +2.03 kB
assets/CloudLayoutView-BwFiQ6xx.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.11 kB 🔴 +1.83 kB
assets/CloudLayoutView-dq_BGm4X.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.12 kB 🟢 -1.84 kB
assets/CloudForgotPasswordView-B9YiWCaJ.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.94 kB 🟢 -1.73 kB
assets/CloudForgotPasswordView-D_LtG6tN.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.94 kB 🔴 +1.71 kB
assets/CloudAuthTimeoutView-BDvZOzK4.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/CloudAuthTimeoutView-DwHTwksl.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CloudSubscriptionRedirectView-CPd2TBfX.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.77 kB 🔴 +1.57 kB
assets/CloudSubscriptionRedirectView-D3aklwEV.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.77 kB 🟢 -1.57 kB
assets/UserSelectView-C8X-JR-C.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/UserSelectView-DJKJxZFx.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.64 kB 🟢 -1.46 kB
assets/CloudSorryContactSupportView-BPXBOTez.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-ncetNFDR.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

Panels & Settings — 410 kB (baseline 410 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WorkspacePanel-BVHLZuQY.js (new) 26.9 kB 🔴 +26.9 kB 🔴 +5.66 kB 🔴 +4.97 kB
assets/WorkspacePanel-DVNXE9n4.js (removed) 26.9 kB 🟢 -26.9 kB 🟢 -5.66 kB 🟢 -4.97 kB
assets/SecretsPanel-C-fA3whR.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.31 kB 🟢 -4.66 kB
assets/SecretsPanel-DA6QBG8a.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.31 kB 🔴 +4.66 kB
assets/LegacyCreditsPanel-BTuMiwCU.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -5.62 kB 🟢 -4.93 kB
assets/LegacyCreditsPanel-Dyz1Qthv.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +5.62 kB 🔴 +4.93 kB
assets/SubscriptionPanel-B3p_rR_v.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +4.77 kB 🔴 +4.21 kB
assets/SubscriptionPanel-BCf349_s.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -4.76 kB 🟢 -4.2 kB
assets/KeybindingPanel-ChQgFsIN.js (removed) 12.6 kB 🟢 -12.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/KeybindingPanel-DsRkW_hC.js (new) 12.6 kB 🔴 +12.6 kB 🔴 +3.63 kB 🔴 +3.2 kB
assets/ExtensionPanel-D1n6WOoT.js (removed) 9.49 kB 🟢 -9.49 kB 🟢 -2.69 kB 🟢 -2.39 kB
assets/ExtensionPanel-D3oZY2Sa.js (new) 9.49 kB 🔴 +9.49 kB 🔴 +2.69 kB 🔴 +2.39 kB
assets/AboutPanel-D1CuVacg.js (removed) 8.62 kB 🟢 -8.62 kB 🟢 -2.45 kB 🟢 -2.23 kB
assets/AboutPanel-Di7ZJRdl.js (new) 8.62 kB 🔴 +8.62 kB 🔴 +2.46 kB 🔴 +2.21 kB
assets/ServerConfigPanel-D8-HnoBk.js (new) 6.64 kB 🔴 +6.64 kB 🔴 +2.15 kB 🔴 +1.93 kB
assets/ServerConfigPanel-dnQMEJqx.js (removed) 6.64 kB 🟢 -6.64 kB 🟢 -2.15 kB 🟢 -1.94 kB
assets/UserPanel-CLrOyxf7.js (removed) 6.28 kB 🟢 -6.28 kB 🟢 -2.02 kB 🟢 -1.77 kB
assets/UserPanel-DTc7bxMt.js (new) 6.28 kB 🔴 +6.28 kB 🔴 +2.02 kB 🔴 +1.78 kB
assets/cloudRemoteConfig-BKQgXEgZ.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -698 B 🟢 -603 B
assets/cloudRemoteConfig-DJZJt2qw.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +699 B 🔴 +612 B
assets/refreshRemoteConfig-DCuNu9Qf.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -511 B 🟢 -449 B
assets/refreshRemoteConfig-DoQr2Bjh.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +512 B 🔴 +448 B
assets/refreshRemoteConfig-9z6dwkr1.js (new) 345 B 🔴 +345 B 🔴 +201 B 🔴 +204 B
assets/refreshRemoteConfig-BO6p9EzH.js (removed) 345 B 🟢 -345 B 🟢 -202 B 🟢 -206 B
assets/config-HAvaVehF.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/remoteConfig-CUBB_j_I.js 581 B 581 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BgcR6REE.js 25 kB 25 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BmEXiKRV.js 32 kB 32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BNs5rnMt.js 24.1 kB 24.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C5jqELHS.js 23.6 kB 23.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CKCscONF.js 28.1 kB 28.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CzcL_U24.js 20.8 kB 20.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D95NIw0v.js 26.8 kB 26.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DmYc-PH9.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DQe4OZm2.js 25.7 kB 25.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dxocpd_-.js 20.3 kB 20.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-f2yAwEpW.js 23.3 kB 23.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

User & Accounts — 16 kB (baseline 16 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-3sq5oRaz.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +991 B
assets/auth-Dch7xfSr.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -991 B
assets/SignUpForm-38EZlLOp.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/SignUpForm-znk1AB3P.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/UpdatePasswordContent-BDMeRA4t.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -946 B
assets/UpdatePasswordContent-ByNcxsvu.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +949 B
assets/firebaseAuthStore-BJZZUIb4.js (new) 790 B 🔴 +790 B 🔴 +389 B 🔴 +353 B
assets/firebaseAuthStore-Dsbla-rI.js (removed) 790 B 🟢 -790 B 🟢 -388 B 🟢 -346 B
assets/auth-BwOmK8FZ.js (new) 347 B 🔴 +347 B 🔴 +222 B 🔴 +212 B
assets/auth-DssRBCwO.js (removed) 347 B 🟢 -347 B 🟢 -220 B 🟢 -187 B
assets/PasswordFields-BAi3GPM-.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-B0BztYjc.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Editors & Dialogs — 3.47 kB (baseline 3.47 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-B6iV0nIP.js (removed) 2.68 kB 🟢 -2.68 kB 🟢 -1.32 kB 🟢 -1.18 kB
assets/useSubscriptionDialog-eDNFj7Lx.js (new) 2.68 kB 🔴 +2.68 kB 🔴 +1.32 kB 🔴 +1.19 kB
assets/useSubscriptionDialog-DVEeR3ga.js (new) 783 B 🔴 +783 B 🔴 +387 B 🔴 +344 B
assets/useSubscriptionDialog-Eht95feh.js (removed) 783 B 🟢 -783 B 🟢 -385 B 🟢 -345 B

Status: 2 added / 2 removed

UI Components — 37.8 kB (baseline 37.8 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-C9qpx8DA.js (new) 9.9 kB 🔴 +9.9 kB 🔴 +3.4 kB 🔴 +2.99 kB
assets/useTerminalTabs-VGRtbhIf.js (removed) 9.9 kB 🟢 -9.9 kB 🟢 -3.4 kB 🟢 -2.98 kB
assets/ComfyQueueButton-BL-swh8y.js (removed) 7.13 kB 🟢 -7.13 kB 🟢 -2.31 kB 🟢 -2.06 kB
assets/ComfyQueueButton-BwcAhK-X.js (new) 7.13 kB 🔴 +7.13 kB 🔴 +2.31 kB 🔴 +2.06 kB
assets/SubscribeButton-BMQSODIA.js (removed) 3.68 kB 🟢 -3.68 kB 🟢 -1.38 kB 🟢 -1.24 kB
assets/SubscribeButton-DmhGHniN.js (new) 3.68 kB 🔴 +3.68 kB 🔴 +1.38 kB 🔴 +1.24 kB
assets/cloudFeedbackTopbarButton-DNUycdYG.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -858 B 🟢 -762 B
assets/cloudFeedbackTopbarButton-Dtn2zLFr.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +856 B 🔴 +755 B
assets/ComfyQueueButton-BzeLPcis.js (new) 795 B 🔴 +795 B 🔴 +393 B 🔴 +351 B
assets/ComfyQueueButton-jLhIqioH.js (removed) 795 B 🟢 -795 B 🟢 -391 B 🟢 -351 B
assets/Button-ChqYCdrL.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-nZ5YFAbJ.js 1.2 kB 1.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-BsZTG314.js 7.52 kB 7.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-Dtdiv1Hu.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DVfWCi_V.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.1 MB (baseline 2.1 MB) • 🔴 +825 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-xa2PX2SL.js (new) 1.3 MB 🔴 +1.3 MB 🔴 +298 kB 🔴 +232 kB
assets/dialogService-C8g-thZs.js (removed) 1.3 MB 🟢 -1.3 MB 🟢 -298 kB 🟢 -232 kB
assets/api-C-dsu1Tk.js (removed) 643 kB 🟢 -643 kB 🟢 -145 kB 🟢 -116 kB
assets/api-DnQFYIzK.js (new) 643 kB 🔴 +643 kB 🔴 +145 kB 🔴 +116 kB
assets/load3dService-CZVV61sG.js (new) 91.1 kB 🔴 +91.1 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-DCATf2nq.js (removed) 91.1 kB 🟢 -91.1 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/teamWorkspaceStore-CXbd4DaP.js (new) 27.1 kB 🔴 +27.1 kB 🔴 +6.12 kB 🔴 +5.41 kB
assets/teamWorkspaceStore-DS4Hw88Z.js (removed) 27.1 kB 🟢 -27.1 kB 🟢 -6.12 kB 🟢 -5.41 kB
assets/systemStatsStore-2srZtGgt.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +4.29 kB 🔴 +3.77 kB
assets/systemStatsStore-DBROLa9j.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -4.29 kB 🟢 -3.77 kB
assets/releaseStore-BfuqZZ7y.js (removed) 8.14 kB 🟢 -8.14 kB 🟢 -2.24 kB 🟢 -1.97 kB
assets/releaseStore-D1VlHqM6.js (new) 8.14 kB 🔴 +8.14 kB 🔴 +2.24 kB 🔴 +1.97 kB
assets/keybindingService-C5SXWsSR.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/keybindingService-DnLAj_VF.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/bootstrapStore-Dqet_duy.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +883 B 🔴 +814 B
assets/bootstrapStore-GmQw0iPQ.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -879 B 🟢 -814 B
assets/userStore-D8FUa28p.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +720 B 🔴 +634 B
assets/userStore-DS_prvy9.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -718 B 🟢 -673 B
assets/audioService-BekrnVcw.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -842 B 🟢 -723 B
assets/audioService-C0qSRWsg.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +846 B 🔴 +725 B
assets/releaseStore-DMEEzFwT.js (new) 762 B 🔴 +762 B 🔴 +384 B 🔴 +334 B
assets/releaseStore-hjuKOpbo.js (removed) 762 B 🟢 -762 B 🟢 -384 B 🟢 -334 B
assets/dialogStore-D2gUGUn6.js 4.1 kB 4.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-DB58Z5s2.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

Utilities & Hooks — 234 kB (baseline 234 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-CUhU98bm.js (new) 177 kB 🔴 +177 kB 🔴 +38.9 kB 🔴 +32.4 kB
assets/useConflictDetection-Dk9loaI5.js (removed) 177 kB 🟢 -177 kB 🟢 -38.9 kB 🟢 -32.4 kB
assets/useLoad3d-2jaIwBlC.js (new) 14.4 kB 🔴 +14.4 kB 🔴 +3.56 kB 🔴 +3.14 kB
assets/useLoad3d-mqKyn0L4.js (removed) 14.4 kB 🟢 -14.4 kB 🟢 -3.56 kB 🟢 -3.14 kB
assets/useLoad3dViewer-CnInIe3B.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.16 kB 🟢 -2.8 kB
assets/useLoad3dViewer-U120DPfT.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.16 kB 🔴 +2.8 kB
assets/useErrorHandling-DHmJcTJ4.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.34 kB 🟢 -1.19 kB
assets/useErrorHandling-RmcURj5e.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.34 kB 🔴 +1.18 kB
assets/useWorkspaceUI-Dt8oabW5.js (new) 3.16 kB 🔴 +3.16 kB 🔴 +882 B 🔴 +764 B
assets/useWorkspaceUI-gdIhjkca.js (removed) 3.16 kB 🟢 -3.16 kB 🟢 -883 B 🟢 -764 B
assets/useSubscriptionActions-_9LV69fR.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -757 B 🟢 -650 B
assets/useSubscriptionActions-6Mh-_Upm.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +756 B 🔴 +651 B
assets/subscriptionCheckoutUtil-BJ9Ny6ou.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +786 B 🔴 +688 B
assets/subscriptionCheckoutUtil-C_q7t4_b.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -785 B 🟢 -679 B
assets/useSubscriptionCredits-Cv-wuCoX.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +500 B 🔴 +434 B
assets/useSubscriptionCredits-df1dx2-7.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -500 B 🟢 -450 B
assets/useLoad3d-BA8e3WXz.js (removed) 861 B 🟢 -861 B 🟢 -426 B 🟢 -379 B
assets/useLoad3d-D97-3cNd.js (new) 861 B 🔴 +861 B 🔴 +425 B 🔴 +381 B
assets/audioUtils-BzMn_K_I.js (new) 858 B 🔴 +858 B 🔴 +499 B 🔴 +400 B
assets/audioUtils-CdPcsVtO.js (removed) 858 B 🟢 -858 B 🟢 -497 B 🟢 -404 B
assets/useLoad3dViewer-CskW_czj.js (new) 840 B 🔴 +840 B 🔴 +409 B 🔴 +373 B
assets/useLoad3dViewer-CvUHPPFh.js (removed) 840 B 🟢 -840 B 🟢 -410 B 🟢 -370 B
assets/useCurrentUser-CCgRJcav.js (new) 724 B 🔴 +724 B 🔴 +375 B 🔴 +330 B
assets/useCurrentUser-DgP-NLWL.js (removed) 724 B 🟢 -724 B 🟢 -371 B 🟢 -326 B
assets/_plugin-vue_export-helper-CAbbkOlw.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-FW_Ghng2.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Djb4sHrV.js 524 B 524 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-Cc2LFa5s.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/networkUtil-Du2a_n7V.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-DwBAnKr-.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCopyToClipboard-BCOSf9ef.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-DWs-fjHA.js 1.63 kB 1.63 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

Vendor & Third-Party — 9.37 MB (baseline 9.37 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-D0w6WYH0.js 71.6 kB 71.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-CIdI9Yl4.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-CLEC0CcJ.js 842 kB 842 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-C6_f776o.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-BkVHYrKV.js 102 kB 102 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-DPcKX1Hx.js 2.16 MB 2.16 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-Dw8RivU1.js 1.74 MB 1.74 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CPrt7lw0.js 240 kB 240 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-BVA5kbUC.js 183 kB 183 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-CJhOuqDg.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-CvX7mojg.js 632 kB 632 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-BBP9kkTE.js 312 kB 312 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-CS5mlw4Q.js 111 kB 111 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-DOEEpxXk.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-BtrvIr1x.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-gAWmQIF-.js 110 kB 110 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.1 MB (baseline 7.1 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-BmeDhKOp.js (new) 71.4 kB 🔴 +71.4 kB 🔴 +18.4 kB 🔴 +15.8 kB
assets/core-rZ6qwDFI.js (removed) 71.4 kB 🟢 -71.4 kB 🟢 -18.4 kB 🟢 -15.8 kB
assets/groupNode-BHUKOuY_.js (removed) 70.9 kB 🟢 -70.9 kB 🟢 -17.5 kB 🟢 -15.4 kB
assets/groupNode-DSjG6aDL.js (new) 70.9 kB 🔴 +70.9 kB 🔴 +17.5 kB 🔴 +15.4 kB
assets/WidgetSelect-BlQIA6z0.js (new) 56.6 kB 🔴 +56.6 kB 🔴 +12 kB 🔴 +10.4 kB
assets/WidgetSelect-DucxtZUx.js (removed) 56.6 kB 🟢 -56.6 kB 🟢 -12 kB 🟢 -10.4 kB
assets/SettingDialogContent-BPcmjr2G.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +8.01 kB 🔴 +7.06 kB
assets/SettingDialogContent-BXYMQuYP.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -8 kB 🟢 -7.05 kB
assets/Load3DControls-BItltWq5.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +5.33 kB 🔴 +4.65 kB
assets/Load3DControls-DZgvZF0a.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -5.33 kB 🟢 -4.64 kB
assets/SubscriptionRequiredDialogContent-CGlgRV3d.js (removed) 25.4 kB 🟢 -25.4 kB 🟢 -6.36 kB 🟢 -5.58 kB
assets/SubscriptionRequiredDialogContent-GKP-EIam.js (new) 25.4 kB 🔴 +25.4 kB 🔴 +6.36 kB 🔴 +5.58 kB
assets/Load3dViewerContent-3TTG-mFu.js (removed) 23.2 kB 🟢 -23.2 kB 🟢 -5.24 kB 🟢 -4.54 kB
assets/Load3dViewerContent-DCN0cjCs.js (new) 23.2 kB 🔴 +23.2 kB 🔴 +5.25 kB 🔴 +4.54 kB
assets/WidgetImageCrop-Bas2RJXg.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.51 kB 🔴 +4.86 kB
assets/WidgetImageCrop-i9HNwGai.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.51 kB 🟢 -4.85 kB
assets/FormItem-AVjBAZvE.js (removed) 20.2 kB 🟢 -20.2 kB 🟢 -4.87 kB 🟢 -4.25 kB
assets/FormItem-BTHQ7MQk.js (new) 20.2 kB 🔴 +20.2 kB 🔴 +4.87 kB 🔴 +4.25 kB
assets/CurrentUserPopoverWorkspace-CszMRviy.js (new) 19.7 kB 🔴 +19.7 kB 🔴 +4.74 kB 🔴 +4.22 kB
assets/CurrentUserPopoverWorkspace-SFLrD01e.js (removed) 19.7 kB 🟢 -19.7 kB 🟢 -4.74 kB 🟢 -4.23 kB
assets/SignInContent-ClPobh2r.js (removed) 19 kB 🟢 -19 kB 🟢 -4.8 kB 🟢 -4.2 kB
assets/SignInContent-wi1nXOY0.js (new) 19 kB 🔴 +19 kB 🔴 +4.8 kB 🔴 +4.2 kB
assets/WidgetRecordAudio-DhKoXrcn.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -4.92 kB 🟢 -4.4 kB
assets/WidgetRecordAudio-nrC21zHU.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +4.92 kB 🔴 +4.4 kB
assets/TopUpCreditsDialogContent-C_nA7WyD.js (removed) 16.9 kB 🟢 -16.9 kB 🟢 -4.8 kB 🟢 -4.24 kB
assets/TopUpCreditsDialogContent-CMHH6T7h.js (new) 16.9 kB 🔴 +16.9 kB 🔴 +4.8 kB 🔴 +4.25 kB
assets/Load3D-0DMDlz9j.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.04 kB 🟢 -3.52 kB
assets/Load3D-BisVRY94.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.04 kB 🔴 +3.5 kB
assets/MissingModelsWarning-BgboYK8L.js (removed) 16.1 kB 🟢 -16.1 kB 🟢 -4.4 kB 🟢 -3.9 kB
assets/MissingModelsWarning-YZlphcXR.js (new) 16.1 kB 🔴 +16.1 kB 🔴 +4.4 kB 🔴 +3.92 kB
assets/SubscriptionPanelContentWorkspace-Ba6NVWNg.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.03 kB 🔴 +3.56 kB
assets/SubscriptionPanelContentWorkspace-BZsAknXK.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -4.03 kB 🟢 -3.54 kB
assets/WidgetInputNumber-B3bcu9gp.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -4.26 kB 🟢 -3.8 kB
assets/WidgetInputNumber-C3zAo9xo.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.26 kB 🔴 +3.81 kB
assets/load3d-CXHqfLcW.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.18 kB 🟢 -3.65 kB
assets/load3d-DW-KJWzQ.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.18 kB 🔴 +3.65 kB
assets/AudioPreviewPlayer-CipPVkRU.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.2 kB 🔴 +2.87 kB
assets/AudioPreviewPlayer-CoPNrVGq.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.2 kB 🟢 -2.87 kB
assets/NodeConflictDialogContent-C3bGf8Oi.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.36 kB 🔴 +2.08 kB
assets/NodeConflictDialogContent-DlONyUiX.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.36 kB 🟢 -2.08 kB
assets/nodeTemplates-Dw-I380u.js (new) 9.33 kB 🔴 +9.33 kB 🔴 +3.27 kB 🔴 +2.87 kB
assets/nodeTemplates-ZO7b3VwO.js (removed) 9.33 kB 🟢 -9.33 kB 🟢 -3.27 kB 🟢 -2.89 kB
assets/InviteMemberDialogContent-BlytnLIG.js (new) 7.95 kB 🔴 +7.95 kB 🔴 +2.57 kB 🔴 +2.23 kB
assets/InviteMemberDialogContent-DK5W76ff.js (removed) 7.95 kB 🟢 -7.95 kB 🟢 -2.57 kB 🟢 -2.23 kB
assets/WidgetWithControl-CJoXRiNh.js (new) 6.97 kB 🔴 +6.97 kB 🔴 +2.59 kB 🔴 +2.31 kB
assets/WidgetWithControl-f8caGU6h.js (removed) 6.97 kB 🟢 -6.97 kB 🟢 -2.59 kB 🟢 -2.31 kB
assets/Load3DConfiguration-Bnm8OHdU.js (new) 6.36 kB 🔴 +6.36 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/Load3DConfiguration-DTQB5fGF.js (removed) 6.36 kB 🟢 -6.36 kB 🟢 -1.92 kB 🟢 -1.69 kB
assets/MissingNodesContent-BbCm-xxE.js (removed) 6.14 kB 🟢 -6.14 kB 🟢 -2.08 kB 🟢 -1.84 kB
assets/MissingNodesContent-BO6o8gUe.js (new) 6.14 kB 🔴 +6.14 kB 🔴 +2.08 kB 🔴 +1.85 kB
assets/CreateWorkspaceDialogContent-BYclnoac.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -2 kB 🟢 -1.75 kB
assets/CreateWorkspaceDialogContent-DUxHDikW.js (new) 5.58 kB 🔴 +5.58 kB 🔴 +2 kB 🔴 +1.75 kB
assets/EditWorkspaceDialogContent-CJjkvxbZ.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.96 kB 🔴 +1.71 kB
assets/EditWorkspaceDialogContent-UCllNTy0.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.96 kB 🟢 -1.7 kB
assets/ValueControlPopover-CZCbRUH1.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.77 kB 🟢 -1.58 kB
assets/ValueControlPopover-D92Uv7a4.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.77 kB 🔴 +1.59 kB
assets/Preview3d-DT0TYKvz.js (new) 4.82 kB 🔴 +4.82 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/Preview3d-hAjI0tFc.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/MissingNodesFooter-BVmq4pWU.js (new) 4.8 kB 🔴 +4.8 kB 🔴 +1.78 kB 🔴 +1.57 kB
assets/MissingNodesFooter-yTUd7RqS.js (removed) 4.8 kB 🟢 -4.8 kB 🟢 -1.78 kB 🟢 -1.58 kB
assets/DeleteWorkspaceDialogContent-8qJ-RWIO.js (new) 4.28 kB 🔴 +4.28 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/DeleteWorkspaceDialogContent-De5PmIwf.js (removed) 4.28 kB 🟢 -4.28 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/LeaveWorkspaceDialogContent-C8rcYcqg.js (new) 4.11 kB 🔴 +4.11 kB 🔴 +1.59 kB 🔴 +1.38 kB
assets/LeaveWorkspaceDialogContent-D1m4XTgJ.js (removed) 4.11 kB 🟢 -4.11 kB 🟢 -1.59 kB 🟢 -1.38 kB
assets/RemoveMemberDialogContent-C0DM6L4G.js (removed) 4.09 kB 🟢 -4.09 kB 🟢 -1.54 kB 🟢 -1.34 kB
assets/RemoveMemberDialogContent-LSNtymwx.js (new) 4.09 kB 🔴 +4.09 kB 🔴 +1.54 kB 🔴 +1.34 kB
assets/RevokeInviteDialogContent-4u_PlueL.js (removed) 4 kB 🟢 -4 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/RevokeInviteDialogContent-BkRBGsFX.js (new) 4 kB 🔴 +4 kB 🔴 +1.55 kB 🔴 +1.36 kB
assets/saveMesh-0on1KDgb.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.45 kB 🔴 +1.29 kB
assets/saveMesh-DKucKaIo.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.29 kB
assets/cloudSessionCookie-CgbcI4p_.js (new) 3.07 kB 🔴 +3.07 kB 🔴 +1.08 kB 🔴 +940 B
assets/cloudSessionCookie-ZDmhZjYT.js (removed) 3.07 kB 🟢 -3.07 kB 🟢 -1.08 kB 🟢 -952 B
assets/GlobalToast-CZ_BR5z2.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -963 B 🟢 -808 B
assets/GlobalToast-pmI9tFlk.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +964 B 🔴 +802 B
assets/SubscribeToRun-DKuqj9_N.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -989 B 🟢 -866 B
assets/SubscribeToRun-jMZC2-rN.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +989 B 🔴 +866 B
assets/CloudRunButtonWrapper-BKmKoNe4.js (removed) 1.67 kB 🟢 -1.67 kB 🟢 -780 B 🟢 -703 B
assets/CloudRunButtonWrapper-D-4UNKDb.js (new) 1.67 kB 🔴 +1.67 kB 🔴 +781 B 🔴 +715 B
assets/cloudBadges-ClAOfD9t.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -699 B 🟢 -615 B
assets/cloudBadges-DjhDPJRI.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +699 B 🔴 +613 B
assets/cloudSubscription-cVYDf11K.js (new) 1.32 kB 🔴 +1.32 kB 🔴 +653 B 🔴 +571 B
assets/cloudSubscription-DIMuM9Zk.js (removed) 1.32 kB 🟢 -1.32 kB 🟢 -652 B 🟢 -565 B
assets/SubscriptionPanelContentWorkspace-C-YaXQTp.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +478 B 🔴 +416 B
assets/SubscriptionPanelContentWorkspace-D04rG78C.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -476 B 🟢 -421 B
assets/Load3D-3hX_7kEh.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -484 B 🟢 -431 B
assets/Load3D-CSu8cQn0.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +483 B 🔴 +435 B
assets/nightlyBadges-CvAVG17K.js (new) 1 kB 🔴 +1 kB 🔴 +536 B 🔴 +476 B
assets/nightlyBadges-wXDziOD5.js (removed) 1 kB 🟢 -1 kB 🟢 -534 B 🟢 -473 B
assets/Load3dViewerContent-BQWIGdoe.js (new) 961 B 🔴 +961 B 🔴 +455 B 🔴 +408 B
assets/Load3dViewerContent-BXAiuFGn.js (removed) 961 B 🟢 -961 B 🟢 -455 B 🟢 -407 B
assets/SettingDialogContent-BQ_SWXQz.js (new) 917 B 🔴 +917 B 🔴 +439 B 🔴 +393 B
assets/SettingDialogContent-CkcWgD1I.js (removed) 917 B 🟢 -917 B 🟢 -441 B 🟢 -390 B
assets/graphHasMissingNodes-2nI-o3Mp.js (new) 761 B 🔴 +761 B 🔴 +373 B 🔴 +323 B
assets/graphHasMissingNodes-BcXWoYRG.js (removed) 761 B 🟢 -761 B 🟢 -373 B 🟢 -323 B
assets/WidgetLegacy-BOOk2xQn.js (new) 747 B 🔴 +747 B 🔴 +386 B 🔴 +338 B
assets/WidgetLegacy-CgqpKMIY.js (removed) 747 B 🟢 -747 B 🟢 -384 B 🟢 -337 B
assets/WidgetInputNumber-BEH39NJU.js (removed) 392 B 🟢 -392 B 🟢 -231 B 🟢 -197 B
assets/WidgetInputNumber-BmJQVRto.js (new) 392 B 🔴 +392 B 🔴 +230 B 🔴 +196 B
assets/AnimationControls-bPyINTJI.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-SdEmJCMH.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-DjoqfnTX.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-BnXUotno.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-DCVL1uOL.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-32ZIoIYN.js 909 B 909 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BTIhwSf_.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BxiMWv9a.js 14.6 kB 14.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BYGUQRX1.js 15.3 kB 15.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CtxsvHdf.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D4xkLWYG.js 14.4 kB 14.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D7Ez6YeH.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DFfk2Km5.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ds7u8tBA.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DuYqNMWX.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-ovF76AYH.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-tMQq9SrH.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-0PstQIzB.js 480 kB 480 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-BHeCxExo.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeContent-VPjQzi79.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeFooter-D_BxHHK1.js 1.88 kB 1.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeHeader-DUns4_x2.js 1.08 kB 1.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-Bir4uhOp.js 12.3 kB 12.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-2HxSpwOp.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-5vUvgJMx.js 155 kB 155 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B_En4SpT.js 148 kB 148 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BpnmNj1n.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BuWOig7p.js 129 kB 129 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BYoy9XSQ.js 136 kB 136 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CKN_4E4Z.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CN7pSufO.js 180 kB 180 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-dc7AuxCr.js 128 kB 128 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dn8ME7jP.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dt6bQoC3.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-DTYkrVtB.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-AFmsiWi3.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-ATOoJCQr.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-CQw3f2T6.js 2.23 kB 2.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingNodesHeader-BOlbqJ0O.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-Dq6XmUX_.js 92 B 92 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictFooter-Dh-VROp2.js 2.37 kB 2.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictHeader-DRxQs5TH.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-_IXEWmm8.js 332 kB 332 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-4ZA9-QzB.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BCF6YMp3.js 365 kB 365 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bjx0mgI7.js 442 kB 442 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BS6wnxse.js 329 kB 329 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Ch6ZXz-h.js 375 kB 375 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D18zvGhR.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DDR1mCTO.js 405 kB 405 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DT6NpDBI.js 354 kB 354 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DyA4_B3a.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-fPFi65f3.js 406 kB 406 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/PanelTemplate-C1h0RxBM.js 1.2 kB 1.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DsBk66MD.js 665 B 665 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-Ca2S-reV.js 1.87 kB 1.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-1KJOqzqF.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SettingDialogHeader-BHt-6Ao_.js 1.62 kB 1.62 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SettingDialogHeader-D5wathvf.js 244 B 244 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-DmfohtOF.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-Bh_ZdHn9.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-DAMctjF_.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-VDank0gz.js 318 B 318 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-RLUqfB5N.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-2w5BjjHm.js 3.94 kB 3.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-Djm16aYN.js 131 B 131 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-Dsp6bf_j.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-jDbRm4n6.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-C8ikSQqn.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-B1RSu0_k.js 3.1 kB 3.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-MXN3EUoN.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-BcUSnWUK.js 1.95 kB 1.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-wePHc2fh.js 2.88 kB 2.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DyQHILEf.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-D07MktMK.js 3.14 kB 3.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-CoKD027B.js 2.5 kB 2.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-BCsKJASV.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 49 added / 49 removed

CodeRabbit suggestion was incorrect - LS_LoadSegformerModel is the correct
node type name used in NODE_CLASS_MAPPINGS for comfyui_layerstyle.

Amp-Thread-ID: https://ampcode.com/threads/T-019c0cdc-0150-7698-b71f-1f18d053521c
@DrJKL DrJKL added the preview label Feb 6, 2026
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@coderabbitai Open an issue to parameterize this test.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Create GitHub issue for parameterizing tests

gh issue create \
  --title "Parameterize repetitive test cases in modelToNodeStore.test.ts" \
  --body "## Context
Identified during review of PR `#8468`: https://github.com/Comfy-Org/ComfyUI_frontend/pull/8468
Comment: https://github.com/Comfy-Org/ComfyUI_frontend/pull/8468#discussion_r2776248903

## Description
Several test cases in \`src/stores/modelToNodeStore.test.ts\` follow similar patterns and could be parameterized using Vitest's \`it.each()\` or similar approaches to reduce code duplication and improve maintainability.

## Test Cases to Parameterize

The following tests in the \`getNodeProvider\` describe block have similar structures:

1. **\"should return provider for new extension model types\"** - tests multiple model types (sam2, sams, ipadapter, depthanything) with assertions on nodeDef name and key
2. **\"should use hierarchical fallback for ultralytics subcategories\"** - tests ultralytics/bbox and ultralytics/segm
3. **\"should return provider for FlashVSR nodes with empty key (auto-load)\"** - tests FlashVSR and FlashVSR-v1.1
4. **\"should return provider for segformer models\"** - tests segformer_b2_clothes and segformer_b3_fashion

## Suggested Approach

Use Vitest's \`it.each()\` to create a test table with columns for:
- Model type
- Expected node definition name
- Expected key value

Example pattern:
\`\`\`typescript
it.each([
  ['sam2', 'DownloadAndLoadSAM2Model', 'model'],
  ['sams', 'SAMLoader', 'model_name'],
  ['ipadapter', 'IPAdapterModelLoader', 'ipadapter_file'],
  // ... more test cases
])('should return provider for %s model type', (modelType, expectedNodeName, expectedKey) => {
  const modelToNodeStore = useModelToNodeStore()
  modelToNodeStore.registerDefaults()
  
  const provider = modelToNodeStore.getNodeProvider(modelType)
  expect(provider?.nodeDef?.name).toBe(expectedNodeName)
  expect(provider?.key).toBe(expectedKey)
})
\`\`\`

## Benefits
- Reduces code duplication
- Makes it easier to add new test cases
- Improves test maintainability
- Clearer test structure

---
Requested by: `@DrJKL`" \
  --assignee DrJKL

Length of output: 57


@DrJKL, I've opened issue #8703 to track the test parameterization work: #8703

The issue outlines using Vitest's it.each() to consolidate the repetitive test cases for model type providers, which should reduce code duplication and make it easier to add new test cases in the future.


🧬 Code Graph Analysis Results

[src/stores/modelToNodeStore.ts:22-245]

export const useModelToNodeStore = defineStore('modelToNode', () => {
const modelToNodeMap = ref<Record<string, ModelNodeProvider[]>>({})
const nodeDefStore = useNodeDefStore()
const haveDefaultsLoaded = ref(false)

/** Internal computed for reactive caching of registered node types */
const registeredNodeTypes = computed<Record<string, string>>(() => {
return Object.fromEntries(
Object.values(modelToNodeMap.value)
.flat()
.filter((provider) => !!provider.nodeDef)
.map((provider) => [provider.nodeDef.name, provider.key])
)
})

/** Internal computed for efficient reverse lookup: nodeType -> category */
const nodeTypeToCategory = computed(() => {
const lookup: Record<string, string> = {}
for (const [category, providers] of Object.entries(modelToNodeMap.value)) {
for (const provider of providers) {
// Extension nodes may not be installed
if (!provider.nodeDef) continue
// Only store the first category for each node type (matches current assetService behavior)
if (!lookup[provider.nodeDef.name]) {
lookup[provider.nodeDef.name] = category
}
}
}
return lookup
})

/** Get set of all registered node types for efficient lookup */
function getRegisteredNodeTypes(): Record<string, string> {
registerDefaults()
return registeredNodeTypes.value
}

/**

  • Get the category for a given node type.
  • Performs efficient O(1) lookup using cached reverse map.
  • @param nodeType The node type name to find the category for
  • @returns The category name, or undefined if not found
    */
    function getCategoryForNodeType(nodeType: string): string | undefined {
    registerDefaults()
// Handle invalid input gracefully
if (!nodeType || typeof nodeType !== 'string') {
  return undefined
}

return nodeTypeToCategory.value[nodeType]

}

/**

  • Find providers for modelType with hierarchical fallback.
  • Tries exact match first, then falls back to top-level segment (e.g., "parent/child" → "parent").
  • Note: Only falls back one level; "a/b/c" tries "a/b/c" then "a", not "a/b".
    */
    function findProvidersWithFallback(
    modelType: string
    ): ModelNodeProvider[] | undefined {
    if (!modelType || typeof modelType !== 'string') {
    return undefined
    }
const exactMatch = modelToNodeMap.value[modelType]
if (exactMatch && exactMatch.length > 0) return exactMatch

const topLevel = modelType.split('/')[0]
if (topLevel === modelType) return undefined

const fallback = modelToNodeMap.value[topLevel]

if (fallback && fallback.length > 0) return fallback

return undefined

}

/**

  • Get the node provider for the given model type name.
  • Supports hierarchical lookups: if "parent/child" has no match, falls back to "parent".
  • @param modelType The name of the model type to get the node provider for.
  • @returns The node provider for the given model type name.
    */
    function getNodeProvider(modelType: string): ModelNodeProvider | undefined {
    registerDefaults()
    return findProvidersWithFallback(modelType)?.[0]
    }

/**

  • Get the list of all valid node providers for the given model type name.
  • Supports hierarchical lookups: if "parent/child" has no match, falls back to "parent".
  • @param modelType The name of the model type to get the node providers for.
  • @returns The list of all valid node providers for the given model type name.
    /
    function getAllNodeProviders(modelType: string): ModelNodeProvider[] {
    registerDefaults()
    return findProvidersWithFallback(modelType) ?? []
    }
    /
    *
  • Register a node provider for the given model type name.
  • @param modelType The name of the model type to register the node provider for.
  • @param nodeProvider The node provider to register.
    /
    function registerNodeProvider(
    modelType: string,
    nodeProvider: ModelNodeProvider
    ) {
    registerDefaults()
    if (!nodeProvider.nodeDef) return
    if (!modelToNodeMap.value[modelType]) {
    modelToNodeMap.value[modelType] = []
    }
    modelToNodeMap.value[modelType].push(nodeProvider)
    }
    /
    *
  • Register a node provider for the given simple names.
  • @param modelType The name of the model type to register the node provider for.
  • @param nodeClass The node class name to register.
  • @param key The key to use for the node input.
    */
    function quickRegister(modelType: string, nodeClass: string, key: string) {
    registerNodeProvider(
    modelType,
    new ModelNodeProvider(nodeDefStore.nodeDefsByName[nodeClass], key)
    )
    }

function registerDefaults() {
if (haveDefaultsLoaded.value) {
return
}
if (Object.keys(nodeDefStore.nodeDefsByName).length === 0) {
return
}
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', '')

}

return {
modelToNodeMap,
getRegisteredNodeTypes,
getCategoryForNodeType,
getNodeProvider,
getAllNodeProviders,
registerNodeProvider,
quickRegister,
registerDefaults
}
})


[src/stores/modelToNodeStore.ts:8-19]

export class ModelNodeProvider {
/** The node definition to use for this model. */
public nodeDef: ComfyNodeDefImpl

/** The node input key for where to insert the model name. */
public key: string

constructor(nodeDef: ComfyNodeDefImpl, key: string) {
this.nodeDef = nodeDef
this.key = key
}
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Update the issue to use it.for instead of it.each()

gh issue edit 8703 --body "## Context
Identified during review of PR `#8468`: https://github.com/Comfy-Org/ComfyUI_frontend/pull/8468
Comment: https://github.com/Comfy-Org/ComfyUI_frontend/pull/8468#discussion_r2776248903

## Description
Several test cases in \`src/stores/modelToNodeStore.test.ts\` follow similar patterns and could be parameterized using Vitest's \`it.for()\` to reduce code duplication and improve maintainability.

## Test Cases to Parameterize

The following tests in the \`getNodeProvider\` describe block have similar structures:

1. **\"should return provider for new extension model types\"** - tests multiple model types (sam2, sams, ipadapter, depthanything) with assertions on nodeDef name and key
2. **\"should use hierarchical fallback for ultralytics subcategories\"** - tests ultralytics/bbox and ultralytics/segm
3. **\"should return provider for FlashVSR nodes with empty key (auto-load)\"** - tests FlashVSR and FlashVSR-v1.1
4. **\"should return provider for segformer models\"** - tests segformer_b2_clothes and segformer_b3_fashion

## Suggested Approach

Use Vitest's \`it.for()\` to create a test table with columns for:
- Model type
- Expected node definition name
- Expected key value

\`it.for()\` is preferred over \`it.each()\` as it provides better TestContext support and follows Vitest best practices.

Example pattern:
\`\`\`typescript
it.for([
  ['sam2', 'DownloadAndLoadSAM2Model', 'model'],
  ['sams', 'SAMLoader', 'model_name'],
  ['ipadapter', 'IPAdapterModelLoader', 'ipadapter_file'],
  ['depthanything', 'DownloadAndLoadDepthAnythingV2Model', 'model'],
  // ... more test cases
])('should return provider for %s model type', ([modelType, expectedNodeName, expectedKey]) => {
  const modelToNodeStore = useModelToNodeStore()
  modelToNodeStore.registerDefaults()
  
  const provider = modelToNodeStore.getNodeProvider(modelType)
  expect(provider?.nodeDef?.name).toBe(expectedNodeName)
  expect(provider?.key).toBe(expectedKey)
})
\`\`\`

Note: \`it.for()\` doesn't spread array arguments (unlike \`it.each()\`), so the test function receives the entire array and needs to destructure it.

## Benefits
- Reduces code duplication
- Makes it easier to add new test cases
- Improves test maintainability
- Clearer test structure
- Better TestContext support compared to \`it.each()\`

---
Requested by: `@DrJKL`"

Length of output: 57


@DrJKL, you're absolutely right—thank you for the correction! I've updated issue #8703 to recommend it.for() instead of it.each().

it.for() is indeed the better choice as it provides TestContext support and follows Vitest best practices. The main difference is that it.for() doesn't spread array arguments, so the test function receives the entire array and needs to destructure it, which gives more flexibility with TestContext access.

The updated issue now includes the correct example pattern using it.for().

In test files at src/**/*.test.ts in the Comfy-Org/ComfyUI_frontend repository, prefer using Vitest's it.for() over it.each() for parameterized tests, as it.for() provides better TestContext support and follows Vitest best practices.


🧬 Code Graph Analysis Results

[src/stores/modelToNodeStore.ts] (lines 22-245)

"""
Docstring: useModelToNodeStore implementation and associated internal helpers.

Context:

  • Exports useModelToNodeStore, a Pinia store managing mapping from model types to
    ModelNodeProvider instances, enabling dynamic loading/registration of node
    providers for different model categories.

Key API and internal state:

  • modelToNodeMap: ref<Record<string, ModelNodeProvider[]>>; maps modelType -> list of providers.
  • nodeDefStore: dependency on useNodeDefStore(); provides available node definitions.
  • haveDefaultsLoaded: ref; guards one-time population of defaults.

Computed helpers:

  • registeredNodeTypes: derived mapping of nodeDef.name -> provider.key for all registered providers.
  • nodeTypeToCategory: derived reverse mapping: nodeDef.name -> category (first category only).

Public/store methods:

  • getRegisteredNodeTypes(): Record<string, string> — ensures defaults loaded; returns mapping of node type to widget key.
  • getCategoryForNodeType(nodeType: string): string | undefined — returns category for a given node type; ensures defaults; handles invalid input gracefully.
  • findProvidersWithFallback(modelType: string): ModelNodeProvider[] | undefined — exact match or hierarchical top-level fallback (e.g., "parent/child" -> "parent" if needed).
  • getNodeProvider(modelType: string): ModelNodeProvider | undefined — returns primary provider; supports fallback.
  • getAllNodeProviders(modelType: string): ModelNodeProvider[] — returns all providers matching modelType or its fallback.
  • registerNodeProvider(modelType: string, nodeProvider: ModelNodeProvider): void — registers a provider; ignores if provider.nodeDef is undefined.
  • quickRegister(modelType: string, nodeClass: string, key: string): void — convenience to register via a nodeDefStore lookup.
  • registerDefaults(): void — populates default registrations for all known model types using predefined mappings; idempotent.

Behaviors:

  • Lazy registration: getNodeProvider/getAllNodeProviders trigger registerDefaults() if not yet loaded.
  • Hierarchical fallback support for model types like "ultralytics/bbox" or "checkpoints/subfolder".
  • Robustness: handles invalid inputs gracefully; non-existent node classes are filtered out.

Notes:

  • This snippet models the core store logic used by tests to verify default registrations,
    provider retrieval, fallback behavior, and dynamic registration paths.
    """

[src/stores/modelToNodeStore.ts] (lines 8-19)

"""
Docstring: ModelNodeProvider class

Context:

  • Simple container for a node definition and its associated key used when registering
    model types to node providers.

API:

  • class ModelNodeProvider
    • nodeDef: ComfyNodeDefImpl — the node definition used by this provider.
    • key: string — the input key for where to insert the model name.
    • constructor(nodeDef: ComfyNodeDefImpl, key: string) — initializes the two fields.

Usage:

  • Instances are created and passed to registerNodeProvider / quickRegister to wire
    model types to specific node definitions and keys.
    """

🧠 Learnings used
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-03T20:30:57.039Z
Learning: Applies to **/*.test.ts : For mocking in Vitest, leverage Vitest's utilities where possible

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/AGENTS.md:0-0
Timestamp: 2026-02-03T23:08:09.731Z
Learning: Applies to src/lib/litegraph/**/*.test.{ts,tsx} : Use provided test helper functions `createTestSubgraph` and `createTestSubgraphNode` from `__fixtures__/subgraphHelpers` for test setup

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 8497
File: src/platform/assets/utils/assetFilterUtils.test.ts:14-25
Timestamp: 2026-02-01T21:08:47.817Z
Learning: In test files at src/**/*.test.ts, when creating test helper functions that construct mock objects implementing an interface (e.g., AssetItem), use `satisfies InterfaceType` for shape validation instead of type assertions like `as Partial<InterfaceType> as InterfaceType` or `as any`.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7894
File: src/renderer/extensions/vueNodes/widgets/components/WidgetToggleSwitch.test.ts:11-14
Timestamp: 2026-01-08T02:40:22.621Z
Learning: In the Comfy-Org/ComfyUI_frontend repository test files: When testing components, import the real type definitions from the component files instead of duplicating interface definitions in the test files. This prevents type drift and maintains consistency.

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-03T20:30:57.039Z
Learning: Applies to **/*.test.ts : Keep module mocks contained; do not use global mutable state within test files; use `vi.hoisted()` if necessary for per-test Arrange phase manipulation

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/AGENTS.md:0-0
Timestamp: 2026-02-03T20:33:39.759Z
Learning: Applies to browser_tests/**/*.spec.ts : Use premade JSON workflows in the `assets/` directory to load desired graph state in E2E tests

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/AGENTS.md:0-0
Timestamp: 2026-02-03T20:31:03.021Z
Learning: Applies to browser_tests/**/*.spec.ts : Use premade JSON workflows from the assets/ directory to load desired graph state in tests

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-03T20:33:39.759Z
Learning: Applies to src/**/*.test.ts : Use Vitest (happy-dom) for unit and component tests

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-03T20:30:57.039Z
Learning: Applies to browser_tests/**/*.spec.ts : Follow Playwright Best Practices in E2E tests

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-03T20:30:57.039Z
Learning: Applies to **/*.test.ts : For Component testing, use Vue Test Utils and follow best practices about making components easy to test

@DrJKL DrJKL assigned christian-byrne and unassigned DrJKL Feb 6, 2026
@christian-byrne christian-byrne added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch cloud/1.38 Backport PRs for cloud 1.38 and removed preview labels Feb 7, 2026
@christian-byrne christian-byrne merged commit f53b087 into main Feb 7, 2026
32 checks passed
@christian-byrne christian-byrne deleted the fix/chatterbox-cloud-model-create branch February 7, 2026 00:04
github-actions bot pushed a commit that referenced this pull request Feb 7, 2026
## Summary

Add mappings for 13 previously unmapped model categories in the Cloud
asset browser, enabling users to click on models to create corresponding
loader nodes on the canvas.

## Changes

### Core nodes
- `latent_upscale_models` → `LatentUpscaleModelLoader`

### Extension nodes
| Category | Node Class | Widget Key |
|----------|-----------|-----------|
| `sam2` | `DownloadAndLoadSAM2Model` | `model` |
| `sams` | `SAMLoader` | `model_name` |
| `ultralytics` | `UltralyticsDetectorProvider` | `model_name` |
| `depthanything` | `DownloadAndLoadDepthAnythingV2Model` | `model` |
| `ipadapter` | `IPAdapterModelLoader` | `ipadapter_file` |
| `segformer_b2_clothes` | `LS_LoadSegformerModel` | `model_name` |
| `segformer_b3_clothes` | `LS_LoadSegformerModel` | `model_name` |
| `segformer_b3_fashion` | `LS_LoadSegformerModel` | `model_name` |
| `nlf` | `LoadNLFModel` | `nlf_model` |
| `FlashVSR` | `FlashVSRNode` | (auto-load) |
| `FlashVSR-v1.1` | `FlashVSRNode` | (auto-load) |

### Hierarchical fallback
- `ultralytics/bbox` and `ultralytics/segm` fall back to the
`ultralytics` mapping

### Skipped categories
- `vae_approx` - No user-facing loader (used internally for latent
previews)
- `detection` - No specific loader exists

## Testing
- Added unit tests for all new mappings
- Tests verify hierarchical fallback works correctly
- All 40 tests pass

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8468-feat-add-model-to-node-mappings-for-cloud-asset-categories-2f86d73d365081389ea5fbfc52ecbfad)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Subagent 5 <subagent@example.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Alexander Brown <drjkl@comfy.org>
Co-authored-by: GitHub Action <action@github.com>
@comfy-pr-bot
Copy link
Member

@christian-byrne Successfully backported to #8706

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Feb 7, 2026
AustinMroz pushed a commit that referenced this pull request Feb 7, 2026
…t categories (#8706)

Backport of #8468 to `cloud/1.38`

Automatically created by backport workflow.

Co-authored-by: Christian Byrne <cbyrne@comfy.org>
Co-authored-by: Subagent 5 <subagent@example.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Alexander Brown <drjkl@comfy.org>
Co-authored-by: GitHub Action <action@github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud/1.38 Backport PRs for cloud 1.38 size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants