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 base64 def 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
}
# 调用本地API
response = 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