"""diffusers_load_lora — carga un adaptador LoRA en un pipeline diffusers.""" from __future__ import annotations import sys import os from typing import Any sys.path.insert(0, os.path.dirname(__file__)) from lora_ref import LoraRef def diffusers_load_lora(pipe: Any, lora: LoraRef) -> Any: """Carga un adaptador LoRA en un pipeline diffusers y ajusta su peso de fusion. Usa pipe.load_lora_weights(lora.path) para cargar los pesos del adaptador. Si lora.weight != 1.0, aplica set_adapters(['default'], adapter_weights=[w]) para escalar la contribucion del LoRA. Modifica el pipe in-place y retorna el mismo objeto para composicion. Args: pipe: Pipeline diffusers cargado. Debe soportar load_lora_weights (StableDiffusionPipeline, StableDiffusionXLPipeline, etc.). lora: Referencia al adaptador LoRA. lora.path apunta al archivo .safetensors o directorio del adaptador. lora.weight controla la intensidad de fusion (1.0 = peso completo, 0.0 = sin efecto). Returns: El mismo pipe con el LoRA cargado y el peso de fusion aplicado. Raises: ImportError: Si diffusers no esta instalado. OSError: Si lora.path no existe o el formato del archivo es invalido. """ try: import diffusers # noqa: F401 — verificar disponibilidad except ImportError as exc: raise ImportError( "diffusers_load_lora requiere diffusers. " "Instalar con: pip install diffusers" ) from exc pipe.load_lora_weights(lora.path) if lora.weight != 1.0: # set_adapters acepta lista de nombres y lista de pesos. # El nombre "default" es el que diffusers asigna al primer LoRA cargado. if hasattr(pipe, "set_adapters"): pipe.set_adapters(["default"], adapter_weights=[lora.weight]) elif hasattr(pipe, "fuse_lora"): # Fallback para versiones antiguas de diffusers pipe.fuse_lora(lora_scale=lora.weight) return pipe