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:
@@ -0,0 +1,74 @@
|
||||
---
|
||||
name: comfyui_critique_image_llm
|
||||
kind: function
|
||||
lang: py
|
||||
domain: ml
|
||||
version: "1.0.0"
|
||||
purity: impure
|
||||
signature: "def comfyui_critique_image_llm(image_path: str, prompt: str, *, model: str = 'claude-opus-4-8', max_tokens: int = 1024, token: str = '') -> dict"
|
||||
description: "Critica de un LLM-vision sobre una imagen generada: detecta artefactos, anatomia rota, texto ilegible, watermarks, incoherencias de composicion. Tercer juez del panel comfyui-judge. Compone ask_llm_vision (claude-direct, API directa) con un system prompt que obliga a devolver JSON {verdict good|bad, score 0-10, reasons}. Impura: red (API Anthropic) + lectura de imagen."
|
||||
tags: [comfyui-judge, ml, llm, vision, critique, scoring]
|
||||
uses_functions: [ask_llm_vision_py_core]
|
||||
uses_types: []
|
||||
returns: []
|
||||
returns_optional: false
|
||||
error_type: error_go_core
|
||||
imports: []
|
||||
params:
|
||||
- name: image_path
|
||||
desc: "Ruta a la imagen en disco local."
|
||||
- name: prompt
|
||||
desc: "Prompt original de la generacion (contexto para juzgar la fidelidad). Puede ir vacio si solo se evalua calidad intrinseca."
|
||||
- name: model
|
||||
desc: "id del modelo Anthropic con vision. Default 'claude-opus-4-8'. keyword-only."
|
||||
- name: max_tokens
|
||||
desc: "Maximo de tokens de la respuesta. keyword-only."
|
||||
- name: token
|
||||
desc: "Token OAuth; si vacio lo carga ask_llm_vision automaticamente. keyword-only."
|
||||
output: "dict {ok, verdict, score_0_10, reasons, error}. En exito ok=True, verdict 'good'|'bad', score_0_10 el score del modelo y reasons la lista de razones. En error (imagen invalida, API caida, 429, JSON no parseable) ok=False con error. Nunca lanza excepcion."
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
file_path: "python/functions/ml/comfyui_critique_image_llm.py"
|
||||
---
|
||||
|
||||
## Ejemplo
|
||||
|
||||
```python
|
||||
import sys, os
|
||||
sys.path.insert(0, os.path.join("python", "functions"))
|
||||
from ml.comfyui_critique_image_llm import comfyui_critique_image_llm
|
||||
|
||||
img = os.path.expanduser("~/ComfyUI/output/comfy_sdxl_00001_.png")
|
||||
res = comfyui_critique_image_llm(img, "a majestic lion standing on rocks at sunset, photorealistic")
|
||||
print(res)
|
||||
# {'ok': True, 'verdict': 'good', 'score_0_10': 8.0,
|
||||
# 'reasons': ['anatomia del leon correcta', 'iluminacion coherente con el atardecer'], 'error': ''}
|
||||
```
|
||||
|
||||
CLI directa:
|
||||
|
||||
```bash
|
||||
python/.venv/bin/python3 python/functions/ml/comfyui_critique_image_llm.py ~/ComfyUI/output/comfy_sdxl_00001_.png "a majestic lion at sunset"
|
||||
```
|
||||
|
||||
## Cuando usarla
|
||||
|
||||
- Cuando los scores numericos (estetico/CLIP) no bastan: el LLM ve defectos finos que el
|
||||
score global no penaliza (dedos de mas, ojos asimetricos, texto basura, watermarks).
|
||||
- Como el juez "humano" de `comfyui_judge_image`, para desempatar good/bad.
|
||||
- Para obtener razones LEGIBLES de por que una imagen es mala (feedback accionable al skill).
|
||||
|
||||
## Gotchas
|
||||
|
||||
- **Cuesta tokens de API.** Cada llamada va a api.anthropic.com (claude-direct). Usar con
|
||||
mesura; en validacion, pocas llamadas.
|
||||
- **Rate limit (HTTP 429).** Si el rate limit compartido esta saturado, devuelve
|
||||
`ok=False` con el error 429 — no crashea. El panel `comfyui_judge_image` sigue votando con
|
||||
los otros dos jueces. Reintentar mas tarde o bajar a un modelo con cuota (haiku).
|
||||
- **El modelo puede no devolver JSON limpio.** Se extrae el primer objeto `{...}` (tolera
|
||||
fences ```json). Si no hay JSON parseable, `ok=False`.
|
||||
- **verdict conservador.** Si el modelo responde algo ambiguo (ni 'good' ni 'bad'), se
|
||||
normaliza a 'bad' (ante la duda, no es producto).
|
||||
- **NUNCA `claude -p`.** Respeta la regla `llm_invocation`: solo claude-direct via
|
||||
ask_llm_vision (arranque 0, API directa).
|
||||
Reference in New Issue
Block a user