---
name: comfyui_load_workflow_ui
kind: function
lang: py
domain: browser
version: "1.1.0"
purity: impure
signature: "def comfyui_load_workflow_ui(workflow: dict, *, port: int = 9222, server_url_substr: str = '8188', filename: str = 'workflow.json', clear_outputs: bool = True, timeout_s: float = 20.0) -> dict"
description: "Carga un workflow ComfyUI (API format) en la UI del navegador via CDP: inyecta app.loadApiJson(<workflow>, filename) en la pestana de ComfyUI abierta y reconstruye el grafo visual. Por defecto (clear_outputs=True) limpia antes los previews/outputs residuales para que un preview cacheado del workflow anterior no se pegue a un nodo nuevo que reusa el mismo node_id. Compone cdp_eval + comfyui_clear_node_outputs_ui. Impura: red (CDP WebSocket) + muta el grafo de la UI."
tags: [comfyui, browser, cdp, ml, image-generation, stable-diffusion, ui-automation]
uses_functions: ["cdp_eval_py_browser", "comfyui_clear_node_outputs_ui_py_browser"]
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: ["json"]
params:
  - name: workflow
    desc: "dict en API format (claves = node_ids, valores con class_type + inputs); tipicamente el resultado de comfyui_build_txt2img_workflow."
  - name: port
    desc: "Puerto de remote debugging del Chrome diario. Default 9222."
  - name: server_url_substr
    desc: "Substring de la URL de la pestana de ComfyUI (default '8188', el puerto del server). Identifica la pestana entre las abiertas."
  - name: filename
    desc: "Nombre que ComfyUI asocia al workflow cargado. Default 'workflow.json'."
  - name: clear_outputs
    desc: "Si True (default) limpia previews/outputs residuales (app.nodeOutputs + node.imgs) antes de cargar, evitando que un preview cacheado de un workflow anterior se pegue a un nodo nuevo que reusa el mismo node_id. False conserva los previews previos a proposito."
  - name: timeout_s
    desc: "Timeout de la conexion CDP en segundos. Default 20.0."
output: "dict {ok: bool, loaded: bool, error: str}. ok/loaded True si app.loadApiJson termino sin excepcion en la pagina."
tested: false
tests: []
test_file_path: ""
file_path: "python/functions/browser/comfyui_load_workflow_ui.py"
---

## Ejemplo

```python
import sys, os
sys.path.insert(0, os.path.join("python", "functions"))
from ml.comfyui_build_txt2img_workflow import comfyui_build_txt2img_workflow
from browser.comfyui_load_workflow_ui import comfyui_load_workflow_ui

wf = comfyui_build_txt2img_workflow(
    ckpt_name="IMG_dreamshaper_8.safetensors",
    positive="a red apple on a wooden table, sharp focus",
)
# Requiere la UI de ComfyUI abierta en el Chrome con CDP en el puerto 9222.
print(comfyui_load_workflow_ui(wf))   # -> {'ok': True, 'loaded': True, 'error': ''}
```

## Cuando usarla

Cuando tienes un workflow en API format (lo construyo con
`comfyui_build_txt2img_workflow` o lo exporto de otro lado) y quieres verlo y
editarlo en la UI del navegador del usuario antes de encolarlo. Es el puente
"API format -> grafo visual": cargas, luego ajustas widgets con
`comfyui_set_node_widget_ui` y encolas con `comfyui_queue_prompt_ui`.

## Gotchas

- Requiere que la pestana de ComfyUI ya este abierta en un Chrome con
  `--remote-debugging-port=9222`. Si no hay target que matchee `server_url_substr`,
  `cdp_eval` devuelve error y aqui `ok=False`.
- `app.loadApiJson` REEMPLAZA el grafo actual de la UI por el del workflow; pierde
  los cambios no exportados. Exporta antes con `comfyui_export_workflow_ui` si los
  necesitas.
- Espera la Promise de carga (`await_promise=True`). El conteo de nodos cargados
  se puede verificar con `cdp_eval("app.graph._nodes.length", target_url_substr="8188")`.
- `app.loadApiJson` (a diferencia de la ruta del menu `app.loadGraphData`) NO
  llama a `app.clean()`, asi que NO resetea el store `app.nodeOutputs` ni los
  previews de los nodos. Sin `clear_outputs=True`, un preview cacheado de un
  workflow anterior se re-pinta sobre el nodo nuevo que reuse el mismo node_id
  (visto: imagen 3D pegada bajo un `CheckpointLoaderSimple`/`SaveGLB`). El
  default `clear_outputs=True` lo evita delegando en
  `comfyui_clear_node_outputs_ui`.

## Capability growth log

- v1.1.0 (2026-06-24) — anade `clear_outputs=True` (default): limpia los
  previews/outputs residuales (`app.nodeOutputs` + `node.imgs`) antes de cargar,
  delegando en `comfyui_clear_node_outputs_ui`. Fija el bug de imagenes
  residuales pegadas a nodos que reusan node_id entre workflows.
