stable diffusion comfyui的api使用教程

news2024/11/20 6:26:41

一、为什么要使用comfyui的api?对比webui的api,它有什么好处?

1、自带队列
2、支持websocket
3、无需关心插件是否有开放api接口,只要插件在浏览器中可以正常使用,接口就一定可以使用
4、开发人员只需关心绘图流程的搭建
5、切换模型、进度查询soeasy
6、轻松实现图片生成时的渐变效果
7、支持中断绘图任务
8、无需繁琐的base64图片转换

其实我们之前一直都是用web-ui的api,最近web-ui被我们给废弃掉了,主要是因为comfyui基本上解决了webui做开发所有的弊端,首先列队的问题不用去管,它自己有列队,插件这块是最方便的,用上comfyui以后就不要去管插件是怎么调用的,只要你在工作流里面用了什么插件,保存为api之后,他直接下发后台就会自动去运行,也不用去管插件具体怎么调用。如果是webui,有些比较良心的插件,直接把接口写好,然后暴露出来, 如果没写的话,你用起来就会非常的麻烦,还得去研究它是怎么去调用的。所以 ,小伙伴们,别再执着用webui的api了,那个确实反人类,假如做开发的话问题会很多,比较烦人,就像获取任务进度,还有这个线程锁,切换模型这块都非常繁琐。我为了研究那东西 ,看代码看得头都大了 ,整整研究了一个月才把代码改好。

二、接口详解

本文主要介绍 stable diffusion API 调用,准确来说是对 stable diffusion comfyui 的 API 调用。需要apifox接口文件的可以查看:
https://gitee.com/BTYY/wailikeji-chatgpt/blob/master/comfyui-api.md

1、绘图接口:POST /prompt

注意:该接口只做绘图任务的下发,然后返回任务ID信息。并不会直接返回最终的结果图!

与webui的api不同的是,comfyui的api并没有单独区分文生图、图生图的接口,而是所有的绘图任务的下发全部都使用POST /prompt。那具体是文生图、图生图、又或者是换脸、倒推关键词等,取决于你的参数!

需要上传的参数只有两个

请求参数
名称类型必选说明
client_idstring任务ID,由客户端生成,用于标记任务是谁发起的
promptjson任务参数
返回参数
名称类型说明
prompt_idstring任务ID
numberint当前任务序号,可用于后续获取需要等待任务数的计算
node_errorsjson错误信息

返回示例

{
    "prompt_id": "bd2cfa2c-de87-4258-89cc-d8791bc13a61",
    "number": 501,
    "node_errors": {}
}
使用说明

client_id:任务ID,由客户端生成,用于标记任务是谁发起的,相当于告诉comfyui,该绘图任务是由用户A发起的,后续comfyui就会通过websocket将属于用户A的绘图信息推送给你

prompt:prompt所传的是一个json数据,它是由comfyui浏览器通过保存api生成的json数据,如下图
在这里插入图片描述

至于正反、提示词、模型、vae、图片尺寸、批次、提示词相关性、随机种子、采样器、降噪值等参数,只需替换json中对应的参数为用户上传的参数即可
在这里插入图片描述
比如用户上传的图片尺寸是768*512,那你只需将json数据中的width改为768、height改为512即可,其他的参数也是同样的道理!

2、websocket:/ws?client_id=XXXXXXXX

client_id后面的参数即为上面/prompt接口中上传给comfyui的client_id,假如没有上传client_id,那comfyui就不知道连上该websocket的用户是谁,也就无法进行信息推送!comfyui拿到client_id后,即可知道当前是哪个用户,后续就会通过websocket将属于该用户的绘图信息精准推送给他

注意:websocket只需做监听处理,无需通过websocket向comfyui发送任何消息

websocket数据解析:
主要有两种数据格式:
1、文本数据,文本数据主要通知以下几个绘图信息:
通知任务变更、当前执行的步骤、进度
2、二进制数据,即图片预览信息

(一)文本数据详解:
(1)任务变更通知:
{
    "type":"status",
    "data":{
        "status":{
            "exec_info":{
                "queue_remaining":7
            }
        }
    }
}

当你收到type为status信息时,这是comfyui在告诉你,当前任务数发生变更,queue_remaining是指当前还有多少个任务需要处理。

注意,此处的queue_remaining并不是告诉你在你的任务之前还有多少个任务需要处理!而是总的!
所以,如果你也想像我一样(见下图),当还没轮到你的绘图任务时,显示还需等待多少个任务,你就需要借助comfyui的另一个接口:GET /queue:获取详细任务队列信息,正在运行的以及挂起的。该接口会返回挂起的任务信息,其中有prompt_id信息和number信息,你可以根据这number信息获取到当前任务排在第几位。具体如何调用,这里就不进行展开!

在这里插入图片描述

(2)当前任务开始执行:
{
    "type":"execution_start",
    "data":{
        "prompt_id":"3935f7c3-ec38-4d94-843f-86fe86c6d384"
    }
}

当你收到type为execution_start信息时,这是comfyui在告诉你,你的任务id,prompt_id为“3935f7c3-ec38-4d94-843f-86fe86c6d384”的任务当前正在被执行

(3)当前任务执行的步骤信息:
{
    "type":"executing",
    "data":{
        "node":"5",
        "prompt_id":"3935f7c3-ec38-4d94-843f-86fe86c6d384"
    }
}

当你收到type为executing信息时,这是comfyui在告诉你,你的任务id,prompt_id为“3935f7c3-ec38-4d94-843f-86fe86c6d384”的任务当前正在执行节点5的步骤,此处你可以解析到前端,显示当前执行的步骤名称,如下图所示
在这里插入图片描述

(4)当前进度信息:
{
    "type":"progress",
    "data":{
        "value":1,
        "max":10
    }
}

当你收到type为progress信息时,这是comfyui在告诉你,当前步骤执行的进度,value是当前的步数,max是总的步数,如下图所示
在这里插入图片描述

(5)绘图结束:
{
    "type":"executing",
    "data":{
        "node":null,
        "prompt_id":"37099310-a790-44f4-8d13-4f4d5f69c891"
    }
}

绘图结束时,type类型仍然是executing,和前面的(3)是一样的,区别主要在于node为null,也就是当type=executing,且node=null的时候,说明流程已经跑完,此时需要通过接口GET /history/{prompt_id}获取输出的图片信息。底下是通过history获取到的图片信息:

{
    "37099310-a790-44f4-8d13-4f4d5f69c891": {
    	略。。。。。。。。。。
        "outputs": {
            "18": {
                "images": [
                    {
                        "filename": "ComfyUI_temp_slqio_00001_.png",
                        "subfolder": "",
                        "type": "temp"
                    },
                    {
                        "filename": "ComfyUI_temp_slqio_00002_.png",
                        "subfolder": "",
                        "type": "temp"
                    },
                    {
                        "filename": "ComfyUI_temp_slqio_00003_.png",
                        "subfolder": "",
                        "type": "temp"
                    },
                    {
                        "filename": "ComfyUI_temp_slqio_00004_.png",
                        "subfolder": "",
                        "type": "temp"
                    }
                ]
            },
            "22": {
                "images": [
                    {
                        "filename": "ComfyUI_temp_rfvdr_00001_.png",
                        "subfolder": "",
                        "type": "temp"
                    },
                    {
                        "filename": "ComfyUI_temp_rfvdr_00002_.png",
                        "subfolder": "",
                        "type": "temp"
                    },
                    {
                        "filename": "ComfyUI_temp_rfvdr_00003_.png",
                        "subfolder": "",
                        "type": "temp"
                    },
                    {
                        "filename": "ComfyUI_temp_rfvdr_00004_.png",
                        "subfolder": "",
                        "type": "temp"
                    }
                ]
            },
            "24": {
                "images": [
                    {
                        "filename": "ComfyUI_00702_.png",
                        "subfolder": "",
                        "type": "output"
                    },
                    {
                        "filename": "ComfyUI_00703_.png",
                        "subfolder": "",
                        "type": "output"
                    },
                    {
                        "filename": "ComfyUI_00704_.png",
                        "subfolder": "",
                        "type": "output"
                    },
                    {
                        "filename": "ComfyUI_00705_.png",
                        "subfolder": "",
                        "type": "output"
                    }
                ]
            }
        }
    }
}

outputs中的内容就是最终生成的图片信息,我们通过将图片信息进行拼接,即可获取到图片的url访问地址,
例如:ComfyUI_00702_.png这张图片,其拼接后的访问地址就是:
http://127.0.0.1:8188/view?filename=ComfyUI_00702_.png&type=output

该地址实际是使用了comfyui的view接口

3、图片的在线预览接口:GET /view

图片的在线预览接口(上传图像,生图图像,蒙蔽图像,均通过该接口预览)

请求参数

名称位置类型必选说明
filenamequerystring图片名称
typequerystring图片存放位置的文件夹(input为长传图片,output为生成的图片)
subfolderquerystring子文件夹(没有可不填)
previewquerystring预览
channelquerystring

在前面的websocket中,我们通过history获取最终的图片信息,我们将图片信息进行拼接,即可获取到图片的url访问地址,就是通过该接口获取到图片

(二)二进制数据详解:

二进制数据就是在绘图过程中,如果在采样器中有开启图片预览,则comfyui会以二进制数据的方式推送给你,如果没有开启,则没有,如下:
请添加图片描述

总结

至此,stable diffusion comfyui的api的整个调用逻辑已经走完,无论是文生图、图生图、换脸、倒推关键词等,都是走相同的流程。你们在实际开发过程中也可以参考我的项目来实现,需要我的comfyui的workflow.json工作流的可以联系我获取v:ai_009966

源码地址:
https://ext.dcloud.net.cn/plugin?id=12603
项目体验地址:
https://pcai.wailikeji.com/

需要整个项目源码的联系我v:ai_009966

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1210285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode刷题笔记】二叉树(二)

257. 二叉树的所有路径 解题思路: 1. DFS 前序遍历 ,每次递归将 当前节点的拼接结果 传递到 下一层 中,如果当前节点是 叶子节点 ,就将 当前拼接结果 收集答案并返回。 注意:路径path结果可以使用 String 来拼接,这样可以避免回溯处理。

Git 本地库基本教程

目录 一. Git 概述 1.1 何为版本控制 1.2 为什么需要版本控制 1.3 版本控制工具 1.3.1 集中式版本控制工具 1.3.2 分布式版本控制系统 1.4 Git简介 1.5 Git工作机制 1.6 Git 和代码托管中心 1.6.1 局域网 1.6.2 互联网 二. Git 安装 三. Git…

SystemC 学习之与 System Verilog 的混合仿真(九)

1、下载 uvmc (uvm connect) https://download.csdn.net/download/yp18792574062/88529417?spm1001.2014.3001.5501 2、配置相关环境变量 export UVM_HOME${VCS_HOME}/etc/uvm export UVMC_HOME/home/yangpan/yangpan/uvmc/uvmc-2.3.1 然后执行 source ~/.zshrc 更新 3、…

让公有云服务“宁安如梦”的“定心丸”在哪里?

电视剧《宁安如梦》正在热播中,该剧讲述了主人公在经历人生的重大风险后,重获新生再活一遍,以确定性的方式抵御和化解原有的重大风险。然而,在现实的生活中,却没有这样的重来机会。 2023年11月13日,Gartne…

二、服务拆分及远程调用

目录 一、注意事项: 1.单一职责: 2.数据独立: 3.面向服务: 二、服务拆分例子: 三、远程调用例子: 微服务调用方式: 四、提供者与消费者 服务调用关系: 一、注意事项: 1.单一职责: 不同…

某建筑网页js逆向分析过程(有坑)

某建筑网页: 网站: import base64 # 解码 website base64.b64decode(aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55.encode(utf-8)) print(website)JSON.parse() ​ 当你有一个包含JSON字符串的变量时,你可以使用JSON.parse()将…

No209.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

19 - 如何用协程来优化多线程业务?

近几年,国内很多互联网公司开始使用或转型 Go 语言,其中一个很重要的原因就是 Go 语言优越的性能表现,而这个优势与 Go 实现的轻量级线程 Goroutines(协程 Coroutine)不无关系。那么 Go 协程的实现与 Java 线程的实现有…

高效免费办公神器——ONLYOFFICE入手指南

前言: 作为开发者,有时候经常为寻找适合的开发工具而苦恼;或者因为高昂的费用而犹豫不决;亦或喜欢的办公产品只能在单一的平台上使用,与其把时间花在复杂的工具使用上,不如节省出时间投入思考和技术的提升。…

【洛谷算法题】P5711-闰年判断【入门2分支结构】

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5711-闰年判断【入门2分支结构】🌏题目描述🌏输入格式&a…

js写轮播图,逐步完善

目录 1、自动轮播 2、点击更换 3、自动播放加左右箭头点击切换 4、完整版轮播图 1、自动轮播 用定时器setInterval()来写&#xff0c;可以实现自动播放 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><met…

一例plugx样本的分析(AcroRd32cWP)

这是一例plugx的样本&#xff0c;使用了一个合法签名的程序 &#xff0c;使用侧加载的方式加载一个恶意的dll&#xff0c;解密一个dat文件来&#xff0c;在内存中执行一个反射型dll来完成恶意功能。 这个病毒会使用摆渡的方式的来窃取内网的文档数据&#xff0c;具有严重的失泄…

Git新建分支

修改代码之Git策略思考&#xff1a; 有三种办法&#xff1a; 需要在主分支上新建一个分支&#xff0c;不合并新建版本。其实也是先新建一个分支&#xff0c;然后合并到主分支&#xff0c;再删除分支。直接新建远程仓库。 考虑&#xff0c;3&#xff09;最浪费&#xff0c;其…

QGIS之十七按范围选择要素

效果 步骤 1、准备数据 &#xff08;1&#xff09;、范围面 &#xff08;2&#xff09;、point 2、Qgis中裁剪 工具箱中搜索“裁剪” 注意编码问题 3、裁剪结果

Skybox天空盒子的更换教程_unity基础开发教程

Skybox天空盒子的更换 Skybox的下载与导入更换SkyboxSkybox属性自定义 Skybox的下载与导入 打开资源商店 搜索FREE Skybox 这里是我使用的是这一款资源&#xff0c;点击添加至我的资源 打开包管理器Package Manager Packages选择My Assets 搜索Sky 选择刚刚添加的天空盒子 点…

​TechSmith Camtasia 2024破解版功能介绍及使用教程

在现在的网络互联网时代&#xff0c;越来越多的人走上了自媒体的道路。有些自媒体人会自己在网络上录制精彩视频&#xff0c;也有一些人会将精彩、热门的电影剪辑出来再加上自己给它的配音&#xff0c;做成大家喜欢看的电影剪辑片段。相信不管大家是自己平时有独特的爱好也好、…

滚雪球学Java(63):Java高级集合之TreeSet:什么是它,为什么使用它?

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【物联网】BDS/GNSS 全星座定位导航模块——ATGM332D-5N

随着科技的不断进步&#xff0c;导航系统已经成为我们日常生活中不可或缺的一部分。传统的导航系统往往只提供基本的地图和路线规划&#xff0c;对于一些特殊需求或个性化定位并不够满足。全星座定位导航模块的出现&#xff0c;为我们带来了全新的导航体验。通过结合星座学说和…

上海亚商投顾:沪指震荡反弹 鸿蒙、算力概念股集体爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡&#xff0c;创业板指冲高回落&#xff0c;市场热点继续轮动。华为鸿蒙概念股继续活跃&#…

Leetcode刷题详解—— 图像渲染

1. 题目链接&#xff1a;733. 图像渲染 2. 题目描述&#xff1a; 有一幅以 m x n 的二维整数数组表示的图画 image &#xff0c;其中 image[i][j] 表示该图画的像素值大小。 你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。…