Files

104 lines
3.3 KiB
Python

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"
}