feat(ml): panel multi-juez comfyui-judge (estetico + CLIP + LLM-vision)
Cuatro funciones impuras + pagina madre del grupo comfyui-judge, el gate objetivo de calidad de imagen para tests/DoD y el bucle de mejora de skills: - comfyui_score_aesthetic: estetico LAION-V2 (head MLP sobre CLIP ViT-L/14), subproceso al venv ComfyUI (torch+open_clip). - comfyui_score_clip_alignment: fidelidad prompt-imagen via similitud coseno CLIP. - comfyui_critique_image_llm: critica LLM-vision (compone ask_llm_vision), JSON verdict+score+reasons. - comfyui_judge_image: agregadora, vota mayoria good/bad; degrada si un juez cae. QuickGELU (ViT-L-14-quickgelu/openai) obligatorio: sin el, los embeddings se degradan y el ranking de fidelidad se invierte en silencio. Validado e2e sobre imagenes reales: golden 3 votos coherentes, asserts relativos (nitida>ruido, alineado>desalineado), split 2-1 respeta mayoria en ambos sentidos, degradacion ante 429/model invalido/path invalido sin crash. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -69,6 +69,7 @@ Indice de grupos de capacidades del registry. Cada grupo agrupa >=3 funciones qu
|
||||
| [eda](eda.md) | 27 | Exploratory Data Analysis por tabla y base con motor DuckDB + PostgreSQL push-down: perfil base SQL (SUMMARIZE + distinct exacto), estadística numérica/categórica, tipo semántico regex, calidad, correlación/asociación (Pearson/Spearman/Cramér's V/Theil's U/η/MI), relaciones inter-tabla (FK containment + join graph mermaid), modelos baratos (PCA/KMeans/IsolationForest/normalidad/tendencia), capa LLM (dictionary/PII/limpieza/análisis) y generación de notebook. Orquestadores `profile_table` (backend duckdb/postgres, flags run_models/run_llm) y `profile_database` |
|
||||
| [seo](seo.md) | 3 | SEO orientado a datos sobre Google Search Console: autenticar con service account (`gsc_auth`), extraer Search Analytics paginado (`pull_gsc_search_analytics`) y el pipeline de ingesta a DuckDB + espejo Postgres para Metabase (`ingest_gsc_search_analytics`). Cadena de ingesta del proyecto `seo_analytics`; alimenta dashboards de striking distance, CTR opportunities y content decay |
|
||||
| [local-hub](local-hub.md) | 4 | Exponer los procesos locales como subdominios `*.localhost` (via Caddy, sin DNS) y reunirlos en una pantalla principal Glance con estado en vivo, refrescada a diario por dag_engine. Descubre servicios (manifiesto + registry), renderiza Caddyfile + config Glance (puras), y el pipeline `refresh_local_hub` regenera+recarga. Fuente de verdad: `apps/local_hub/local_services.yaml` |
|
||||
| [comfyui-judge](comfyui-judge.md) | 4 | Panel multi-juez de calidad de imagen: estético LAION-V2 (`comfyui_score_aesthetic`, 0-10) + fidelidad CLIP prompt↔imagen (`comfyui_score_clip_alignment`, 0-1) + crítica LLM-vision (`comfyui_critique_image_llm`, good/bad). Agregados por voto mayoría en `comfyui_judge_image`. Gate objetivo para tests/DoD y el bucle de mejora de skills ComfyUI; degrada con gracia si un juez cae. Jueces estético/fidelidad por subproceso al venv ComfyUI (torch+open_clip), crítico via claude-direct |
|
||||
| [comfyui](comfyui.md) | 29 | Controlar ComfyUI (Stable Diffusion por grafos) de dos formas: por API HTTP (build_txt2img_workflow puro → submit → wait → object_info; download_model con validación Civitai/HF) y por la UI web vía CDP sobre la pestaña abierta (load_workflow_ui, set_node_widget_ui para tunear prompt/steps/seed en vivo, queue_prompt_ui = botón Queue Prompt, export_workflow_ui, refresh_nodes_ui). El API format es el puente entre ambos caminos. Las funciones de UI componen `cdp_eval`. Incluye imagen→3D nativo (Hunyuan3D-2, tag `img-to-3d`): build_image_to_3d_workflow + fetch_output_mesh + install_3d_model + pipeline image_to_3d_oneshot |
|
||||
|
||||
## Como anadir grupo
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
# comfyui-judge — panel multi-juez de calidad de imagen
|
||||
|
||||
El "modelo adversario" del pipeline ComfyUI: el sistema que distingue **producto bueno de
|
||||
malo** de forma objetiva. Tres jueces independientes puntúan/critican una imagen y un
|
||||
agregador vota por mayoría. Es el **gate objetivo** que consumen los tests, los contratos
|
||||
DoD y el bucle de mejora de skills (grupo `comfyui-skill`): un skill no está "hecho" hasta
|
||||
que la imagen que produce pasa el panel (`verdict == 'good'`).
|
||||
|
||||
## Funciones del grupo
|
||||
|
||||
| ID | Firma corta | Qué hace |
|
||||
|---|---|---|
|
||||
| `comfyui_score_aesthetic_py_ml` | `score_aesthetic(image_path) -> {ok, score_0_10}` | Calidad estética LAION-V2 (head MLP sobre CLIP ViT-L/14). Subproceso al venv ComfyUI. Barato, determinista, sin API. |
|
||||
| `comfyui_score_clip_alignment_py_ml` | `score_clip_alignment(image_path, prompt) -> {ok, score_0_1}` | Fidelidad prompt↔imagen (similitud coseno CLIP). Subproceso al venv ComfyUI. |
|
||||
| `comfyui_critique_image_llm_py_ml` | `critique_image_llm(image_path, prompt) -> {ok, verdict, score_0_10, reasons}` | Crítica de un LLM-vision (artefactos, anatomía, watermarks). Compone `ask_llm_vision` (claude-direct). Cuesta API. |
|
||||
| `comfyui_judge_image_py_ml` | `judge_image(image_path, prompt) -> {ok, verdict, score, votes, reasons}` | **Agregadora.** Llama a los 3, vota good/bad por mayoría, agrega razones. Degrada si un juez cae. |
|
||||
|
||||
Los tres jueces son ortogonales a propósito: el estético mide *belleza*, el de fidelidad mide
|
||||
*que sea lo pedido*, y el crítico LLM ve *defectos finos* que un score global no penaliza. Un
|
||||
único score se engaña fácil; tres votos independientes, no.
|
||||
|
||||
## Ejemplo canónico (end-to-end)
|
||||
|
||||
```python
|
||||
import sys, os
|
||||
sys.path.insert(0, os.path.join("python", "functions"))
|
||||
from ml.comfyui_judge_image import comfyui_judge_image
|
||||
|
||||
img = os.path.expanduser("~/ComfyUI/output/comfy_sdxl_00001_.png")
|
||||
prompt = "a majestic lion standing on rocks at sunset, photorealistic"
|
||||
|
||||
res = comfyui_judge_image(img, prompt)
|
||||
print(res["verdict"], round(res["score"], 2), res["votes"])
|
||||
# good 7.1 {'aesthetic': 'good', 'clip': 'good', 'llm': 'good'}
|
||||
|
||||
if res["verdict"] != "good":
|
||||
for r in res["reasons"]:
|
||||
print(" -", r) # feedback accionable para mejorar el skill
|
||||
```
|
||||
|
||||
Jueces sueltos (cuando solo quieres una dimensión):
|
||||
|
||||
```bash
|
||||
# estético (sin API, rápido)
|
||||
python/.venv/bin/python3 python/functions/ml/comfyui_score_aesthetic.py ~/ComfyUI/output/comfy_sdxl_00001_.png
|
||||
# fidelidad
|
||||
python/.venv/bin/python3 python/functions/ml/comfyui_score_clip_alignment.py ~/ComfyUI/output/comfy_sdxl_00001_.png "a lion at sunset"
|
||||
```
|
||||
|
||||
## Cómo se enchufa a tests / DoD como gate objetivo
|
||||
|
||||
- **e2e_check de un skill ComfyUI**: declarar en el `app.md` (o en el contrato del skill) un
|
||||
check que genere la imagen y exija `comfyui_judge_image(img, prompt)["verdict"] == "good"`.
|
||||
Es la cláusula golden: producto = imagen que el panel aprueba, no "el workflow no petó".
|
||||
- **Bucle de mejora** (grupo `comfyui-skill`): tras generar, juzgar; si `verdict == 'bad'`,
|
||||
las `reasons` del juez crítico indican qué corregir (más steps, otro sampler, fix de prompt)
|
||||
y se re-genera. Convergencia = el panel aprueba.
|
||||
- **Selección de la mejor de N**: ejecutar el panel sobre cada candidata y rankear por `score`
|
||||
(o filtrar por `verdict == 'good'`).
|
||||
|
||||
Umbrales por defecto (ajustables): estético `>= 6.0` → good; fidelidad `>= 0.24` → good; el
|
||||
crítico da su propio verdict. Veredicto final = **mayoría** de los votos vivos; empate → `bad`.
|
||||
|
||||
## Fronteras (qué NO cubre)
|
||||
|
||||
- **No genera imágenes.** Eso es el grupo `comfyui` (build_*_workflow + submit + wait + fetch).
|
||||
Este grupo solo *juzga* una imagen ya producida.
|
||||
- **No es un detector forense de IA** ni un clasificador NSFW/seguridad: juzga *calidad de
|
||||
producto*, no procedencia ni políticas de contenido.
|
||||
- **No corre en el venv del registry.** Los jueces estético/fidelidad necesitan torch +
|
||||
open_clip, que viven en `~/ComfyUI/.venv`; se invocan por subproceso. El crítico necesita la
|
||||
API Anthropic (claude-direct).
|
||||
- **No persiste resultados.** Devuelve dicts en memoria; persistir veredictos (operations.db,
|
||||
e2e_runs) es responsabilidad del consumidor.
|
||||
|
||||
## Prerequisitos
|
||||
|
||||
- venv de ComfyUI con torch + open_clip 3.x: `~/ComfyUI/.venv/bin/python3`.
|
||||
- Modelo estético LAION en `/mnt/2tb/comfyui_models/aesthetic/sac+logos+ava1-l14-linearMSE.pth`.
|
||||
- CLIP ViT-L-14-quickgelu (pretrained openai) cacheado (se descarga la 1ª vez, ~900 MB).
|
||||
- Token OAuth de Claude (claude-direct) para el juez crítico — lo resuelve `ask_llm_vision`.
|
||||
|
||||
## Notas
|
||||
|
||||
- **QuickGELU** es obligatorio en CLIP (`ViT-L-14-quickgelu`/`openai`): sin él los embeddings
|
||||
se degradan en silencio y tanto el score estético como el ranking de fidelidad se desvirtúan.
|
||||
- El panel **degrada con gracia**: si un juez cae (p.ej. el LLM en HTTP 429), vota con los
|
||||
demás y lo anota; solo falla si caen los tres.
|
||||
Reference in New Issue
Block a user