基于Flask的ComfyUI API服务,用于远程图像生成和工作流管理。
- 支持配置ComfyUI服务地址
- 提供工作流提交接口
- 支持查询历史记录
- 支持查询系统状态
- 支持查看队列状态
- 支持测试连接
- 支持工作流管理
- 支持任务状态查询
- 支持历史记录查询
- 支持图片获取
- 安装依赖:
pip install -r requirements.txt
- 配置环境变量(创建.env文件):
COMFYUI_BASE_URL=http://localhost:8188
FLASK_DEBUG=True
FLASK_HOST=0.0.0.0
FLASK_PORT=5000
测试ComfyUI服务器连接状态。
GET /api/test_comfy
响应示例:
{
"status": "success",
"comfyui_url": "http://localhost:8188/system_stats",
"response": {
"system_stats": { ... }
}
}
GET /api/workflows
响应示例:
{
"workflows": ["sd_txt2img", "sd_img2img", "flux_test"]
}
支持两种格式的工作流更新请求:
适用于只需要更新单个文本节点的场景。
POST /api/workflow/<workflow_name>
请求体:
{
"prompt": "your text prompt",
"target_node": "node_id"
}
适用于需要同时更新多个不同节点的场景。
POST /api/workflow/<workflow_name>
请求体:
{
"node_id1": {
"inputs": {
"text": "your text for node 1"
}
},
"node_id2": {
"inputs": {
"text": "your text for node 2"
}
}
}
示例:同时更新提示词、标题和短语
{
"58": {
"inputs": {
"text": "A young man standing in front of a building..."
}
},
"126": {
"inputs": {
"text": "惊喜的购物狂欢"
}
},
"128": {
"inputs": {
"text": "意外的礼物, 购物的快乐"
}
}
}
响应示例:
{
"status": "success",
"prompt_id": "12345",
"client_id": "my-api-1234567890"
}
错误响应示例:
{
"error": "Target node 41 is not a text input node"
}
或
{
"error": "No suitable text input node found in workflow"
}
注意事项:
-
简单格式(推荐):
prompt
: 要传入的提示语文本target_node
: 可选,目标节点ID。如果指定,必须是工作流中存在的文本输入节点(支持 Text Multiline 或 CLIPTextEncode 类型)- 如果不指定 target_node,API 会自动查找工作流中第一个合适的文本输入节点
-
高级格式:
- 直接指定要更新的节点ID和其输入参数
- 需要了解工作流的具体结构
- 可以同时更新多个节点的多个参数
调试信息:
- API 会在服务器终端打印完整的工作流 JSON 和发送给 ComfyUI 的请求内容
- 格式化的日志包括:
- 最终的工作流 JSON(=== Final Workflow JSON ===)
- 发送给 ComfyUI 的完整请求(=== Request to ComfyUI ===)
GET /api/task_status/<prompt_id>
可能的响应状态:
- 等待中:
{
"status": "pending",
"message": "Task is waiting in queue",
"queue_position": 1
}
- 执行中:
{
"status": "running",
"message": "Task is currently running",
"execution_info": { ... }
}
- 已完成:
{
"status": "completed",
"message": "Image generation completed",
"images": [
{
"url": "http://localhost:8188/view?filename=xxx.png",
"filename": "xxx.png",
"subfolder": "",
"type": "temp"
}
],
"execution_time": 10.5,
"node_errors": {}
}
- 其他状态:
processing
: 处理中但未生成图片not_found
: 未找到任务unknown
: 状态未知error
: 发生错误
GET /api/history
GET /api/history/<prompt_id>
获取生成的图片信息:
GET /api/image/<prompt_id>
响应示例:
{
"status": "success",
"images": [
{
"url": "http://localhost:8188/view?filename=ComfyUI_00001_.png",
"filename": "ComfyUI_00001_.png",
"subfolder": "",
"type": "temp"
}
]
}
工作流JSON格式:
{
"1": {
"inputs": {
"text": "提示词"
}
},
"3": {
"inputs": {
"seed": 42,
"steps": 20,
"cfg": 7.5,
"sampler_name": "euler_ancestral",
"scheduler": "normal",
"denoise": 1.0
}
}
}
所有API错误响应格式:
{
"error": "错误描述",
"status_code": 400
}
- 工作流文件存放在
workflows
目录 - 支持动态参数更新
- 提供详细的错误信息和日志
- 支持异步任务状态查询
- 图片URL中的
type=temp
表示临时文件,会定期清理 - 建议定期查询任务状态直到完成
- 确保ComfyUI服务器地址配置正确
sequenceDiagram
participant Client as 客户端
participant API as API服务
participant ComfyUI as ComfyUI服务
Client->>API: 1. GET /api/workflows
API-->>Client: 返回可用工作流列表
Client->>API: 2. POST /api/workflow/{workflow_name}<br>{"prompt": "text", "target_node": "id"}
API->>API: 2.1 加载并更新工作流
API->>ComfyUI: 2.2 提交工作流
ComfyUI-->>API: 返回 prompt_id
API-->>Client: 返回 prompt_id 和状态
Client->>API: 3. GET /api/task_status/{prompt_id}
API->>ComfyUI: 查询任务状态
ComfyUI-->>API: 返回状态信息
API-->>Client: 返回处理状态和结果
stateDiagram-v2
[*] --> 提交工作流
提交工作流 --> 等待中: 进入队列
等待中 --> 执行中: 开始处理
执行中 --> 已完成: 生成成功
执行中 --> 错误: 生成失败
已完成 --> [*]
错误 --> [*]
state 等待中 {
[*] --> 队列中
队列中 --> 准备执行
}
state 执行中 {
[*] --> 加载模型
加载模型 --> 生成图像
生成图像 --> 保存结果
}
-
准备阶段
flowchart LR A[准备工作流文件] --> B[上传到 workflows 目录] B --> C[确认文本输入节点 ID]
-
调用阶段
flowchart LR A[获取工作流列表] --> B[提交生成请求] B --> C[轮询任务状态] C --> D{状态检查} D -->|完成| E[获取结果] D -->|进行中| C D -->|错误| F[错误处理]
flowchart TD
A[API 调用] --> B{检查响应}
B -->|400| C[请求格式错误]
B -->|404| D[工作流不存在]
B -->|500| E[服务器错误]
B -->|200| F[调用成功]
C --> G[检查请求格式]
D --> H[检查工作流文件]
E --> I[查看服务日志]
G --> J[重新提交]
H --> J
I --> J
python app.py