Dify调用本地Stable Diffusion API的工作流搭建指南
核心架构
详细步骤
-
准备Stable Diffusion API服务
- 确保本地已部署SD WebUI(如Automatic1111)
- 启动API服务:
python launch.py --api --port 7860
- 验证API可用性:
curl -X POST http://localhost:7860/sdapi/v1/txt2img -H 'Content-Type: application/json' -d '{"prompt":"test"}'
-
在Dify中创建应用
- 新建工作流类型应用
- 添加「HTTP请求」节点
- 配置节点参数:
{"url": "http://localhost:7860/sdapi/v1/txt2img","method": "POST","headers": {"Content-Type": "application/json"},"body": {"prompt": "{{input}}","steps": 20,"width": 512,"height": 512} }
-
数据处理配置
- 添加「变量提取」节点处理API响应:
import base64def process(data):image_b64 = data['images'][0]return {"image": f"data:image/png;base64,{image_b64}","info": data['info']}
- 添加「变量提取」节点处理API响应:
-
输出节点配置
- 设置返回数据结构:
{"image_url": "{{image}}","generation_info": "{{info}}" }
- 设置返回数据结构:
完整工作流示例
# Dify工作流伪代码
def main(input_text):# 构造SD API请求payload = {"prompt": input_text,"negative_prompt": "ugly, blurry","cfg_scale": 7}# 调用本地APIresponse = requests.post("http://localhost:7860/sdapi/v1/txt2img",json=payload)# 解析响应result = response.json()image_data = result['images'][0]# 返回结果return {"image": f"data:image/png;base64,{image_data}","parameters": result['parameters']}
关键注意事项
-
网络配置
- 确保Dify服务与SD API在同一网络域
- 若跨域访问需配置CORS:
export COMMANDLINE_ARGS="--api --cors-allow-origins=*"
-
安全加固
- 添加请求频率限制(建议使用Dify的速率限制中间件)
- 在SD API端设置身份验证:
# webui.py修改 app.add_middleware(AuthMiddleware, token="YOUR_SECRET")
-
性能优化
- 启用SD的
--xformers
加速 - 设置Dify超时参数:
# dify配置 request_timeout: 300 # 单位秒
- 启用SD的
调试技巧
-
使用Postman测试API端点:
POST http://localhost:7860/sdapi/v1/options Body: {"sd_model_checkpoint": "v2-1_768-ema-pruned.safetensors"}
-
查看SD日志定位问题:
tail -f ~/stable-diffusion-webui/logs/api.log
-
Dify调试模式启用:
- 工作流编辑页开启「调试输出」
- 查看每个节点的输入/输出数据
提示:首次运行时建议使用简单提示词(如"a red apple")测试基础功能,逐步增加复杂度。当处理1024×10241024\times10241024×1024以上分辨率时,需调整显存设置:
--medvram-sdxl