--- name: comfyui_map_a1111_params kind: function lang: py domain: ml version: "1.0.0" purity: pure signature: "def comfyui_map_a1111_params(meta: dict, resources: list | None = None) -> dict" description: "Traduce la metadata de generacion de Civitai/A1111 a parametros de ComfyUI. Mapea el sampler A1111 ('DPM++ 2M Karras') a (sampler_name='dpmpp_2m', scheduler='karras') de ComfyUI, normaliza steps/cfg/dims/seed/positive/negative a las claves que consumen los builders del registry, infiere la familia del modelo (sd15|sdxl|flux|unknown) por nombre/baseModel/recursos/dimensiones, y extrae los LoRAs tanto de los resources de Civitai como de las etiquetas del prompt (sintaxis A1111, que ademas limpia del prompt). Funcion pura: sin red ni I/O." tags: [comfyui, civitai, replicate, ml, a1111, sampler, pure, stable-diffusion] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "" imports: ["re"] params: - name: meta desc: "Dict de generacion estilo A1111/Civitai. Claves reconocidas: prompt, negativePrompt, Model/model, baseModel, sampler, steps, cfgScale, seed, Size ('WxH'), clipSkip." - name: resources desc: "Lista de recursos de Civitai ({modelType, modelName, weight, baseModel, ...}) para detectar checkpoint, LoRAs y familia. Opcional (None = lista vacia)." output: "dict {sampler_name, scheduler, steps, cfg, width, height, seed, positive, negative, family, checkpoint_hint, loras, clip_skip}. Los numericos son None cuando la meta no los aporta (el caller pone defaults por familia). family in {sd15, sdxl, flux, unknown}. loras = [{name, weight, source}]. positive viene SIN las etiquetas (que pasan a loras)." tested: true tests: - "test_map_sampler_karras_y_ancestral" - "test_infer_family_sdxl_sd15_flux" - "test_loras_de_resources_y_tags_del_prompt" - "test_dims_desde_size_y_numericos" test_file_path: "python/functions/ml/comfyui_map_a1111_params_test.py" file_path: "python/functions/ml/comfyui_map_a1111_params.py" --- ## Ejemplo ```python import sys, os sys.path.insert(0, os.path.join(os.environ["HOME"], "fn_registry", "python", "functions")) from ml.comfyui_map_a1111_params import comfyui_map_a1111_params meta = {"prompt": "knight ", "negativePrompt": "blurry", "Model": "juggernautXL_v11", "sampler": "DPM++ 2M Karras", "steps": 30, "cfgScale": 5.5, "seed": 12345, "Size": "832x1216"} p = comfyui_map_a1111_params(meta) print(p["sampler_name"], p["scheduler"]) # dpmpp_2m karras print(p["family"]) # sdxl print(p["loras"]) # [{'name': 'detail', 'weight': 0.6, 'source': 'prompt_tag'}] ``` ## Cuando usarla Cuando tengas la `meta` de una imagen de Civitai/A1111 (p.ej. de `comfyui_fetch_civitai_image_meta`) y necesites construir un workflow ComfyUI que la reproduzca: traduce sampler/scheduler/dims/loras al vocabulario de ComfyUI y te dice la familia del modelo para elegir un checkpoint compatible. Es el puente entre observar una receta y construir el workflow en `comfyui_replicate_civitai_oneshot`. ## Gotchas - El mapeo de sampler cubre los comunes; un sampler raro o mal escrito cae a `('euler','normal')` (fallback seguro, no falla). - `family` por dimensiones es heurística: si no hay pistas en nombres, dimensión mayor >=900 → `sdxl`, si no `sd15`. Puede equivocarse con modelos atípicos. - Los nombres de LoRA salen como los nombra Civitai (modelName o tag del prompt), NO como el filename `.safetensors` instalado — el caller debe casarlos contra los modelos del servidor. - Pura: no consulta el servidor ComfyUI ni valida que el checkpoint exista; eso lo hace el pipeline.