打通 Dify 和 ComfyUI 的绘画尝试

为什么要打通 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) 方法,在该方法中通过 wsComfyUI 通信: