← 返回 Siami 首頁

Hermes Agent 從另一台電腦操控 ComfyUI 生圖

Hermes Agent 從另一台電腦操控 ComfyUI 生圖

LAN 遠端操控 ComfyUI 成果展示


🚀 為什麼要遠端操控 ComfyUI?

ComfyUI 預設只監聽 127.0.0.1,只有本機才能用。但只要加一個啟動參數,同一區網內任何設備都能呼叫你那台 RTX 5090 來生圖。

實戰環境是這樣搭的:

角色設備IP
🖥️ 生成端(負責繪圖)Windows 桌上型,RTX 5090(34GB VRAM)192.168.0.101
📡 控制端(發送指令)Linux 迷你主機(VivoMini),跑 Hermes Agent192.168.0.100

⚠️ 關鍵條件:兩台機器必須在同一個 LAN 區域網路內(接同一台路由器或交換器)。


📡 第一步:開啟 LAN 監聽模式

🎯 找到啟動腳本

ComfyUI Portable 版(Windows)的啟動腳本是 run_nvidia_gpu.bat,在 ComfyUI 根目錄下。

✏️ 修改內容

用記事本打開,原本長這樣:

.\python_embeded\python.exe -s ComfyUI\main.py --windows-standalone-build

main.py 前面加上 --listen 0.0.0.0

.\python_embeded\python.exe -s ComfyUI\main.py --listen 0.0.0.0 --windows-standalone-build

💡 參數說明--listen 0.0.0.0 讓 ComfyUI 綁定所有網路介面,不再只鎖 127.0.0.1。同一 LAN 的其他設備就能透過 http://<電腦IP>:8188 訪問。

✅ 驗證啟動

儲存後雙擊執行,看到這個就成功了:

Starting server
To see the GUI go to http://localhost:8188

接著在其他機器的瀏覽器輸入 http://192.168.0.101:8188(換成你的 IP),就能看到 ComfyUI 網頁介面啦!🎉


🔌 第二步:確認網路暢通

從控制端(Linux)測試一下連線:

curl http://192.168.0.101:8188/system_stats

成功的話會回傳 GPU 資訊,像這樣:

{
  "devices": [
    {
      "name": "NVIDIA GeForce RTX 5090",
      "VRAM_total": 34.0,
      "VRAM_free": 33.5,
      "torch_version": "2.6.0+cu126"
    }
  ]
}

33.5GB 空閒 VRAM — 準備好要幹活了!💪


📥 第三步:下載所需模型

🎨 主模型:hassaku XL Illustrious v3.3

項目內容
📛 模型名稱hassaku XL Illustrious v3.3
🔗 下載網址CivitAI:hassaku-xl-illustrious
👤 作者OnomaAI Research
📂 放置路徑ComfyUI/models/checkpoints/hassakuXLIllustrious_v33.safetensors
📦 檔案大小約 3.5 GB

直接下載放進 models/checkpoints/ 就好。

🧩 LoRA 模型(可選強化)

這套 Workflow 用了兩組 LoRA,讓風格更有層次感:

LoRA 名稱🎯 用途🔗 下載建議權重
ppw_v8_Illuv2stable_128提升寫實感與光影層次CivitAI0.5
PetraStyle油畫質感+印象派筆觸CivitAI0.6

💡 放好後進 ComfyUI → Extra Networks(左側面板)點一下 Refresh,新模型就會出現了!


🔧 第四步:Workflow 結構拆解

完整的生圖流程長這樣,每個節點就是一個處理步驟:

┌─────────────────────────────────────────────────────────┐
│  🎯 1. CheckpointLoaderSimple                           │
│      模型:hassakuXLIllustrious_v33.safetensors         │
│                          ↓                              │
│  ✏️  2. CLIPTextEncode(正向提示詞)                     │
│      text: "masterpiece, best quality, impressionism..." │
│                          ↓                              │
│  ✏️  3. CLIPTextEncode(負向提示詞)                     │
│      text:(留空)                                       │
│                          ↓                              │
│  🖼️  4. EmptyLatentImage                                │
│      width: 1280, height: 1280, batch_size: 1           │
│                          ↓                              │
│  🔄 5. KSampler(採樣器)                               │
│      sampler: dpmpp_2m, scheduler: karras              │
│      steps: 35, cfg: 5, seed:(隨機)                   │
│                          ↓                              │
│  🧬 6. VAEDecode                                       │
│      將潛空間向量解碼成實際像素                          │
│                          ↓                              │
│  💾 7. SaveImage → 輸出到 output/ 資料夾                │
└─────────────────────────────────────────────────────────┘

⚙️ 第五步:完整參數設定

📊 生圖參數一覽

參數數值備註
🧠 CheckpointhassakuXLIllustrious_v33基礎模型
✍️ 正向提示詞masterpiece, best quality, very aesthetic, impressionism, slim 1girl, pink hair, lobster hat accessory, big sparkling eyes, soft pastel palette, kawaii aesthetic人物+風格描述
🚫 負向提示詞(留空)不特別排除元素
📐 解析度1280 × 1280(半身)/ 896 × 1536(全身)batch=1
🔄 Samplerdpmpp_2mDPM++ 2M,速度與品質最佳平衡
📅 Schedulerkarras前期快速收斂
🔢 Steps35對這模型已足夠
⚖️ CFG Scale5偏低偏創意,下文有說明
🔗 LoRA 1ppw_v8_Illuv2stable_128 @ 0.5寫實光影增強
🔗 LoRA 2PetraStyle @ 0.6油畫印象派質感
🧬 VAE(內建)hassaku XL 已有

⚠️ CFG Scale 不能設太低

有些文章說「CFG 越低越有創意」,但在 hassaku XL Illustrious 這模型上,CFG 建議設在 5~7。設到 1~2 的話,生出來的角色會變成一團雜訊。CFG 5 在這模型上剛好兼顧創意與穩定性 ✅


💻 第六步:完整 Python 程式碼

以下程式從控制端(Linux)發送 Request,就能叫 Windows 那台 RTX 5090 開始生圖 👇

import json
import urllib.request
import urllib.error
import time
import base64
import os

COMFYUI_HOST = "192.168.0.101"
COMFYUI_PORT = "8188"
BASE_URL = f"http://{COMFYUI_HOST}:{COMFYUI_PORT}"

WORKFLOW_FILE = "workflow.json"  # 從 ComfyUI UI 匯出的 API workflow
OUTPUT_DIR = "./output/"         # 圖片存放位置

# ─────────────────────────────────────────────
# Step 1:讀取 Workflow 並修改 Prompt
# ─────────────────────────────────────────────
with open(WORKFLOW_FILE, "r", encoding="utf-8") as f:
    workflow = json.load(f)

# Node 3 = CLIPTextEncode(正向提示詞)
workflow["3"]["inputs"]["text"] = (
    "masterpiece, best quality, cute anime girl, "
    "pink hair with lobster hat accessory, "
    "big sparkling eyes, soft pastel palette, "
    "impressionist style, kawaii aesthetic"
)

# ─────────────────────────────────────────────
# Step 2:送出 Prompt 到佇列
# ─────────────────────────────────────────────
def queue_prompt(prompt_dict):
    data = json.dumps({"prompt": prompt_dict}).encode("utf-8")
    req = urllib.request.Request(
        f"{BASE_URL}/api/prompt",
        data=data,
        headers={"Content-Type": "application/json"},
    )
    with urllib.request.urlopen(req) as resp:
        result = json.loads(resp.read().decode("utf-8"))
    return result["prompt_id"]

prompt_id = queue_prompt(workflow)
print(f"✅ 已送出 Prompt,ID:{prompt_id}")

# ─────────────────────────────────────────────
# Step 3:輪詢直到完成
# ─────────────────────────────────────────────
def wait_for_completion(prompt_id, poll_interval=2, timeout=300):
    start = time.time()
    while True:
        if time.time() - start > timeout:
            raise TimeoutError(f"⏰ 生圖超時({timeout}s)")
        try:
            with urllib.request.urlopen(f"{BASE_URL}/api/history/{prompt_id}") as resp:
                history = json.loads(resp.read().decode("utf-8"))
            if prompt_id in history:
                print("🎉 完成!")
                return history[prompt_id]
        except urllib.error.HTTPError:
            pass
        time.sleep(poll_interval)

history = wait_for_completion(prompt_id)

# ─────────────────────────────────────────────
# Step 4:取出圖片並存檔
# ─────────────────────────────────────────────
os.makedirs(OUTPUT_DIR, exist_ok=True)

for node_id, node_data in history.get("outputs", {}).items():
    images = node_data.get("images", [])
    for img in images:
        img_url = f"{BASE_URL}/view?filename={img['filename']}&type=output"
        req = urllib.request.Request(img_url)
        with urllib.request.urlopen(req) as resp:
            img_data = resp.read()
        out_path = os.path.join(OUTPUT_DIR, img["filename"])
        with open(out_path, "wb") as f:
            f.write(img_data)
        print(f"💾 已存檔:{out_path}")

執行完成後,生成的圖片就會出現在 ./output/ 目錄裡 🖼️


📤 第七步:從 ComfyUI UI 匯出 Workflow

如果還沒有 workflow.json,在 ComfyUI 網頁介面中:

  1. 🎨 載入或建立你想要的 Pipeline
  2. 💾 點右側面板 Save → 選擇格式 API (.json)
  3. 📁 把下載的 JSON 放到控制端機器,餵給上面的 Python 程式

💡 Pro Tip:第一次先在 ComfyUI UI 直接執行一次,確認能正常產圖,再把 Workflow JSON 匯出搬到控制端。遠端操控的成功率會高很多!


🖼️ 成果展示

全身版 896×1536

尺寸⏱ 耗時💾 VRAM
1280 × 1280(半身)約 10 秒約 12 GB
896 × 1536(全身)約 30 秒約 18 GB

RTX 5090 的 34GB VRAM 在整個過程閒置率還很高,未來可以一次排多張 Batch 或疊加更多 LoRA 來壓榨效能 🔥


🏗️ 架構總覽

┌──────────────────────────────────┐
│  📡 控制端:Linux VivoMini        │
│  Hermes Agent 發送指令            │
│                                  │
│  ➊  POST /api/prompt  送出任務   │
│  ➋  GET  /api/history 輪詢結果   │
│  ➌  接收生成好的圖片              │
└──────────────┬───────────────────┘
               │  http://192.168.0.101:8188
               │  (LAN 區域網路,免公網 IP)

┌──────────────────────────────────┐
│  🖥️ 生成端:Windows 桌上型        │
│  GPU: RTX 5090(34GB VRAM)     │
│  ComfyUI Portable               │
│  啟動參數: --listen 0.0.0.0     │
│  Port: 8188                     │
│                                  │
│  📂 models/checkpoints/         │
│     hassakuXLIllustrious_v33     │
│  📂 models/loras/               │
│     ppw_v8_Illuv2stable_128     │
│     PetraStyle                  │
└──────────────────────────────────┘

✅ 快速檢查清單

  • run_nvidia_gpu.bat 已加入 --listen 0.0.0.0
  • 兩台機器連上同一個 LAN
  • curl http://<WIN_IP>:8188/system_stats 有回應
  • hassakuXLIllustrious_v33 已放入 models/checkpoints/
  • 兩組 LoRA 已放入 models/loras/
  • ComfyUI UI 直接生圖驗證正常
  • Workflow JSON 已匯出到控制端
  • Python 程式碼中的 IP 與路徑已替換

❓ 常見問題

Q:其他機器打不開 http://192.168.0.101:8188
→ 檢查 Windows 防火牆有沒有擋 8188 埠。去「Windows 安全性 → 防火牆與網路保護 → 新增連接埠規則」開放 8188 TCP

Q:出現 401 Unauthorized?
→ 預設 ComfyUI 不需要認證。但有設 API Key 的話,請在 Header 加上 Authorization: Bearer <你的KEY>

Q:VRAM 不夠怎麼辦?
→ 降低解析度,或把 batch_size 從 1 改為 2(但記得 VRAM 要夠)。RTX 5090 34GB 完全沒在怕這套 Workflow。


🎯 總結

只要在啟動時加上 --listen 0.0.0.0,ComfyUI 立刻變身一台區網共享的 AI 生圖伺服器。一台高階 GPU、多人同時使用 — 非常適合工作室或家庭成員共享同一台高效能機器 💪

需要圖的時候,躺在沙發上用手機發個 Request 就好,何樂而不為呢?😎