把 RunningHub.ai 搭进你的 ComfyUI

喀秋莎 11小时前 41

1. 为什么选这套组合

RunningHub.ai 是什么?

一个聚焦 工作流发现与复用 的平台:搜索、预览、阅读说明、查看依赖,一键获取 别人已验证可跑 的 ComfyUI 工作流,极大减少从零搭图的时间成本。

  • 按主题/模型/节点筛选工作流
  • 查看参数与示例输出,理解意图
  • 结合本地资源做可控替换

ComfyUI_RH_APICall 有啥用?

把 RunningHub 的“获取/更新/执行”打通为 可编排的节点/脚本接口,在 ComfyUI 内部或外部脚本里:

  • 按 ID 拉取工作流 JSON
  • 自动替换本地模型/LoRA 路径
  • 注入 prompt/seed/尺寸 等参数
  • 一次性提交至 ComfyUI 队列并保存结果

再加一把 TT Tools,有何提升?

把“下载的模型与素材、运行结果、工程打包与命名规范”交给一套轻量工具处理,做到:

  • 资源清点与映射:扫描工作流引用,生成 path_map.json,统一重定向本地路径
  • 批量重命名:用规则把输出图像命名为包含 key 参数的易检索格式
  • 工程打包:拷贝必要模型/节点/设置,产出 .zip 可复现包

本文把「TT Tools」作为你本地的辅助脚本/工具集的统称;如果你手边已有同类工具,可等价替换。

2. 环境准备

  • 准备 ComfyUI(建议使用独立虚拟环境/便携包),确认能正常出图。
  • 准备 Python 3.10+(或随 ComfyUI 自带环境)。
  • 准备 Git(用于拉取扩展/工具仓库)。
  • 如果 RunningHub.ai 需要 API Key,先在网站创建并保存(本文以 RUNNINGHUB_API_KEY 环境变量为例)。

3. 安装与配置

3.1 安装 ComfyUI_RH_APICall 扩展

方式 A:Git 克隆

# 1) 进入你的 ComfyUI 根目录(替换为你的实际路径)
cd "G:/DiskC/Documents/ComfyUI"

# 2) 克隆扩展(目录名可自定义)
git clone https://example.com/your-repo/ComfyUI_RH_APICall.git ./custom_nodes/ComfyUI_RH_APICall

# 3) (可选)安装依赖
# 如果扩展附带 requirements.txt:
python -m pip install -r custom_nodes/ComfyUI_RH_APICall/requirements.txt

# 4) 重启 ComfyUI

方式 B:ComfyUI 内的扩展管理器(如你使用了第三方 Manager,按提示搜索并安装 ComfyUI_RH_APICall)。

3.2 运行前的配置文件

扩展通常提供一个配置文件(例如 config.toml.json),示例:

# ComfyUI_RH_APICall/config.toml
base_url = "https://www.runninghub.ai"
api_key_env = "RUNNINGHUB_API_KEY"   # 从环境变量读取,避免明文写入
timeout_s = 60
verify_ssl = true

# 路径映射:把远程/示意路径替换为你的本地模型库
# 例如,把 "models/checkpoints/..." 重写到 "G:/DiskC/Documents/ComfyUI/models/checkpoints"
[paths.map]
"models/checkpoints" = "G:/DiskC/Documents/ComfyUI/models/checkpoints"
"models/loras"       = "G:/DiskC/Documents/ComfyUI/models/loras"
"models/vae"         = "G:/DiskC/Documents/ComfyUI/models/vae"

以环境变量保存敏感凭据更安全:在系统里设置 RUNNINGHUB_API_KEY

3.3 设置环境变量(示例)

Windows PowerShell

$env:RUNNINGHUB_API_KEY="你的API密钥"
# 若用便携式 ComfyUI,可把这行添加到启动脚本中

Linux/macOS

export RUNNINGHUB_API_KEY="你的API密钥"
# 可写入 ~/.bashrc 或启动脚本

4. 最小可用示例:一键拉取并运行工作流

目标

给定 RunningHub 上的工作流 ID(例如 rh_wf_123456),在 ComfyUI 内:

  1. 拉取工作流 JSON
  2. 用本地路径映射替换模型/LoRA/CLIP/ControlNet 等引用
  3. 注入参数(prompt、seed、分辨率等)
  4. 提交队列并保存结果到指定目录

4.1 在 ComfyUI 里用节点编排(概念拓扑)

┌────────────────────┐      ┌─────────────────┐      ┌──────────────────┐      ┌───────────────────┐
│ RH_APICall (GET)   │──▶──▶│ JSON Parse      │──▶──▶│ Graph Merge/Bind │──▶──▶│ QueuePrompt/Execute│
│ endpoint: /api/wf  │      │ (取出nodes等) │      │ 注入自定义参数     │      │ SaveImage          │
└────────────────────┘      └─────────────────┘      └──────────────────┘      └───────────────────┘

不同扩展会提供不同名称的节点,但思路通用:“拉取→解析→注入→执行”。

4.2 通过 Python 节点/脚本调用(适合自动化)

如果扩展同时提供 Python 接口,可用如下伪代码(放在 custom_nodes 的脚本或外部控制脚本里):

import os, json, requests

BASE = "https://www.runninghub.ai"
KEY  = os.getenv("RUNNINGHUB_API_KEY")
WFID = "rh_wf_123456"

# 1) 拉取工作流
resp = requests.get(f"{BASE}/api/workflows/{WFID}",
                    headers={"Authorization": f"Bearer {KEY}"}, timeout=60)
resp.raise_for_status()
wf = resp.json()  # 约定字段:nodes, links, meta ...

# 2) 路径映射(示例)
PATH_MAP = {
    "models/checkpoints": r"G:/DiskC/Documents/ComfyUI/models/checkpoints",
    "models/loras":       r"G:/DiskC/Documents/ComfyUI/models/loras",
    "models/vae":         r"G:/DiskC/Documents/ComfyUI/models/vae"
}

def remap_path(p):
    for k,v in PATH_MAP.items():
        if p.startswith(k):
            return p.replace(k, v, 1)
    return p

for n in wf.get("nodes", []):
    for k,val in list(n.get("properties", {}).items()):
        if isinstance(val, str) and ("models/" in val):
            n["properties"][k] = remap_path(val)

# 3) 注入参数(prompt/seed/size)
PARAMS = {
    "positive_prompt": "a natural portrait, soft daylight, 85mm look",
    "negative_prompt": "low quality, artifacts",
    "seed": 123456789,
    "width": 768, "height": 1024
}

# 假设有统一参数节点的命名/ID:
for n in wf["nodes"]:
    if n["type"] == "CLIPTextEncode" and "positive" in n.get("label","").lower():
        n["properties"]["text"] = PARAMS["positive_prompt"]
    if n["type"] == "CLIPTextEncode" and "negative" in n.get("label","").lower():
        n["properties"]["text"] = PARAMS["negative_prompt"]
    if n["type"] == "KSampler":
        n["properties"]["seed"] = PARAMS["seed"]
    if n["type"] == "EmptyLatentImage":
        n["properties"]["width"] = PARAMS["width"]
        n["properties"]["height"]= PARAMS["height"]

# 4) 提交给本地 ComfyUI(HTTP API)
# 你的 ComfyUI 必须开启 API(通常启动即开放)
COMFY = "http://127.0.0.1:8188"

submit = requests.post(f"{COMFY}/prompt", json=wf, timeout=60)
submit.raise_for_status()
print("submitted:", submit.json())

不同版本 ComfyUI 的 HTTP API 格式略有差异,请根据本地版本调整字段。

4.3 输出与命名规范

建议把关键参数写入文件名,便于追溯:

# 约定输出格式:{date}_{wf}_{seed}_{w}x{h}_{shortprompt}.png
2025-10-23_rh_wf_123456_s123456789_768x1024_daylight-portrait.png

5. 批量化:prompt / seed / 分辨率参数扫描

5.1 扫 seed(观测稳定性)

seeds = [111, 222, 333, 444, 555]
for s in seeds:
    PARAMS["seed"] = s
    # 重复第 4 章的“注入与提交”逻辑
    # 输出命名中包含 s

5.2 扫 prompt 变体(风格细化)

variants = [
  "natural light, campus, candid",
  "overcast softbox look, minimal retouch",
  "golden hour rim light, shallow depth"
]
for v in variants:
    PARAMS["positive_prompt"] = v
    # 继续注入→提交→保存

5.3 尺寸/构图矩阵(适配不同平台)

sizes = [(768,1024),(896,1152),(1024,1536)]
for (w,h) in sizes:
    PARAMS["width"], PARAMS["height"] = w, h
    # 注入→提交→保存
提示:大批量请求时请设置 sleep 或队列长度上限,避免本地显存/CPU 撑爆,或触发远端接口的速率限制。

6. 用 TT Tools 做资源管理与工程打包

6.1 生成路径映射(解决“他人目录”和“我本地目录”不一致)

# 扫描工作流 JSON,提取所有模型/LoRA/控制网等路径,输出 path_map.json
tt scan --wf runninghub_wf.json --out path_map.json

# 自动把常见根目录重写到你的本地库
tt map --in runninghub_wf.json --map path_map.json --out wf_mapped.json

6.2 批量重命名输出(把关键信息写进文件名)

tt rename --src outputs/ --rule "{date}_{wf}_{seed}_{size}_{hash8}.png"

6.3 可复现打包(交付/迁移)

tt pack \
  --wf wf_mapped.json \
  --include models/checkpoints/sdxl/*.safetensors \
  --include models/loras/portrait/* \
  --include custom_nodes/SomeNode \
  --out deliverables/rh_wf_123456_repro.zip

打包时仅包含必要子集,保持体积可控。

7. 最佳实践

  • 凭据安全:API Key 放环境变量;避免提交到仓库。
  • 路径规范:把模型库根路径统一成 1–2 个目录;配合 path_map.json 自动重写。
  • 参数固化:prompt/seed/size 写入 metadata.json 与文件名,便于复现实验。
  • 合理限流:批跑时设置队列长度与 sleep;遇到 429/超时,指数退避重试。
  • 缓存与命中:重复拉取同一工作流时,优先本地缓存,必要时再检查远端是否有更新。

8. 常见问题排查

8.1 401/403 未授权

  • 确认环境变量 RUNNINGHUB_API_KEY 已设置,扩展配置读取的是同名变量。
  • 检查系统代理/抓包工具是否改写了请求头。

8.2 404 工作流不存在

  • 确认工作流 ID 无误且对当前账号可见。
  • 若链接私有/已下架,请更换为可访问的工作流。

8.3 本地模型路径不匹配

  • 使用 TT Tools 生成并维护 path_map.json,在注入阶段统一替换。
  • .safetensors 名称做模糊匹配(如去掉大小写/空格/下划线差异)。

8.4 队列卡住/显存不足

  • 降低并发,控制 QueuePrompt 的入队频率。
  • 先用小图(如 512×768)验证流程,再放大。

8.5 SSL/网络超时

  • 确认 verify_ssl 与系统证书链正常;必要时使用中间代理。
  • 提高超时时间;失败后指数退避重试。

9. 附:模板与片段

9.1 统一的参数注入器(示例片段)

def inject_params(graph, params):
    for n in graph.get("nodes", []):
        t = n.get("type","").lower()
        label = n.get("label","").lower()
        if "cliptextencode" in t and "positive" in label:
            n.setdefault("properties",{})["text"] = params["pos"]
        if "cliptextencode" in t and "negative" in label:
            n.setdefault("properties",{})["text"] = params["neg"]
        if "ksampler" in t:
            n.setdefault("properties",{})["seed"] = params["seed"]
        if "emptylatentimage" in t:
            p = n.setdefault("properties",{})
            p["width"], p["height"] = params["w"], params["h"]
    return graph

9.2 输出命名规则(Python 片段)

from datetime import date
def out_name(wf_id, seed, w, h, hint):
    d = date.today().isoformat()
    hint = hint.replace(" ","-")[:24]
    return f"{d}_{wf_id}_s{seed}_{w}x{h}_{hint}.png"
 

声明:本文示例为通用范式与伪代码,实际接口字段与节点名称以你本地扩展与 ComfyUI 版本为准。请尊重模型/素材的版权与站点使用条款。

我在上班,别发骚图了。
最新回复 (5)
  • 一只猴子 10小时前
    0 2
    看不懂思密达
  • 0 3
    emmmm……看了半天确实看不懂,是编程工作上用的?
    这个人很懒,什么也没有留下!
  • 冷泉法克斯 9小时前
    0 4
    喀秋莎前辈也要开始创作了?
    信仰是为了虚幻之人
  • 欧派兽 6小时前
    0 5
    奖励三
    1:管理员给你移区后会显示移到了你之前发帖的区。 2:点击我作为楼主发帖时一楼下的图片签名,可以跳转到站规教程贴。 3:多次水贴水回复会封号哦? 4:不知道回什么的时候就点“里世界专属”,一键随机生成几种回复内容。 5:祝你在里世界玩得愉快!
  • 喀秋莎 5小时前
    1 6
    冷泉法克斯 喀秋莎前辈也要开始创作了?
    已经开始画色图和H视频了。目前玩的比较变态的是先用模型生成自己的女性形象,然后生成不同的场景图+换脸+图生视频。
    我在上班,别发骚图了。
    • ACG里世界
      7
          
返回
发新帖