Conteúdo

Tutorial de API do ComfyUI: automatize a geração de imagens com Python

O próprio ComfyUI é um servidor HTTP. Cada execução pela interface, na prática, chama a API. Você pode enviar fluxos de trabalho por código para:

  • Gerar muitas imagens em lote (por exemplo, criar uma imagem para cada um de 100 produtos)
  • Integrar o ComfyUI ao seu site, chatbot ou fluxo de automação do n8n
  • Gerar conteúdo automaticamente em horários programados

1. Exporte um fluxo de trabalho no formato API

O JSON de um fluxo de trabalho salvo pela interface inclui informações de layout. A API precisa de outro formato, mais enxuto:

  1. Crie e teste o fluxo de trabalho no ComfyUI.
  2. No menu no canto superior esquerdo, selecione File → Export (API) e salve como workflow_api.json.
Menu no canto superior esquerdo do ComfyUI
Menu do ComfyUI no canto superior esquerdo: o submenu File contém opções para abrir, salvar e exportar, além de permitir navegar pelos modelos

O formato da API é assim: cada nó é identificado pela sua ID:

{
  "3": {
    "class_type": "KSampler",
    "inputs": {
      "seed": 123456,
      "steps": 25,
      "cfg": 6,
      "sampler_name": "dpmpp_2m",
      "scheduler": "karras",
      "denoise": 1,
      "model": ["4", 0],
      "positive": ["6", 0],
      "negative": ["7", 0],
      "latent_image": ["5", 0]
    }
  },
  "6": {
    "class_type": "CLIPTextEncode",
    "inputs": { "text": "a cat sitting on a windowsill", "clip": ["4", 1] }
  }
}

["4", 0] significa “a saída 0 do nó 4”. Anote as IDs dos nós que você quer alterar (por exemplo, o prompt positivo é 6 e o KSampler é 3).

2. Envie uma tarefa

curl -X POST http://127.0.0.1:8188/prompt \
  -H "Content-Type: application/json" \
  -d "{\"prompt\": $(cat workflow_api.json)}"

Use o prompt_id da resposta para consultar o resultado.

3. Exemplo completo em Python

import json
import random
import time
import urllib.parse
import urllib.request

SERVER = "http://127.0.0.1:8188"

def queue(workflow: dict) -> str:
    data = json.dumps({"prompt": workflow}).encode()
    req = urllib.request.Request(f"{SERVER}/prompt", data=data, headers={"Content-Type": "application/json"})
    return json.load(urllib.request.urlopen(req))["prompt_id"]

def wait_for(prompt_id: str) -> dict:
    while True:
        history = json.load(urllib.request.urlopen(f"{SERVER}/history/{prompt_id}"))
        if prompt_id in history:
            return history[prompt_id]
        time.sleep(1)

def download_images(result: dict, prefix: str):
    for node_output in result["outputs"].values():
        for i, img in enumerate(node_output.get("images", [])):
            query = urllib.parse.urlencode(
                {"filename": img["filename"], "subfolder": img["subfolder"], "type": img["type"]}
            )
            with urllib.request.urlopen(f"{SERVER}/view?{query}") as r, open(f"{prefix}_{i}.png", "wb") as f:
                f.write(r.read())

workflow = json.load(open("workflow_api.json", encoding="utf-8"))

subjects = ["a red bicycle", "a vintage camera", "a cup of bubble tea"]
for n, subject in enumerate(subjects):
    workflow["6"]["inputs"]["text"] = f"product photo of {subject}, white background, studio lighting"
    workflow["3"]["inputs"]["seed"] = random.randint(0, 2**32 - 1)
    pid = queue(workflow)
    print("Enviado", subject, pid)
    download_images(wait_for(pid), f"product_{n}")
    print("Concluído", subject)

Substitua "6" e "3" pelas IDs dos nós correspondentes no seu fluxo de trabalho.

Envie imagens de entrada

Quando a geração de imagem a partir de imagem ou o ControlNet exigir uma imagem de entrada, faça o upload primeiro:

curl -X POST http://127.0.0.1:8188/upload/image -F "image=@./input.jpg"

A resposta informa o nome do arquivo. Preencha esse nome no campo image do nó Load Image.

Progresso em tempo real: WebSocket

Conecte-se a ws://127.0.0.1:8188/ws?clientId=custom-ID (envie o mesmo client_id no JSON ao iniciar a tarefa) para receber em tempo real os nós em execução, a porcentagem de progresso e a notificação de conclusão. Isso é útil para criar uma interface com barra de progresso.

Outros endpoints comuns

EndpointUso
GET /queueFila atual
POST /interruptInterromper a execução atual
GET /historyHistórico
GET /object_infoDefinições de todos os nós (entradas, saídas e opções)
GET /system_statsInformações do sistema e da placa de vídeo

Cuidados na implantação

  • A API do ComfyUI não tem mecanismo de autenticação. Não a exponha diretamente à internet. Faça chamadas a partir do seu próprio backend e implemente nele autenticação e limites de uso.
  • Para fazer chamadas de outros computadores, inicie o ComfyUI com --listen e restrinja as origens pelo firewall.
  • Ao gerar imagens em lote por muito tempo, lembre-se de limpar a pasta output regularmente.

Você também pode integrar o ComfyUI ao n8n: use o nó HTTP Request para enviar o fluxo de trabalho e, em seguida, Wait e um loop para consultar o resultado. Veja como usar o n8n no tutorial do n8n.

Atualizado 12 de outubro de 2026