1
0
mirror of https://github.com/vladmandic/sdnext.git synced 2026-01-27 15:02:48 +03:00
Files
sdnext/cli/api-xyz.py
Vladimir Mandic 0b1e6d2d3c improve offloading
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2025-12-25 10:24:02 +00:00

107 lines
4.2 KiB
Python
Executable File

#!/usr/bin/env python
# example: api-control.py --prompt "anime girl" --control "Canny:Canny:1.0:0.1:0.9:/home/vlado/generative/Samples/anime1.jpg,None:Depth:0.9:0.0:1.0:/home/vlado/generative/Samples/anime1.jpg" --hires --detailer --output /tmp/anime.jpg
import os
import io
import time
import base64
import logging
import argparse
import requests
import urllib3
from PIL import Image
sd_url = os.environ.get('SDAPI_URL', "http://127.0.0.1:7860")
sd_username = os.environ.get('SDAPI_USR', None)
sd_password = os.environ.get('SDAPI_PWD', None)
logging.basicConfig(level = logging.INFO, format = '%(asctime)s %(levelname)s: %(message)s')
log = logging.getLogger(__name__)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
options = {
"save_images": False,
"send_images": True,
}
def auth():
if sd_username is not None and sd_password is not None:
return requests.auth.HTTPBasicAuth(sd_username, sd_password)
return None
def post(endpoint: str, dct: dict = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }
else:
return req.json()
def generate(args): # pylint: disable=redefined-outer-name
t0 = time.time()
options['prompt'] = args.prompt
options['negative_prompt'] = args.negative
options['xyz'] = {
'draw_legend': args.legend,
'include_grid': args.grid,
'include_subgrids': args.subgrids,
'include_images': args.images,
'include_time': args.time,
'include_text': args.text,
}
if args.x_type and args.x_values:
options['xyz']['x_type'] = args.x_type
options['xyz']['x_values'] = args.x_values
if args.y_type and args.y_values:
options['xyz']['y_type'] = args.y_type
options['xyz']['y_values'] = args.y_values
if args.z_type and args.z_values:
options['xyz']['z_type'] = args.z_type
options['xyz']['z_values'] = args.z_values
data = post('/sdapi/v1/control', options)
t1 = time.time()
if 'info' in data:
log.info(f'info: {data["info"]}')
def get_image(encoded, output):
if not isinstance(encoded, list):
return
for i in range(len(encoded)):
b64 = encoded[i].split(',',1)[0]
info = data['info']
image = Image.open(io.BytesIO(base64.b64decode(b64)))
log.info(f'received image: size={image.size} time={t1-t0:.2f} info="{info}"')
if output:
image.save(output)
log.info(f'image saved: size={image.size} filename={output}')
if 'images' in data:
get_image(data['images'], args.output)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description = 'api-control')
parser.add_argument('--output', required=False, default=None, help='output filename')
parser.add_argument('--prompt', required=False, default='', help='prompt text')
parser.add_argument('--negative', required=False, default='', help='negative prompt text')
parser.add_argument('--x-type', required=False, default=None, help='x axis type')
parser.add_argument('--y-type', required=False, default=None, help='y axis type')
parser.add_argument('--z-type', required=False, default=None, help='z axis type')
parser.add_argument('--x-values', required=False, default=None, help='x axis values')
parser.add_argument('--y-values', required=False, default=None, help='y axis values')
parser.add_argument('--z-values', required=False, default=None, help='z axis values')
parser.add_argument('--legend', required=False, default=True, help='Draw legend')
parser.add_argument('--grid', required=False, default=True, help='Include grid')
parser.add_argument('--subgrids', required=False, default=False, help='Include subgrids')
parser.add_argument('--images', required=False, default=True, help='Include images')
parser.add_argument('--time', required=False, default=True, help='Include time')
parser.add_argument('--text', required=False, default=True, help='Include text')
args = parser.parse_args()
log.info(f'api-control: {args}')
generate(args)