Files
Runware-ComfyUI-Runware/modules/upscaler.py
T

254 lines
11 KiB
Python

from .utils import runwareUtils as rwUtils
class upscaler:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"Image": ("IMAGE", {
"tooltip": "Specifies the input image to be upscaled."
}),
"upscaleFactor": ("INT", {
"tooltip": "Each level will increase the size of the image by the corresponding factor.",
"default": 2,
"min": 1,
"max": 8,
"step": 1,
}),
},
"optional": {
"model": ("STRING", {
"tooltip": "Model AIR ID (runware:500@1, runware:501@1, runware:502@1, runware:503@1, runware:504@1, bria:52@1)",
"default": "",
}),
# Common parameters toggles
"useSteps": ("BOOLEAN", {
"tooltip": "Enable quality steps parameter",
"default": False,
}),
"steps": ("INT", {
"tooltip": "Quality steps (4-60 depending on model)",
"default": 20,
"min": 1,
"max": 100,
}),
"useSeed": ("BOOLEAN", {
"tooltip": "Enable seed for reproducibility",
"default": False,
}),
"seed": ("INT", {
"tooltip": "Reproducibility toggle",
"default": 0,
"min": 0,
}),
"useCFGScale": ("BOOLEAN", {
"tooltip": "Enable CFG Scale parameter",
"default": False,
}),
"CFGScale": ("FLOAT", {
"tooltip": "Guidance CFG (3-20 depending on model)",
"default": 7.0,
"min": 1.0,
"max": 30.0,
"step": 0.1,
}),
"usePrompts": ("BOOLEAN", {
"tooltip": "Enable positive and negative prompts",
"default": False,
}),
"positivePrompt": ("STRING", {
"tooltip": "Positive prompt for upscaling",
"multiline": True,
"default": "",
}),
"negativePrompt": ("STRING", {
"tooltip": "Negative prompt for upscaling",
"multiline": True,
"default": "",
}),
# Clarity upscaler specific toggles
"useClarityParams": ("BOOLEAN", {
"tooltip": "Enable Clarity upscaler specific parameters",
"default": False,
}),
"controlNetWeight": ("FLOAT", {
"tooltip": "Style preservation/Resemblance (0-1) - Clarity upscaler specific",
"default": 0.5,
"min": 0.0,
"max": 1.0,
"step": 0.01,
}),
"strength": ("FLOAT", {
"tooltip": "Creativity (0-1) - Clarity upscaler specific",
"default": 0.5,
"min": 0.0,
"max": 1.0,
"step": 0.01,
}),
"scheduler": ("STRING", {
"tooltip": "Controls noise addition/removal - Clarity upscaler specific",
"default": "DPM++ 2M Karras",
}),
# CCSR and Latent upscaler specific toggles
"useCCSRParams": ("BOOLEAN", {
"tooltip": "Enable CCSR and Latent upscaler specific parameters",
"default": False,
}),
"colorFix": ("BOOLEAN", {
"tooltip": "Color correction (ADAIN/NOFIX) - CCSR and Latent upscaler specific",
"default": False,
}),
"tileDiffusion": ("BOOLEAN", {
"tooltip": "Tile diffusion for large images - CCSR and Latent upscaler specific",
"default": False,
}),
# Latent upscaler specific toggle
"useLatentParams": ("BOOLEAN", {
"tooltip": "Enable Latent upscaler specific parameters",
"default": False,
}),
"clipSkip": ("INT", {
"tooltip": "Skip CLIP layers during guidance (0-2) - Latent upscaler specific",
"default": 0,
"min": 0,
"max": 2,
}),
"safetyInputs": ("RUNWARESAFETYINPUTS", {
"tooltip": "Connect Runware Safety Inputs node to configure safety and content moderation settings.",
}),
"Accelerator": ("RUNWAREACCELERATOR", {
"tooltip": "Connect a Runware Accelerator Options Node to configure caching and acceleration settings.",
}),
"providerSettings": ("RUNWAREPROVIDERSETTINGS", {
"tooltip": "Connect a Runware Provider Settings node to configure provider-specific parameters.",
}),
},
}
DESCRIPTION = "Enhance the resolution and quality of your images using Runware's advanced upscaling API. Transform low-resolution images into sharp, high-definition visuals."
FUNCTION = "upscale"
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("IMAGE",)
CATEGORY = "Runware"
def upscale(self, **kwargs):
image = kwargs.get("Image")
upscaleFactor = int(kwargs.get("upscaleFactor", 2))
# Get toggle parameters
useSteps = kwargs.get("useSteps", False)
useSeed = kwargs.get("useSeed", False)
useCFGScale = kwargs.get("useCFGScale", False)
usePrompts = kwargs.get("usePrompts", False)
useClarityParams = kwargs.get("useClarityParams", False)
useCCSRParams = kwargs.get("useCCSRParams", False)
useLatentParams = kwargs.get("useLatentParams", False)
# Get optional parameters
model = kwargs.get("model", "")
steps = kwargs.get("steps", 20)
seed = kwargs.get("seed", 0)
CFGScale = kwargs.get("CFGScale", 7.0)
positivePrompt = kwargs.get("positivePrompt", "")
negativePrompt = kwargs.get("negativePrompt", "")
controlNetWeight = kwargs.get("controlNetWeight", 0.5)
strength = kwargs.get("strength", 0.5)
scheduler = kwargs.get("scheduler", "DPM++ 2M Karras")
colorFix = kwargs.get("colorFix", False)
tileDiffusion = kwargs.get("tileDiffusion", False)
clipSkip = kwargs.get("clipSkip", 0)
safetyInputs = kwargs.get("safetyInputs", None)
runwareAccelerator = kwargs.get("Accelerator", None)
providerSettings = kwargs.get("providerSettings", None)
# Build the base configuration
genConfig = {
"taskType": "imageUpscale",
"taskUUID": rwUtils.genRandUUID(),
"inputImage": rwUtils.convertTensor2IMG(image),
"upscaleFactor": int(upscaleFactor),
"outputFormat": rwUtils.OUTPUT_FORMAT,
"outputQuality": rwUtils.OUTPUT_QUALITY,
"outputType": "URL",
}
# Add model if specified
if model:
genConfig["model"] = model
# Add common parameters at top level - only add if their toggle is enabled
if useSteps:
genConfig["steps"] = steps
if useSeed:
genConfig["seed"] = seed
if useCFGScale:
genConfig["CFGScale"] = CFGScale
if usePrompts:
if positivePrompt:
genConfig["positivePrompt"] = positivePrompt
if negativePrompt:
genConfig["negativePrompt"] = negativePrompt
# Build settings object for advanced parameters
settings = {}
# Clarity upscaler specific parameters
if useClarityParams:
settings["controlNetWeight"] = controlNetWeight
settings["strength"] = strength
settings["scheduler"] = scheduler
# CCSR and Latent upscaler specific parameters
if useCCSRParams:
settings["colorFix"] = colorFix
settings["tileDiffusion"] = tileDiffusion
# Latent upscaler specific parameters
if useLatentParams:
settings["clipSkip"] = clipSkip
# Add settings to config if any settings were specified
if settings:
genConfig["settings"] = settings
# Add safety inputs if provided
if safetyInputs is not None and isinstance(safetyInputs, dict) and len(safetyInputs) > 0:
genConfig["safety"] = safetyInputs
# Add accelerator options if provided
if runwareAccelerator is not None and isinstance(runwareAccelerator, dict) and len(runwareAccelerator) > 0:
genConfig["acceleratorOptions"] = runwareAccelerator
# Handle providerSettings - extract provider name from model and merge with custom settings
if providerSettings is not None:
# Extract provider name from model (e.g., "runware:500@1" -> "runware")
provider_name = model.split(":")[0] if ":" in model and model else "runware"
# If providerSettings is a dictionary, create the correct API format
if isinstance(providerSettings, dict):
# Create the providerSettings object with provider name as key
final_provider_settings = {
provider_name: providerSettings
}
genConfig["providerSettings"] = final_provider_settings
print(f"[Debugging] Provider settings: {final_provider_settings}")
else:
# If it's just a string, use it directly
genConfig["providerSettings"] = providerSettings
# Debug: Print the request being sent
print(f"[DEBUG] Sending Image Upscale Request:", flush=True)
print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps([genConfig], indent=2)}", flush=True)
try:
genResult = rwUtils.inferenecRequest([genConfig])
# Debug: Print the response received
print(f"[DEBUG] Received Image Upscale Response:", flush=True)
print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(genResult, indent=2)}", flush=True)
except Exception as e:
print(f"[DEBUG] Error in Image Upscale Request: {str(e)}", flush=True)
raise
images = rwUtils.extractImageURLs(genResult)
return (images,)