Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
S
Stable Diffusion Webui
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
novelai-storage
Stable Diffusion Webui
Commits
3ba6c3c8
Commit
3ba6c3c8
authored
May 09, 2023
by
Aarni Koskela
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix up string formatting/concatenation to f-strings where feasible
parent
8fb16ceb
Changes
34
Hide whitespace changes
Inline
Side-by-side
Showing
34 changed files
with
121 additions
and
101 deletions
+121
-101
modules/api/api.py
modules/api/api.py
+11
-11
modules/call_queue.py
modules/call_queue.py
+3
-2
modules/esrgan_model.py
modules/esrgan_model.py
+7
-4
modules/esrgan_model_arch.py
modules/esrgan_model_arch.py
+8
-8
modules/extra_networks_hypernet.py
modules/extra_networks_hypernet.py
+2
-1
modules/generation_parameters_copypaste.py
modules/generation_parameters_copypaste.py
+2
-2
modules/hashes.py
modules/hashes.py
+2
-2
modules/images.py
modules/images.py
+4
-4
modules/interrogate.py
modules/interrogate.py
+2
-2
modules/models/diffusion/ddpm_edit.py
modules/models/diffusion/ddpm_edit.py
+2
-2
modules/models/diffusion/uni_pc/uni_pc.py
modules/models/diffusion/uni_pc/uni_pc.py
+2
-2
modules/ngrok.py
modules/ngrok.py
+2
-2
modules/paths.py
modules/paths.py
+1
-1
modules/processing.py
modules/processing.py
+11
-2
modules/progress.py
modules/progress.py
+2
-1
modules/realesrgan_model.py
modules/realesrgan_model.py
+4
-4
modules/scripts.py
modules/scripts.py
+3
-2
modules/sd_hijack_clip_old.py
modules/sd_hijack_clip_old.py
+2
-1
modules/sd_hijack_unet.py
modules/sd_hijack_unet.py
+1
-1
modules/sd_models.py
modules/sd_models.py
+2
-2
modules/sd_models_config.py
modules/sd_models_config.py
+1
-1
modules/sd_samplers_kdiffusion.py
modules/sd_samplers_kdiffusion.py
+1
-1
modules/sd_vae.py
modules/sd_vae.py
+1
-1
modules/styles.py
modules/styles.py
+1
-1
modules/textual_inversion/autocrop.py
modules/textual_inversion/autocrop.py
+3
-3
modules/textual_inversion/dataset.py
modules/textual_inversion/dataset.py
+1
-1
modules/textual_inversion/preprocess.py
modules/textual_inversion/preprocess.py
+3
-3
modules/textual_inversion/textual_inversion.py
modules/textual_inversion/textual_inversion.py
+6
-6
modules/ui.py
modules/ui.py
+23
-23
modules/ui_extensions.py
modules/ui_extensions.py
+2
-1
modules/ui_extra_networks.py
modules/ui_extra_networks.py
+3
-1
scripts/custom_code.py
scripts/custom_code.py
+1
-1
scripts/loopback.py
scripts/loopback.py
+1
-1
scripts/xyz_grid.py
scripts/xyz_grid.py
+1
-1
No files found.
modules/api/api.py
View file @
3ba6c3c8
...
...
@@ -570,20 +570,20 @@ class Api:
filename
=
create_embedding
(
**
args
)
# create empty embedding
sd_hijack
.
model_hijack
.
embedding_db
.
load_textual_inversion_embeddings
()
# reload embeddings so new one can be immediately used
shared
.
state
.
end
()
return
CreateResponse
(
info
=
"create embedding filename: {filename}"
.
format
(
filename
=
filename
)
)
return
CreateResponse
(
info
=
f
"create embedding filename: {filename}"
)
except
AssertionError
as
e
:
shared
.
state
.
end
()
return
TrainResponse
(
info
=
"create embedding error: {error}"
.
format
(
error
=
e
)
)
return
TrainResponse
(
info
=
f
"create embedding error: {e}"
)
def
create_hypernetwork
(
self
,
args
:
dict
):
try
:
shared
.
state
.
begin
()
filename
=
create_hypernetwork
(
**
args
)
# create empty embedding
shared
.
state
.
end
()
return
CreateResponse
(
info
=
"create hypernetwork filename: {filename}"
.
format
(
filename
=
filename
)
)
return
CreateResponse
(
info
=
f
"create hypernetwork filename: {filename}"
)
except
AssertionError
as
e
:
shared
.
state
.
end
()
return
TrainResponse
(
info
=
"create hypernetwork error: {error}"
.
format
(
error
=
e
)
)
return
TrainResponse
(
info
=
f
"create hypernetwork error: {e}"
)
def
preprocess
(
self
,
args
:
dict
):
try
:
...
...
@@ -593,13 +593,13 @@ class Api:
return
PreprocessResponse
(
info
=
'preprocess complete'
)
except
KeyError
as
e
:
shared
.
state
.
end
()
return
PreprocessResponse
(
info
=
"preprocess error: invalid token: {error}"
.
format
(
error
=
e
)
)
return
PreprocessResponse
(
info
=
f
"preprocess error: invalid token: {e}"
)
except
AssertionError
as
e
:
shared
.
state
.
end
()
return
PreprocessResponse
(
info
=
"preprocess error: {error}"
.
format
(
error
=
e
)
)
return
PreprocessResponse
(
info
=
f
"preprocess error: {e}"
)
except
FileNotFoundError
as
e
:
shared
.
state
.
end
()
return
PreprocessResponse
(
info
=
'preprocess error: {error}'
.
format
(
error
=
e
)
)
return
PreprocessResponse
(
info
=
f
'preprocess error: {e}'
)
def
train_embedding
(
self
,
args
:
dict
):
try
:
...
...
@@ -617,10 +617,10 @@ class Api:
if
not
apply_optimizations
:
sd_hijack
.
apply_optimizations
()
shared
.
state
.
end
()
return
TrainResponse
(
info
=
"train embedding complete: filename: {filename} error: {error}"
.
format
(
filename
=
filename
,
error
=
error
)
)
return
TrainResponse
(
info
=
f
"train embedding complete: filename: {filename} error: {error}"
)
except
AssertionError
as
msg
:
shared
.
state
.
end
()
return
TrainResponse
(
info
=
"train embedding error: {msg}"
.
format
(
msg
=
msg
)
)
return
TrainResponse
(
info
=
f
"train embedding error: {msg}"
)
def
train_hypernetwork
(
self
,
args
:
dict
):
try
:
...
...
@@ -641,10 +641,10 @@ class Api:
if
not
apply_optimizations
:
sd_hijack
.
apply_optimizations
()
shared
.
state
.
end
()
return
TrainResponse
(
info
=
"train embedding complete: filename: {filename} error: {error}"
.
format
(
filename
=
filename
,
error
=
error
)
)
return
TrainResponse
(
info
=
f
"train embedding complete: filename: {filename} error: {error}"
)
except
AssertionError
as
msg
:
shared
.
state
.
end
()
return
TrainResponse
(
info
=
"train embedding error: {error}"
.
format
(
error
=
error
)
)
return
TrainResponse
(
info
=
f
"train embedding error: {error}"
)
def
get_memory
(
self
):
try
:
...
...
modules/call_queue.py
View file @
3ba6c3c8
...
...
@@ -60,7 +60,7 @@ def wrap_gradio_call(func, extra_outputs=None, add_stats=False):
max_debug_str_len
=
131072
# (1024*1024)/8
print
(
"Error completing request"
,
file
=
sys
.
stderr
)
argStr
=
f
"Arguments: {
str(args)} {str(kwargs)
}"
argStr
=
f
"Arguments: {
args} {kwargs
}"
print
(
argStr
[:
max_debug_str_len
],
file
=
sys
.
stderr
)
if
len
(
argStr
)
>
max_debug_str_len
:
print
(
f
"(Argument list truncated at {max_debug_str_len}/{len(argStr)} characters)"
,
file
=
sys
.
stderr
)
...
...
@@ -73,7 +73,8 @@ def wrap_gradio_call(func, extra_outputs=None, add_stats=False):
if
extra_outputs_array
is
None
:
extra_outputs_array
=
[
None
,
''
]
res
=
extra_outputs_array
+
[
f
"<div class='error'>{html.escape(type(e).__name__+': '+str(e))}</div>"
]
error_message
=
f
'{type(e).__name__}: {e}'
res
=
extra_outputs_array
+
[
f
"<div class='error'>{html.escape(error_message)}</div>"
]
shared
.
state
.
skipped
=
False
shared
.
state
.
interrupted
=
False
...
...
modules/esrgan_model.py
View file @
3ba6c3c8
...
...
@@ -156,13 +156,16 @@ class UpscalerESRGAN(Upscaler):
def
load_model
(
self
,
path
:
str
):
if
"http"
in
path
:
filename
=
load_file_from_url
(
url
=
self
.
model_url
,
model_dir
=
self
.
model_path
,
file_name
=
"
%
s.pth"
%
self
.
model_name
,
progress
=
True
)
filename
=
load_file_from_url
(
url
=
self
.
model_url
,
model_dir
=
self
.
model_path
,
file_name
=
f
"{self.model_name}.pth"
,
progress
=
True
,
)
else
:
filename
=
path
if
not
os
.
path
.
exists
(
filename
)
or
filename
is
None
:
print
(
"Unable to load
%
s from
%
s"
%
(
self
.
model_path
,
filename
)
)
print
(
f
"Unable to load {self.model_path} from {filename}"
)
return
None
state_dict
=
torch
.
load
(
filename
,
map_location
=
'cpu'
if
devices
.
device_esrgan
.
type
==
'mps'
else
None
)
...
...
modules/esrgan_model_arch.py
View file @
3ba6c3c8
...
...
@@ -38,7 +38,7 @@ class RRDBNet(nn.Module):
elif
upsample_mode
==
'pixelshuffle'
:
upsample_block
=
pixelshuffle_block
else
:
raise
NotImplementedError
(
'upsample mode [{:s}] is not found'
.
format
(
upsample_mode
)
)
raise
NotImplementedError
(
f
'upsample mode [{upsample_mode}] is not found'
)
if
upscale
==
3
:
upsampler
=
upsample_block
(
nf
,
nf
,
3
,
act_type
=
act_type
,
convtype
=
convtype
)
else
:
...
...
@@ -261,10 +261,10 @@ class Upsample(nn.Module):
def
extra_repr
(
self
):
if
self
.
scale_factor
is
not
None
:
info
=
'scale_factor='
+
str
(
self
.
scale_factor
)
info
=
f
'scale_factor={self.scale_factor}'
else
:
info
=
'size='
+
str
(
self
.
size
)
info
+=
', mode='
+
self
.
mode
info
=
f
'size={self.size}'
info
+=
f
', mode={self.mode}'
return
info
...
...
@@ -350,7 +350,7 @@ def act(act_type, inplace=True, neg_slope=0.2, n_prelu=1, beta=1.0):
elif
act_type
==
'sigmoid'
:
# [0, 1] range output
layer
=
nn
.
Sigmoid
()
else
:
raise
NotImplementedError
(
'activation layer [{:s}] is not found'
.
format
(
act_type
)
)
raise
NotImplementedError
(
f
'activation layer [{act_type}] is not found'
)
return
layer
...
...
@@ -372,7 +372,7 @@ def norm(norm_type, nc):
elif
norm_type
==
'none'
:
def
norm_layer
(
x
):
return
Identity
()
else
:
raise
NotImplementedError
(
'normalization layer [{:s}] is not found'
.
format
(
norm_type
)
)
raise
NotImplementedError
(
f
'normalization layer [{norm_type}] is not found'
)
return
layer
...
...
@@ -388,7 +388,7 @@ def pad(pad_type, padding):
elif
pad_type
==
'zero'
:
layer
=
nn
.
ZeroPad2d
(
padding
)
else
:
raise
NotImplementedError
(
'padding layer [{:s}] is not implemented'
.
format
(
pad_type
)
)
raise
NotImplementedError
(
f
'padding layer [{pad_type}] is not implemented'
)
return
layer
...
...
@@ -432,7 +432,7 @@ def conv_block(in_nc, out_nc, kernel_size, stride=1, dilation=1, groups=1, bias=
pad_type
=
'zero'
,
norm_type
=
None
,
act_type
=
'relu'
,
mode
=
'CNA'
,
convtype
=
'Conv2D'
,
spectral_norm
=
False
):
""" Conv layer with padding, normalization, activation """
assert
mode
in
[
'CNA'
,
'NAC'
,
'CNAC'
],
'Wrong conv mode [{:s}]'
.
format
(
mode
)
assert
mode
in
[
'CNA'
,
'NAC'
,
'CNAC'
],
f
'Wrong conv mode [{mode}]'
padding
=
get_valid_padding
(
kernel_size
,
dilation
)
p
=
pad
(
pad_type
,
padding
)
if
pad_type
and
pad_type
!=
'zero'
else
None
padding
=
padding
if
pad_type
==
'zero'
else
0
...
...
modules/extra_networks_hypernet.py
View file @
3ba6c3c8
...
...
@@ -10,7 +10,8 @@ class ExtraNetworkHypernet(extra_networks.ExtraNetwork):
additional
=
shared
.
opts
.
sd_hypernetwork
if
additional
!=
"None"
and
additional
in
shared
.
hypernetworks
and
len
([
x
for
x
in
params_list
if
x
.
items
[
0
]
==
additional
])
==
0
:
p
.
all_prompts
=
[
x
+
f
"<hypernet:{additional}:{shared.opts.extra_networks_default_multiplier}>"
for
x
in
p
.
all_prompts
]
hypernet_prompt_text
=
f
"<hypernet:{additional}:{shared.opts.extra_networks_default_multiplier}>"
p
.
all_prompts
=
[
f
"{prompt}{hypernet_prompt_text}"
for
prompt
in
p
.
all_prompts
]
params_list
.
append
(
extra_networks
.
ExtraNetworkParams
(
items
=
[
additional
,
shared
.
opts
.
extra_networks_default_multiplier
]))
names
=
[]
...
...
modules/generation_parameters_copypaste.py
View file @
3ba6c3c8
...
...
@@ -269,8 +269,8 @@ Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 965400086, Size: 512x512, Model
v
=
v
[
1
:
-
1
]
if
v
[
0
]
==
'"'
and
v
[
-
1
]
==
'"'
else
v
m
=
re_imagesize
.
match
(
v
)
if
m
is
not
None
:
res
[
k
+
"
-1"
]
=
m
.
group
(
1
)
res
[
k
+
"
-2"
]
=
m
.
group
(
2
)
res
[
f
"{k}
-1"
]
=
m
.
group
(
1
)
res
[
f
"{k}
-2"
]
=
m
.
group
(
2
)
else
:
res
[
k
]
=
v
...
...
modules/hashes.py
View file @
3ba6c3c8
...
...
@@ -13,7 +13,7 @@ cache_data = None
def
dump_cache
():
with
filelock
.
FileLock
(
cache_filename
+
"
.lock"
):
with
filelock
.
FileLock
(
f
"{cache_filename}
.lock"
):
with
open
(
cache_filename
,
"w"
,
encoding
=
"utf8"
)
as
file
:
json
.
dump
(
cache_data
,
file
,
indent
=
4
)
...
...
@@ -22,7 +22,7 @@ def cache(subsection):
global
cache_data
if
cache_data
is
None
:
with
filelock
.
FileLock
(
cache_filename
+
"
.lock"
):
with
filelock
.
FileLock
(
f
"{cache_filename}
.lock"
):
if
not
os
.
path
.
isfile
(
cache_filename
):
cache_data
=
{}
else
:
...
...
modules/images.py
View file @
3ba6c3c8
...
...
@@ -467,7 +467,7 @@ def get_next_sequence_number(path, basename):
"""
result
=
-
1
if
basename
!=
''
:
basename
=
basename
+
"
-"
basename
=
f
"{basename}
-"
prefix_length
=
len
(
basename
)
for
p
in
os
.
listdir
(
path
):
...
...
@@ -536,7 +536,7 @@ def save_image(image, path, basename, seed=None, prompt=None, extension='png', i
add_number
=
opts
.
save_images_add_number
or
file_decoration
==
''
if
file_decoration
!=
""
and
add_number
:
file_decoration
=
"-"
+
file_decoration
file_decoration
=
f
"-{file_decoration}"
file_decoration
=
namegen
.
apply
(
file_decoration
)
+
suffix
...
...
@@ -566,7 +566,7 @@ def save_image(image, path, basename, seed=None, prompt=None, extension='png', i
def
_atomically_save_image
(
image_to_save
,
filename_without_extension
,
extension
):
# save image with .tmp extension to avoid race condition when another process detects new image in the directory
temp_file_path
=
f
ilename_without_extension
+
"
.tmp"
temp_file_path
=
f
"{filename_without_extension}
.tmp"
image_format
=
Image
.
registered_extensions
()[
extension
]
if
extension
.
lower
()
==
'.png'
:
...
...
@@ -626,7 +626,7 @@ def save_image(image, path, basename, seed=None, prompt=None, extension='png', i
if
opts
.
save_txt
and
info
is
not
None
:
txt_fullfn
=
f
"{fullfn_without_extension}.txt"
with
open
(
txt_fullfn
,
"w"
,
encoding
=
"utf8"
)
as
file
:
file
.
write
(
info
+
"
\n
"
)
file
.
write
(
f
"{info}
\n
"
)
else
:
txt_fullfn
=
None
...
...
modules/interrogate.py
View file @
3ba6c3c8
...
...
@@ -28,7 +28,7 @@ def category_types():
def
download_default_clip_interrogate_categories
(
content_dir
):
print
(
"Downloading CLIP categories..."
)
tmpdir
=
content_dir
+
"
_tmp"
tmpdir
=
f
"{content_dir}
_tmp"
category_types
=
[
"artists"
,
"flavors"
,
"mediums"
,
"movements"
]
try
:
...
...
@@ -214,7 +214,7 @@ class InterrogateModels:
if
shared
.
opts
.
interrogate_return_ranks
:
res
+=
f
", ({match}:{score/100:.3f})"
else
:
res
+=
", "
+
match
res
+=
f
", {match}"
except
Exception
:
print
(
"Error interrogating"
,
file
=
sys
.
stderr
)
...
...
modules/models/diffusion/ddpm_edit.py
View file @
3ba6c3c8
...
...
@@ -223,7 +223,7 @@ class DDPM(pl.LightningModule):
for
k
in
keys
:
for
ik
in
ignore_keys
:
if
k
.
startswith
(
ik
):
print
(
"Deleting key {} from state_dict."
.
format
(
k
)
)
print
(
f
"Deleting key {k} from state_dict."
)
del
sd
[
k
]
missing
,
unexpected
=
self
.
load_state_dict
(
sd
,
strict
=
False
)
if
not
only_model
else
self
.
model
.
load_state_dict
(
sd
,
strict
=
False
)
...
...
@@ -386,7 +386,7 @@ class DDPM(pl.LightningModule):
_
,
loss_dict_no_ema
=
self
.
shared_step
(
batch
)
with
self
.
ema_scope
():
_
,
loss_dict_ema
=
self
.
shared_step
(
batch
)
loss_dict_ema
=
{
key
+
'_ema'
:
loss_dict_ema
[
key
]
for
key
in
loss_dict_ema
}
loss_dict_ema
=
{
f
"{key}_ema"
:
loss_dict_ema
[
key
]
for
key
in
loss_dict_ema
}
self
.
log_dict
(
loss_dict_no_ema
,
prog_bar
=
False
,
logger
=
True
,
on_step
=
False
,
on_epoch
=
True
)
self
.
log_dict
(
loss_dict_ema
,
prog_bar
=
False
,
logger
=
True
,
on_step
=
False
,
on_epoch
=
True
)
...
...
modules/models/diffusion/uni_pc/uni_pc.py
View file @
3ba6c3c8
...
...
@@ -94,7 +94,7 @@ class NoiseScheduleVP:
"""
if
schedule
not
in
[
'discrete'
,
'linear'
,
'cosine'
]:
raise
ValueError
(
"Unsupported noise schedule {}. The schedule needs to be 'discrete' or 'linear' or 'cosine'"
.
format
(
schedule
)
)
raise
ValueError
(
f
"Unsupported noise schedule {schedule}. The schedule needs to be 'discrete' or 'linear' or 'cosine'"
)
self
.
schedule
=
schedule
if
schedule
==
'discrete'
:
...
...
@@ -469,7 +469,7 @@ class UniPC:
t
=
torch
.
linspace
(
t_T
**
(
1.
/
t_order
),
t_0
**
(
1.
/
t_order
),
N
+
1
)
.
pow
(
t_order
)
.
to
(
device
)
return
t
else
:
raise
ValueError
(
"Unsupported skip_type {}, need to be 'logSNR' or 'time_uniform' or 'time_quadratic'"
.
format
(
skip_type
)
)
raise
ValueError
(
f
"Unsupported skip_type {skip_type}, need to be 'logSNR' or 'time_uniform' or 'time_quadratic'"
)
def
get_orders_and_timesteps_for_singlestep_solver
(
self
,
steps
,
order
,
skip_type
,
t_T
,
t_0
,
device
):
"""
...
...
modules/ngrok.py
View file @
3ba6c3c8
...
...
@@ -7,8 +7,8 @@ def connect(token, port, region):
else
:
if
':'
in
token
:
# token = authtoken:username:password
account
=
token
.
split
(
':'
)[
1
]
+
':'
+
token
.
split
(
':'
)[
-
1
]
token
=
token
.
split
(
':'
)[
0
]
token
,
username
,
password
=
token
.
split
(
':'
,
2
)
account
=
f
"{username}:{password}"
config
=
conf
.
PyngrokConfig
(
auth_token
=
token
,
region
=
region
...
...
modules/paths.py
View file @
3ba6c3c8
...
...
@@ -16,7 +16,7 @@ for possible_sd_path in possible_sd_paths:
sd_path
=
os
.
path
.
abspath
(
possible_sd_path
)
break
assert
sd_path
is
not
None
,
"Couldn't find Stable Diffusion in any of: "
+
str
(
possible_sd_paths
)
assert
sd_path
is
not
None
,
f
"Couldn't find Stable Diffusion in any of: {possible_sd_paths}"
path_dirs
=
[
(
sd_path
,
'ldm'
,
'Stable Diffusion'
,
[]),
...
...
modules/processing.py
View file @
3ba6c3c8
...
...
@@ -500,7 +500,7 @@ def create_infotext(p, all_prompts, all_seeds, all_subseeds, comments=None, iter
generation_params_text
=
", "
.
join
([
k
if
k
==
v
else
f
'{k}: {generation_parameters_copypaste.quote(v)}'
for
k
,
v
in
generation_params
.
items
()
if
v
is
not
None
])
negative_prompt_text
=
"
\n
Negative prompt: "
+
p
.
all_negative_prompts
[
index
]
if
p
.
all_negative_prompts
[
index
]
else
""
negative_prompt_text
=
f
"
\n
Negative prompt: {p.all_negative_prompts[index]}"
if
p
.
all_negative_prompts
[
index
]
else
""
return
f
"{all_prompts[index]}{negative_prompt_text}
\n
{generation_params_text}"
.
strip
()
...
...
@@ -780,7 +780,16 @@ def process_images_inner(p: StableDiffusionProcessing) -> Processed:
devices
.
torch_gc
()
res
=
Processed
(
p
,
output_images
,
p
.
all_seeds
[
0
],
infotext
(),
comments
=
""
.
join
([
"
\n\n
"
+
x
for
x
in
comments
]),
subseed
=
p
.
all_subseeds
[
0
],
index_of_first_image
=
index_of_first_image
,
infotexts
=
infotexts
)
res
=
Processed
(
p
,
images_list
=
output_images
,
seed
=
p
.
all_seeds
[
0
],
info
=
infotext
(),
comments
=
""
.
join
(
f
"
\n\n
{comment}"
for
comment
in
comments
),
subseed
=
p
.
all_subseeds
[
0
],
index_of_first_image
=
index_of_first_image
,
infotexts
=
infotexts
,
)
if
p
.
scripts
is
not
None
:
p
.
scripts
.
postprocess
(
p
,
res
)
...
...
modules/progress.py
View file @
3ba6c3c8
...
...
@@ -96,7 +96,8 @@ def progressapi(req: ProgressRequest):
if
image
is
not
None
:
buffered
=
io
.
BytesIO
()
image
.
save
(
buffered
,
format
=
"png"
)
live_preview
=
'data:image/png;base64,'
+
base64
.
b64encode
(
buffered
.
getvalue
())
.
decode
(
"ascii"
)
base64_image
=
base64
.
b64encode
(
buffered
.
getvalue
())
.
decode
(
'ascii'
)
live_preview
=
f
"data:image/png;base64,{base64_image}"
id_live_preview
=
shared
.
state
.
id_live_preview
else
:
live_preview
=
None
...
...
modules/realesrgan_model.py
View file @
3ba6c3c8
...
...
@@ -28,9 +28,9 @@ class UpscalerRealESRGAN(Upscaler):
for
scaler
in
scalers
:
if
scaler
.
local_data_path
.
startswith
(
"http"
):
filename
=
modelloader
.
friendly_name
(
scaler
.
local_data_path
)
local
=
next
(
iter
([
local_model
for
local_model
in
local_model_paths
if
local_model
.
endswith
(
filename
+
'.pth'
)]),
None
)
if
local
:
scaler
.
local_data_path
=
local
local
_model_candidates
=
[
local_model
for
local_model
in
local_model_paths
if
local_model
.
endswith
(
f
"{filename}.pth"
)]
if
local
_model_candidates
:
scaler
.
local_data_path
=
local
_model_candidates
[
0
]
if
scaler
.
name
in
opts
.
realesrgan_enabled_models
:
self
.
scalers
.
append
(
scaler
)
...
...
@@ -47,7 +47,7 @@ class UpscalerRealESRGAN(Upscaler):
info
=
self
.
load_model
(
path
)
if
not
os
.
path
.
exists
(
info
.
local_data_path
):
print
(
"Unable to load RealESRGAN model:
%
s"
%
info
.
name
)
print
(
f
"Unable to load RealESRGAN model: {info.name}"
)
return
img
upsampler
=
RealESRGANer
(
...
...
modules/scripts.py
View file @
3ba6c3c8
...
...
@@ -163,7 +163,8 @@ class Script:
"""helper function to generate id for a HTML element, constructs final id out of script name, tab and user-supplied item_id"""
need_tabname
=
self
.
show
(
True
)
==
self
.
show
(
False
)
tabname
=
(
'img2img'
if
self
.
is_img2img
else
'txt2txt'
)
+
"_"
if
need_tabname
else
""
tabkind
=
'img2img'
if
self
.
is_img2img
else
'txt2txt'
tabname
=
f
"{tabkind}_"
if
need_tabname
else
""
title
=
re
.
sub
(
r'[^a-z_0-9]'
,
''
,
re
.
sub
(
r'\s'
,
'_'
,
self
.
title
()
.
lower
()))
return
f
'script_{tabname}{title}_{item_id}'
...
...
@@ -526,7 +527,7 @@ def add_classes_to_gradio_component(comp):
this adds gradio-* to the component for css styling (ie gradio-button to gr.Button), as well as some others
"""
comp
.
elem_classes
=
[
"gradio-"
+
comp
.
get_block_name
()
,
*
(
comp
.
elem_classes
or
[])]
comp
.
elem_classes
=
[
f
"gradio-{comp.get_block_name()}"
,
*
(
comp
.
elem_classes
or
[])]
if
getattr
(
comp
,
'multiselect'
,
False
):
comp
.
elem_classes
.
append
(
'multiselect'
)
...
...
modules/sd_hijack_clip_old.py
View file @
3ba6c3c8
...
...
@@ -75,7 +75,8 @@ def forward_old(self: sd_hijack_clip.FrozenCLIPEmbedderWithCustomWordsBase, text
self
.
hijack
.
comments
+=
hijack_comments
if
len
(
used_custom_terms
)
>
0
:
self
.
hijack
.
comments
.
append
(
"Used embeddings: "
+
", "
.
join
([
f
'{word} [{checksum}]'
for
word
,
checksum
in
used_custom_terms
]))
embedding_names
=
", "
.
join
(
f
"{word} [{checksum}]"
for
word
,
checksum
in
used_custom_terms
)
self
.
hijack
.
comments
.
append
(
f
"Used embeddings: {embedding_names}"
)
self
.
hijack
.
fixes
=
hijack_fixes
return
self
.
process_tokens
(
remade_batch_tokens
,
batch_multipliers
)
modules/sd_hijack_unet.py
View file @
3ba6c3c8
...
...
@@ -18,7 +18,7 @@ class TorchHijackForUnet:
if
hasattr
(
torch
,
item
):
return
getattr
(
torch
,
item
)
raise
AttributeError
(
"'{}' object has no attribute '{}'"
.
format
(
type
(
self
)
.
__name__
,
item
)
)
raise
AttributeError
(
f
"'{type(self).__name__}' object has no attribute '{item}'"
)
def
cat
(
self
,
tensors
,
*
args
,
**
kwargs
):
if
len
(
tensors
)
==
2
:
...
...
modules/sd_models.py
View file @
3ba6c3c8
...
...
@@ -47,7 +47,7 @@ class CheckpointInfo:
self
.
model_name
=
os
.
path
.
splitext
(
name
.
replace
(
"/"
,
"_"
)
.
replace
(
"
\\
"
,
"_"
))[
0
]
self
.
hash
=
model_hash
(
filename
)
self
.
sha256
=
hashes
.
sha256_from_cache
(
self
.
filename
,
"checkpoint/"
+
name
)
self
.
sha256
=
hashes
.
sha256_from_cache
(
self
.
filename
,
f
"checkpoint/{name}"
)
self
.
shorthash
=
self
.
sha256
[
0
:
10
]
if
self
.
sha256
else
None
self
.
title
=
name
if
self
.
shorthash
is
None
else
f
'{name} [{self.shorthash}]'
...
...
@@ -69,7 +69,7 @@ class CheckpointInfo:
checkpoint_alisases
[
id
]
=
self
def
calculate_shorthash
(
self
):
self
.
sha256
=
hashes
.
sha256
(
self
.
filename
,
"checkpoint/"
+
self
.
name
)
self
.
sha256
=
hashes
.
sha256
(
self
.
filename
,
f
"checkpoint/{self.name}"
)
if
self
.
sha256
is
None
:
return
...
...
modules/sd_models_config.py
View file @
3ba6c3c8
...
...
@@ -111,7 +111,7 @@ def find_checkpoint_config_near_filename(info):
if
info
is
None
:
return
None
config
=
os
.
path
.
splitext
(
info
.
filename
)[
0
]
+
"
.yaml"
config
=
f
"{os.path.splitext(info.filename)[0]}
.yaml"
if
os
.
path
.
exists
(
config
):
return
config
...
...
modules/sd_samplers_kdiffusion.py
View file @
3ba6c3c8
...
...
@@ -198,7 +198,7 @@ class TorchHijack:
if
hasattr
(
torch
,
item
):
return
getattr
(
torch
,
item
)
raise
AttributeError
(
"'{}' object has no attribute '{}'"
.
format
(
type
(
self
)
.
__name__
,
item
)
)
raise
AttributeError
(
f
"'{type(self).__name__}' object has no attribute '{item}'"
)
def
randn_like
(
self
,
x
):
if
self
.
sampler_noises
:
...
...
modules/sd_vae.py
View file @
3ba6c3c8
...
...
@@ -89,7 +89,7 @@ def refresh_vae_list():
def
find_vae_near_checkpoint
(
checkpoint_file
):
checkpoint_path
=
os
.
path
.
splitext
(
checkpoint_file
)[
0
]
for
vae_location
in
[
checkpoint_path
+
".vae.pt"
,
checkpoint_path
+
".vae.ckpt"
,
checkpoint_path
+
"
.vae.safetensors"
]:
for
vae_location
in
[
f
"{checkpoint_path}.vae.pt"
,
f
"{checkpoint_path}.vae.ckpt"
,
f
"{checkpoint_path}
.vae.safetensors"
]:
if
os
.
path
.
isfile
(
vae_location
):
return
vae_location
...
...
modules/styles.py
View file @
3ba6c3c8
...
...
@@ -74,7 +74,7 @@ class StyleDatabase:
def
save_styles
(
self
,
path
:
str
)
->
None
:
# Always keep a backup file around
if
os
.
path
.
exists
(
path
):
shutil
.
copy
(
path
,
path
+
"
.bak"
)
shutil
.
copy
(
path
,
f
"{path}
.bak"
)
fd
=
os
.
open
(
path
,
os
.
O_RDWR
|
os
.
O_CREAT
)
with
os
.
fdopen
(
fd
,
"w"
,
encoding
=
"utf-8-sig"
,
newline
=
''
)
as
file
:
...
...
modules/textual_inversion/autocrop.py
View file @
3ba6c3c8
...
...
@@ -111,7 +111,7 @@ def focal_point(im, settings):
if
corner_centroid
is
not
None
:
color
=
BLUE
box
=
corner_centroid
.
bounding
(
max_size
*
corner_centroid
.
weight
)
d
.
text
((
box
[
0
],
box
[
1
]
-
15
),
"Edge:
%.02
f"
%
corner_centroid
.
weight
,
fill
=
color
)
d
.
text
((
box
[
0
],
box
[
1
]
-
15
),
f
"Edge: {corner_centroid.weight:.02f}"
,
fill
=
color
)
d
.
ellipse
(
box
,
outline
=
color
)
if
len
(
corner_points
)
>
1
:
for
f
in
corner_points
:
...
...
@@ -119,7 +119,7 @@ def focal_point(im, settings):
if
entropy_centroid
is
not
None
:
color
=
"#ff0"
box
=
entropy_centroid
.
bounding
(
max_size
*
entropy_centroid
.
weight
)
d
.
text
((
box
[
0
],
box
[
1
]
-
15
),
"Entropy:
%.02
f"
%
entropy_centroid
.
weight
,
fill
=
color
)
d
.
text
((
box
[
0
],
box
[
1
]
-
15
),
f
"Entropy: {entropy_centroid.weight:.02f}"
,
fill
=
color
)
d
.
ellipse
(
box
,
outline
=
color
)
if
len
(
entropy_points
)
>
1
:
for
f
in
entropy_points
:
...
...
@@ -127,7 +127,7 @@ def focal_point(im, settings):
if
face_centroid
is
not
None
:
color
=
RED
box
=
face_centroid
.
bounding
(
max_size
*
face_centroid
.
weight
)
d
.
text
((
box
[
0
],
box
[
1
]
-
15
),
"Face:
%.02
f"
%
face_centroid
.
weight
,
fill
=
color
)
d
.
text
((
box
[
0
],
box
[
1
]
-
15
),
f
"Face: {face_centroid.weight:.02f}"
,
fill
=
color
)
d
.
ellipse
(
box
,
outline
=
color
)
if
len
(
face_points
)
>
1
:
for
f
in
face_points
:
...
...
modules/textual_inversion/dataset.py
View file @
3ba6c3c8
...
...
@@ -72,7 +72,7 @@ class PersonalizedBase(Dataset):
except
Exception
:
continue
text_filename
=
os
.
path
.
splitext
(
path
)[
0
]
+
"
.txt"
text_filename
=
f
"{os.path.splitext(path)[0]}
.txt"
filename
=
os
.
path
.
basename
(
path
)
if
os
.
path
.
exists
(
text_filename
):
...
...
modules/textual_inversion/preprocess.py
View file @
3ba6c3c8
...
...
@@ -63,9 +63,9 @@ def save_pic_with_caption(image, index, params: PreprocessParams, existing_capti
image
.
save
(
os
.
path
.
join
(
params
.
dstdir
,
f
"{basename}.png"
))
if
params
.
preprocess_txt_action
==
'prepend'
and
existing_caption
:
caption
=
existing_caption
+
' '
+
caption
caption
=
f
"{existing_caption} {caption}"
elif
params
.
preprocess_txt_action
==
'append'
and
existing_caption
:
caption
=
caption
+
' '
+
existing_caption
caption
=
f
"{caption} {existing_caption}"
elif
params
.
preprocess_txt_action
==
'copy'
and
existing_caption
:
caption
=
existing_caption
...
...
@@ -174,7 +174,7 @@ def preprocess_work(process_src, process_dst, process_width, process_height, pre
params
.
src
=
filename
existing_caption
=
None
existing_caption_filename
=
os
.
path
.
splitext
(
filename
)[
0
]
+
'.txt'
existing_caption_filename
=
f
"{os.path.splitext(filename)[0]}.txt"
if
os
.
path
.
exists
(
existing_caption_filename
):
with
open
(
existing_caption_filename
,
'r'
,
encoding
=
"utf8"
)
as
file
:
existing_caption
=
file
.
read
()
...
...
modules/textual_inversion/textual_inversion.py
View file @
3ba6c3c8
...
...
@@ -69,7 +69,7 @@ class Embedding:
'hash'
:
self
.
checksum
(),
'optimizer_state_dict'
:
self
.
optimizer_state_dict
,
}
torch
.
save
(
optimizer_saved_dict
,
f
ilename
+
'.optim'
)
torch
.
save
(
optimizer_saved_dict
,
f
"{filename}.optim"
)
def
checksum
(
self
):
if
self
.
cached_checksum
is
not
None
:
...
...
@@ -437,8 +437,8 @@ def train_embedding(id_task, embedding_name, learn_rate, batch_size, gradient_st
optimizer
=
torch
.
optim
.
AdamW
([
embedding
.
vec
],
lr
=
scheduler
.
learn_rate
,
weight_decay
=
0.0
)
if
shared
.
opts
.
save_optimizer_state
:
optimizer_state_dict
=
None
if
os
.
path
.
exists
(
f
ilename
+
'.optim'
):
optimizer_saved_dict
=
torch
.
load
(
f
ilename
+
'.optim'
,
map_location
=
'cpu'
)
if
os
.
path
.
exists
(
f
"{filename}.optim"
):
optimizer_saved_dict
=
torch
.
load
(
f
"{filename}.optim"
,
map_location
=
'cpu'
)
if
embedding
.
checksum
()
==
optimizer_saved_dict
.
get
(
'hash'
,
None
):
optimizer_state_dict
=
optimizer_saved_dict
.
get
(
'optimizer_state_dict'
,
None
)
...
...
@@ -599,7 +599,7 @@ def train_embedding(id_task, embedding_name, learn_rate, batch_size, gradient_st
data
=
torch
.
load
(
last_saved_file
)
info
.
add_text
(
"sd-ti-embedding"
,
embedding_to_b64
(
data
))
title
=
"<{}>"
.
format
(
data
.
get
(
'name'
,
'???'
))
title
=
f
"<{data.get('name', '???')}>"
try
:
vectorSize
=
list
(
data
[
'string_to_param'
]
.
values
())[
0
]
.
shape
[
0
]
...
...
@@ -608,8 +608,8 @@ def train_embedding(id_task, embedding_name, learn_rate, batch_size, gradient_st
checkpoint
=
sd_models
.
select_checkpoint
()
footer_left
=
checkpoint
.
model_name
footer_mid
=
'[{}]'
.
format
(
checkpoint
.
shorthash
)
footer_right
=
'{}v {}s'
.
format
(
vectorSize
,
steps_done
)
footer_mid
=
f
'[{checkpoint.shorthash}]'
footer_right
=
f
'{vectorSize}v {steps_done}s'
captioned_image
=
caption_image_overlay
(
image
,
title
,
footer_left
,
footer_mid
,
footer_right
)
captioned_image
=
insert_image_data_embed
(
captioned_image
,
data
)
...
...
modules/ui.py
View file @
3ba6c3c8
...
...
@@ -101,7 +101,7 @@ def visit(x, func, path=""):
for
c
in
x
.
children
:
visit
(
c
,
func
,
path
)
elif
x
.
label
is
not
None
:
func
(
path
+
"/"
+
str
(
x
.
label
)
,
x
)
func
(
f
"{path}/{x.label}"
,
x
)
def
add_style
(
name
:
str
,
prompt
:
str
,
negative_prompt
:
str
):
...
...
@@ -166,7 +166,7 @@ def process_interrogate(interrogation_function, mode, ii_input_dir, ii_output_di
img
=
Image
.
open
(
image
)
filename
=
os
.
path
.
basename
(
image
)
left
,
_
=
os
.
path
.
splitext
(
filename
)
print
(
interrogation_function
(
img
),
file
=
open
(
os
.
path
.
join
(
ii_output_dir
,
left
+
"
.txt"
),
'a'
))
print
(
interrogation_function
(
img
),
file
=
open
(
os
.
path
.
join
(
ii_output_dir
,
f
"{left}
.txt"
),
'a'
))
return
[
gr
.
update
(),
None
]
...
...
@@ -182,29 +182,29 @@ def interrogate_deepbooru(image):
def
create_seed_inputs
(
target_interface
):
with
FormRow
(
elem_id
=
target_interface
+
'_seed_row'
,
variant
=
"compact"
):
seed
=
(
gr
.
Textbox
if
cmd_opts
.
use_textbox_seed
else
gr
.
Number
)(
label
=
'Seed'
,
value
=-
1
,
elem_id
=
target_interface
+
'_seed'
)
with
FormRow
(
elem_id
=
f
"{target_interface}_seed_row"
,
variant
=
"compact"
):
seed
=
(
gr
.
Textbox
if
cmd_opts
.
use_textbox_seed
else
gr
.
Number
)(
label
=
'Seed'
,
value
=-
1
,
elem_id
=
f
"{target_interface}_seed"
)
seed
.
style
(
container
=
False
)
random_seed
=
ToolButton
(
random_symbol
,
elem_id
=
target_interface
+
'_random_seed'
,
label
=
'Random seed'
)
reuse_seed
=
ToolButton
(
reuse_symbol
,
elem_id
=
target_interface
+
'_reuse_seed'
,
label
=
'Reuse seed'
)
random_seed
=
ToolButton
(
random_symbol
,
elem_id
=
f
"{target_interface}_random_seed"
,
label
=
'Random seed'
)
reuse_seed
=
ToolButton
(
reuse_symbol
,
elem_id
=
f
"{target_interface}_reuse_seed"
,
label
=
'Reuse seed'
)
seed_checkbox
=
gr
.
Checkbox
(
label
=
'Extra'
,
elem_id
=
target_interface
+
'_subseed_show'
,
value
=
False
)
seed_checkbox
=
gr
.
Checkbox
(
label
=
'Extra'
,
elem_id
=
f
"{target_interface}_subseed_show"
,
value
=
False
)
# Components to show/hide based on the 'Extra' checkbox
seed_extras
=
[]
with
FormRow
(
visible
=
False
,
elem_id
=
target_interface
+
'_subseed_row'
)
as
seed_extra_row_1
:
with
FormRow
(
visible
=
False
,
elem_id
=
f
"{target_interface}_subseed_row"
)
as
seed_extra_row_1
:
seed_extras
.
append
(
seed_extra_row_1
)
subseed
=
gr
.
Number
(
label
=
'Variation seed'
,
value
=-
1
,
elem_id
=
target_interface
+
'_subseed'
)
subseed
=
gr
.
Number
(
label
=
'Variation seed'
,
value
=-
1
,
elem_id
=
f
"{target_interface}_subseed"
)
subseed
.
style
(
container
=
False
)
random_subseed
=
ToolButton
(
random_symbol
,
elem_id
=
target_interface
+
'_random_subseed'
)
reuse_subseed
=
ToolButton
(
reuse_symbol
,
elem_id
=
target_interface
+
'_reuse_subseed'
)
subseed_strength
=
gr
.
Slider
(
label
=
'Variation strength'
,
value
=
0.0
,
minimum
=
0
,
maximum
=
1
,
step
=
0.01
,
elem_id
=
target_interface
+
'_subseed_strength'
)
random_subseed
=
ToolButton
(
random_symbol
,
elem_id
=
f
"{target_interface}_random_subseed"
)
reuse_subseed
=
ToolButton
(
reuse_symbol
,
elem_id
=
f
"{target_interface}_reuse_subseed"
)
subseed_strength
=
gr
.
Slider
(
label
=
'Variation strength'
,
value
=
0.0
,
minimum
=
0
,
maximum
=
1
,
step
=
0.01
,
elem_id
=
f
"{target_interface}_subseed_strength"
)
with
FormRow
(
visible
=
False
)
as
seed_extra_row_2
:
seed_extras
.
append
(
seed_extra_row_2
)
seed_resize_from_w
=
gr
.
Slider
(
minimum
=
0
,
maximum
=
2048
,
step
=
8
,
label
=
"Resize seed from width"
,
value
=
0
,
elem_id
=
target_interface
+
'_seed_resize_from_w'
)
seed_resize_from_h
=
gr
.
Slider
(
minimum
=
0
,
maximum
=
2048
,
step
=
8
,
label
=
"Resize seed from height"
,
value
=
0
,
elem_id
=
target_interface
+
'_seed_resize_from_h'
)
seed_resize_from_w
=
gr
.
Slider
(
minimum
=
0
,
maximum
=
2048
,
step
=
8
,
label
=
"Resize seed from width"
,
value
=
0
,
elem_id
=
f
"{target_interface}_seed_resize_from_w"
)
seed_resize_from_h
=
gr
.
Slider
(
minimum
=
0
,
maximum
=
2048
,
step
=
8
,
label
=
"Resize seed from height"
,
value
=
0
,
elem_id
=
f
"{target_interface}_seed_resize_from_h"
)
random_seed
.
click
(
fn
=
lambda
:
-
1
,
show_progress
=
False
,
inputs
=
[],
outputs
=
[
seed
])
random_subseed
.
click
(
fn
=
lambda
:
-
1
,
show_progress
=
False
,
inputs
=
[],
outputs
=
[
subseed
])
...
...
@@ -765,7 +765,7 @@ def create_ui():
)
button
.
click
(
fn
=
lambda
:
None
,
_js
=
"switch_to_"
+
name
.
replace
(
" "
,
"_"
)
,
_js
=
f
"switch_to_{name.replace(' ', '_')}"
,
inputs
=
[],
outputs
=
[],
)
...
...
@@ -1462,18 +1462,18 @@ def create_ui():
elif
t
==
bool
:
comp
=
gr
.
Checkbox
else
:
raise
Exception
(
f
'bad options item type: {
str(t)
} for key {key}'
)
raise
Exception
(
f
'bad options item type: {
t
} for key {key}'
)
elem_id
=
"setting_"
+
key
elem_id
=
f
"setting_{key}"
if
info
.
refresh
is
not
None
:
if
is_quicksettings
:
res
=
comp
(
label
=
info
.
label
,
value
=
fun
(),
elem_id
=
elem_id
,
**
(
args
or
{}))
create_refresh_button
(
res
,
info
.
refresh
,
info
.
component_args
,
"refresh_"
+
key
)
create_refresh_button
(
res
,
info
.
refresh
,
info
.
component_args
,
f
"refresh_{key}"
)
else
:
with
FormRow
():
res
=
comp
(
label
=
info
.
label
,
value
=
fun
(),
elem_id
=
elem_id
,
**
(
args
or
{}))
create_refresh_button
(
res
,
info
.
refresh
,
info
.
component_args
,
"refresh_"
+
key
)
create_refresh_button
(
res
,
info
.
refresh
,
info
.
component_args
,
f
"refresh_{key}"
)
else
:
res
=
comp
(
label
=
info
.
label
,
value
=
fun
(),
elem_id
=
elem_id
,
**
(
args
or
{}))
...
...
@@ -1545,7 +1545,7 @@ def create_ui():
current_tab
.
__exit__
()
gr
.
Group
()
current_tab
=
gr
.
TabItem
(
elem_id
=
"settings_{}"
.
format
(
elem_id
)
,
label
=
text
)
current_tab
=
gr
.
TabItem
(
elem_id
=
f
"settings_{elem_id}"
,
label
=
text
)
current_tab
.
__enter__
()
current_row
=
gr
.
Column
(
variant
=
'compact'
)
current_row
.
__enter__
()
...
...
@@ -1664,7 +1664,7 @@ def create_ui():
for
interface
,
label
,
ifid
in
interfaces
:
if
label
in
shared
.
opts
.
hidden_tabs
:
continue
with
gr
.
TabItem
(
label
,
id
=
ifid
,
elem_id
=
'tab_'
+
ifid
):
with
gr
.
TabItem
(
label
,
id
=
ifid
,
elem_id
=
f
"tab_{ifid}"
):
interface
.
render
()
if
os
.
path
.
exists
(
os
.
path
.
join
(
script_path
,
"notification.mp3"
)):
...
...
@@ -1771,10 +1771,10 @@ def create_ui():
def
loadsave
(
path
,
x
):
def
apply_field
(
obj
,
field
,
condition
=
None
,
init_field
=
None
):
key
=
path
+
"/"
+
field
key
=
f
"{path}/{field}"
if
getattr
(
obj
,
'custom_script_source'
,
None
)
is
not
None
:
key
=
'customscript/'
+
obj
.
custom_script_source
+
'/'
+
key
key
=
f
"customscript/{obj.custom_script_source}/{key}"
if
getattr
(
obj
,
'do_not_save_to_config'
,
False
):
return
...
...
modules/ui_extensions.py
View file @
3ba6c3c8
...
...
@@ -61,7 +61,8 @@ def save_config_state(name):
if
not
name
:
name
=
"Config"
current_config_state
[
"name"
]
=
name
filename
=
os
.
path
.
join
(
config_states_dir
,
datetime
.
now
()
.
strftime
(
"
%
Y_
%
m_
%
d-
%
H_
%
M_
%
S"
)
+
"_"
+
name
+
".json"
)
timestamp
=
datetime
.
now
()
.
strftime
(
'
%
Y_
%
m_
%
d-
%
H_
%
M_
%
S'
)
filename
=
os
.
path
.
join
(
config_states_dir
,
f
"{timestamp}_{name}.json"
)
print
(
f
"Saving backup of webui/extension state to {filename}."
)
with
open
(
filename
,
"w"
,
encoding
=
"utf-8"
)
as
f
:
json
.
dump
(
current_config_state
,
f
)
...
...
modules/ui_extra_networks.py
View file @
3ba6c3c8
...
...
@@ -69,7 +69,9 @@ class ExtraNetworksPage:
pass
def
link_preview
(
self
,
filename
):
return
"./sd_extra_networks/thumb?filename="
+
urllib
.
parse
.
quote
(
filename
.
replace
(
'
\\
'
,
'/'
))
+
"&mtime="
+
str
(
os
.
path
.
getmtime
(
filename
))
quoted_filename
=
urllib
.
parse
.
quote
(
filename
.
replace
(
'
\\
'
,
'/'
))
mtime
=
os
.
path
.
getmtime
(
filename
)
return
f
"./sd_extra_networks/thumb?filename={quoted_filename}&mtime={mtime}"
def
search_terms_from_path
(
self
,
filename
,
possible_directories
=
None
):
abspath
=
os
.
path
.
abspath
(
filename
)
...
...
scripts/custom_code.py
View file @
3ba6c3c8
...
...
@@ -77,7 +77,7 @@ return process_images(p)
module
.
display
=
display
indent
=
" "
*
indent_level
indented
=
code
.
replace
(
'
\n
'
,
'
\n
'
+
indent
)
indented
=
code
.
replace
(
'
\n
'
,
f
"
\n
{indent}"
)
body
=
f
"""def __webuitemp__():
{indent}{indented}
__webuitemp__()"""
...
...
scripts/loopback.py
View file @
3ba6c3c8
...
...
@@ -84,7 +84,7 @@ class Script(scripts.Script):
p
.
color_corrections
=
initial_color_corrections
if
append_interrogation
!=
"None"
:
p
.
prompt
=
original_prompt
+
", "
if
original_prompt
!=
""
else
""
p
.
prompt
=
f
"{original_prompt}, "
if
original_prompt
else
""
if
append_interrogation
==
"CLIP"
:
p
.
prompt
+=
shared
.
interrogator
.
interrogate
(
p
.
init_images
[
0
])
elif
append_interrogation
==
"DeepBooru"
:
...
...
scripts/xyz_grid.py
View file @
3ba6c3c8
...
...
@@ -439,7 +439,7 @@ class Script(scripts.Script):
z_type
.
change
(
fn
=
select_axis
,
inputs
=
[
z_type
,
z_values_dropdown
],
outputs
=
[
fill_z_button
,
z_values
,
z_values_dropdown
])
def
get_dropdown_update_from_params
(
axis
,
params
):
val_key
=
axis
+
"
Values"
val_key
=
f
"{axis}
Values"
vals
=
params
.
get
(
val_key
,
""
)
valslist
=
[
x
.
strip
()
for
x
in
chain
.
from_iterable
(
csv
.
reader
(
StringIO
(
vals
)))
if
x
]
return
gr
.
update
(
value
=
valslist
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment