Skip to content

Instantly share code, notes, and snippets.

@w-e-w
Last active May 22, 2024 07:38
Show Gist options
  • Save w-e-w/0f37c04c18e14e4ee1482df5c4eb9f53 to your computer and use it in GitHub Desktop.
Save w-e-w/0f37c04c18e14e4ee1482df5c4eb9f53 to your computer and use it in GitHub Desktop.
Stable Diffusion web UI txt2img img2img api example script
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
@w-e-w
Copy link
Author

w-e-w commented Feb 25, 2024

Hello, I would like to ask what the parameters for redrawing the area are. I would like to use redrawing only to mask the area, but it has not taken effect and has been redrawing the entire image

are you asking about Inpaint area only masked
irrc the payload are is inpaint_full_res: True

@samlara32
Copy link

Is it possible to add Adetailer to the payload

@w-e-w
Copy link
Author

w-e-w commented Apr 18, 2024

Is it possible to add Adetailer to the payload

yes read the last section

@toshan-luktuke
Copy link

Hi, trying it out on 19th April on Windows 11, Python 3.10.11 and I'm getting a HTTP Error 404: Not Found running the above example script. However when I use the requests module instead of urllib I can get the correct response.
Letting people know in case someone faces a similar issue

@samlara32
Copy link

Hi, trying it out on 19th April on Windows 11, Python 3.10.11 and I'm getting a HTTP Error 404: Not Found running the above example script. However when I use the requests module instead of urllib I can get the correct response. Letting people know in case someone faces a similar issue

hey, can you share your updated code

@ChenXuanting
Copy link

Hi, trying it out on 19th April on Windows 11, Python 3.10.11 and I'm getting a HTTP Error 404: Not Found running the above example script. However when I use the requests module instead of urllib I can get the correct response. Letting people know in case someone faces a similar issue

Hi, I used requests but still got empty response object showing 404. Could you share you code here? Many thanks.

@ChenXuanting
Copy link

@ckc1q2w

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'

https://gist.github.com/w-e-w/0f37c04c18e14e4ee1482df5c4eb9f53#file-sd-webui-txt2img-img2img-api-example-py-L161-L163

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?

@muhammadhur2
Copy link

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?

@kid9591
Copy link

kid9591 commented May 22, 2024

Did they remove the txt2img & img2img APIs? Please anyone gives us confirmation, thanks.

@w-e-w
Copy link
Author

w-e-w commented May 22, 2024

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

@kid9591
Copy link

kid9591 commented May 22, 2024

@w-e-w
I created a request using Postman and it says "Not found". Can you tell me what is wrong here?

Screenshot 2024-05-22 at 14 01 30

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

@w-e-w
Copy link
Author

w-e-w commented May 22, 2024

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
image

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment