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
d6a9b22c
Commit
d6a9b22c
authored
May 09, 2023
by
AUTOMATIC1111
Committed by
GitHub
May 09, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #10232 from akx/eff
Fix up string formatting/concatenation to f-strings where feasible
parents
ccbb3618
3ba6c3c8
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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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 @
d6a9b22c
...
...
@@ -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