Files
Bjornulf_custom_nodes/random_model_selector.py
justumen 510d25e766 0.37
2024-09-17 12:07:26 +02:00

57 lines
2.1 KiB
Python

import os
import random
from folder_paths import get_filename_list, get_full_path
import comfy.sd
class RandomModelSelector:
@classmethod
def INPUT_TYPES(cls):
model_list = get_filename_list("checkpoints")
optional_inputs = {}
for i in range(1, 11):
optional_inputs[f"model_{i}"] = (model_list, {"default": model_list[min(i-1, len(model_list)-1)]})
optional_inputs["seed"] = ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff})
return {
"required": {
"number_of_models": ("INT", {"default": 3, "min": 1, "max": 20, "step": 1}),
},
"optional": optional_inputs
}
RETURN_TYPES = ("MODEL", "CLIP", "VAE", "STRING", "STRING", "STRING")
RETURN_NAMES = ("model", "clip", "vae", "model_path", "model_name", "model_folder")
FUNCTION = "random_select_model"
CATEGORY = "Bjornulf"
def random_select_model(self, number_of_models, seed, **kwargs):
random.seed(seed)
available_models = [kwargs[f"model_{i}"] for i in range(1, number_of_models + 1) if f"model_{i}" in kwargs]
if not available_models:
raise ValueError("No models selected")
selected_model = random.choice(available_models)
# Extract just the name of the model (no folders and no extensions)
model_name = os.path.splitext(os.path.basename(selected_model))[0]
# Get the full path of the selected model
model_path = get_full_path("checkpoints", selected_model)
# Get the folder of the selected model (Hopefully people use that to organize their models...)
model_folder = os.path.basename(os.path.dirname(model_path))
# Load the model
loaded_objects = comfy.sd.load_checkpoint_guess_config(model_path)
# Unpack only the values we need
model = loaded_objects[0]
clip = loaded_objects[1]
vae = loaded_objects[2]
return (model, clip, vae, model_path, model_name, model_folder)