import random import json import os class FixedSeedController: """ A ComfyUI node that generates a random seed and keeps it fixed until manually regenerated. Perfect for iterative workflows where you want to keep the same seed across multiple generations. """ def __init__(self): self.current_seed = None self.seed_file = os.path.join(os.path.dirname(__file__), "last_seed.json") self.load_seed() @classmethod def INPUT_TYPES(cls): return { "required": { "generate_new_seed": ("BOOLEAN", { "default": False, "label_on": "Generate New", "label_off": "Keep Current" }), "seed_min": ("INT", { "default": 0, "min": 0, "max": 0xffffffffffffffff, "step": 1 }), "seed_max": ("INT", { "default": 0xffffffffffffffff, "min": 0, "max": 0xffffffffffffffff, "step": 1 }), }, "optional": { "manual_seed": ("INT", { "default": -1, "min": -1, "max": 0xffffffffffffffff, "step": 1, "tooltip": "Set to -1 to use random generation, or enter a specific seed" }), } } RETURN_TYPES = ("INT", "STRING") RETURN_NAMES = ("seed", "seed_info") FUNCTION = "generate_seed" CATEGORY = "utils" OUTPUT_NODE = False def load_seed(self): """Load the last used seed from file""" try: if os.path.exists(self.seed_file): with open(self.seed_file, 'r') as f: data = json.load(f) self.current_seed = data.get('seed', None) except Exception as e: print(f"Could not load seed: {e}") self.current_seed = None def save_seed(self, seed): """Save the current seed to file""" try: with open(self.seed_file, 'w') as f: json.dump({'seed': seed}, f) except Exception as e: print(f"Could not save seed: {e}") def generate_seed(self, generate_new_seed, seed_min, seed_max, manual_seed=-1): """ Generate or return the current seed based on parameters """ # If manual seed is provided (not -1), use it if manual_seed >= 0: self.current_seed = manual_seed self.save_seed(self.current_seed) info = f"Manual Seed: {self.current_seed}" return (self.current_seed, info) # If we need to generate a new seed or don't have one yet if generate_new_seed or self.current_seed is None: self.current_seed = random.randint(seed_min, seed_max) self.save_seed(self.current_seed) info = f"New Random Seed: {self.current_seed}" else: info = f"Fixed Seed: {self.current_seed}" return (self.current_seed, info) # Node registration NODE_CLASS_MAPPINGS = { "FixedSeedController": FixedSeedController } NODE_DISPLAY_NAME_MAPPINGS = { "FixedSeedController": "Fixed Seed Controller" }