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