┌────────────────────┐      ┌─────────────────┐      ┌──────────────────┐      ┌───────────────────┐
│ RH_APICall (GET)   │──▶──▶│ JSON Parse      │──▶──▶│ Graph Merge/Bind │──▶──▶│ QueuePrompt/Execute│
│ endpoint: /api/wf  │      │ (取出nodes等) │      │ 注入自定义参数     │      │ SaveImage          │
└────────────────────┘      └─────────────────┘      └──────────────────┘      └───────────────────┘
不同扩展会提供不同名称的节点,但思路通用:“拉取→解析→注入→执行”。
 
如果扩展同时提供 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 格式略有差异,请根据本地版本调整字段。