comfyui_Bonso_Tools / nodes /bonso_switch_model.py
willybonso
v1.10.2 - 10 nodos: Switch, Moviola Prompt, fixes
e682b15
Raw History Blame Contribute Delete
3.46 kB
class Bonso_Switch_Model:
"""Cambia entre dos modelos (MODEL) segun la casilla `switch`.
Pensado para encajar con `Bonso Booleano`: su booleano sale por el
socket y entra aqui por `switch`.
switch = True -> devuelve true_model
switch = False -> devuelve false_model
Tres cosas que hay que dejar claras para no romperlo:
- **El modelo pasa tal cual**: se devuelve la misma referencia que ha
llegado. Ni clone, ni copia, ni transformacion, ni operacion alguna.
Si la entrada es un `ModelPatcher` de ComfyUI, la salida es ese mismo
objeto.
- **La salida es `MODEL`, no `*`**: asi el servidor valida de verdad el
enlace (`Return type mismatch between linked nodes` si intentas
enchufar esto a una entrada CLIP/CONDITIONING) y el frontend mantiene
la linea morada. Un ANY disfrazado no avisaria de nada.
- **Las dos entradas de modelo son `optional`**: ComfyUI valida el
prompt COMPLETO antes de ejecutar, asi que una rama rota (nodo en
bypass, entrada que falta, checkpoint que no existe) reventaria el
trabajo aunque no tocara. Por eso `js/bonso_switch_model.js` **saca la
rama inactiva del prompt** antes de encolar: lo que no se usa no se
valida ni se ejecuta. Sin ese JS (o si el valor de `switch` no se
puede saber) se envian las dos ramas, que es el comportamiento de
siempre.
Si falta la rama que SI toca, el nodo dice cual es con un error claro
en vez de devolver `None` y estrellar el KSampler mas abajo.
"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"switch": (
"BOOLEAN",
{
"default": True,
"tooltip": "True -> true_model, False -> false_model.",
},
),
},
"optional": {
"true_model": (
"MODEL",
{"tooltip": "Modelo que sale con switch en True."},
),
"false_model": (
"MODEL",
{"tooltip": "Modelo que sale con switch en False."},
),
},
}
RETURN_TYPES = ("MODEL",)
RETURN_NAMES = ("model",)
FUNCTION = "switch_model"
CATEGORY = "Bonso Tools"
DESCRIPTION = (
"Devuelve true_model si switch es True y false_model si es False. "
"El modelo sale igual que ha entrado: misma referencia, sin clonar. "
"La rama que no toca queda fuera del prompt y no se valida ni se ejecuta."
)
def switch_model(self, switch=True, true_model=None, false_model=None):
if switch:
if true_model is None:
raise ValueError(
"[Bonso Switch Model] switch=True pero 'true_model' no esta "
"conectado: conecta el modelo de la rama activa o cambia switch a False."
)
return (true_model,)
if false_model is None:
raise ValueError(
"[Bonso Switch Model] switch=False pero 'false_model' no esta "
"conectado: conecta el modelo de la rama activa o cambia switch a True."
)
return (false_model,)
NODE_CLASS_MAPPINGS = {
"Bonso_Switch_Model": Bonso_Switch_Model,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"Bonso_Switch_Model": "Bonso Switch Model",
}