chatgpt调用api API调用comfyui工作流,做一个自己的app,chatgpt给我写的前端,一键创建自己的卡通形象,附源码
最近玩这个文生图,图生视频有点上瘾,还出了一个【】(目前1.2w阅读,对我算是爆文了,^_^),这几天干了好多工作流,挺好玩的,有视频转绘的,有一键制作动图的,有一张图定制自己的卡通形象的,说实话,使用工作流还是需要一丢丢基础的,有些bug你还要能看懂才能解决,于是乎,我就想怎样让大家使用一些炫酷的工作流呢,哈哈,那就是使用工作流搞一个应用呗,说干就干,哈哈 ~
工具介绍
首先 你是少不了的,这个是工作流的后端支持,用这个去调试工作流和生成API可调用文件
前端我们就用很流行的吧,什么你一时半会没有学的计划,没事,笔者也没系统学过,我干脆直接让写前端了,哈哈~
首先你需要打开的开发者模式,就是这个地方
开启后会主页设置中会多出一个【保存(API格式)】,让后将你要做应用的工作流保存(API格式)
这里我们做一个【一张图生成人偶的服务】,使用的是 rui的《Cute you!》By Rui,欢迎大家去b站搜,我已关注哈哈,工作流如下
前端代码
虽然我会(O(∩_∩)O哈哈~),但是为了简便我让给我写了
帮我使用gradio写一个 页面,功能是:上传一张照片,然后提交给后台,
后台保存图片到固定目录,并且图片名字不能能重复,
并返回另一张照片的链接,前端将两张照片同事显示出来
代码如下
import os
import gradio as gr
from datetime import datetime
from PIL import Image
import requests
from io import BytesIO
# 设置图片保存目录
UPLOAD_DIRECTORY = "uploaded_images"
if not os.path.exists(UPLOAD_DIRECTORY):
os.makedirs(UPLOAD_DIRECTORY)
# 用于生成唯一图片文件名的函数
def generate_unique_filename(extension):
timestamp = datetime.now().strftime("%Y%m%d%H%M%S%f")
return f"{timestamp}.{extension}"
# 处理图片上传的函数
def process_image(image):
# 保存上传的图片
extension = image.name.split('.')[-1]
unique_filename = generate_unique_filename(extension)
image_path = os.path.join(UPLOAD_DIRECTORY, unique_filename)
with open(image_path, "wb") as image_file:
image_file.write(image.read())
# 返回另一张图片的链接(此处为示例,实际应用中应替换为真实图片链接)
response_image_url = "https://via.placeholder.com/150" # 示例图片链接
response = requests.get(response_image_url)
response_image = Image.open(BytesIO(response.content))
# 返回上传的图片和网络上的图片
return image_path, response_image
# 创建Gradio接口
iface = gr.Interface(
fn=process_image,
inputs=gr.inputs.Image(type="file"),
outputs=[
gr.outputs.Image(type="file", label="Uploaded Image"),
gr.outputs.Image(type="pil", label="Response Image")
],
live=False
)
# 运行应用
iface.launch()
基本就是,上传一张图片,然后保存,给工作流用,工作流处理后返回原图和生成的图,这个代码添加一下我们的方法就可以用了,界面如下
还是很不错的,哈哈~
API调用代码
1、读取工作流
import json
# 这个地方是你工作流的地址,服务器行写路径
prompt_f = r"人偶-api.json"
with open(prompt_f,"r",encoding="utf-8") as f:
prompt = json.loads(f.read())
2、设置上传图片
prompt["331"]["inputs"]["image"] = image_url
prompt["432"]["inputs"]["image"] = image_url
这给地方要注意,看看你的工作流的输入图片的节点是多少,我的是331和432
3、请求工作流
import requests
#comfyui地址
url = "http://127.0.0.1:8188/"
p = {"prompt":prompt}
respone = requests.post(url=url+"prompt",json=p)
respone
4、获取
prompt_id = respone.json()["prompt_id"]
prompt_id
这个地方获取是为了后边获取处理图片做准备,因为工作流执行需要时间,不用时时等待返回,排队处理就好了,后边使用去获取结果
5、获取结果
respone = requests.get(url=url+"history/"+prompt_id)
respone.json()
在执行历史中获取结果,展示,这个地方,做成服务的话,你可以循环探测这个接口直到有结果,没有结果他就一直为{},可以设置5s睡眠再访问
6、解析图片
image_name = respone.json()[prompt_id]['outputs']['456']["images"][0]["filename"]
image_url = url + 'view?filename='+image_name+"&subfolder=&type=output"
image_url
这个地方要注意,返回结果在 下的中,但是你要看看是哪个id下,我的是456
ok,到这 后端就ok了
组装程序
将这个后端处理代码,集成到中
# 处理图片上传的函数
def process_image(image):
# 保存上传的图片
# print(image)
# extension = image.split('.')[-1]
# unique_filename = generate_unique_filename(extension)
# image_path = os.path.join(UPLOAD_DIRECTORY, unique_filename)
# with open(image_path, "wb") as image_file:
# image_file.write(image.read())
prompt["331"]["inputs"]["image"] = image
prompt["432"]["inputs"]["image"] = image
url = "http://127.0.0.1:8188/"
p = {"prompt":prompt}
respone = requests.post(url=url+"prompt",json=p)
prompt_id = respone.json()["prompt_id"]
while True:
respone = requests.get(url=url+"history/"+prompt_id)
if respone.json() == {}:
time.sleep(5)
continue
image_name = respone.json()[prompt_id]['outputs']['456']["images"][0]["filename"]
response_image_url = url + 'view?filename='+image_name+"&subfolder=&type=output"
break
# 返回另一张图片的链接(此处为示例,实际应用中应替换为真实图片链接)
# response_image_url = "https://img2.baidu.com/it/u=1814561676,2470063876&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500" # 示例图片链接
response = requests.get(response_image_url)
response_image = Image.open(BytesIO(response.content))
# 返回上传的图片和网络上的图片
return image, response_image
测试
需要等待一会。。。。。。。。。
哈哈,还不错吧,赶紧试试吧
资料和完整源码我放网盘
需要的 私信回复 【】就可以获取
为了方便大家交流和解决bug,我建了一个群,需要可以加入
历史回顾: