为什么要打通 Dify 和 ComfyUI(也有人认为没有必要)?初步想法是要把控制和执行分开,脑袋是脑袋,四肢是四肢,专业的工具做专业的事情。打通有什么优势呢?最关键的是一个 Dify 流程可以调用很多的 ComfyUI 流程,每个 ComfyUI 流程仅仅完成一部分的创作工作。Dify 可以做到精准的 Prompt 控制,而 ComfyUI 可根据传入参数精准绘画。通过文生文、文生图、图生图、图生视频、视频合成、自动配音乐。这样就可以实现一键漫画、一键表情包、一键图文小说、甚至一键 Everything,从文本到视频生成一气呵成。总之,创作只有想不到的,没有做不到的。特别是硅基流动 BizyAir 云节点的实现,ComfyUI 可混合节点使用,费卡的放云端,其它的放本地。现在 BizyAir Ksampler 已经进入内测阶段,支持 LoRA、ControlNet、IPAdapter,使用方式与原生 ComfyUI 节点一致。
流程的永恒之道:通过 Dify 可以调动很多 ComfyUI 工作流,以及第三方的图像、视频、音频模型的 API 接口。真正实现了控制与执行的分离,协同完成内容创作。打通 Dify 和 ComfyUI 技术实现思路:(1)Dify 工作流 HTTP 请求节点;(2)Flask 封装 REST 接口;(3)REST 接口中调用导出的 ComfyUI 工作流 json 文件。其它要注意的是 Dify 给 ComfyUI 的 prompt 参数传递,以及 ComfyUI 生成的图像返回给 Dify。本文通过一个极简的例子,对打通 Dify 和 ComfyUI 绘画进行了尝试。
一.HTTP 请求节点
由于仅仅作为例子演示,所以只使用了开始、HTTP 请求和直接回复 3 个节点。最终生成效果,如下所示:
二.Flask 封装 REST 接口
需要注意的是通过 send_from_directory()返回图片文件:
@app.route('/dify_comfyui', methods=['GET']) def dify_comfyui(): # 获取提示词参数 prompt = request.args.get('prompt') # 设置工作目录和项目相关的路径 seed = 15465856 generate_clip(prompt, seed, 1) # 假设生成的图片文件名为 '1_15465856_YYYYMMDDHHMMSS.png' image_filename = f"1_{seed}_{datetime.now().strftime('%Y%m%d%H%M%S')}.png" # 返回图片文件 return send_from_directory(app.static_folder, image_filename)
- 1
三.调用 ComfyUI 工作流
启用开发模式选项,才能显示保存(API 格式):
将工作流保存为 workflow_api.json
文件:
要把 HTTP
请求中的 prompt
参数传进来,替换 workflow_api.json
中的参数:
在中 HTTP
请求 /dify_comfyui?prompt=bord
中,调用 generate_clip(prompt, seed, 1)
方法,在该方法中通过 ws
和 ComfyUI
通信: