---
name: comfyui_import_workflow_png
kind: function
lang: py
domain: ml
version: "1.0.0"
purity: impure
signature: "def comfyui_import_workflow_png(png_path_or_url: str, timeout: float = 15.0) -> dict"
description: "Extrae el workflow embebido en los chunks de texto de un PNG de ComfyUI. Lee el chunk 'prompt' (API format) y/o 'workflow' (UI graph) de los chunks tEXt/zTXt/iTXt con stdlib (struct, zlib). Acepta path local o URL. Impura: red opcional + lectura de disco."
tags: [comfyui, ml, import, png, workflow, stable-diffusion]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: error_go_core
imports: []
params:
  - name: png_path_or_url
    desc: "Ruta local de un PNG generado por ComfyUI, o URL http(s) de un PNG (ej. de ComfyUI_examples en GitHub)."
  - name: timeout
    desc: "Timeout HTTP en segundos (solo si es URL). keyword-only."
output: "dict {ok, prompt, workflow, format_detected, error}. prompt = API format (dict) si existe el chunk 'prompt'; workflow = UI graph (dict) si existe el chunk 'workflow'; format_detected = chunks hallados ('prompt', 'workflow' o 'prompt+workflow'). Si no hay metadata, ok=False."
tested: false
tests: []
test_file_path: ""
file_path: "python/functions/ml/comfyui_import_workflow_png.py"
---

## Ejemplo

```python
import sys, os
sys.path.insert(0, os.path.join(os.environ["HOME"], "fn_registry", "python", "functions"))
from ml.comfyui_import_workflow_png import comfyui_import_workflow_png

# Desde un PNG generado localmente
res = comfyui_import_workflow_png(os.path.expanduser("~/ComfyUI/output/comfy_00001_.png"))
# res["ok"] == True
# res["format_detected"]  # "prompt" (generado por API) o "prompt+workflow" (desde la UI)
# res["prompt"]["3"]["class_type"] == "KSampler"

# Desde una URL (un PNG de ComfyUI_examples trae el workflow embebido)
res2 = comfyui_import_workflow_png("https://raw.githubusercontent.com/comfyanonymous/ComfyUI_examples/master/...png")
```

Lánzalo con el python del venv (import de arriba o heredoc). Nota: `./fn run` directo no aplica porque la firma usa `*` (keyword-only), no soportado por el generador de runner de `fn run`.

## Cuando usarla

Cuando alguien te pase una imagen PNG de ComfyUI (de los `ComfyUI_examples`, de la
comunidad, o tuya) y quieras recuperar el workflow exacto que la genero para
relanzarlo o editarlo. El `prompt` (API format) va directo a
`comfyui_validate_workflow` + `comfyui_submit_workflow`; el `workflow` (UI graph)
puede cargarse en la UI con `comfyui_load_workflow_ui`.

## Gotchas

- Impura: HTTP GET si es URL, lectura de disco si es path. Errores devuelven
  `{ok: False, error: ...}` (no lanza).
- Solo PNG: lee chunks tEXt/zTXt/iTXt. Los JPG/WebP NO llevan estos chunks (usa
  otra via). Un PNG sin metadata de ComfyUI da `ok=False`.
- Los PNG generados por la API REST solo traen el chunk `prompt`; los generados
  desde la UI traen ademas `workflow`. Por eso `format_detected` puede ser solo
  "prompt".
- El `prompt` recuperado es API format, no el UI graph: para reabrirlo visualmente
  usa el `workflow` (si existe) o reconstruye el grafo desde el API format en la UI.
