---
name: comfyui_list_installed_models
kind: function
lang: py
domain: ml
version: "1.0.0"
purity: impure
signature: "def comfyui_list_installed_models(folder: str | None = None, comfyui_dir: str = \"~/ComfyUI\") -> dict"
description: "Lista los modelos instalados de ComfyUI por carpeta de tipo (checkpoints, loras, vae, controlnet, upscale_models), resolviendo las rutas REALES: escanea tanto la nativa <comfyui_dir>/models/<folder>/ como las externas declaradas en extra_model_paths.yaml (en este equipo /mnt/2tb/comfyui_models/). Escaneo de FS (no depende del servidor). Impura: lectura de disco + parse de YAML. Solo stdlib + PyYAML."
tags: [comfyui, ml, models, inventory, filesystem, stable-diffusion]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: ["os", "yaml"]
params:
  - name: folder
    desc: "Carpeta concreta a listar (ej. 'checkpoints'). Si None, lista todas (checkpoints, loras, vae, controlnet, upscale_models)."
  - name: comfyui_dir
    desc: "Raiz de la instalacion de ComfyUI (se expande ~). Default '~/ComfyUI'."
output: "dict {ok, models, error}. models = {folder: [nombre, ...]} con los archivos de modelo (dedup por nombre) hallados en la ruta nativa models/<folder>/ y en las externas de extra_model_paths.yaml. ok=True salvo fallo de escaneo."
tested: false
tests: []
test_file_path: ""
file_path: "python/functions/ml/comfyui_list_installed_models.py"
---

## Ejemplo

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

out = comfyui_list_installed_models()
print(out["models"]["checkpoints"])
# ['IMG_dreamshaper_8.safetensors', 'IMG_juggernaut_xl_v11.safetensors', 'IMG_v1-5-pruned-emaonly-fp16.safetensors', ...]
# -> resueltos desde /mnt/2tb/comfyui_models/checkpoints/ via extra_model_paths.yaml

# Una sola carpeta:
loras = comfyui_list_installed_models(folder="loras")["models"]["loras"]
```

El bloque se lanza con el python del venv (`python/.venv/bin/python3`).

## Cuando usarla

Cuando necesites saber que checkpoints/LoRAs/VAEs/ControlNets/upscalers tienes ya
descargados antes de construir un workflow (los builders necesitan el nombre exacto
del modelo) o antes de descargar uno nuevo. Ve los modelos esten en `models/` o en
el disco externo de `extra_model_paths.yaml`.

## Gotchas

- Impura: lee disco y parsea `extra_model_paths.yaml`. NO consulta el servidor de
  ComfyUI, asi que funciona aunque el server este reiniciandose.
- **Resuelve la ruta REAL**: en este equipo los modelos viven en
  `/mnt/2tb/comfyui_models/` (no en `~/ComfyUI/models/`), declarado en
  `extra_model_paths.yaml`. La funcion lee ese YAML (incluida la sintaxis de
  carpeta multilinea) y suma esas rutas a la nativa, dedup por nombre.
- Si `extra_model_paths.yaml` no existe o PyYAML no lo puede parsear, degrada a
  solo las rutas nativas `~/ComfyUI/models/<folder>/` (no falla).
- Lista por nombre de archivo (no rutas completas) y solo extensiones de modelo
  (.safetensors, .ckpt, .pt, .pth, .bin, .gguf, .sft, .onnx). Subcarpetas dentro de
  cada folder NO se recorren (solo el primer nivel).
- El catalogo que ve el SERVIDOR (combos de la UI) puede diferir si el server no se
  ha refrescado tras una descarga; para el combo en vivo usa `comfyui_object_info`
  o `comfyui_refresh_nodes_ui`.
