-
-
Save w-e-w/0f37c04c18e14e4ee1482df5c4eb9f53 to your computer and use it in GitHub Desktop.
from datetime import datetime | |
import urllib.request | |
import base64 | |
import json | |
import time | |
import os | |
webui_server_url = 'http://127.0.0.1:7860' | |
out_dir = 'api_out' | |
out_dir_t2i = os.path.join(out_dir, 'txt2img') | |
out_dir_i2i = os.path.join(out_dir, 'img2img') | |
os.makedirs(out_dir_t2i, exist_ok=True) | |
os.makedirs(out_dir_i2i, exist_ok=True) | |
def timestamp(): | |
return datetime.fromtimestamp(time.time()).strftime("%Y%m%d-%H%M%S") | |
def encode_file_to_base64(path): | |
with open(path, 'rb') as file: | |
return base64.b64encode(file.read()).decode('utf-8') | |
def decode_and_save_base64(base64_str, save_path): | |
with open(save_path, "wb") as file: | |
file.write(base64.b64decode(base64_str)) | |
def call_api(api_endpoint, **payload): | |
data = json.dumps(payload).encode('utf-8') | |
request = urllib.request.Request( | |
f'{webui_server_url}/{api_endpoint}', | |
headers={'Content-Type': 'application/json'}, | |
data=data, | |
) | |
response = urllib.request.urlopen(request) | |
return json.loads(response.read().decode('utf-8')) | |
def call_txt2img_api(**payload): | |
response = call_api('sdapi/v1/txt2img', **payload) | |
for index, image in enumerate(response.get('images')): | |
save_path = os.path.join(out_dir_t2i, f'txt2img-{timestamp()}-{index}.png') | |
decode_and_save_base64(image, save_path) | |
def call_img2img_api(**payload): | |
response = call_api('sdapi/v1/img2img', **payload) | |
for index, image in enumerate(response.get('images')): | |
save_path = os.path.join(out_dir_i2i, f'img2img-{timestamp()}-{index}.png') | |
decode_and_save_base64(image, save_path) | |
if __name__ == '__main__': | |
payload = { | |
"prompt": "masterpiece, (best quality:1.1), 1girl <lora:lora_model:1>", # extra networks also in prompts | |
"negative_prompt": "", | |
"seed": 1, | |
"steps": 20, | |
"width": 512, | |
"height": 512, | |
"cfg_scale": 7, | |
"sampler_name": "DPM++ 2M", | |
"n_iter": 1, | |
"batch_size": 1, | |
# example args for x/y/z plot | |
# "script_name": "x/y/z plot", | |
# "script_args": [ | |
# 1, | |
# "10,20", | |
# [], | |
# 0, | |
# "", | |
# [], | |
# 0, | |
# "", | |
# [], | |
# True, | |
# True, | |
# False, | |
# False, | |
# 0, | |
# False | |
# ], | |
# example args for Refiner and ControlNet | |
# "alwayson_scripts": { | |
# "ControlNet": { | |
# "args": [ | |
# { | |
# "batch_images": "", | |
# "control_mode": "Balanced", | |
# "enabled": True, | |
# "guidance_end": 1, | |
# "guidance_start": 0, | |
# "image": { | |
# "image": encode_file_to_base64(r"B:\path\to\control\img.png"), | |
# "mask": None # base64, None when not need | |
# }, | |
# "input_mode": "simple", | |
# "is_ui": True, | |
# "loopback": False, | |
# "low_vram": False, | |
# "model": "control_v11p_sd15_canny [d14c016b]", | |
# "module": "canny", | |
# "output_dir": "", | |
# "pixel_perfect": False, | |
# "processor_res": 512, | |
# "resize_mode": "Crop and Resize", | |
# "threshold_a": 100, | |
# "threshold_b": 200, | |
# "weight": 1 | |
# } | |
# ] | |
# }, | |
# "Refiner": { | |
# "args": [ | |
# True, | |
# "sd_xl_refiner_1.0", | |
# 0.5 | |
# ] | |
# } | |
# }, | |
# "enable_hr": True, | |
# "hr_upscaler": "R-ESRGAN 4x+ Anime6B", | |
# "hr_scale": 2, | |
# "denoising_strength": 0.5, | |
# "styles": ['style 1', 'style 2'], | |
# "override_settings": { | |
# 'sd_model_checkpoint': "sd_xl_base_1.0", # this can use to switch sd model | |
# }, | |
} | |
call_txt2img_api(**payload) | |
init_images = [ | |
encode_file_to_base64(r"B:\path\to\img_1.png"), | |
# encode_file_to_base64(r"B:\path\to\img_2.png"), | |
# "https://image.can/also/be/a/http/url.png", | |
] | |
batch_size = 2 | |
payload = { | |
"prompt": "1girl, blue hair", | |
"seed": 1, | |
"steps": 20, | |
"width": 512, | |
"height": 512, | |
"denoising_strength": 0.5, | |
"n_iter": 1, | |
"init_images": init_images, | |
"batch_size": batch_size if len(init_images) == 1 else len(init_images), | |
# "mask": encode_file_to_base64(r"B:\path\to\mask.png") | |
} | |
# if len(init_images) > 1 then batch_size should be == len(init_images) | |
# else if len(init_images) == 1 then batch_size can be any value int >= 1 | |
call_img2img_api(**payload) | |
# there exist a useful extension that allows converting of webui calls to api payload | |
# particularly useful when you wish setup arguments of extensions and scripts | |
# https://github.com/huchenlei/sd-webui-api-payload-display |
Hello, you have shown an example args for 'x/y/z plot' in this demo, May I ask if you can give me an example args for 'Prompts from file and textbox'
but to be honest I don't know why you would ever use
Prompts from file and textbox
in api just used API and send multiple requests to generate the images with the parameters you want, you have more freedom
Hi, this script is not working anymore. Possible updates?
When I make request at http://127.0.0.1:7860/sdapi/v1/txt2img directly using postman or using the above script (with or without requests module) I am getting 404 error. Anyone know how to fix this?
Did they remove the txt2img & img2img APIs? Please anyone gives us confirmation, thanks.
Did they remove the txt2img & img2img APIs? Please anyone gives us confirmation, thanks.
api works
... HTTP Error 404: Not Found ...
the API error message is not that descripted, we use 404 for lots of things "not found"
txt2img and img2img
- Sampler not found
img2img - Init image not found
interrogate - Image not found
- Model not found
in particular there was some change to the sampler scheduler in 1.9
we did not have the foresight to implement backwards compatibility and result in a 404 if you try to generate an image with a non-existent sampler scheduler
@w-e-w
I created a request using Postman and it says "Not found". Can you tell me what is wrong here?
Moreover, at "http://127.0.0.1:7860/docs#/" I cannot see the description for that above 2 APIs. I installed Automatic1111 v1.9.3
Moreover, at "http://127.0.0.1:7860/docs#/" I cannot see the description for that above 2 APIs. I installed Automatic1111 v1.9.3
that's odd, it's showing on mine
but since you give me practically zero information I can't really help
if I think your experiencing an issue don't ask here make an issue post
Got the same issue: "... HTTP Error 404: Not Found ..."
I searched the http://127.0.0.1:7860/docs#/, no /sdapi/v1/txt2img was found.
restart for several times, still not working.
So I search all the webui process use the following cmd:
ps -ef | grep webui.sh | grep -v grep | gawk '{ print $2 }' and kill all the pids
then I search the 7860 port use the following cmd:
netstat -antlp | grep LISTEN | grep 7860 and kill the pid again.
then I start webui again, and finally the /sdapi/v1/txt2img was shown and the api test code worked.
I don't know why.
if you guys have the same issue, try to clean all the process and restart with --api.
To whom they couldn't find /sdapi/v1/txt2img
and /sdapi/v1/img2img
endpoint in http://127.0.0.1:7860/docs:
I solved the problem by adding --api
to COMMANDLINE_ARGS
in webui-user.bat file.
To whom they couldn't find
/sdapi/v1/txt2img
and/sdapi/v1/img2img
endpoint in http://127.0.0.1:7860/docs: I solved the problem by adding--api
toCOMMANDLINE_ARGS
in webui-user.bat file.
i want to kiss u
Hi, I used requests but still got empty response object showing 404. Could you share you code here? Many thanks.