2026-04-18
教程
0

目录

ComfyUI API 调用完整教程
一、准备工作
1.1 环境要求
1.2 安装 Python 依赖
1.3 启动 ComfyUI 服务(示例)
二、导出 API 格式的工作流
操作步骤:
三、编写 Python 调用脚本
3.1 如何动态修改提示词?
3.2 修改其他参数
四、运行与验证
4.1 运行脚本
4.2 预期输出
4.3 验证服务是否正常
五、常见问题与解决
六、进阶:批量生成与集成
6.1 批量生成不同提示词
6.2 集成到 Web 服务
七、总结

ComfyUI API 调用完整教程

本教程将指导你如何通过 Python 调用 ComfyUI 的 API 接口,实现自动化图像生成。你只需准备一个导出的 API 格式工作流文件,即可通过脚本提交任务、获取结果并保存图片。


一、准备工作

1.1 环境要求

  • Python 3.8+
  • 已部署并运行 ComfyUI 服务(需要开启 --listen 参数)
  • 确保 ComfyUI 服务所在服务器的防火墙已放行指定端口(例如 32794

1.2 安装 Python 依赖

只需要 requests 库:

bash
pip install requests

1.3 启动 ComfyUI 服务(示例)

在服务器上执行(IP 和端口根据实际情况修改):

bash
cd /path/to/ComfyUI python main.py --listen 0.0.0.0 --port 32794

注意--listen 0.0.0.0 允许外部访问,--port 指定端口号。


二、导出 API 格式的工作流

ComfyUI 默认保存的工作流包含界面布局信息,不适合 API 调用。你需要导出纯 API 格式的 JSON 文件。

操作步骤:

  1. 在 ComfyUI 界面中加载你设计好的工作流。
  2. 点击右上角 齿轮图标(Settings),勾选 "Enable Dev mode Options"
  3. 关闭设置面板,此时主菜单会出现 "Save (API Format)" 按钮。
  4. 点击该按钮,将工作流保存为 .json 文件(例如 workflow_api.json)。

注意:不要使用普通的 “Save” 按钮,否则后续调用会失败。


三、编写 Python 调用脚本

下面提供一个通用的脚本模板,只需修改 SERVER_URLWORKFLOW_FILE 即可。

python
import json import time import random import requests from urllib.parse import urljoin # ========== 配置 ========== SERVER_URL = "http://<YOUR_SERVER_IP>:8180" # 替换为你的 ComfyUI 服务地址 WORKFLOW_FILE = "workflow_api.json" # 你导出的 API 工作流文件 def queue_prompt(workflow): """提交工作流到队列,返回 prompt_id""" url = urljoin(SERVER_URL, "/prompt") payload = {"prompt": workflow} resp = requests.post(url, json=payload) resp.raise_for_status() return resp.json()["prompt_id"] def get_history(prompt_id, max_wait=60): """轮询获取生成结果,超时返回 None""" url = urljoin(SERVER_URL, f"/history/{prompt_id}") start = time.time() while time.time() - start < max_wait: resp = requests.get(url) if resp.status_code == 200: data = resp.json() if prompt_id in data: return data[prompt_id] time.sleep(1) return None def save_images(history, output_prefix="output"): """从 history 中提取图片并保存到本地""" outputs = history.get("outputs", {}) saved = [] for node_id, node_out in outputs.items(): images = node_out.get("images", []) for img in images: filename = img["filename"] img_url = urljoin(SERVER_URL, f"/view?filename={filename}") img_data = requests.get(img_url).content local_name = f"{output_prefix}_{filename}" with open(local_name, "wb") as f: f.write(img_data) print(f"已保存: {local_name}") saved.append(local_name) return saved def main(): # 1. 加载工作流 with open(WORKFLOW_FILE, "r", encoding="utf-8") as f: workflow = json.load(f) # 2. (可选)修改工作流参数,例如随机种子、提示词等 # 假设 KSampler 节点的 ID 为 "3"(具体 ID 需查看你的 JSON) if "3" in workflow and "inputs" in workflow["3"]: workflow["3"]["inputs"]["seed"] = random.randint(1, 10**9) print(f"设置随机种子: {workflow['3']['inputs']['seed']}") # 3. 提交任务 print("正在提交任务...") prompt_id = queue_prompt(workflow) print(f"任务 ID: {prompt_id}") # 4. 等待结果 print("等待生成完成...") history = get_history(prompt_id) if not history: print("超时未获取到结果") return # 5. 保存图片 saved = save_images(history) print(f"完成,共保存 {len(saved)} 张图片") if __name__ == "__main__": main()

3.1 如何动态修改提示词?

如果你希望每次运行都输入不同的提示词,可以找到工作流中的 CLIPTextEncode 节点(通常为 class_type: "CLIPTextEncode"),修改其 text 字段。示例:

python
# 假设提示词节点 ID 为 "6" user_prompt = input("请输入提示词: ") workflow["6"]["inputs"]["text"] = user_prompt

更通用的方法是遍历所有节点,根据 class_type 自动识别:

python
def set_prompt(workflow, positive_text, negative_text=None): for node_id, node in workflow.items(): if node.get("class_type") == "CLIPTextEncode": title = node.get("_meta", {}).get("title", "").lower() if negative_text and ("negative" in title or "neg" in title): node["inputs"]["text"] = negative_text else: node["inputs"]["text"] = positive_text

3.2 修改其他参数

  • 随机种子:找到 KSampler 节点,修改 seed 字段。
  • 采样步数:修改 steps 字段。
  • 图片尺寸:找到 EmptyLatentImage 或类似节点,修改 widthheight

四、运行与验证

4.1 运行脚本

bash
python call_comfyui.py

4.2 预期输出

  • 控制台打印任务 ID、种子等信息。
  • 等待若干秒后,生成 output_*.png 文件保存在当前目录。

4.3 验证服务是否正常

如果遇到连接错误,可以在浏览器访问 http://<YOUR_SERVER_IP>:32794,确认 ComfyUI 界面可打开。


五、常见问题与解决

错误现象可能原因解决方案
ConnectionError服务器 IP/端口错误,或防火墙未放行ping <IP> 测试连通性;检查云安全组是否开放对应端口
KeyError: 'prompt_id'工作流不是 API 格式重新按第二章导出 API 格式 JSON
get_history 超时生成时间过长或服务端出错增加 max_wait 参数;查看 ComfyUI 服务端日志
403 ForbiddenComfyUI 未监听 0.0.0.0启动时添加 --listen 0.0.0.0 参数
图片未生成模型文件缺失或路径错误检查 ComfyUI 控制台错误信息,确认模型文件已正确放置

六、进阶:批量生成与集成

6.1 批量生成不同提示词

准备一个 prompts.txt 文件,每行一个提示词,然后循环调用:

python
with open("prompts.txt", "r", encoding="utf-8") as f: prompts = [line.strip() for line in f if line.strip()] for idx, p in enumerate(prompts): workflow["6"]["inputs"]["text"] = p workflow["3"]["inputs"]["seed"] = random.randint(1, 10**9) prompt_id = queue_prompt(workflow) history = get_history(prompt_id) if history: save_images(history, output_prefix=f"batch_{idx}")

6.2 集成到 Web 服务

可以将上述脚本封装为 Flask API,接收提示词参数,返回生成的图片 URL。示例:

python
from flask import Flask, request, send_file import io app = Flask(__name__) @app.route('/generate', methods=['POST']) def generate(): prompt = request.json.get('prompt') # 调用 ComfyUI API 生成图片 # ... return send_file(io.BytesIO(img_data), mimetype='image/png')

七、总结

通过本教程,你已经学会了:

  • 导出 ComfyUI 的 API 格式工作流
  • 使用 Python 脚本提交任务、获取结果并保存图片
  • 动态修改提示词、随机种子等参数
  • 处理常见问题并进行批量生成

这套自动化流程可以无缝集成到你的电商、设计或内容生产系统中,实现从文本到图像的自动化生成。如果在实际操作中遇到问题,请检查 ComfyUI 服务端日志,并根据错误提示调整脚本或工作流。

本文作者:苏皓明

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!