Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.9 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | params | output | tested | tests | test_file_path | file_path | ||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| comfyui_download_workflow | function | py | ml | 1.0.0 | impure | def comfyui_download_workflow(source: str, dest: str | None = None, *, server: str = "127.0.0.1:8188", civitai_token: str | None = None, hf_token: str | None = None, timeout: float = 30.0) -> dict | Descarga un workflow ComfyUI desde CUALQUIER fuente (Google Drive, GitHub, Civitai, HuggingFace, URL directa o path local) y lo normaliza a API format. Dispatcher que detecta el tipo de fuente por la URL y delega: Drive via gdown/uc?export=download, GitHub via raw.githubusercontent.com, Civitai via API REST (resuelve downloadUrl, descomprime zip), HuggingFace via resolve/. Tras bajar: PNG/WebP -> comfyui_import_workflow_png; JSON -> comfyui_import_workflow_json (normaliza UI->API). Compone import_workflow_json + import_workflow_png. Impura: red + descompresion + disco. |
|
|
false | error_go_core |
|
dict {ok, workflow, source_type, path, format_in, error}. workflow = dict API format (vacio si ok=False); source_type = drive|github|civitai|huggingface|direct|local; path = ruta local descargada; format_in = api|ui_graph|png-prompt|png-workflow|zip. Nunca lanza: fallos devuelven ok=False con error. | false | python/functions/ml/comfyui_download_workflow.py |
Ejemplo
import sys, os
sys.path.insert(0, os.path.join(os.environ["HOME"], "fn_registry", "python", "functions"))
from ml.comfyui_download_workflow import comfyui_download_workflow
# GitHub (cubiq, Apache-2.0) — baja el raw .json y lo deja en API format
res = comfyui_download_workflow(
"https://raw.githubusercontent.com/cubiq/ComfyUI_Workflows/main/ComfyUI_Simple/SDXL_simple.json"
)
# res == {"ok": True, "workflow": {...}, "source_type": "github",
# "path": "/tmp/comfy_wf_xxx.json", "format_in": "ui_graph", "error": ""}
# Google Drive por share-url (extrae el file id; usa gdown si esta, si no descarga directa)
res2 = comfyui_download_workflow("https://drive.google.com/file/d/<FILE_ID>/view", dest="/tmp/wf.json")
# El workflow resultante esta listo para validar/encolar:
# from ml.comfyui_validate_workflow import comfyui_validate_workflow
# comfyui_validate_workflow(res["workflow"])
Lánzalo con el python del venv (import de arriba o heredoc). ./fn run directo no aplica: la firma usa * (keyword-only), no soportado por el generador de runner de fn run. El bloque __main__ baja el ejemplo de cubiq cuando lo ejecutas como script.
Cuando usarla
Cuando tengas la URL de un workflow ajeno (Drive de un creador, repo GitHub, página
de Civitai, dataset de HuggingFace) y quieras un dict en API format sin pensar en el
método de descarga ni en el formato. Es el punto de entrada único antes de
comfyui_validate_workflow + comfyui_resolve_workflow_deps + comfyui_submit_workflow.
Para una fuente que ya sabes que es JSON local/URL directa, comfyui_import_workflow_json
basta; para un PNG suelto, comfyui_import_workflow_png. Este dispatcher es para
"dame el workflow de esta URL, sea cual sea la fuente". Catálogo de fuentes: report 0080.
Gotchas
- Impura: hace HTTP GET (y gdown/unzip según fuente) + escribe a disco. Cualquier
fallo de red/IO devuelve
{ok: False, error: ...}(no lanza). - Google Drive: usa
gdownsi está instalado (maneja el aviso de virus-scan de archivos grandes). Sin gdown cae auc?export=download, que solo sirve para archivos pequeños (un.jsonde workflow son KB); si Drive devuelve HTML (aviso de virus-scan o gated) la función pide instalar gdown.pip install gdownen el venv. - Civitai: descargas gated/early-access exigen
civitai_token(Bearer). Sin token la respuesta puede ser HTML de login → error claro. Una página/models/<id>se resuelve via/api/v1/models/<id>tomando el primer file; para precisión pasa eldownloadUrldirecto (/api/download/models/<version_id>). - GitHub: una URL
github.com/.../blob/...se reescribe araw.githubusercontent.comautomáticamente; si pasas la URL de la página HTML (no raw ni blob) puede bajar HTML → error. Mejor pasar el raw o el blob. - Formato de salida siempre API: un PNG con chunk
prompt(API) se usa directo; si solo trae el chunkworkflow(UI graph) se normaliza vía import_workflow_json (necesita el server vivo para mapear widgets). Un UI graph.jsonse normaliza igual (best-effort: conexiones siempre; widgets sólo si el server responde). - El workflow descargado es un secreto si trae credenciales/cookies (raro en workflows,
común en HAR): este caso es de workflows públicos; aun así no commitear el
pathtemporal. - Fuentes con anti-bot fuerte (ComfyWorkflows.com, comfy.org/workflows con Cloudflare) pueden devolver 402/HTML a la descarga directa → requieren navegador (CDP). No cubiertas.