feat(ml): pipeline replicar imagen desde link de Civitai
Nueva capacidad del grupo comfyui: dado el id/URL de una imagen de Civitai, extrae cómo se generó (prompt, modelo, sampler, LoRAs) vía los endpoints tRPC image.getGenerationData + image.get (la API v1 da meta=null), reconstruye el workflow y lo replica en nuestro ComfyUI, sustituyendo el checkpoint ausente por el más parecido instalado y reportando lo que falta en missing_models sin bajar nada a ciegas. Respeta SFW. Funciones nuevas (registry-first, componen 8 funciones existentes): - comfyui_fetch_civitai_image_meta_py_ml (impura): observa la receta por id/URL. - comfyui_map_a1111_params_py_ml (pura): traduce meta A1111 -> params ComfyUI, familia del modelo y LoRAs. - comfyui_replicate_civitai_oneshot_py_pipelines: orquesta fetch_meta -> map_a1111_params -> build/embebido -> run_foreign_workflow_oneshot -> judge. Probado en vivo (imagen SFW 23526611): receta extraída + réplica 1024x1024 generada + panel de jueces. 12 tests unitarios verdes. Capability page comfyui.md actualizada. Report 0127. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
---
|
||||
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.
|
||||
Reference in New Issue
Block a user