@ -3,6 +3,7 @@ import io
import time
import time
import datetime
import datetime
import uvicorn
import uvicorn
import gradio as gr
from threading import Lock
from threading import Lock
from io import BytesIO
from io import BytesIO
from gradio . processing_utils import decode_base64_to_file
from gradio . processing_utils import decode_base64_to_file
@ -152,6 +153,9 @@ class Api:
self . add_api_route ( " /sdapi/v1/memory " , self . get_memory , methods = [ " GET " ] , response_model = MemoryResponse )
self . add_api_route ( " /sdapi/v1/memory " , self . get_memory , methods = [ " GET " ] , response_model = MemoryResponse )
self . add_api_route ( " /sdapi/v1/scripts " , self . get_scripts_list , methods = [ " GET " ] , response_model = ScriptsList )
self . add_api_route ( " /sdapi/v1/scripts " , self . get_scripts_list , methods = [ " GET " ] , response_model = ScriptsList )
self . default_script_arg_txt2img = [ ]
self . default_script_arg_img2img = [ ]
def add_api_route ( self , path : str , endpoint , * * kwargs ) :
def add_api_route ( self , path : str , endpoint , * * kwargs ) :
if shared . cmd_opts . api_auth :
if shared . cmd_opts . api_auth :
return self . app . add_api_route ( path , endpoint , dependencies = [ Depends ( self . auth ) ] , * * kwargs )
return self . app . add_api_route ( path , endpoint , dependencies = [ Depends ( self . auth ) ] , * * kwargs )
@ -185,7 +189,7 @@ class Api:
script_idx = script_name_to_index ( script_name , script_runner . scripts )
script_idx = script_name_to_index ( script_name , script_runner . scripts )
return script_runner . scripts [ script_idx ]
return script_runner . scripts [ script_idx ]
def init_ script_args( self , request , selectable_scripts , selectable_idx , script_runner ) :
def init_ default_ script_args( self , script_runner ) :
#find max idx from the scripts in runner and generate a none array to init script_args
#find max idx from the scripts in runner and generate a none array to init script_args
last_arg_index = 1
last_arg_index = 1
for script in script_runner . scripts :
for script in script_runner . scripts :
@ -193,13 +197,24 @@ class Api:
last_arg_index = script . args_to
last_arg_index = script . args_to
# None everywhere except position 0 to initialize script args
# None everywhere except position 0 to initialize script args
script_args = [ None ] * last_arg_index
script_args = [ None ] * last_arg_index
script_args [ 0 ] = 0
# get default values
with gr . Blocks ( ) : # will throw errors calling ui function without this
for script in script_runner . scripts :
if script . ui ( script . is_img2img ) :
ui_default_values = [ ]
for elem in script . ui ( script . is_img2img ) :
ui_default_values . append ( elem . value )
script_args [ script . args_from : script . args_to ] = ui_default_values
return script_args
def init_script_args ( self , request , default_script_args , selectable_scripts , selectable_idx , script_runner ) :
script_args = default_script_args . copy ( )
# position 0 in script_arg is the idx+1 of the selectable script that is going to be run when using scripts.scripts_*2img.run()
# position 0 in script_arg is the idx+1 of the selectable script that is going to be run when using scripts.scripts_*2img.run()
if selectable_scripts :
if selectable_scripts :
script_args [ selectable_scripts . args_from : selectable_scripts . args_to ] = request . script_args
script_args [ selectable_scripts . args_from : selectable_scripts . args_to ] = request . script_args
script_args [ 0 ] = selectable_idx + 1
script_args [ 0 ] = selectable_idx + 1
else :
# when [0] = 0 no selectable script to run
script_args [ 0 ] = 0
# Now check for always on scripts
# Now check for always on scripts
if request . alwayson_scripts and ( len ( request . alwayson_scripts ) > 0 ) :
if request . alwayson_scripts and ( len ( request . alwayson_scripts ) > 0 ) :
@ -220,6 +235,8 @@ class Api:
if not script_runner . scripts :
if not script_runner . scripts :
script_runner . initialize_scripts ( False )
script_runner . initialize_scripts ( False )
ui . create_ui ( )
ui . create_ui ( )
if not self . default_script_arg_txt2img :
self . default_script_arg_txt2img = self . init_default_script_args ( script_runner )
selectable_scripts , selectable_script_idx = self . get_selectable_script ( txt2imgreq . script_name , script_runner )
selectable_scripts , selectable_script_idx = self . get_selectable_script ( txt2imgreq . script_name , script_runner )
populate = txt2imgreq . copy ( update = { # Override __init__ params
populate = txt2imgreq . copy ( update = { # Override __init__ params
@ -235,7 +252,7 @@ class Api:
args . pop ( ' script_args ' , None ) # will refeed them to the pipeline directly after initializing them
args . pop ( ' script_args ' , None ) # will refeed them to the pipeline directly after initializing them
args . pop ( ' alwayson_scripts ' , None )
args . pop ( ' alwayson_scripts ' , None )
script_args = self . init_script_args ( txt2imgreq , selectable_scripts , selectable_script_idx , script_runner )
script_args = self . init_script_args ( txt2imgreq , self . default_script_arg_txt2img , selectable_scripts , selectable_script_idx , script_runner )
send_images = args . pop ( ' send_images ' , True )
send_images = args . pop ( ' send_images ' , True )
args . pop ( ' save_images ' , None )
args . pop ( ' save_images ' , None )
@ -272,6 +289,8 @@ class Api:
if not script_runner . scripts :
if not script_runner . scripts :
script_runner . initialize_scripts ( True )
script_runner . initialize_scripts ( True )
ui . create_ui ( )
ui . create_ui ( )
if not self . default_script_arg_img2img :
self . default_script_arg_img2img = self . init_default_script_args ( script_runner )
selectable_scripts , selectable_script_idx = self . get_selectable_script ( img2imgreq . script_name , script_runner )
selectable_scripts , selectable_script_idx = self . get_selectable_script ( img2imgreq . script_name , script_runner )
populate = img2imgreq . copy ( update = { # Override __init__ params
populate = img2imgreq . copy ( update = { # Override __init__ params
@ -289,7 +308,7 @@ class Api:
args . pop ( ' script_args ' , None ) # will refeed them to the pipeline directly after initializing them
args . pop ( ' script_args ' , None ) # will refeed them to the pipeline directly after initializing them
args . pop ( ' alwayson_scripts ' , None )
args . pop ( ' alwayson_scripts ' , None )
script_args = self . init_script_args ( img2imgreq , selectable_scripts , selectable_script_idx , script_runner )
script_args = self . init_script_args ( img2imgreq , self . default_script_arg_img2img , selectable_scripts , selectable_script_idx , script_runner )
send_images = args . pop ( ' send_images ' , True )
send_images = args . pop ( ' send_images ' , True )
args . pop ( ' save_images ' , None )
args . pop ( ' save_images ' , None )