📺 影片版(約 7 分鐘):想先看實際操作的話可以直接看這支影片,完整步驟、設定與程式碼在下方文字版。
ComfyUI 是目前 Stable Diffusion (AI 繪圖) 領域中最強大的可視化介面之一。它的核心特點是「節點式 (Node-based)」操作,這讓使用者可以精確控制整個渲染流程。
以下是關於 ComfyUI 的簡介以及安裝方式:
---
🌟 什麼是 ComfyUI?ComfyUI 是一個基於
Stable Diffusion 模型的視覺化介面。與 Midjourney (文字輸入) 或 Automatic1111 / SD WebUI (選單下拉框) 不同,ComfyUI 透過「連接節點」來完成工作。
💡 核心優勢1.
效能極佳:由於採用圖形化資料流,它的 GPU VRAM 佔用率通常比其他介面低約 30%~50%,這讓你在顯示卡有限的情況下也能跑更高分辨率。
2.
完全的控制權:你可以看到模型是如何一步步組合(例如:Text Encoding -> Latent Sampling -> VAE Decode)。
3.
工作流分享 (JSON):你畫好的圖,可以直接把
.png 檔塞回 ComfyUI 的左側,就能還原出它的設定流程,方便學習與修改。
---
🛠️ 安裝方式 (以 Linux / NVIDIA GPU 為例)您的伺服器有
128GB RAM + NVIDIA GB10 顯示卡,效能非常充裕,但建議還是使用隔離環境來安裝以避免系統衝突。
步驟 1:準備環境確保您已經安裝了必要的基礎工具:
sudo apt update && sudo apt upgrade -y
sudo apt install git python3 python3-venv python3-pip libgl1-mesa-glx -y
步驟 2:下載 ComfyUI1. 進入您的工作目錄並克隆官方專案倉庫:
2. 建立一個乾淨的 Python 虛擬環境
python3 -m venv venv
3. 啟動虛擬環境
source venv/bin/activate
4. 下載最適合您系統的環境依賴套件
pip install --upgrade pip pip install -r
requirements.txt
步驟 3:直接啟動本機 ComfyUI 服務
cd ~/ComfyUI
source venv/bin/activate
python main.py --listen 0.0.0.0 --port 8188
進入後
開啟範本: 若有錯誤點選元件下載
配置 ComfyUI 的 Z-Image-Turbo 流程,請確保將它們放對資料夾
- ae.safetensors
放入 ComfyUI/models/vae/
- qwen_3_4b.safetensors
放入 ComfyUI/models/text_encoders/
- z_image_turbo_bf16.safetensors
放入 ComfyUI/models/diffusion_models/
補充(2026/10 更新):實際環境、實測速度與 Telegram 生圖的完整做法
這篇寫於 7 月剛裝好 ComfyUI 的時候。用了幾個月後,把實際的版本、安裝步驟的修正、實測速度,以及 Telegram 文字生圖背後到底怎麼運作補上來。以下數字都是在 GX10 本機實際查詢、實際跑出來的。
補充一、這台 GX10 的實際環境
| 項目 | 實際值 |
| 主機 | ASUS Ascent GX10(NVIDIA GB10,ARM64 架構) |
| 記憶體 | 121 GB 統一記憶體(CPU 與 GPU 共用,ComfyUI 看到的 VRAM 也是 121 GB) |
| ComfyUI | v0.34.2(前端 1.49.6) |
| Python 環境 | Anaconda 環境 ComfyUI_env,Python 3.10.20 |
| PyTorch | 2.12.1 + CUDA 13.0(cu130) |
| Telegram 套件 | python-telegram-bot 22.8、httpx 0.28.1 |
Z-Image-Turbo 這組三個模型檔的大小,下載前可以先確認硬碟空間:
| 檔案 | 放置資料夾 | 大小 |
| z_image_turbo_bf16.safetensors | models/diffusion_models/ | 12 GB |
| qwen_3_4b.safetensors | models/text_encoders/ | 7.5 GB |
| ae.safetensors | models/vae/ | 320 MB |
補充二、安裝步驟的幾個修正
上面的步驟照抄有幾個地方會卡住,這裡更正:
1. libgl1-mesa-glx 在 Ubuntu 24.04 已經不存在,apt 會報找不到套件,改裝
libgl1:
sudo apt install git python3 python3-venv python3-pip libgl1 -y
2. pip 那行其實是兩個指令,要分開執行:
pip install --upgrade pip
pip install -r requirements.txt
3. GX10 是 ARM64,PyTorch 要裝 CUDA 13 版,否則會裝到只能用 CPU 的版本。建議在
pip install -r requirements.txt 之前先裝:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu130
裝完用這行確認 GPU 有抓到(要印出
True):
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
4. ComfyUI-Manager 要用 git clone 放進 custom_nodes,不是 wget:
cd ~/ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager.git comfyui-manager
5. venv 或 conda 都可以。我這台後來改用 Anaconda 環境(
conda create -n ComfyUI_env python=3.10),好處是 Python 版本跟系統完全分開;用 venv 的話把下面服務檔裡的路徑換成
~/ComfyUI/venv/bin/python 即可。
補充三、Z-Image-Turbo 工作流的參數與實測速度
範本裡實際用的參數如下,Turbo 版只要 8 步就能出圖:
| 節點 | 參數 |
| EmptySD3LatentImage | 1024 × 1024 |
| KSampler | steps 8、cfg 1、sampler res_multistep、scheduler simple |
| ModelSamplingAuraFlow | shift 3 |
| CLIPLoader | qwen_3_4b,type 選 lumina2 |
| ConditioningZeroOut | 負面提示詞直接歸零(cfg 1 時本來就用不到負面提示詞) |
在 GX10 上實測三張 1024×1024:
- 第一張(冷啟動):18.1 秒,多出來的時間是把約 20 GB 模型載入記憶體
- 之後每張:約 7.5 秒
提示詞可以直接寫中文(文字編碼器是 Qwen3),例如「夜晚霓虹燈下的台北街頭,賽博龐克風格」就能出圖。不過圖中如果要出現招牌文字,中文字常常會變成看起來像字但其實不是字的筆畫,這是目前模型的限制。
補充四、讓 ComfyUI 開機自動啟動(systemd)
每次手動
python main.py 很麻煩,可以做成 systemd 使用者服務,掛掉 10 秒後還會自動重啟。建立
~/.config/systemd/user/comfyui.service:
[Unit]
Description=ComfyUI AI Generation Service
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/gx/ComfyUI
ExecStart=/home/gx/anaconda3/envs/ComfyUI_env/bin/python main.py --listen 0.0.0.0 --port 8188
Restart=always
RestartSec=10
[Install]
WantedBy=default.target
啟用與管理:
systemctl --user daemon-reload
systemctl --user enable --now comfyui.service # 開機自動啟動並立即啟動
systemctl --user status comfyui.service
journalctl --user -u comfyui.service -f # 看即時 log
sudo loginctl enable-linger $USER # 沒登入也照樣跑
啟動後約 10 秒,用
curl -s http://127.0.0.1:8188/system_stats 有回 JSON 就代表服務好了。
小提醒:ComfyUI 載入模型後會一直佔著記憶體。GX10 的 GPU 跟 CPU 共用同一塊記憶體,如果同時還要跑 Ollama 大模型,不常生圖的話可以不設開機啟動,要用時再
systemctl --user start comfyui。
補充五、Telegram 文字生圖是怎麼運作的
上面截圖裡在 Telegram 打
/generate 提示詞 就收到圖,背後是一支自己寫的 Python 機器人,流程如下:
手機 Telegram:/generate 一隻橘貓坐在窗台上看雨
│
▼
Telegram Bot(python-telegram-bot,在 GX10 上跑)
1. 讀取工作流 JSON(API 格式)
2. 把提示詞塞進 CLIPTextEncode 節點的 text
│ POST /prompt
▼
ComfyUI(127.0.0.1:8188)排隊、生圖 → 回傳 prompt_id
│ 每秒 GET /history/{prompt_id},直到出現結果
▼
Bot 用 GET /view 取回 PNG → send_photo 傳回手機
步驟 1:建立 Telegram Bot
- 在 Telegram 搜尋 @BotFather,輸入
/newbot,依指示取名,最後會拿到一組 Bot Token
- 跟 @userinfobot 說一句話,取得自己的數字 User ID(等一下用來限制只有自己能用)
步驟 2:從 ComfyUI 匯出 API 格式的工作流
在 ComfyUI 網頁打開 Z-Image-Turbo 工作流,確認能正常出圖後,選單「Workflow → Export (API)」存成
image_z_image_turbo.json。
注意一定要匯出
API 格式:一般「Save」存的是編輯器格式(有 nodes、links 陣列),直接送
/prompt 會失敗。API 格式長這樣,每個節點以 ID 為 key:
"57:27": {"class_type": "CLIPTextEncode", "inputs": {"text": "山窮水盡的水彩畫", "clip": ["57:30", 0]}},
"57:3": {"class_type": "KSampler", "inputs": {"seed": 878164762609716, "steps": 8, "cfg": 1, ...}}
程式要改提示詞就改
57:27 的
text,要換種子就改
57:3 的
seed。
步驟 3:安裝套件
pip install python-telegram-bot httpx
步驟 4:機器人程式(精簡版)
我最早的版本有 180 行,還用了執行緒池;其實 httpx 本身就是非同步的,不需要另外開執行緒。整理後的精簡版如下(核心的 ComfyUI 呼叫在 GX10 上實測可正常取回圖片),存成
comfy_bot.py:
import os, json, random, asyncio, httpx
from pathlib import Path
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes, filters
COMFY = "http://127.0.0.1:8188"
WF = json.loads(Path("image_z_image_turbo.json").read_text())
MY_ID = int(os.environ["TG_MY_USER_ID"]) # 只允許自己使用
async def comfy(prompt: str) -> bytes:
wf = json.loads(json.dumps(WF)) # 複製一份,避免改到原本的
wf["57:27"]["inputs"]["text"] = prompt # 提示詞節點
wf["57:3"]["inputs"]["seed"] = random.randint(0, 2**48) # 每次換種子
async with httpx.AsyncClient(timeout=30) as c:
pid = (await c.post(f"{COMFY}/prompt", json={"prompt": wf})).json()["prompt_id"]
for _ in range(180): # 最多等 180 秒
await asyncio.sleep(1)
h = (await c.get(f"{COMFY}/history/{pid}")).json()
if pid in h:
img = next(i for o in h[pid]["outputs"].values() for i in o.get("images", []))
return (await c.get(f"{COMFY}/view", params=img)).content
raise TimeoutError("ComfyUI 超過 180 秒沒回應")
async def generate(update: Update, context: ContextTypes.DEFAULT_TYPE):
prompt = " ".join(context.args)
if not prompt:
await update.message.reply_text("用法:/generate 畫面描述")
return
msg = await update.message.reply_text("⏳ 生成中,約 10 秒…")
try:
png = await comfy(prompt)
await update.message.reply_photo(png, caption=prompt[:1000])
await msg.delete()
except Exception as e:
await msg.edit_text(f"❌ 生成失敗:{e}")
app = (ApplicationBuilder().token(os.environ["TG_BOT_TOKEN"])
.concurrent_updates(True).build()) # 生圖時 Bot 仍可回應其他訊息
app.add_handler(CommandHandler("generate", generate,
filters=filters.User(MY_ID), block=False))
app.run_polling()
步驟 5:執行
export TG_BOT_TOKEN="從 BotFather 拿到的 token"
export TG_MY_USER_ID="你的數字 User ID"
python comfy_bot.py
接著在 Telegram 對你的 Bot 傳
/generate 清晨山間的茶園,雲霧繚繞,寫實攝影,約 8 秒就會收到圖。
補充六、幾個實際踩過的坑
- 種子固定,同一句提示詞永遠同一張圖:工作流 JSON 裡的 seed 是固定值,不改的話 ComfyUI 甚至會直接回快取結果。上面程式每次用
random.randint 換種子就解決了。
- 不要用「有 text 欄位就替換」的寫法:我第一版是掃過所有節點、只要 inputs 有 text 就換掉,如果工作流裡有負面提示詞節點,會連負面提示詞一起被換成正面內容。直接指定節點 ID 最保險。
- 一個 Bot Token 只能有一支程式在收訊息:如果同一個 token 已經給其他程式(例如 AI Agent)用,兩邊同時 polling 會出現
409 Conflict,訊息會被搶走。生圖機器人請另外跟 BotFather 申請一個。
- 一定要限制使用者:Bot 是公開的,任何人搜到都能傳指令。沒加
filters.User 等於讓陌生人免費用你的 GPU。
--listen 0.0.0.0 等於對整個區網開放:ComfyUI 沒有登入機制,同網段的人都能打開網頁、送工作。如果只有本機的 Bot 會用,改成 --listen 127.0.0.1;要從外面連就透過 Tailscale,不要在路由器開 port。
- 做影片時要把逾時拉長:生圖 10 秒內就好,但 LTX 等影片模型一支要好幾分鐘,輪詢上限要改大,而且
reply_photo 要換成 reply_video。
補充七、更進一步:讓 AI Agent 直接操作 ComfyUI
自己寫 Bot 的好處是簡單、可控,但只能固定打
/generate。後來我在 GX10 上改用 Hermes Agent 的
comfyui 技能(skill),在 Telegram 用一般對話就行,例如「幫我畫一張水彩風格的貓,畫完再做成 5 秒影片」,Agent 會自己選工作流、改參數、送給同一台 ComfyUI,再把結果傳回來。底層呼叫的一樣是
/prompt、
/history、
/view 這幾個 API,所以先把這篇的 Bot 做通,對理解 Agent 在做什麼很有幫助。
補充八、問題排查清單
| 症狀 | 檢查方向 |
| Bot 沒反應 | token 是否正確、是否被其他程式同時 polling(409 Conflict)、User ID 是否填對 |
| 回「生成失敗」連線被拒 | ComfyUI 沒在跑:systemctl --user status comfyui、curl 127.0.0.1:8188/system_stats |
| POST /prompt 回 400 | 工作流不是 API 格式,或模型檔名、資料夾放錯(看回應裡的 node_errors) |
| 第一張特別慢 | 正常,冷啟動要載入模型,之後就快了 |
| 出圖很慢、像在用 CPU | PyTorch 裝到 CPU 版,torch.cuda.is_available() 是 False,重裝 cu130 版 |
延伸閱讀