KM
ComfyUI 101 · บทที่ 6 · สาย Automation

Automation & API — เครื่องผลิตภาพอัตโนมัติ

สั่งงานผ่าน API · ทำ batch หลายร้อยภาพ · เชื่อมเข้าระบบงานของทีม — ต้องอ่าน Python ออก รู้จัก JSON และเคยใช้ command line

6.1

ComfyUI เป็น “เซิร์ฟเวอร์” อยู่แล้ว

จุดที่ทำให้มันทรงพลังเรื่อง automation: ตัวมันคือ HTTP server ที่มี API ในตัว — หน้าจอ node ที่เราใช้มาตลอดเป็นแค่ client หนึ่งเท่านั้น

🖥️

หน้าจอ node (เบราว์เซอร์)

client ที่เราใช้มาตลอดบท 1–5

🐍

Python script ของเรา

batch / automation (บทนี้)

🪝

n8n / Make / ระบบบริษัท

เรียกผ่าน HTTP เหมือนกันเป๊ะ

HTTP / WebSocket:8188

🏭

ComfyUI Server

HTTP server (Python) + คิวงาน + GPU — มี API ในตัวตั้งแต่แรก

$ python main.py --dont-print-server
$ python main.py --listen 0.0.0.0

· เขียนสคริปต์คุยกับ API ได้โดยตรง

· ไม่ต้องเปิดเบราว์เซอร์/คลิกเอง — สั่งจากโค้ดได้หมด

· รันแบบ headless บนเซิร์ฟเวอร์ได้

⚠️ --listen 0.0.0.0 เปิดให้เครื่องอื่นเข้าถึง — ใช้เฉพาะวงเครือข่ายที่ไว้ใจได้ + มี firewall

6.2 · ต้องแยกให้ออก

Workflow format vs API format

ComfyUI มี JSON 2 แบบ — งานเดียวกันแต่คนละหน้าที่ กดสลับดูความต่าง

{
"4": { "class_type": "CheckpointLoaderSimple",
"inputs": { "ckpt_name": "sd_xl_base_1.0.safetensors" } },
"6": { "class_type": "CLIPTextEncode",
"inputs": { "text": "a red sports car",
"clip": ["4", 1] } },
"3": { "class_type": "KSampler",
"inputs": { "seed": 12345, "steps": 25, "cfg": 7,
"model": ["4", 0], "positive": ["6", 0],
"latent_image": ["5", 0] } },
"9": { "class_type": "SaveImage",
"inputs": { "filename_prefix": "batch_",
"images": ["8", 0] } }
}

สีชมพู = ค่าที่เราแก้จากโค้ดได้ตรง ๆ — นี่คือวิธี “ป้อน prompt/seed ต่างกัน” ให้ทุกภาพใน batch

สีฟ้า = การเชื่อม node: ["4", 1] อ่านว่า “เอา output ช่องที่ 1 ของ node หมายเลข 4” — เส้นในกราฟกลายเป็นแค่ตัวเลขอ้างอิง

🔓 วิธีเปิดปุ่ม: Settings (เฟือง) → เปิด “Enable Dev mode options” → จะมีเมนู Save (API Format) เพิ่มขึ้นมา → ได้ไฟล์ workflow_api.json

6.3

Endpoints หลักที่ต้องรู้

คลิกแต่ละ endpoint เพื่อดูหน้าที่ + ตัวอย่าง request/response

ส่ง workflow (API format) เข้าคิวประมวลผล → คืน prompt_id

POST /prompt
{ "prompt": { ...workflow_api... },
  "client_id": "a1b2c3" }

→ { "prompt_id": "d4e5f6-..." }

6.4 · หัวใจของบท

วงจรชีวิตของงาน 1 ภาพ — กด Run ดูเอง

flow มาตรฐาน: POST /prompt → ฟัง WebSocket จนเสร็จ → GET /history → GET /view ดึงภาพ

client_id = a1b2c3 · server = 127.0.0.1:8188

① POST /prompt

② ฟัง WebSocket

③ GET /history

④ GET /view

ภาพจะมาปรากฏที่นี่ — โดยไม่ต้องเปิดหน้าจอ ComfyUI เลย

💡 ไม่อยากจัดการ WebSocket เอง? poll /history/{prompt_id} เป็นระยะจนมีผลลัพธ์ก็ได้ (ง่ายกว่า แต่เนียนน้อยกว่า) · หรือใช้ CLI: comfy run --workflow workflow_api.json --wait

🐍 ดูโค้ด Python เต็ม ๆ ของ flow นี้ (คลิกกาง)
import json, urllib.request, uuid, websocket

SERVER = "127.0.0.1:8188"
client_id = str(uuid.uuid4())

def queue_prompt(workflow):
    payload = {"prompt": workflow, "client_id": client_id}
    req = urllib.request.Request(f"http://{SERVER}/prompt",
                                 data=json.dumps(payload).encode())
    return json.loads(urllib.request.urlopen(req).read())["prompt_id"]

def wait_until_done(prompt_id):           # ฟัง WebSocket จนงานเสร็จ
    ws = websocket.WebSocket()
    ws.connect(f"ws://{SERVER}/ws?clientId={client_id}")
    while True:
        m = json.loads(ws.recv())
        if m["type"] == "executing" and m["data"]["node"] is None \
           and m["data"]["prompt_id"] == prompt_id:
            break
    ws.close()

# ---------- ใช้งานจริง ----------
workflow = json.load(open("workflow_api.json", encoding="utf-8"))
workflow["6"]["inputs"]["text"] = "a cozy coffee shop, photorealistic"
workflow["3"]["inputs"]["seed"] = 42       # แก้ค่าจากโค้ดได้ตรง ๆ

pid = queue_prompt(workflow)
wait_until_done(pid)                       # → แล้วไปดึงภาพจาก /history + /view

6.5

Batch Processing — ผลิตทีละหลายร้อยภาพ

แนวคิด: อ่านรายการงานจาก CSV → วน loop แก้ค่าใน workflow → ส่งเข้าคิว → เก็บผล — ลองรันดู (มีงานที่ล้มให้เห็น retry จริง)

jobs.csv — 4 งาน (สังเกต SKU-003 จะล้มแล้ว retry)

skupromptseedสถานะ
SKU-001red sports car, studio light42รอคิว
SKU-002blue ceramic mug, top view43รอคิว
SKU-003leather backpack, outdoor44รอคิว
SKU-004wireless earbuds, minimal bg45รอคิว

batch.log

— กด Run batch เพื่อเริ่ม —
✅ ตั้งชื่อไฟล์ตาม SKU/วันที่/แคมเปญ✅ error handling + retry (1 ภาพล่ม ไม่พังทั้ง batch)✅ logging เสร็จ/ล้มเหลว✅ seed คงที่ = ผลซ้ำได้⚠️ คิวเดียวรันทีละงาน — throughput สูงใช้หลาย instance/GPU

6.6

รูปแบบการเชื่อมต่อเข้าระบบ

จาก script ง่าย ๆ จนถึงระบบ production เต็มรูปแบบ — เลือกตามขนาดงาน

📜

Script ภายใน

Python อ่าน CSV → ยิง API → เซฟไฟล์

เหมาะกับ: งาน batch เป็นรอบ ๆ

📦

Microservice / REST wrapper

ครอบ ComfyUI ด้วย API ของเราเอง (เช่น FastAPI)

เหมาะกับ: ให้ระบบอื่นในบริษัทเรียกใช้

🧵

Queue worker

งานเข้า message queue → worker ดึงไปยิง ComfyUI

เหมาะกับ: งานเยอะ, scale หลาย GPU

🪝

Webhook / automation tool

n8n / Make / Zapier เรียก HTTP /prompt

เหมาะกับ: ต่อกับ flow อัตโนมัติอื่น ๆ

🌐

HTTP Request node ในตัว

ให้ workflow เรียก API ภายนอกเอง (ดึงข้อมูล/ส่งผลออก)

เหมาะกับ: pipeline ที่ต้องคุยกับบริการอื่น

📱

App Mode + แชร์ลิงก์

เปลี่ยน workflow เป็นแอปหน้าเดียว แชร์ให้ทีมใช้

เหมาะกับ: ให้คน non-technical ใช้ (บทที่ 7)

6.7

ข้อควรระวังเรื่อง Production

ก่อนเอาเข้าระบบจริง เช็ก 4 เรื่องนี้ให้ครบ

🧠

VRAM / คิว

1 instance รันทีละงาน — วางแผน throughput และ timeout · ต้องการเร็วขึ้น = หลาย instance / หลาย GPU แล้วกระจายงาน

🔒

ล็อกเวอร์ชัน

อย่าให้ production พึ่ง custom node ที่ไม่เสถียร — ล็อกเวอร์ชัน node/โมเดล และเก็บ workflow_api.json ใน git กันผลลัพธ์เปลี่ยนเงียบ ๆ

🛡️

ความปลอดภัย

อย่าเปิดพอร์ต ComfyUI ออกอินเทอร์เน็ตตรง ๆ — ครอบด้วย auth/reverse proxy · --listen 0.0.0.0 เฉพาะวงที่ไว้ใจได้

⚖️

ลิขสิทธิ์

ตรวจ license ของโมเดล/LoRA ก่อนใช้เชิงพาณิชย์

✅ สรุปบทที่ 6

  • • ComfyUI เป็น HTTP server + API ในตัว — หน้าจอ node เป็นแค่ client หนึ่ง
  • • ต้อง export เป็น API format (เปิด Dev Mode) ก่อนสั่งผ่าน /prompt
  • • flow มาตรฐาน: POST /prompt → ฟัง ws จนเสร็จ → GET /history → GET /view
  • Batch = วน loop แก้ค่าต่อ job + error handling/retry/logging/ชื่อไฟล์เป็นระบบ
  • • เชื่อมระบบได้ตั้งแต่ script จนถึง microservice/queue/App Mode
📚 ถัดไป: บทที่ 7 — Use Cases และแบบฝึกหัด (บทปิดคอร์ส — ทุกคนกลับมาเรียนรวมกัน) — เลือกได้จาก sidebar ซ้ายมือ