--- 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).