---
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 <lora:nombre:peso> 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 <lora:..> (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 <lora:detail:0.6>", "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.
