fix(ml): comfyui_wait_result no sale prematuro en jobs de video/3D
Exige outputs no vacios (no solo status terminal) para dar por completado un prompt: en jobs pesados ComfyUI marca la entry de /history como terminada antes de poblar outputs, lo que devolvia un dict vacio mientras el job seguia en GPU. Ahora sigue sondeando hasta que los outputs aparecen o hasta agotar el timeout. Timeout default 180s -> 600s (cubre video/3D) y timeout HTTP por-request acotado a 30s. Firma y contrato de retorno intactos. Tests nuevos (mock urllib CI-safe + live opcional contra /history real): golden, regresion del bug, edge imagen corta, timeout y error. v1.0.0 -> 1.1.0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,10 +3,10 @@ name: comfyui_wait_result
|
||||
kind: function
|
||||
lang: py
|
||||
domain: ml
|
||||
version: "1.0.0"
|
||||
version: "1.1.0"
|
||||
purity: impure
|
||||
signature: "def comfyui_wait_result(prompt_id: str, server: str = \"127.0.0.1:8188\", timeout: float = 180.0, poll_interval: float = 1.0) -> dict"
|
||||
description: "Sondea GET /history/{prompt_id} hasta que un prompt ComfyUI completa (status.completed o status_str success/error) o se agota el timeout. Devuelve los outputs por nodo (node_id -> {images: [...]}). Polling como mecanismo principal (no WebSocket). Impura: HTTP GET en bucle + sleep, solo stdlib."
|
||||
signature: "def comfyui_wait_result(prompt_id: str, server: str = \"127.0.0.1:8188\", timeout: float = 600.0, poll_interval: float = 1.0) -> dict"
|
||||
description: "Sondea GET /history/{prompt_id} hasta que un prompt ComfyUI completa con estado de exito (status.completed o status_str success) Y outputs ya poblados, o falla (status_str error), o se agota el timeout. Exige outputs no vacios para no salir prematuro en jobs de video/3D donde la entry de /history aparece marcada como terminada antes de poblar resultados. Devuelve los outputs por nodo (node_id -> {images: [...]}). Polling como mecanismo principal (no WebSocket). Impura: HTTP GET en bucle + sleep, solo stdlib."
|
||||
tags: [comfyui, ml, image-generation, stable-diffusion, http, polling]
|
||||
uses_functions: []
|
||||
uses_types: []
|
||||
@@ -20,13 +20,13 @@ params:
|
||||
- name: server
|
||||
desc: "host:port del servidor ComfyUI sin esquema (default '127.0.0.1:8188')."
|
||||
- name: timeout
|
||||
desc: "Maximo de segundos a esperar antes de lanzar TimeoutError."
|
||||
desc: "Maximo de segundos a esperar antes de lanzar TimeoutError. Default amplio (600s) para cubrir video/3D; imagenes cortas retornan en cuanto los outputs estan listos."
|
||||
- name: poll_interval
|
||||
desc: "Segundos entre sondeos de /history."
|
||||
output: "dict de outputs {node_id: {'images': [{'filename', 'subfolder', 'type'}, ...]}} tal como ComfyUI los expone en history[prompt_id]['outputs']. Para un txt2img, el nodo SaveImage ('9') trae el PNG. Puede contener otros tipos (gifs, texto) segun los nodos del workflow."
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
output: "dict de outputs {node_id: {'images': [{'filename', 'subfolder', 'type'}, ...]}} tal como ComfyUI los expone en history[prompt_id]['outputs']. Siempre no vacio en caso de exito. Para un txt2img, el nodo SaveImage ('9') trae el PNG. El video (SaveVideo) aparece bajo 'images' con 'animated':[True]. Puede contener otros tipos (gifs, texto) segun los nodos del workflow."
|
||||
tested: true
|
||||
tests: ["Golden: espera hasta que /history puebla outputs no vacios (entry tarda en aparecer)", "Regresion bug: 'done' con outputs vacios NO sale prematuro, espera a que aparezcan", "Edge: imagen corta ya completada en el primer sondeo retorna inmediato", "Edge: status.completed sin status_str success tambien vale si hay outputs", "Error: timeout genuino (prompt inexistente) lanza TimeoutError sin colgar", "Error: status_str 'error' lanza RuntimeError", "Live (skippable): job de video ya completado en /history real devuelve outputs"]
|
||||
test_file_path: "python/functions/ml/tests/test_comfyui_wait_result.py"
|
||||
file_path: "python/functions/ml/comfyui_wait_result.py"
|
||||
---
|
||||
|
||||
@@ -63,11 +63,25 @@ a paso) — es portable porque solo depende de HTTP, no de websocket-client.
|
||||
|
||||
- Bloquea el hilo (sondea + duerme). Para varias generaciones en paralelo,
|
||||
encola todas con submit y luego espera cada prompt_id, o usa hilos.
|
||||
- El timeout por defecto (180s) puede quedarse corto en GPUs lentas o workflows
|
||||
pesados (muchos steps, alta resolucion, upscalers). Sube `timeout` segun el
|
||||
caso. Lanza TimeoutError si se agota.
|
||||
- El timeout por defecto es ahora 600s (antes 180s) para cubrir video/3D. Sigue
|
||||
pudiendo quedarse corto en workflows muy pesados o GPUs lentas: sube `timeout`
|
||||
segun el caso. Lanza TimeoutError si se agota.
|
||||
- Considera el job terminado solo cuando el estado es de exito **y** los outputs
|
||||
estan poblados. Si ComfyUI marca la entry como terminada pero aun sin outputs
|
||||
(ocurre en jobs de video/3D mientras la GPU sigue escribiendo), sigue
|
||||
sondeando hasta que aparezcan o hasta agotar el timeout — no devuelve un dict
|
||||
vacio prematuro. Corolario: un workflow sin nodo de guardado (no produce
|
||||
outputs) agota el timeout en vez de devolver {}.
|
||||
- Lanza RuntimeError si la ejecucion termina con status_str "error" (el detalle
|
||||
del fallo va en el mensaje) o si no se puede conectar al servidor.
|
||||
- Devuelve metadatos de los PNG (filename, subfolder, type), NO los bytes de la
|
||||
imagen. Los archivos quedan en la carpeta output/ del servidor; para leerlos
|
||||
- Devuelve metadatos de los PNG/MP4 (filename, subfolder, type), NO los bytes de
|
||||
la imagen. Los archivos quedan en la carpeta output/ del servidor; para leerlos
|
||||
desde otra maquina usa GET /view?filename=...&subfolder=...&type=output.
|
||||
|
||||
## Capability growth log
|
||||
|
||||
- v1.1.0 (2026-06-24) — fix salida prematura en jobs de video/3D: ahora exige
|
||||
outputs no vacios (no solo status terminal) para dar por completado, sigue
|
||||
sondeando si la entry de /history aparece terminada pero sin outputs, sube el
|
||||
timeout default 180s -> 600s y acota el timeout HTTP por-request a 30s.
|
||||
Anadidos tests (mock urllib + live opcional). Documentado en report 0106.
|
||||
|
||||
Reference in New Issue
Block a user