--- name: genconfig_to_diffusers_kwargs kind: function lang: py domain: ml version: "1.0.0" purity: pure signature: "def genconfig_to_diffusers_kwargs(cfg: GenerationConfig) -> dict" description: "Convierte un GenerationConfig al dict de kwargs listo para pipe(**kwargs) de diffusers. Mapea prompt, steps, cfg_scale, width, height. LoRAs y sampler se aplican antes de la llamada; generator=None para que el caller setee torch.Generator por separado." tags: [ml, diffusers, generation, converter, pure] params: - name: cfg desc: "Instancia de GenerationConfig con los parametros de generacion validados." output: "dict con claves prompt, negative_prompt, num_inference_steps, guidance_scale, width, height, generator (None). Listo para desempaquetar con pipe(**kwargs)." uses_functions: [] uses_types: - generation_config_py_ml returns: [] returns_optional: false error_type: "" imports: [] tested: true tests: - "kwargs contiene todas las claves requeridas" - "negative_prompt None se pasa tal cual" - "steps y cfg_scale se mapean a num_inference_steps y guidance_scale" - "generator siempre es None" test_file_path: "python/functions/ml/tests/test_genconfig_to_diffusers_kwargs.py" file_path: "python/functions/ml/genconfig_to_diffusers_kwargs.py" --- ## Ejemplo ```python from ml.genconfig_to_diffusers_kwargs import genconfig_to_diffusers_kwargs from ml.generation_config import GenerationConfig from ml.model_ref import ModelRef cfg = GenerationConfig( prompt="a dog in the park", seed=42, steps=30, cfg_scale=7.5, sampler="euler_a", width=512, height=512, model=ModelRef(name="runwayml/stable-diffusion-v1-5", model_type="sd15"), ) kwargs = genconfig_to_diffusers_kwargs(cfg) # kwargs["num_inference_steps"] == 30 # kwargs["guidance_scale"] == 7.5 # kwargs["generator"] is None # El caller asigna el generator: # kwargs["generator"] = torch.Generator(device=device).manual_seed(cfg.seed) # image = pipe(**kwargs).images[0] ``` ## Notas Funcion pura: sin I/O, sin torch, sin imports opcionales en tiempo de ejecucion. Los LoRAs se aplican via `pipe.load_lora_weights(lora.path, adapter_name=...)` antes de la llamada. El scheduler/sampler se configura via `pipe.scheduler = ...` tambien antes. Ambos no tienen mapping directo a kwargs de `__call__`.