---
name: comfyui_resolve_workflow_deps
kind: function
lang: py
domain: ml
version: "1.0.0"
purity: impure
signature: "def comfyui_resolve_workflow_deps(workflow: dict, server: str = \"127.0.0.1:8188\") -> dict"
description: "Resuelve las dependencias de un workflow ComfyUI ajeno: lo valida contra /object_info y traduce lo que falta en acciones concretas: nodos custom ausentes -> repos a instalar (comfyui_install_custom_node) y modelos ausentes -> assets a descargar (comfyui_search_civitai_models + comfyui_download_model). Compone comfyui_validate_workflow. Impura: HTTP GET. Solo stdlib."
tags: [comfyui, ml, workflow, dependencies, validation, stable-diffusion]
uses_functions: [comfyui_validate_workflow_py_ml]
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: ["os", "sys"]
params:
  - name: workflow
    desc: "dict en API format ({node_id: {class_type, inputs}}), normalmente importado de internet con comfyui_import_workflow_json/_png."
  - name: server
    desc: "host:port del servidor ComfyUI sin esquema. Debe estar vivo para consultar /object_info."
output: "dict {ok, missing_nodes, missing_models, suggestions, error}. ok = se pudo consultar el servidor; missing_nodes = class_type ausentes (nodos custom); missing_models = lista de {node, input, value}; suggestions = lista de {kind, name, action, hint, ...} (una por nodo/modelo faltante) con la funcion a usar; error = motivo si ok=False."
tested: true
tests: ["traduce nodos y modelos faltantes en suggestions (install_custom_node / search_and_download)", "sin faltantes -> suggestions vacio", "servidor caido -> ok=False con error propagado"]
test_file_path: "python/functions/ml/tests/test_comfyui_resolve_workflow_deps.py"
file_path: "python/functions/ml/comfyui_resolve_workflow_deps.py"
---

## Ejemplo

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

# Workflow con un nodo custom y un modelo que no estan en este server:
wf = {
    "1": {"class_type": "CheckpointLoaderSimple",
          "inputs": {"ckpt_name": "no_existe_xyz.safetensors"}},
    "2": {"class_type": "NodoQueNoExiste_XYZ", "inputs": {}},
}
res = comfyui_resolve_workflow_deps(wf)            # server 127.0.0.1:8188 vivo
# res["missing_nodes"]  == ["NodoQueNoExiste_XYZ"]
# res["missing_models"] == [{"node": "1", "input": "ckpt_name", "value": "no_existe_xyz.safetensors"}]
# res["suggestions"]    -> 2 acciones: {kind:"node", action:"install_custom_node", ...}
#                                       {kind:"model", action:"search_and_download", ...}
```

El bloque se lanza con el python del venv y necesita el server vivo en
`127.0.0.1:8188`.

## Cuando usarla

Justo despues de importar un workflow de internet
(`comfyui_import_workflow_json`/`_png`) y antes de intentar ejecutarlo: te dice
exactamente que nodos custom instalar y que modelos descargar para que funcione,
con la funcion concreta a usar en cada caso. Evita el ciclo de prueba y error de
encolar workflows ajenos.

## Gotchas

- Impura: compone `comfyui_validate_workflow`, que hace HTTP GET a `/object_info`.
  Requiere el servidor vivo; si esta caido o reiniciandose devuelve
  `{ok: False, error: ...}` (no lanza). Reintenta tu con backoff.
- Las `suggestions` son guias accionables (hint + funcion), NO resuelven el repo
  exacto de cada nodo automaticamente: identificar el repo de un nodo custom por
  su class_type requiere la DB de ComfyUI-Manager o una busqueda manual en GitHub.
- `missing_models` solo cubre inputs de modelo conocidos (ckpt_name, lora_name,
  vae_name, control_net_name, ...) cuyo valor sea un string fuera del combo. No
  valida rangos numericos ni tipos de conexion (hereda los limites de
  `comfyui_validate_workflow`).
- Un workflow ya completo devuelve `missing_nodes=[]`, `missing_models=[]`,
  `suggestions=[]` con `ok=True`: listo para encolar.
