From 6de0668c4b90cc8a4ce8c8e9e1f028f2e5edb6f7 Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Fri, 19 Jun 2026 00:44:36 +0200 Subject: [PATCH] feat: add sams and ultralytics model categories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add support for Two new model categories with full frontend and backend integration: - sams: maps sam, sam_model, sam_models → sams category - ultralytics: maps ultralytics, ultralytics_bbox, ultralytics_segm, yolo → ultralytics category Covers CATEGORY_MAP, settings templates/aliases, workflow_analyzer node hints, download target resolution (JS), and folder detection. --- __init__.py | 9 +++++++ core/downloader.py | 8 +++++++ core/settings.py | 12 ++++++++++ core/workflow_analyzer.py | 6 +++++ .../search/download_target_methods.js | 24 ++++++++++++++++--- web/resolver/shell/workflow_state_methods.js | 3 +++ 6 files changed, 59 insertions(+), 3 deletions(-) diff --git a/__init__.py b/__init__.py index acfb0f8..d482812 100644 --- a/__init__.py +++ b/__init__.py @@ -788,6 +788,14 @@ class ModelResolverExtension: "gligen": "gligen", "diffusers": "diffusers", "vae_approx": "vae_approx", + "sam": "sams", + "sam_model": "sams", + "sam_models": "sams", + "sams": "sams", + "ultralytics": "ultralytics", + "ultralytics_bbox": "ultralytics", + "ultralytics_segm": "ultralytics", + "yolo": "ultralytics", "audio_encoder": "audio_encoders", "audio_encoders": "audio_encoders", "background_removal": "background_removal", @@ -1943,6 +1951,7 @@ class ModelResolverExtension: "text_encoders", "ipadapter", "sams", + "ultralytics", ] skip_categories = {"custom_nodes", "configs"} categories = [] diff --git a/core/downloader.py b/core/downloader.py index 915caec..c60f593 100644 --- a/core/downloader.py +++ b/core/downloader.py @@ -63,6 +63,14 @@ CATEGORY_MAP = { "gligen": "gligen", "diffusers": "diffusers", "vae_approx": "vae_approx", + "sam": "sams", + "sam_model": "sams", + "sam_models": "sams", + "sams": "sams", + "ultralytics": "ultralytics", + "ultralytics_bbox": "ultralytics", + "ultralytics_segm": "ultralytics", + "yolo": "ultralytics", "audio_encoder": "audio_encoders", "audio_encoders": "audio_encoders", "background_removal": "background_removal", diff --git a/core/settings.py b/core/settings.py index ab538aa..ea18797 100644 --- a/core/settings.py +++ b/core/settings.py @@ -39,6 +39,14 @@ CATEGORY_MAP = { "gligen": "gligen", "diffusers": "diffusers", "vae_approx": "vae_approx", + "sam": "sams", + "sam_model": "sams", + "sam_models": "sams", + "sams": "sams", + "ultralytics": "ultralytics", + "ultralytics_bbox": "ultralytics", + "ultralytics_segm": "ultralytics", + "yolo": "ultralytics", "audio_encoder": "audio_encoders", "audio_encoders": "audio_encoders", "background_removal": "background_removal", @@ -64,6 +72,8 @@ DEFAULT_DOWNLOAD_PATH_TEMPLATES: Dict[str, str] = { "controlnet": "{base_model}", "vae": "", "upscale_models": "", + "sams": "", + "ultralytics": "", } DEFAULT_ROOT_KEYS = { @@ -85,6 +95,8 @@ TEMPLATE_KEY_ALIASES = { "controlnet": ("controlnet", "control_net"), "vae": ("vae",), "upscale_models": ("upscale_models", "upscale_model", "upscaler"), + "sams": ("sams", "sam", "sam_model", "sam_models"), + "ultralytics": ("ultralytics", "ultralytics_bbox", "ultralytics_segm", "yolo"), } PRIORITY_TAGS = ( diff --git a/core/workflow_analyzer.py b/core/workflow_analyzer.py index 0648699..39a01e1 100644 --- a/core/workflow_analyzer.py +++ b/core/workflow_analyzer.py @@ -108,6 +108,8 @@ NODE_TYPE_TO_CATEGORY_HINTS = { "StyleModelLoader": "style_models", "GLIGENLoader": "gligen", "UpscaleModelLoader": "upscale_models", + "SAMLoader": "sams", + "UltralyticsDetectorProvider": "ultralytics", "AudioEncoderLoader": "audio_encoders", "LoadBackgroundRemovalModel": "background_removal", "LoadDA3Model": "geometry_estimation", @@ -209,6 +211,8 @@ NODE_TYPE_MODEL_WIDGET_CATEGORIES = { "StyleModelLoader": {0: "style_models"}, "GLIGENLoader": {0: "gligen"}, "UpscaleModelLoader": {0: "upscale_models"}, + "SAMLoader": {0: "sams"}, + "UltralyticsDetectorProvider": {0: "ultralytics"}, "AudioEncoderLoader": {0: "audio_encoders"}, "LoadBackgroundRemovalModel": {0: "background_removal"}, "LoadDA3Model": {0: "geometry_estimation"}, @@ -251,6 +255,7 @@ MODEL_WIDGET_NAME_TO_CATEGORY = { "audio_encoder_name": "audio_encoders", "bg_removal_name": "background_removal", "photomaker_model_name": "photomaker", + "sam_model_name": "sams", "text_encoder": "text_encoders", "hypernetwork_name": "hypernetworks", } @@ -316,6 +321,7 @@ MODEL_WIDGET_PLACEHOLDERS = { "included", "(use same)", "select the lora to add to the text", + "esam", "pixel_space", "taesd", "taesdxl", diff --git a/web/resolver/search/download_target_methods.js b/web/resolver/search/download_target_methods.js index 39cec6d..800868c 100644 --- a/web/resolver/search/download_target_methods.js +++ b/web/resolver/search/download_target_methods.js @@ -122,6 +122,12 @@ export const downloadTargetMethods = { style_model: 'style_models', audio_encoder: 'audio_encoders', model_patch: 'model_patches', + sam: 'sams', + sam_model: 'sams', + sam_models: 'sams', + ultralytics_bbox: 'ultralytics', + ultralytics_segm: 'ultralytics', + yolo: 'ultralytics', background_removal_model: 'background_removal', frame_interpolation_model: 'frame_interpolation', geometry_estimation_model: 'geometry_estimation', @@ -157,7 +163,9 @@ export const downloadTargetMethods = { 'detection': 'detection', 'model_patches': 'model patch', 'photomaker': 'PhotoMaker', - 'optical_flow': 'optical flow' + 'optical_flow': 'optical flow', + 'sams': 'SAM', + 'ultralytics': 'Ultralytics' }; return displayNames[category] || category || 'unknown'; }, @@ -229,6 +237,13 @@ export const downloadTargetMethods = { model_patch: 'model', photomaker: 'clip-vision', optical_flow: 'image', + sams: 'controlnet', + sam: 'controlnet', + sam_model: 'controlnet', + ultralytics: 'controlnet', + ultralytics_bbox: 'controlnet', + ultralytics_segm: 'controlnet', + yolo: 'controlnet', image: 'image', images: 'image', mask: 'mask', @@ -269,7 +284,9 @@ export const downloadTargetMethods = { 'detection': 'detection', 'model_patches': 'model_patch', 'photomaker': 'photomaker', - 'optical_flow': 'optical_flow' + 'optical_flow': 'optical_flow', + 'sams': 'sam_model', + 'ultralytics': 'ultralytics' }; return tokenNames[category] || category || 'unknown'; }, @@ -298,7 +315,8 @@ export const downloadTargetMethods = { 'photomaker', 'optical_flow', 'ipadapter', - 'sams' + 'sams', + 'ultralytics' ]; }, diff --git a/web/resolver/shell/workflow_state_methods.js b/web/resolver/shell/workflow_state_methods.js index 5a0750d..1bcbb35 100644 --- a/web/resolver/shell/workflow_state_methods.js +++ b/web/resolver/shell/workflow_state_methods.js @@ -42,6 +42,7 @@ export const workflowStateMethods = { 'audio_encoder_name', 'bg_removal_name', 'photomaker_model_name', + 'sam_model_name', 'text_encoder', 'existing_lora', 'hypernetwork_name', @@ -111,6 +112,8 @@ export const workflowStateMethods = { StyleModelLoader: [0], GLIGENLoader: [0], UpscaleModelLoader: [0], + SAMLoader: [0], + UltralyticsDetectorProvider: [0], AudioEncoderLoader: [0], LoadBackgroundRemovalModel: [0], LoadDA3Model: [0],