liluzivert commited on
Commit
94276c7
1 Parent(s): f774f85

Upload 23 files

Browse files
Files changed (23) hide show
  1. .gitignore +36 -0
  2. .pylintrc +3 -0
  3. CHANGELOG.md +62 -0
  4. CODEOWNERS +12 -0
  5. LICENSE.txt +663 -0
  6. README.md +162 -13
  7. cache.json +8 -0
  8. config.json +166 -0
  9. environment-wsl2.yaml +11 -0
  10. launch.py +353 -0
  11. params.txt +2 -0
  12. requirements.txt +33 -0
  13. requirements_versions.txt +30 -0
  14. screenshot.png +0 -0
  15. script.js +104 -0
  16. style.css +859 -0
  17. ui-config.json +623 -0
  18. webui-macos-env.sh +19 -0
  19. webui-user.bat +10 -0
  20. webui-user.sh +49 -0
  21. webui.bat +85 -0
  22. webui.py +413 -0
  23. webui.sh +202 -0
.gitignore ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ __pycache__
2
+ *.ckpt
3
+ *.safetensors
4
+ *.pth
5
+ /ESRGAN/*
6
+ /SwinIR/*
7
+ /repositories
8
+ /venv
9
+ /tmp
10
+ /model.ckpt
11
+ /models/**/*
12
+ /GFPGANv1.3.pth
13
+ /gfpgan/weights/*.pth
14
+ /ui-config.json
15
+ /outputs
16
+ /config.json
17
+ /log
18
+ /webui.settings.bat
19
+ /embeddings
20
+ /styles.csv
21
+ /params.txt
22
+ /styles.csv.bak
23
+ /webui-user.bat
24
+ /webui-user.sh
25
+ /interrogate
26
+ /user.css
27
+ /.idea
28
+ notification.mp3
29
+ /SwinIR
30
+ /textual_inversion
31
+ .vscode
32
+ /extensions
33
+ /test/stdout.txt
34
+ /test/stderr.txt
35
+ /cache.json*
36
+ /config_states/
.pylintrc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # See https://pylint.pycqa.org/en/latest/user_guide/messages/message_control.html
2
+ [MESSAGES CONTROL]
3
+ disable=C,R,W,E,I
CHANGELOG.md ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## 1.1.1
2
+ ### Bug Fixes:
3
+ * fix an error that prevents running webui on torch<2.0 without --disable-safe-unpickle
4
+
5
+ ## 1.1.0
6
+ ### Features:
7
+ * switch to torch 2.0.0 (except for AMD GPUs)
8
+ * visual improvements to custom code scripts
9
+ * add filename patterns: [clip_skip], [hasprompt<>], [batch_number], [generation_number]
10
+ * add support for saving init images in img2img, and record their hashes in infotext for reproducability
11
+ * automatically select current word when adjusting weight with ctrl+up/down
12
+ * add dropdowns for X/Y/Z plot
13
+ * setting: Stable Diffusion/Random number generator source: makes it possible to make images generated from a given manual seed consistent across different GPUs
14
+ * support Gradio's theme API
15
+ * use TCMalloc on Linux by default; possible fix for memory leaks
16
+ * (optimization) option to remove negative conditioning at low sigma values #9177
17
+ * embed model merge metadata in .safetensors file
18
+ * extension settings backup/restore feature #9169
19
+ * add "resize by" and "resize to" tabs to img2img
20
+ * add option "keep original size" to textual inversion images preprocess
21
+ * image viewer scrolling via analog stick
22
+ * button to restore the progress from session lost / tab reload
23
+
24
+ ### Minor:
25
+ * gradio bumped to 3.28.1
26
+ * in extra tab, change extras "scale to" to sliders
27
+ * add labels to tool buttons to make it possible to hide them
28
+ * add tiled inference support for ScuNET
29
+ * add branch support for extension installation
30
+ * change linux installation script to insall into current directory rather than /home/username
31
+ * sort textual inversion embeddings by name (case insensitive)
32
+ * allow styles.csv to be symlinked or mounted in docker
33
+ * remove the "do not add watermark to images" option
34
+ * make selected tab configurable with UI config
35
+ * extra networks UI in now fixed height and scrollable
36
+ * add disable_tls_verify arg for use with self-signed certs
37
+
38
+ ### Extensions:
39
+ * Add reload callback
40
+ * add is_hr_pass field for processing
41
+
42
+ ### Bug Fixes:
43
+ * fix broken batch image processing on 'Extras/Batch Process' tab
44
+ * add "None" option to extra networks dropdowns
45
+ * fix FileExistsError for CLIP Interrogator
46
+ * fix /sdapi/v1/txt2img endpoint not working on Linux #9319
47
+ * fix disappearing live previews and progressbar during slow tasks
48
+ * fix fullscreen image view not working properly in some cases
49
+ * prevent alwayson_scripts args param resizing script_arg list when they are inserted in it
50
+ * fix prompt schedule for second order samplers
51
+ * fix image mask/composite for weird resolutions #9628
52
+ * use correct images for previews when using AND (see #9491)
53
+ * one broken image in img2img batch won't stop all processing
54
+ * fix image orientation bug in train/preprocess
55
+ * fix Ngrok recreating tunnels every reload
56
+ * fix --realesrgan-models-path and --ldsr-models-path not working
57
+ * fix --skip-install not working
58
+ * outpainting Mk2 & Poorman should use the SAMPLE file format to save images, not GRID file format
59
+ * do not fail all Loras if some have failed to load when making a picture
60
+
61
+ ## 1.0.0
62
+ * everything
CODEOWNERS ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ * @AUTOMATIC1111
2
+
3
+ # if you were managing a localization and were removed from this file, this is because
4
+ # the intended way to do localizations now is via extensions. See:
5
+ # https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Developing-extensions
6
+ # Make a repo with your localization and since you are still listed as a collaborator
7
+ # you can add it to the wiki page yourself. This change is because some people complained
8
+ # the git commit log is cluttered with things unrelated to almost everyone and
9
+ # because I believe this is the best overall for the project to handle localizations almost
10
+ # entirely without my oversight.
11
+
12
+
LICENSE.txt ADDED
@@ -0,0 +1,663 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU AFFERO GENERAL PUBLIC LICENSE
2
+ Version 3, 19 November 2007
3
+
4
+ Copyright (c) 2023 AUTOMATIC1111
5
+
6
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
7
+ Everyone is permitted to copy and distribute verbatim copies
8
+ of this license document, but changing it is not allowed.
9
+
10
+ Preamble
11
+
12
+ The GNU Affero General Public License is a free, copyleft license for
13
+ software and other kinds of works, specifically designed to ensure
14
+ cooperation with the community in the case of network server software.
15
+
16
+ The licenses for most software and other practical works are designed
17
+ to take away your freedom to share and change the works. By contrast,
18
+ our General Public Licenses are intended to guarantee your freedom to
19
+ share and change all versions of a program--to make sure it remains free
20
+ software for all its users.
21
+
22
+ When we speak of free software, we are referring to freedom, not
23
+ price. Our General Public Licenses are designed to make sure that you
24
+ have the freedom to distribute copies of free software (and charge for
25
+ them if you wish), that you receive source code or can get it if you
26
+ want it, that you can change the software or use pieces of it in new
27
+ free programs, and that you know you can do these things.
28
+
29
+ Developers that use our General Public Licenses protect your rights
30
+ with two steps: (1) assert copyright on the software, and (2) offer
31
+ you this License which gives you legal permission to copy, distribute
32
+ and/or modify the software.
33
+
34
+ A secondary benefit of defending all users' freedom is that
35
+ improvements made in alternate versions of the program, if they
36
+ receive widespread use, become available for other developers to
37
+ incorporate. Many developers of free software are heartened and
38
+ encouraged by the resulting cooperation. However, in the case of
39
+ software used on network servers, this result may fail to come about.
40
+ The GNU General Public License permits making a modified version and
41
+ letting the public access it on a server without ever releasing its
42
+ source code to the public.
43
+
44
+ The GNU Affero General Public License is designed specifically to
45
+ ensure that, in such cases, the modified source code becomes available
46
+ to the community. It requires the operator of a network server to
47
+ provide the source code of the modified version running there to the
48
+ users of that server. Therefore, public use of a modified version, on
49
+ a publicly accessible server, gives the public access to the source
50
+ code of the modified version.
51
+
52
+ An older license, called the Affero General Public License and
53
+ published by Affero, was designed to accomplish similar goals. This is
54
+ a different license, not a version of the Affero GPL, but Affero has
55
+ released a new version of the Affero GPL which permits relicensing under
56
+ this license.
57
+
58
+ The precise terms and conditions for copying, distribution and
59
+ modification follow.
60
+
61
+ TERMS AND CONDITIONS
62
+
63
+ 0. Definitions.
64
+
65
+ "This License" refers to version 3 of the GNU Affero General Public License.
66
+
67
+ "Copyright" also means copyright-like laws that apply to other kinds of
68
+ works, such as semiconductor masks.
69
+
70
+ "The Program" refers to any copyrightable work licensed under this
71
+ License. Each licensee is addressed as "you". "Licensees" and
72
+ "recipients" may be individuals or organizations.
73
+
74
+ To "modify" a work means to copy from or adapt all or part of the work
75
+ in a fashion requiring copyright permission, other than the making of an
76
+ exact copy. The resulting work is called a "modified version" of the
77
+ earlier work or a work "based on" the earlier work.
78
+
79
+ A "covered work" means either the unmodified Program or a work based
80
+ on the Program.
81
+
82
+ To "propagate" a work means to do anything with it that, without
83
+ permission, would make you directly or secondarily liable for
84
+ infringement under applicable copyright law, except executing it on a
85
+ computer or modifying a private copy. Propagation includes copying,
86
+ distribution (with or without modification), making available to the
87
+ public, and in some countries other activities as well.
88
+
89
+ To "convey" a work means any kind of propagation that enables other
90
+ parties to make or receive copies. Mere interaction with a user through
91
+ a computer network, with no transfer of a copy, is not conveying.
92
+
93
+ An interactive user interface displays "Appropriate Legal Notices"
94
+ to the extent that it includes a convenient and prominently visible
95
+ feature that (1) displays an appropriate copyright notice, and (2)
96
+ tells the user that there is no warranty for the work (except to the
97
+ extent that warranties are provided), that licensees may convey the
98
+ work under this License, and how to view a copy of this License. If
99
+ the interface presents a list of user commands or options, such as a
100
+ menu, a prominent item in the list meets this criterion.
101
+
102
+ 1. Source Code.
103
+
104
+ The "source code" for a work means the preferred form of the work
105
+ for making modifications to it. "Object code" means any non-source
106
+ form of a work.
107
+
108
+ A "Standard Interface" means an interface that either is an official
109
+ standard defined by a recognized standards body, or, in the case of
110
+ interfaces specified for a particular programming language, one that
111
+ is widely used among developers working in that language.
112
+
113
+ The "System Libraries" of an executable work include anything, other
114
+ than the work as a whole, that (a) is included in the normal form of
115
+ packaging a Major Component, but which is not part of that Major
116
+ Component, and (b) serves only to enable use of the work with that
117
+ Major Component, or to implement a Standard Interface for which an
118
+ implementation is available to the public in source code form. A
119
+ "Major Component", in this context, means a major essential component
120
+ (kernel, window system, and so on) of the specific operating system
121
+ (if any) on which the executable work runs, or a compiler used to
122
+ produce the work, or an object code interpreter used to run it.
123
+
124
+ The "Corresponding Source" for a work in object code form means all
125
+ the source code needed to generate, install, and (for an executable
126
+ work) run the object code and to modify the work, including scripts to
127
+ control those activities. However, it does not include the work's
128
+ System Libraries, or general-purpose tools or generally available free
129
+ programs which are used unmodified in performing those activities but
130
+ which are not part of the work. For example, Corresponding Source
131
+ includes interface definition files associated with source files for
132
+ the work, and the source code for shared libraries and dynamically
133
+ linked subprograms that the work is specifically designed to require,
134
+ such as by intimate data communication or control flow between those
135
+ subprograms and other parts of the work.
136
+
137
+ The Corresponding Source need not include anything that users
138
+ can regenerate automatically from other parts of the Corresponding
139
+ Source.
140
+
141
+ The Corresponding Source for a work in source code form is that
142
+ same work.
143
+
144
+ 2. Basic Permissions.
145
+
146
+ All rights granted under this License are granted for the term of
147
+ copyright on the Program, and are irrevocable provided the stated
148
+ conditions are met. This License explicitly affirms your unlimited
149
+ permission to run the unmodified Program. The output from running a
150
+ covered work is covered by this License only if the output, given its
151
+ content, constitutes a covered work. This License acknowledges your
152
+ rights of fair use or other equivalent, as provided by copyright law.
153
+
154
+ You may make, run and propagate covered works that you do not
155
+ convey, without conditions so long as your license otherwise remains
156
+ in force. You may convey covered works to others for the sole purpose
157
+ of having them make modifications exclusively for you, or provide you
158
+ with facilities for running those works, provided that you comply with
159
+ the terms of this License in conveying all material for which you do
160
+ not control copyright. Those thus making or running the covered works
161
+ for you must do so exclusively on your behalf, under your direction
162
+ and control, on terms that prohibit them from making any copies of
163
+ your copyrighted material outside their relationship with you.
164
+
165
+ Conveying under any other circumstances is permitted solely under
166
+ the conditions stated below. Sublicensing is not allowed; section 10
167
+ makes it unnecessary.
168
+
169
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
170
+
171
+ No covered work shall be deemed part of an effective technological
172
+ measure under any applicable law fulfilling obligations under article
173
+ 11 of the WIPO copyright treaty adopted on 20 December 1996, or
174
+ similar laws prohibiting or restricting circumvention of such
175
+ measures.
176
+
177
+ When you convey a covered work, you waive any legal power to forbid
178
+ circumvention of technological measures to the extent such circumvention
179
+ is effected by exercising rights under this License with respect to
180
+ the covered work, and you disclaim any intention to limit operation or
181
+ modification of the work as a means of enforcing, against the work's
182
+ users, your or third parties' legal rights to forbid circumvention of
183
+ technological measures.
184
+
185
+ 4. Conveying Verbatim Copies.
186
+
187
+ You may convey verbatim copies of the Program's source code as you
188
+ receive it, in any medium, provided that you conspicuously and
189
+ appropriately publish on each copy an appropriate copyright notice;
190
+ keep intact all notices stating that this License and any
191
+ non-permissive terms added in accord with section 7 apply to the code;
192
+ keep intact all notices of the absence of any warranty; and give all
193
+ recipients a copy of this License along with the Program.
194
+
195
+ You may charge any price or no price for each copy that you convey,
196
+ and you may offer support or warranty protection for a fee.
197
+
198
+ 5. Conveying Modified Source Versions.
199
+
200
+ You may convey a work based on the Program, or the modifications to
201
+ produce it from the Program, in the form of source code under the
202
+ terms of section 4, provided that you also meet all of these conditions:
203
+
204
+ a) The work must carry prominent notices stating that you modified
205
+ it, and giving a relevant date.
206
+
207
+ b) The work must carry prominent notices stating that it is
208
+ released under this License and any conditions added under section
209
+ 7. This requirement modifies the requirement in section 4 to
210
+ "keep intact all notices".
211
+
212
+ c) You must license the entire work, as a whole, under this
213
+ License to anyone who comes into possession of a copy. This
214
+ License will therefore apply, along with any applicable section 7
215
+ additional terms, to the whole of the work, and all its parts,
216
+ regardless of how they are packaged. This License gives no
217
+ permission to license the work in any other way, but it does not
218
+ invalidate such permission if you have separately received it.
219
+
220
+ d) If the work has interactive user interfaces, each must display
221
+ Appropriate Legal Notices; however, if the Program has interactive
222
+ interfaces that do not display Appropriate Legal Notices, your
223
+ work need not make them do so.
224
+
225
+ A compilation of a covered work with other separate and independent
226
+ works, which are not by their nature extensions of the covered work,
227
+ and which are not combined with it such as to form a larger program,
228
+ in or on a volume of a storage or distribution medium, is called an
229
+ "aggregate" if the compilation and its resulting copyright are not
230
+ used to limit the access or legal rights of the compilation's users
231
+ beyond what the individual works permit. Inclusion of a covered work
232
+ in an aggregate does not cause this License to apply to the other
233
+ parts of the aggregate.
234
+
235
+ 6. Conveying Non-Source Forms.
236
+
237
+ You may convey a covered work in object code form under the terms
238
+ of sections 4 and 5, provided that you also convey the
239
+ machine-readable Corresponding Source under the terms of this License,
240
+ in one of these ways:
241
+
242
+ a) Convey the object code in, or embodied in, a physical product
243
+ (including a physical distribution medium), accompanied by the
244
+ Corresponding Source fixed on a durable physical medium
245
+ customarily used for software interchange.
246
+
247
+ b) Convey the object code in, or embodied in, a physical product
248
+ (including a physical distribution medium), accompanied by a
249
+ written offer, valid for at least three years and valid for as
250
+ long as you offer spare parts or customer support for that product
251
+ model, to give anyone who possesses the object code either (1) a
252
+ copy of the Corresponding Source for all the software in the
253
+ product that is covered by this License, on a durable physical
254
+ medium customarily used for software interchange, for a price no
255
+ more than your reasonable cost of physically performing this
256
+ conveying of source, or (2) access to copy the
257
+ Corresponding Source from a network server at no charge.
258
+
259
+ c) Convey individual copies of the object code with a copy of the
260
+ written offer to provide the Corresponding Source. This
261
+ alternative is allowed only occasionally and noncommercially, and
262
+ only if you received the object code with such an offer, in accord
263
+ with subsection 6b.
264
+
265
+ d) Convey the object code by offering access from a designated
266
+ place (gratis or for a charge), and offer equivalent access to the
267
+ Corresponding Source in the same way through the same place at no
268
+ further charge. You need not require recipients to copy the
269
+ Corresponding Source along with the object code. If the place to
270
+ copy the object code is a network server, the Corresponding Source
271
+ may be on a different server (operated by you or a third party)
272
+ that supports equivalent copying facilities, provided you maintain
273
+ clear directions next to the object code saying where to find the
274
+ Corresponding Source. Regardless of what server hosts the
275
+ Corresponding Source, you remain obligated to ensure that it is
276
+ available for as long as needed to satisfy these requirements.
277
+
278
+ e) Convey the object code using peer-to-peer transmission, provided
279
+ you inform other peers where the object code and Corresponding
280
+ Source of the work are being offered to the general public at no
281
+ charge under subsection 6d.
282
+
283
+ A separable portion of the object code, whose source code is excluded
284
+ from the Corresponding Source as a System Library, need not be
285
+ included in conveying the object code work.
286
+
287
+ A "User Product" is either (1) a "consumer product", which means any
288
+ tangible personal property which is normally used for personal, family,
289
+ or household purposes, or (2) anything designed or sold for incorporation
290
+ into a dwelling. In determining whether a product is a consumer product,
291
+ doubtful cases shall be resolved in favor of coverage. For a particular
292
+ product received by a particular user, "normally used" refers to a
293
+ typical or common use of that class of product, regardless of the status
294
+ of the particular user or of the way in which the particular user
295
+ actually uses, or expects or is expected to use, the product. A product
296
+ is a consumer product regardless of whether the product has substantial
297
+ commercial, industrial or non-consumer uses, unless such uses represent
298
+ the only significant mode of use of the product.
299
+
300
+ "Installation Information" for a User Product means any methods,
301
+ procedures, authorization keys, or other information required to install
302
+ and execute modified versions of a covered work in that User Product from
303
+ a modified version of its Corresponding Source. The information must
304
+ suffice to ensure that the continued functioning of the modified object
305
+ code is in no case prevented or interfered with solely because
306
+ modification has been made.
307
+
308
+ If you convey an object code work under this section in, or with, or
309
+ specifically for use in, a User Product, and the conveying occurs as
310
+ part of a transaction in which the right of possession and use of the
311
+ User Product is transferred to the recipient in perpetuity or for a
312
+ fixed term (regardless of how the transaction is characterized), the
313
+ Corresponding Source conveyed under this section must be accompanied
314
+ by the Installation Information. But this requirement does not apply
315
+ if neither you nor any third party retains the ability to install
316
+ modified object code on the User Product (for example, the work has
317
+ been installed in ROM).
318
+
319
+ The requirement to provide Installation Information does not include a
320
+ requirement to continue to provide support service, warranty, or updates
321
+ for a work that has been modified or installed by the recipient, or for
322
+ the User Product in which it has been modified or installed. Access to a
323
+ network may be denied when the modification itself materially and
324
+ adversely affects the operation of the network or violates the rules and
325
+ protocols for communication across the network.
326
+
327
+ Corresponding Source conveyed, and Installation Information provided,
328
+ in accord with this section must be in a format that is publicly
329
+ documented (and with an implementation available to the public in
330
+ source code form), and must require no special password or key for
331
+ unpacking, reading or copying.
332
+
333
+ 7. Additional Terms.
334
+
335
+ "Additional permissions" are terms that supplement the terms of this
336
+ License by making exceptions from one or more of its conditions.
337
+ Additional permissions that are applicable to the entire Program shall
338
+ be treated as though they were included in this License, to the extent
339
+ that they are valid under applicable law. If additional permissions
340
+ apply only to part of the Program, that part may be used separately
341
+ under those permissions, but the entire Program remains governed by
342
+ this License without regard to the additional permissions.
343
+
344
+ When you convey a copy of a covered work, you may at your option
345
+ remove any additional permissions from that copy, or from any part of
346
+ it. (Additional permissions may be written to require their own
347
+ removal in certain cases when you modify the work.) You may place
348
+ additional permissions on material, added by you to a covered work,
349
+ for which you have or can give appropriate copyright permission.
350
+
351
+ Notwithstanding any other provision of this License, for material you
352
+ add to a covered work, you may (if authorized by the copyright holders of
353
+ that material) supplement the terms of this License with terms:
354
+
355
+ a) Disclaiming warranty or limiting liability differently from the
356
+ terms of sections 15 and 16 of this License; or
357
+
358
+ b) Requiring preservation of specified reasonable legal notices or
359
+ author attributions in that material or in the Appropriate Legal
360
+ Notices displayed by works containing it; or
361
+
362
+ c) Prohibiting misrepresentation of the origin of that material, or
363
+ requiring that modified versions of such material be marked in
364
+ reasonable ways as different from the original version; or
365
+
366
+ d) Limiting the use for publicity purposes of names of licensors or
367
+ authors of the material; or
368
+
369
+ e) Declining to grant rights under trademark law for use of some
370
+ trade names, trademarks, or service marks; or
371
+
372
+ f) Requiring indemnification of licensors and authors of that
373
+ material by anyone who conveys the material (or modified versions of
374
+ it) with contractual assumptions of liability to the recipient, for
375
+ any liability that these contractual assumptions directly impose on
376
+ those licensors and authors.
377
+
378
+ All other non-permissive additional terms are considered "further
379
+ restrictions" within the meaning of section 10. If the Program as you
380
+ received it, or any part of it, contains a notice stating that it is
381
+ governed by this License along with a term that is a further
382
+ restriction, you may remove that term. If a license document contains
383
+ a further restriction but permits relicensing or conveying under this
384
+ License, you may add to a covered work material governed by the terms
385
+ of that license document, provided that the further restriction does
386
+ not survive such relicensing or conveying.
387
+
388
+ If you add terms to a covered work in accord with this section, you
389
+ must place, in the relevant source files, a statement of the
390
+ additional terms that apply to those files, or a notice indicating
391
+ where to find the applicable terms.
392
+
393
+ Additional terms, permissive or non-permissive, may be stated in the
394
+ form of a separately written license, or stated as exceptions;
395
+ the above requirements apply either way.
396
+
397
+ 8. Termination.
398
+
399
+ You may not propagate or modify a covered work except as expressly
400
+ provided under this License. Any attempt otherwise to propagate or
401
+ modify it is void, and will automatically terminate your rights under
402
+ this License (including any patent licenses granted under the third
403
+ paragraph of section 11).
404
+
405
+ However, if you cease all violation of this License, then your
406
+ license from a particular copyright holder is reinstated (a)
407
+ provisionally, unless and until the copyright holder explicitly and
408
+ finally terminates your license, and (b) permanently, if the copyright
409
+ holder fails to notify you of the violation by some reasonable means
410
+ prior to 60 days after the cessation.
411
+
412
+ Moreover, your license from a particular copyright holder is
413
+ reinstated permanently if the copyright holder notifies you of the
414
+ violation by some reasonable means, this is the first time you have
415
+ received notice of violation of this License (for any work) from that
416
+ copyright holder, and you cure the violation prior to 30 days after
417
+ your receipt of the notice.
418
+
419
+ Termination of your rights under this section does not terminate the
420
+ licenses of parties who have received copies or rights from you under
421
+ this License. If your rights have been terminated and not permanently
422
+ reinstated, you do not qualify to receive new licenses for the same
423
+ material under section 10.
424
+
425
+ 9. Acceptance Not Required for Having Copies.
426
+
427
+ You are not required to accept this License in order to receive or
428
+ run a copy of the Program. Ancillary propagation of a covered work
429
+ occurring solely as a consequence of using peer-to-peer transmission
430
+ to receive a copy likewise does not require acceptance. However,
431
+ nothing other than this License grants you permission to propagate or
432
+ modify any covered work. These actions infringe copyright if you do
433
+ not accept this License. Therefore, by modifying or propagating a
434
+ covered work, you indicate your acceptance of this License to do so.
435
+
436
+ 10. Automatic Licensing of Downstream Recipients.
437
+
438
+ Each time you convey a covered work, the recipient automatically
439
+ receives a license from the original licensors, to run, modify and
440
+ propagate that work, subject to this License. You are not responsible
441
+ for enforcing compliance by third parties with this License.
442
+
443
+ An "entity transaction" is a transaction transferring control of an
444
+ organization, or substantially all assets of one, or subdividing an
445
+ organization, or merging organizations. If propagation of a covered
446
+ work results from an entity transaction, each party to that
447
+ transaction who receives a copy of the work also receives whatever
448
+ licenses to the work the party's predecessor in interest had or could
449
+ give under the previous paragraph, plus a right to possession of the
450
+ Corresponding Source of the work from the predecessor in interest, if
451
+ the predecessor has it or can get it with reasonable efforts.
452
+
453
+ You may not impose any further restrictions on the exercise of the
454
+ rights granted or affirmed under this License. For example, you may
455
+ not impose a license fee, royalty, or other charge for exercise of
456
+ rights granted under this License, and you may not initiate litigation
457
+ (including a cross-claim or counterclaim in a lawsuit) alleging that
458
+ any patent claim is infringed by making, using, selling, offering for
459
+ sale, or importing the Program or any portion of it.
460
+
461
+ 11. Patents.
462
+
463
+ A "contributor" is a copyright holder who authorizes use under this
464
+ License of the Program or a work on which the Program is based. The
465
+ work thus licensed is called the contributor's "contributor version".
466
+
467
+ A contributor's "essential patent claims" are all patent claims
468
+ owned or controlled by the contributor, whether already acquired or
469
+ hereafter acquired, that would be infringed by some manner, permitted
470
+ by this License, of making, using, or selling its contributor version,
471
+ but do not include claims that would be infringed only as a
472
+ consequence of further modification of the contributor version. For
473
+ purposes of this definition, "control" includes the right to grant
474
+ patent sublicenses in a manner consistent with the requirements of
475
+ this License.
476
+
477
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
478
+ patent license under the contributor's essential patent claims, to
479
+ make, use, sell, offer for sale, import and otherwise run, modify and
480
+ propagate the contents of its contributor version.
481
+
482
+ In the following three paragraphs, a "patent license" is any express
483
+ agreement or commitment, however denominated, not to enforce a patent
484
+ (such as an express permission to practice a patent or covenant not to
485
+ sue for patent infringement). To "grant" such a patent license to a
486
+ party means to make such an agreement or commitment not to enforce a
487
+ patent against the party.
488
+
489
+ If you convey a covered work, knowingly relying on a patent license,
490
+ and the Corresponding Source of the work is not available for anyone
491
+ to copy, free of charge and under the terms of this License, through a
492
+ publicly available network server or other readily accessible means,
493
+ then you must either (1) cause the Corresponding Source to be so
494
+ available, or (2) arrange to deprive yourself of the benefit of the
495
+ patent license for this particular work, or (3) arrange, in a manner
496
+ consistent with the requirements of this License, to extend the patent
497
+ license to downstream recipients. "Knowingly relying" means you have
498
+ actual knowledge that, but for the patent license, your conveying the
499
+ covered work in a country, or your recipient's use of the covered work
500
+ in a country, would infringe one or more identifiable patents in that
501
+ country that you have reason to believe are valid.
502
+
503
+ If, pursuant to or in connection with a single transaction or
504
+ arrangement, you convey, or propagate by procuring conveyance of, a
505
+ covered work, and grant a patent license to some of the parties
506
+ receiving the covered work authorizing them to use, propagate, modify
507
+ or convey a specific copy of the covered work, then the patent license
508
+ you grant is automatically extended to all recipients of the covered
509
+ work and works based on it.
510
+
511
+ A patent license is "discriminatory" if it does not include within
512
+ the scope of its coverage, prohibits the exercise of, or is
513
+ conditioned on the non-exercise of one or more of the rights that are
514
+ specifically granted under this License. You may not convey a covered
515
+ work if you are a party to an arrangement with a third party that is
516
+ in the business of distributing software, under which you make payment
517
+ to the third party based on the extent of your activity of conveying
518
+ the work, and under which the third party grants, to any of the
519
+ parties who would receive the covered work from you, a discriminatory
520
+ patent license (a) in connection with copies of the covered work
521
+ conveyed by you (or copies made from those copies), or (b) primarily
522
+ for and in connection with specific products or compilations that
523
+ contain the covered work, unless you entered into that arrangement,
524
+ or that patent license was granted, prior to 28 March 2007.
525
+
526
+ Nothing in this License shall be construed as excluding or limiting
527
+ any implied license or other defenses to infringement that may
528
+ otherwise be available to you under applicable patent law.
529
+
530
+ 12. No Surrender of Others' Freedom.
531
+
532
+ If conditions are imposed on you (whether by court order, agreement or
533
+ otherwise) that contradict the conditions of this License, they do not
534
+ excuse you from the conditions of this License. If you cannot convey a
535
+ covered work so as to satisfy simultaneously your obligations under this
536
+ License and any other pertinent obligations, then as a consequence you may
537
+ not convey it at all. For example, if you agree to terms that obligate you
538
+ to collect a royalty for further conveying from those to whom you convey
539
+ the Program, the only way you could satisfy both those terms and this
540
+ License would be to refrain entirely from conveying the Program.
541
+
542
+ 13. Remote Network Interaction; Use with the GNU General Public License.
543
+
544
+ Notwithstanding any other provision of this License, if you modify the
545
+ Program, your modified version must prominently offer all users
546
+ interacting with it remotely through a computer network (if your version
547
+ supports such interaction) an opportunity to receive the Corresponding
548
+ Source of your version by providing access to the Corresponding Source
549
+ from a network server at no charge, through some standard or customary
550
+ means of facilitating copying of software. This Corresponding Source
551
+ shall include the Corresponding Source for any work covered by version 3
552
+ of the GNU General Public License that is incorporated pursuant to the
553
+ following paragraph.
554
+
555
+ Notwithstanding any other provision of this License, you have
556
+ permission to link or combine any covered work with a work licensed
557
+ under version 3 of the GNU General Public License into a single
558
+ combined work, and to convey the resulting work. The terms of this
559
+ License will continue to apply to the part which is the covered work,
560
+ but the work with which it is combined will remain governed by version
561
+ 3 of the GNU General Public License.
562
+
563
+ 14. Revised Versions of this License.
564
+
565
+ The Free Software Foundation may publish revised and/or new versions of
566
+ the GNU Affero General Public License from time to time. Such new versions
567
+ will be similar in spirit to the present version, but may differ in detail to
568
+ address new problems or concerns.
569
+
570
+ Each version is given a distinguishing version number. If the
571
+ Program specifies that a certain numbered version of the GNU Affero General
572
+ Public License "or any later version" applies to it, you have the
573
+ option of following the terms and conditions either of that numbered
574
+ version or of any later version published by the Free Software
575
+ Foundation. If the Program does not specify a version number of the
576
+ GNU Affero General Public License, you may choose any version ever published
577
+ by the Free Software Foundation.
578
+
579
+ If the Program specifies that a proxy can decide which future
580
+ versions of the GNU Affero General Public License can be used, that proxy's
581
+ public statement of acceptance of a version permanently authorizes you
582
+ to choose that version for the Program.
583
+
584
+ Later license versions may give you additional or different
585
+ permissions. However, no additional obligations are imposed on any
586
+ author or copyright holder as a result of your choosing to follow a
587
+ later version.
588
+
589
+ 15. Disclaimer of Warranty.
590
+
591
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
+ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
+ OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
+ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
+ IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
+ ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
+
600
+ 16. Limitation of Liability.
601
+
602
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
+ THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
+ GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
+ USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
+ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
+ EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
+ SUCH DAMAGES.
611
+
612
+ 17. Interpretation of Sections 15 and 16.
613
+
614
+ If the disclaimer of warranty and limitation of liability provided
615
+ above cannot be given local legal effect according to their terms,
616
+ reviewing courts shall apply local law that most closely approximates
617
+ an absolute waiver of all civil liability in connection with the
618
+ Program, unless a warranty or assumption of liability accompanies a
619
+ copy of the Program in return for a fee.
620
+
621
+ END OF TERMS AND CONDITIONS
622
+
623
+ How to Apply These Terms to Your New Programs
624
+
625
+ If you develop a new program, and you want it to be of the greatest
626
+ possible use to the public, the best way to achieve this is to make it
627
+ free software which everyone can redistribute and change under these terms.
628
+
629
+ To do so, attach the following notices to the program. It is safest
630
+ to attach them to the start of each source file to most effectively
631
+ state the exclusion of warranty; and each file should have at least
632
+ the "copyright" line and a pointer to where the full notice is found.
633
+
634
+ <one line to give the program's name and a brief idea of what it does.>
635
+ Copyright (C) <year> <name of author>
636
+
637
+ This program is free software: you can redistribute it and/or modify
638
+ it under the terms of the GNU Affero General Public License as published by
639
+ the Free Software Foundation, either version 3 of the License, or
640
+ (at your option) any later version.
641
+
642
+ This program is distributed in the hope that it will be useful,
643
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
644
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
+ GNU Affero General Public License for more details.
646
+
647
+ You should have received a copy of the GNU Affero General Public License
648
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
649
+
650
+ Also add information on how to contact you by electronic and paper mail.
651
+
652
+ If your software can interact with users remotely through a computer
653
+ network, you should also make sure that it provides a way for users to
654
+ get its source. For example, if your program is a web application, its
655
+ interface could display a "Source" link that leads users to an archive
656
+ of the code. There are many ways you could offer source, and different
657
+ solutions will be better for different programs; see section 13 for the
658
+ specific requirements.
659
+
660
+ You should also get your employer (if you work as a programmer) or school,
661
+ if any, to sign a "copyright disclaimer" for the program, if necessary.
662
+ For more information on this, and how to apply and follow the GNU AGPL, see
663
+ <https://www.gnu.org/licenses/>.
README.md CHANGED
@@ -1,13 +1,162 @@
1
- ---
2
- title: Stabl
3
- emoji: 👁
4
- colorFrom: gray
5
- colorTo: indigo
6
- sdk: gradio
7
- sdk_version: 3.29.0
8
- app_file: app.py
9
- pinned: false
10
- license: openrail
11
- ---
12
-
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Stable Diffusion web UI
2
+ A browser interface based on Gradio library for Stable Diffusion.
3
+
4
+ ![](screenshot.png)
5
+
6
+ ## Features
7
+ [Detailed feature showcase with images](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features):
8
+ - Original txt2img and img2img modes
9
+ - One click install and run script (but you still must install python and git)
10
+ - Outpainting
11
+ - Inpainting
12
+ - Color Sketch
13
+ - Prompt Matrix
14
+ - Stable Diffusion Upscale
15
+ - Attention, specify parts of text that the model should pay more attention to
16
+ - a man in a `((tuxedo))` - will pay more attention to tuxedo
17
+ - a man in a `(tuxedo:1.21)` - alternative syntax
18
+ - select text and press `Ctrl+Up` or `Ctrl+Down` to automatically adjust attention to selected text (code contributed by anonymous user)
19
+ - Loopback, run img2img processing multiple times
20
+ - X/Y/Z plot, a way to draw a 3 dimensional plot of images with different parameters
21
+ - Textual Inversion
22
+ - have as many embeddings as you want and use any names you like for them
23
+ - use multiple embeddings with different numbers of vectors per token
24
+ - works with half precision floating point numbers
25
+ - train embeddings on 8GB (also reports of 6GB working)
26
+ - Extras tab with:
27
+ - GFPGAN, neural network that fixes faces
28
+ - CodeFormer, face restoration tool as an alternative to GFPGAN
29
+ - RealESRGAN, neural network upscaler
30
+ - ESRGAN, neural network upscaler with a lot of third party models
31
+ - SwinIR and Swin2SR ([see here](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/2092)), neural network upscalers
32
+ - LDSR, Latent diffusion super resolution upscaling
33
+ - Resizing aspect ratio options
34
+ - Sampling method selection
35
+ - Adjust sampler eta values (noise multiplier)
36
+ - More advanced noise setting options
37
+ - Interrupt processing at any time
38
+ - 4GB video card support (also reports of 2GB working)
39
+ - Correct seeds for batches
40
+ - Live prompt token length validation
41
+ - Generation parameters
42
+ - parameters you used to generate images are saved with that image
43
+ - in PNG chunks for PNG, in EXIF for JPEG
44
+ - can drag the image to PNG info tab to restore generation parameters and automatically copy them into UI
45
+ - can be disabled in settings
46
+ - drag and drop an image/text-parameters to promptbox
47
+ - Read Generation Parameters Button, loads parameters in promptbox to UI
48
+ - Settings page
49
+ - Running arbitrary python code from UI (must run with `--allow-code` to enable)
50
+ - Mouseover hints for most UI elements
51
+ - Possible to change defaults/mix/max/step values for UI elements via text config
52
+ - Tiling support, a checkbox to create images that can be tiled like textures
53
+ - Progress bar and live image generation preview
54
+ - Can use a separate neural network to produce previews with almost none VRAM or compute requirement
55
+ - Negative prompt, an extra text field that allows you to list what you don't want to see in generated image
56
+ - Styles, a way to save part of prompt and easily apply them via dropdown later
57
+ - Variations, a way to generate same image but with tiny differences
58
+ - Seed resizing, a way to generate same image but at slightly different resolution
59
+ - CLIP interrogator, a button that tries to guess prompt from an image
60
+ - Prompt Editing, a way to change prompt mid-generation, say to start making a watermelon and switch to anime girl midway
61
+ - Batch Processing, process a group of files using img2img
62
+ - Img2img Alternative, reverse Euler method of cross attention control
63
+ - Highres Fix, a convenience option to produce high resolution pictures in one click without usual distortions
64
+ - Reloading checkpoints on the fly
65
+ - Checkpoint Merger, a tab that allows you to merge up to 3 checkpoints into one
66
+ - [Custom scripts](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Custom-Scripts) with many extensions from community
67
+ - [Composable-Diffusion](https://energy-based-model.github.io/Compositional-Visual-Generation-with-Composable-Diffusion-Models/), a way to use multiple prompts at once
68
+ - separate prompts using uppercase `AND`
69
+ - also supports weights for prompts: `a cat :1.2 AND a dog AND a penguin :2.2`
70
+ - No token limit for prompts (original stable diffusion lets you use up to 75 tokens)
71
+ - DeepDanbooru integration, creates danbooru style tags for anime prompts
72
+ - [xformers](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Xformers), major speed increase for select cards: (add `--xformers` to commandline args)
73
+ - via extension: [History tab](https://github.com/yfszzx/stable-diffusion-webui-images-browser): view, direct and delete images conveniently within the UI
74
+ - Generate forever option
75
+ - Training tab
76
+ - hypernetworks and embeddings options
77
+ - Preprocessing images: cropping, mirroring, autotagging using BLIP or deepdanbooru (for anime)
78
+ - Clip skip
79
+ - Hypernetworks
80
+ - Loras (same as Hypernetworks but more pretty)
81
+ - A sparate UI where you can choose, with preview, which embeddings, hypernetworks or Loras to add to your prompt
82
+ - Can select to load a different VAE from settings screen
83
+ - Estimated completion time in progress bar
84
+ - API
85
+ - Support for dedicated [inpainting model](https://github.com/runwayml/stable-diffusion#inpainting-with-stable-diffusion) by RunwayML
86
+ - via extension: [Aesthetic Gradients](https://github.com/AUTOMATIC1111/stable-diffusion-webui-aesthetic-gradients), a way to generate images with a specific aesthetic by using clip images embeds (implementation of [https://github.com/vicgalle/stable-diffusion-aesthetic-gradients](https://github.com/vicgalle/stable-diffusion-aesthetic-gradients))
87
+ - [Stable Diffusion 2.0](https://github.com/Stability-AI/stablediffusion) support - see [wiki](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#stable-diffusion-20) for instructions
88
+ - [Alt-Diffusion](https://arxiv.org/abs/2211.06679) support - see [wiki](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#alt-diffusion) for instructions
89
+ - Now without any bad letters!
90
+ - Load checkpoints in safetensors format
91
+ - Eased resolution restriction: generated image's domension must be a multiple of 8 rather than 64
92
+ - Now with a license!
93
+ - Reorder elements in the UI from settings screen
94
+
95
+ ## Installation and Running
96
+ Make sure the required [dependencies](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Dependencies) are met and follow the instructions available for both [NVidia](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-NVidia-GPUs) (recommended) and [AMD](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs) GPUs.
97
+
98
+ Alternatively, use online services (like Google Colab):
99
+
100
+ - [List of Online Services](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Online-Services)
101
+
102
+ ### Automatic Installation on Windows
103
+ 1. Install [Python 3.10.6](https://www.python.org/downloads/release/python-3106/) (Newer version of Python does not support torch), checking "Add Python to PATH".
104
+ 2. Install [git](https://git-scm.com/download/win).
105
+ 3. Download the stable-diffusion-webui repository, for example by running `git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git`.
106
+ 4. Run `webui-user.bat` from Windows Explorer as normal, non-administrator, user.
107
+
108
+ ### Automatic Installation on Linux
109
+ 1. Install the dependencies:
110
+ ```bash
111
+ # Debian-based:
112
+ sudo apt install wget git python3 python3-venv
113
+ # Red Hat-based:
114
+ sudo dnf install wget git python3
115
+ # Arch-based:
116
+ sudo pacman -S wget git python3
117
+ ```
118
+ 2. Navigate to the directory you would like the webui to be installed and execute the following command:
119
+ ```bash
120
+ bash <(wget -qO- https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh)
121
+ ```
122
+ 3. Run `webui.sh`.
123
+ 4. Check `webui-user.sh` for options.
124
+ ### Installation on Apple Silicon
125
+
126
+ Find the instructions [here](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon).
127
+
128
+ ## Contributing
129
+ Here's how to add code to this repo: [Contributing](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Contributing)
130
+
131
+ ## Documentation
132
+ The documentation was moved from this README over to the project's [wiki](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki).
133
+
134
+ ## Credits
135
+ Licenses for borrowed code can be found in `Settings -> Licenses` screen, and also in `html/licenses.html` file.
136
+
137
+ - Stable Diffusion - https://github.com/CompVis/stable-diffusion, https://github.com/CompVis/taming-transformers
138
+ - k-diffusion - https://github.com/crowsonkb/k-diffusion.git
139
+ - GFPGAN - https://github.com/TencentARC/GFPGAN.git
140
+ - CodeFormer - https://github.com/sczhou/CodeFormer
141
+ - ESRGAN - https://github.com/xinntao/ESRGAN
142
+ - SwinIR - https://github.com/JingyunLiang/SwinIR
143
+ - Swin2SR - https://github.com/mv-lab/swin2sr
144
+ - LDSR - https://github.com/Hafiidz/latent-diffusion
145
+ - MiDaS - https://github.com/isl-org/MiDaS
146
+ - Ideas for optimizations - https://github.com/basujindal/stable-diffusion
147
+ - Cross Attention layer optimization - Doggettx - https://github.com/Doggettx/stable-diffusion, original idea for prompt editing.
148
+ - Cross Attention layer optimization - InvokeAI, lstein - https://github.com/invoke-ai/InvokeAI (originally http://github.com/lstein/stable-diffusion)
149
+ - Sub-quadratic Cross Attention layer optimization - Alex Birch (https://github.com/Birch-san/diffusers/pull/1), Amin Rezaei (https://github.com/AminRezaei0x443/memory-efficient-attention)
150
+ - Textual Inversion - Rinon Gal - https://github.com/rinongal/textual_inversion (we're not using his code, but we are using his ideas).
151
+ - Idea for SD upscale - https://github.com/jquesnelle/txt2imghd
152
+ - Noise generation for outpainting mk2 - https://github.com/parlance-zz/g-diffuser-bot
153
+ - CLIP interrogator idea and borrowing some code - https://github.com/pharmapsychotic/clip-interrogator
154
+ - Idea for Composable Diffusion - https://github.com/energy-based-model/Compositional-Visual-Generation-with-Composable-Diffusion-Models-PyTorch
155
+ - xformers - https://github.com/facebookresearch/xformers
156
+ - DeepDanbooru - interrogator for anime diffusers https://github.com/KichangKim/DeepDanbooru
157
+ - Sampling in float32 precision from a float16 UNet - marunine for the idea, Birch-san for the example Diffusers implementation (https://github.com/Birch-san/diffusers-play/tree/92feee6)
158
+ - Instruct pix2pix - Tim Brooks (star), Aleksander Holynski (star), Alexei A. Efros (no star) - https://github.com/timothybrooks/instruct-pix2pix
159
+ - Security advice - RyotaK
160
+ - UniPC sampler - Wenliang Zhao - https://github.com/wl-zhao/UniPC
161
+ - Initial Gradio script - posted on 4chan by an Anonymous user. Thank you Anonymous user.
162
+ - (You)
cache.json ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "hashes": {
3
+ "checkpoint/model.ckpt": {
4
+ "mtime": 1683723237.3656309,
5
+ "sha256": "fe4efff1e174c627256e44ec2991ba279b3816e364b49f9be2abc0b3ff3f8556"
6
+ }
7
+ }
8
+ }
config.json ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "samples_save": true,
3
+ "samples_format": "png",
4
+ "samples_filename_pattern": "",
5
+ "save_images_add_number": true,
6
+ "grid_save": true,
7
+ "grid_format": "png",
8
+ "grid_extended_filename": false,
9
+ "grid_only_if_multiple": true,
10
+ "grid_prevent_empty_spots": false,
11
+ "n_rows": -1,
12
+ "enable_pnginfo": true,
13
+ "save_txt": false,
14
+ "save_images_before_face_restoration": false,
15
+ "save_images_before_highres_fix": false,
16
+ "save_images_before_color_correction": false,
17
+ "save_mask": false,
18
+ "save_mask_composite": false,
19
+ "jpeg_quality": 80,
20
+ "webp_lossless": false,
21
+ "export_for_4chan": true,
22
+ "img_downscale_threshold": 4.0,
23
+ "target_side_length": 4000,
24
+ "img_max_size_mp": 200,
25
+ "use_original_name_batch": true,
26
+ "use_upscaler_name_as_suffix": false,
27
+ "save_selected_only": true,
28
+ "save_init_img": false,
29
+ "temp_dir": "",
30
+ "clean_temp_dir_at_start": false,
31
+ "outdir_samples": "",
32
+ "outdir_txt2img_samples": "outputs/txt2img-images",
33
+ "outdir_img2img_samples": "outputs/img2img-images",
34
+ "outdir_extras_samples": "outputs/extras-images",
35
+ "outdir_grids": "",
36
+ "outdir_txt2img_grids": "outputs/txt2img-grids",
37
+ "outdir_img2img_grids": "outputs/img2img-grids",
38
+ "outdir_save": "log/images",
39
+ "outdir_init_images": "outputs/init-images",
40
+ "save_to_dirs": true,
41
+ "grid_save_to_dirs": true,
42
+ "use_save_to_dirs_for_ui": false,
43
+ "directories_filename_pattern": "[date]",
44
+ "directories_max_prompt_words": 8,
45
+ "ESRGAN_tile": 192,
46
+ "ESRGAN_tile_overlap": 8,
47
+ "realesrgan_enabled_models": [
48
+ "R-ESRGAN 4x+",
49
+ "R-ESRGAN 4x+ Anime6B"
50
+ ],
51
+ "upscaler_for_img2img": null,
52
+ "SCUNET_tile": 256,
53
+ "SCUNET_tile_overlap": 8,
54
+ "face_restoration_model": "CodeFormer",
55
+ "code_former_weight": 0.5,
56
+ "face_restoration_unload": false,
57
+ "show_warnings": false,
58
+ "memmon_poll_rate": 8,
59
+ "samples_log_stdout": false,
60
+ "multiple_tqdm": true,
61
+ "print_hypernet_extra": false,
62
+ "unload_models_when_training": false,
63
+ "pin_memory": false,
64
+ "save_optimizer_state": false,
65
+ "save_training_settings_to_txt": true,
66
+ "dataset_filename_word_regex": "",
67
+ "dataset_filename_join_string": " ",
68
+ "training_image_repeats_per_epoch": 1,
69
+ "training_write_csv_every": 500,
70
+ "training_xattention_optimizations": false,
71
+ "training_enable_tensorboard": false,
72
+ "training_tensorboard_save_images": false,
73
+ "training_tensorboard_flush_every": 120,
74
+ "sd_model_checkpoint": null,
75
+ "sd_checkpoint_cache": 0,
76
+ "sd_vae_checkpoint_cache": 0,
77
+ "sd_vae": "Automatic",
78
+ "sd_vae_as_default": true,
79
+ "inpainting_mask_weight": 1.0,
80
+ "initial_noise_multiplier": 1.0,
81
+ "img2img_color_correction": false,
82
+ "img2img_fix_steps": false,
83
+ "img2img_background_color": "#ffffff",
84
+ "enable_quantization": false,
85
+ "enable_emphasis": true,
86
+ "enable_batch_seeds": true,
87
+ "comma_padding_backtrack": 20,
88
+ "CLIP_stop_at_last_layers": 1,
89
+ "upcast_attn": false,
90
+ "randn_source": "GPU",
91
+ "use_old_emphasis_implementation": false,
92
+ "use_old_karras_scheduler_sigmas": false,
93
+ "no_dpmpp_sde_batch_determinism": false,
94
+ "use_old_hires_fix_width_height": false,
95
+ "dont_fix_second_order_samplers_schedule": false,
96
+ "interrogate_keep_models_in_memory": false,
97
+ "interrogate_return_ranks": false,
98
+ "interrogate_clip_num_beams": 1,
99
+ "interrogate_clip_min_length": 24,
100
+ "interrogate_clip_max_length": 48,
101
+ "interrogate_clip_dict_limit": 1500,
102
+ "interrogate_clip_skip_categories": [],
103
+ "interrogate_deepbooru_score_threshold": 0.5,
104
+ "deepbooru_sort_alpha": true,
105
+ "deepbooru_use_spaces": false,
106
+ "deepbooru_escape": true,
107
+ "deepbooru_filter_tags": "",
108
+ "extra_networks_default_view": "cards",
109
+ "extra_networks_default_multiplier": 1.0,
110
+ "extra_networks_card_width": 0,
111
+ "extra_networks_card_height": 0,
112
+ "extra_networks_add_text_separator": " ",
113
+ "sd_hypernetwork": "None",
114
+ "return_grid": true,
115
+ "return_mask": false,
116
+ "return_mask_composite": false,
117
+ "do_not_show_images": false,
118
+ "add_model_hash_to_info": true,
119
+ "add_model_name_to_info": true,
120
+ "disable_weights_auto_swap": true,
121
+ "send_seed": true,
122
+ "send_size": true,
123
+ "font": "",
124
+ "js_modal_lightbox": true,
125
+ "js_modal_lightbox_initially_zoomed": true,
126
+ "show_progress_in_title": true,
127
+ "samplers_in_dropdown": true,
128
+ "dimensions_and_batch_together": true,
129
+ "keyedit_precision_attention": 0.1,
130
+ "keyedit_precision_extra": 0.05,
131
+ "keyedit_delimiters": ".,\\/!?%^*;:{}=`~()",
132
+ "quicksettings": "sd_model_checkpoint",
133
+ "hidden_tabs": [],
134
+ "ui_reorder": "inpaint, sampler, checkboxes, hires_fix, dimensions, cfg, seed, batch, override_settings, scripts",
135
+ "ui_extra_networks_tab_reorder": "",
136
+ "localization": "None",
137
+ "gradio_theme": "Default",
138
+ "show_progressbar": true,
139
+ "live_previews_enable": true,
140
+ "show_progress_grid": true,
141
+ "show_progress_every_n_steps": 10,
142
+ "show_progress_type": "Approx NN",
143
+ "live_preview_content": "Prompt",
144
+ "live_preview_refresh_period": 1000,
145
+ "hide_samplers": [],
146
+ "eta_ddim": 0.0,
147
+ "eta_ancestral": 1.0,
148
+ "ddim_discretize": "uniform",
149
+ "s_churn": 0.0,
150
+ "s_min_uncond": 0,
151
+ "s_tmin": 0.0,
152
+ "s_noise": 1.0,
153
+ "eta_noise_seed_delta": 0,
154
+ "always_discard_next_to_last_sigma": false,
155
+ "uni_pc_variant": "bh1",
156
+ "uni_pc_skip_type": "time_uniform",
157
+ "uni_pc_order": 3,
158
+ "uni_pc_lower_order_final": true,
159
+ "postprocessing_enable_in_main_ui": [],
160
+ "postprocessing_operation_order": [],
161
+ "upscaling_max_images_in_cache": 5,
162
+ "disabled_extensions": [],
163
+ "disable_all_extensions": "none",
164
+ "restore_config_state_file": "",
165
+ "sd_checkpoint_hash": ""
166
+ }
environment-wsl2.yaml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: automatic
2
+ channels:
3
+ - pytorch
4
+ - defaults
5
+ dependencies:
6
+ - python=3.10
7
+ - pip=23.0
8
+ - cudatoolkit=11.8
9
+ - pytorch=2.0
10
+ - torchvision=0.15
11
+ - numpy=1.23
launch.py ADDED
@@ -0,0 +1,353 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # this scripts installs necessary requirements and launches main program in webui.py
2
+ import subprocess
3
+ import os
4
+ import sys
5
+ import importlib.util
6
+ import shlex
7
+ import platform
8
+ import json
9
+
10
+ from modules import cmd_args
11
+ from modules.paths_internal import script_path, extensions_dir
12
+
13
+ commandline_args = os.environ.get('COMMANDLINE_ARGS', "")
14
+ sys.argv += shlex.split(commandline_args)
15
+
16
+ args, _ = cmd_args.parser.parse_known_args()
17
+
18
+ python = sys.executable
19
+ git = os.environ.get('GIT', "git")
20
+ index_url = os.environ.get('INDEX_URL', "")
21
+ stored_commit_hash = None
22
+ dir_repos = "repositories"
23
+
24
+ if 'GRADIO_ANALYTICS_ENABLED' not in os.environ:
25
+ os.environ['GRADIO_ANALYTICS_ENABLED'] = 'False'
26
+
27
+
28
+ def check_python_version():
29
+ is_windows = platform.system() == "Windows"
30
+ major = sys.version_info.major
31
+ minor = sys.version_info.minor
32
+ micro = sys.version_info.micro
33
+
34
+ if is_windows:
35
+ supported_minors = [10]
36
+ else:
37
+ supported_minors = [7, 8, 9, 10, 11]
38
+
39
+ if not (major == 3 and minor in supported_minors):
40
+ import modules.errors
41
+
42
+ modules.errors.print_error_explanation(f"""
43
+ INCOMPATIBLE PYTHON VERSION
44
+
45
+ This program is tested with 3.10.6 Python, but you have {major}.{minor}.{micro}.
46
+ If you encounter an error with "RuntimeError: Couldn't install torch." message,
47
+ or any other error regarding unsuccessful package (library) installation,
48
+ please downgrade (or upgrade) to the latest version of 3.10 Python
49
+ and delete current Python and "venv" folder in WebUI's directory.
50
+
51
+ You can download 3.10 Python from here: https://www.python.org/downloads/release/python-3106/
52
+
53
+ {"Alternatively, use a binary release of WebUI: https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases" if is_windows else ""}
54
+
55
+ Use --skip-python-version-check to suppress this warning.
56
+ """)
57
+
58
+
59
+ def commit_hash():
60
+ global stored_commit_hash
61
+
62
+ if stored_commit_hash is not None:
63
+ return stored_commit_hash
64
+
65
+ try:
66
+ stored_commit_hash = run(f"{git} rev-parse HEAD").strip()
67
+ except Exception:
68
+ stored_commit_hash = "<none>"
69
+
70
+ return stored_commit_hash
71
+
72
+
73
+ def run(command, desc=None, errdesc=None, custom_env=None, live=False):
74
+ if desc is not None:
75
+ print(desc)
76
+
77
+ if live:
78
+ result = subprocess.run(command, shell=True, env=os.environ if custom_env is None else custom_env)
79
+ if result.returncode != 0:
80
+ raise RuntimeError(f"""{errdesc or 'Error running command'}.
81
+ Command: {command}
82
+ Error code: {result.returncode}""")
83
+
84
+ return ""
85
+
86
+ result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, env=os.environ if custom_env is None else custom_env)
87
+
88
+ if result.returncode != 0:
89
+
90
+ message = f"""{errdesc or 'Error running command'}.
91
+ Command: {command}
92
+ Error code: {result.returncode}
93
+ stdout: {result.stdout.decode(encoding="utf8", errors="ignore") if len(result.stdout)>0 else '<empty>'}
94
+ stderr: {result.stderr.decode(encoding="utf8", errors="ignore") if len(result.stderr)>0 else '<empty>'}
95
+ """
96
+ raise RuntimeError(message)
97
+
98
+ return result.stdout.decode(encoding="utf8", errors="ignore")
99
+
100
+
101
+ def check_run(command):
102
+ result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
103
+ return result.returncode == 0
104
+
105
+
106
+ def is_installed(package):
107
+ try:
108
+ spec = importlib.util.find_spec(package)
109
+ except ModuleNotFoundError:
110
+ return False
111
+
112
+ return spec is not None
113
+
114
+
115
+ def repo_dir(name):
116
+ return os.path.join(script_path, dir_repos, name)
117
+
118
+
119
+ def run_python(code, desc=None, errdesc=None):
120
+ return run(f'"{python}" -c "{code}"', desc, errdesc)
121
+
122
+
123
+ def run_pip(command, desc=None, live=False):
124
+ if args.skip_install:
125
+ return
126
+
127
+ index_url_line = f' --index-url {index_url}' if index_url != '' else ''
128
+ return run(f'"{python}" -m pip {command} --prefer-binary{index_url_line}', desc=f"Installing {desc}", errdesc=f"Couldn't install {desc}", live=live)
129
+
130
+
131
+ def check_run_python(code):
132
+ return check_run(f'"{python}" -c "{code}"')
133
+
134
+
135
+ def git_clone(url, dir, name, commithash=None):
136
+ # TODO clone into temporary dir and move if successful
137
+
138
+ if os.path.exists(dir):
139
+ if commithash is None:
140
+ return
141
+
142
+ current_hash = run(f'"{git}" -C "{dir}" rev-parse HEAD', None, f"Couldn't determine {name}'s hash: {commithash}").strip()
143
+ if current_hash == commithash:
144
+ return
145
+
146
+ run(f'"{git}" -C "{dir}" fetch', f"Fetching updates for {name}...", f"Couldn't fetch {name}")
147
+ run(f'"{git}" -C "{dir}" checkout {commithash}', f"Checking out commit for {name} with hash: {commithash}...", f"Couldn't checkout commit {commithash} for {name}")
148
+ return
149
+
150
+ run(f'"{git}" clone "{url}" "{dir}"', f"Cloning {name} into {dir}...", f"Couldn't clone {name}")
151
+
152
+ if commithash is not None:
153
+ run(f'"{git}" -C "{dir}" checkout {commithash}', None, "Couldn't checkout {name}'s hash: {commithash}")
154
+
155
+
156
+ def git_pull_recursive(dir):
157
+ for subdir, _, _ in os.walk(dir):
158
+ if os.path.exists(os.path.join(subdir, '.git')):
159
+ try:
160
+ output = subprocess.check_output([git, '-C', subdir, 'pull', '--autostash'])
161
+ print(f"Pulled changes for repository in '{subdir}':\n{output.decode('utf-8').strip()}\n")
162
+ except subprocess.CalledProcessError as e:
163
+ print(f"Couldn't perform 'git pull' on repository in '{subdir}':\n{e.output.decode('utf-8').strip()}\n")
164
+
165
+
166
+ def version_check(commit):
167
+ try:
168
+ import requests
169
+ commits = requests.get('https://api.github.com/repos/AUTOMATIC1111/stable-diffusion-webui/branches/master').json()
170
+ if commit != "<none>" and commits['commit']['sha'] != commit:
171
+ print("--------------------------------------------------------")
172
+ print("| You are not up to date with the most recent release. |")
173
+ print("| Consider running `git pull` to update. |")
174
+ print("--------------------------------------------------------")
175
+ elif commits['commit']['sha'] == commit:
176
+ print("You are up to date with the most recent release.")
177
+ else:
178
+ print("Not a git clone, can't perform version check.")
179
+ except Exception as e:
180
+ print("version check failed", e)
181
+
182
+
183
+ def run_extension_installer(extension_dir):
184
+ path_installer = os.path.join(extension_dir, "install.py")
185
+ if not os.path.isfile(path_installer):
186
+ return
187
+
188
+ try:
189
+ env = os.environ.copy()
190
+ env['PYTHONPATH'] = os.path.abspath(".")
191
+
192
+ print(run(f'"{python}" "{path_installer}"', errdesc=f"Error running install.py for extension {extension_dir}", custom_env=env))
193
+ except Exception as e:
194
+ print(e, file=sys.stderr)
195
+
196
+
197
+ def list_extensions(settings_file):
198
+ settings = {}
199
+
200
+ try:
201
+ if os.path.isfile(settings_file):
202
+ with open(settings_file, "r", encoding="utf8") as file:
203
+ settings = json.load(file)
204
+ except Exception as e:
205
+ print(e, file=sys.stderr)
206
+
207
+ disabled_extensions = set(settings.get('disabled_extensions', []))
208
+ disable_all_extensions = settings.get('disable_all_extensions', 'none')
209
+
210
+ if disable_all_extensions != 'none':
211
+ return []
212
+
213
+ return [x for x in os.listdir(extensions_dir) if x not in disabled_extensions]
214
+
215
+
216
+ def run_extensions_installers(settings_file):
217
+ if not os.path.isdir(extensions_dir):
218
+ return
219
+
220
+ for dirname_extension in list_extensions(settings_file):
221
+ run_extension_installer(os.path.join(extensions_dir, dirname_extension))
222
+
223
+
224
+ def prepare_environment():
225
+ torch_command = os.environ.get('TORCH_COMMAND', "pip install torch==2.0.0 torchvision==0.15.1 --extra-index-url https://download.pytorch.org/whl/cu118")
226
+ requirements_file = os.environ.get('REQS_FILE', "requirements_versions.txt")
227
+
228
+ xformers_package = os.environ.get('XFORMERS_PACKAGE', 'xformers==0.0.17')
229
+ gfpgan_package = os.environ.get('GFPGAN_PACKAGE', "git+https://github.com/TencentARC/GFPGAN.git@8d2447a2d918f8eba5a4a01463fd48e45126a379")
230
+ clip_package = os.environ.get('CLIP_PACKAGE', "git+https://github.com/openai/CLIP.git@d50d76daa670286dd6cacf3bcd80b5e4823fc8e1")
231
+ openclip_package = os.environ.get('OPENCLIP_PACKAGE', "git+https://github.com/mlfoundations/open_clip.git@bb6e834e9c70d9c27d0dc3ecedeebeaeb1ffad6b")
232
+
233
+ stable_diffusion_repo = os.environ.get('STABLE_DIFFUSION_REPO', "https://github.com/Stability-AI/stablediffusion.git")
234
+ taming_transformers_repo = os.environ.get('TAMING_TRANSFORMERS_REPO', "https://github.com/CompVis/taming-transformers.git")
235
+ k_diffusion_repo = os.environ.get('K_DIFFUSION_REPO', 'https://github.com/crowsonkb/k-diffusion.git')
236
+ codeformer_repo = os.environ.get('CODEFORMER_REPO', 'https://github.com/sczhou/CodeFormer.git')
237
+ blip_repo = os.environ.get('BLIP_REPO', 'https://github.com/salesforce/BLIP.git')
238
+
239
+ stable_diffusion_commit_hash = os.environ.get('STABLE_DIFFUSION_COMMIT_HASH', "cf1d67a6fd5ea1aa600c4df58e5b47da45f6bdbf")
240
+ taming_transformers_commit_hash = os.environ.get('TAMING_TRANSFORMERS_COMMIT_HASH', "24268930bf1dce879235a7fddd0b2355b84d7ea6")
241
+ k_diffusion_commit_hash = os.environ.get('K_DIFFUSION_COMMIT_HASH', "5b3af030dd83e0297272d861c19477735d0317ec")
242
+ codeformer_commit_hash = os.environ.get('CODEFORMER_COMMIT_HASH', "c5b4593074ba6214284d6acd5f1719b6c5d739af")
243
+ blip_commit_hash = os.environ.get('BLIP_COMMIT_HASH', "48211a1594f1321b00f14c9f7a5b4813144b2fb9")
244
+
245
+ if not args.skip_python_version_check:
246
+ check_python_version()
247
+
248
+ commit = commit_hash()
249
+
250
+ print(f"Python {sys.version}")
251
+ print(f"Commit hash: {commit}")
252
+
253
+ if args.reinstall_torch or not is_installed("torch") or not is_installed("torchvision"):
254
+ run(f'"{python}" -m {torch_command}', "Installing torch and torchvision", "Couldn't install torch", live=True)
255
+
256
+ if not args.skip_torch_cuda_test:
257
+ run_python("import torch; assert torch.cuda.is_available(), 'Torch is not able to use GPU; add --skip-torch-cuda-test to COMMANDLINE_ARGS variable to disable this check'")
258
+
259
+ if not is_installed("gfpgan"):
260
+ run_pip(f"install {gfpgan_package}", "gfpgan")
261
+
262
+ if not is_installed("clip"):
263
+ run_pip(f"install {clip_package}", "clip")
264
+
265
+ if not is_installed("open_clip"):
266
+ run_pip(f"install {openclip_package}", "open_clip")
267
+
268
+ if (not is_installed("xformers") or args.reinstall_xformers) and args.xformers:
269
+ if platform.system() == "Windows":
270
+ if platform.python_version().startswith("3.10"):
271
+ run_pip(f"install -U -I --no-deps {xformers_package}", "xformers", live=True)
272
+ else:
273
+ print("Installation of xformers is not supported in this version of Python.")
274
+ print("You can also check this and build manually: https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Xformers#building-xformers-on-windows-by-duckness")
275
+ if not is_installed("xformers"):
276
+ exit(0)
277
+ elif platform.system() == "Linux":
278
+ run_pip(f"install {xformers_package}", "xformers")
279
+
280
+ if not is_installed("pyngrok") and args.ngrok:
281
+ run_pip("install pyngrok", "ngrok")
282
+
283
+ os.makedirs(os.path.join(script_path, dir_repos), exist_ok=True)
284
+
285
+ git_clone(stable_diffusion_repo, repo_dir('stable-diffusion-stability-ai'), "Stable Diffusion", stable_diffusion_commit_hash)
286
+ git_clone(taming_transformers_repo, repo_dir('taming-transformers'), "Taming Transformers", taming_transformers_commit_hash)
287
+ git_clone(k_diffusion_repo, repo_dir('k-diffusion'), "K-diffusion", k_diffusion_commit_hash)
288
+ git_clone(codeformer_repo, repo_dir('CodeFormer'), "CodeFormer", codeformer_commit_hash)
289
+ git_clone(blip_repo, repo_dir('BLIP'), "BLIP", blip_commit_hash)
290
+
291
+ if not is_installed("lpips"):
292
+ run_pip(f"install -r \"{os.path.join(repo_dir('CodeFormer'), 'requirements.txt')}\"", "requirements for CodeFormer")
293
+
294
+ if not os.path.isfile(requirements_file):
295
+ requirements_file = os.path.join(script_path, requirements_file)
296
+ run_pip(f"install -r \"{requirements_file}\"", "requirements")
297
+
298
+ run_extensions_installers(settings_file=args.ui_settings_file)
299
+
300
+ if args.update_check:
301
+ version_check(commit)
302
+
303
+ if args.update_all_extensions:
304
+ git_pull_recursive(extensions_dir)
305
+
306
+ if "--exit" in sys.argv:
307
+ print("Exiting because of --exit argument")
308
+ exit(0)
309
+
310
+ if args.tests and not args.no_tests:
311
+ exitcode = tests(args.tests)
312
+ exit(exitcode)
313
+
314
+
315
+ def tests(test_dir):
316
+ if "--api" not in sys.argv:
317
+ sys.argv.append("--api")
318
+ if "--ckpt" not in sys.argv:
319
+ sys.argv.append("--ckpt")
320
+ sys.argv.append(os.path.join(script_path, "test/test_files/empty.pt"))
321
+ if "--skip-torch-cuda-test" not in sys.argv:
322
+ sys.argv.append("--skip-torch-cuda-test")
323
+ if "--disable-nan-check" not in sys.argv:
324
+ sys.argv.append("--disable-nan-check")
325
+ if "--no-tests" not in sys.argv:
326
+ sys.argv.append("--no-tests")
327
+
328
+ print(f"Launching Web UI in another process for testing with arguments: {' '.join(sys.argv[1:])}")
329
+
330
+ os.environ['COMMANDLINE_ARGS'] = ""
331
+ with open(os.path.join(script_path, 'test/stdout.txt'), "w", encoding="utf8") as stdout, open(os.path.join(script_path, 'test/stderr.txt'), "w", encoding="utf8") as stderr:
332
+ proc = subprocess.Popen([sys.executable, *sys.argv], stdout=stdout, stderr=stderr)
333
+
334
+ import test.server_poll
335
+ exitcode = test.server_poll.run_tests(proc, test_dir)
336
+
337
+ print(f"Stopping Web UI process with id {proc.pid}")
338
+ proc.kill()
339
+ return exitcode
340
+
341
+
342
+ def start():
343
+ print(f"Launching {'API server' if '--nowebui' in sys.argv else 'Web UI'} with arguments: {' '.join(sys.argv[1:])}")
344
+ import webui
345
+ if '--nowebui' in sys.argv:
346
+ webui.api_only()
347
+ else:
348
+ webui.webui()
349
+
350
+
351
+ if __name__ == "__main__":
352
+ prepare_environment()
353
+ start()
params.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ basketball
2
+ Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 2605222558, Size: 512x512, Model hash: fe4efff1e1, Model: model
requirements.txt ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ astunparse
2
+ blendmodes
3
+ accelerate
4
+ basicsr
5
+ fonts
6
+ font-roboto
7
+ gfpgan
8
+ gradio==3.28.1
9
+ numpy
10
+ omegaconf
11
+ opencv-contrib-python
12
+ requests
13
+ piexif
14
+ Pillow
15
+ pytorch_lightning==1.7.7
16
+ realesrgan
17
+ scikit-image>=0.19
18
+ timm==0.4.12
19
+ transformers==4.25.1
20
+ torch
21
+ einops
22
+ jsonmerge
23
+ clean-fid
24
+ resize-right
25
+ torchdiffeq
26
+ kornia
27
+ lark
28
+ inflection
29
+ GitPython
30
+ torchsde
31
+ safetensors
32
+ psutil
33
+ rich
requirements_versions.txt ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ blendmodes==2022
2
+ transformers==4.25.1
3
+ accelerate==0.18.0
4
+ basicsr==1.4.2
5
+ gfpgan==1.3.8
6
+ gradio==3.28.1
7
+ numpy==1.23.5
8
+ Pillow==9.4.0
9
+ realesrgan==0.3.0
10
+ torch
11
+ omegaconf==2.2.3
12
+ pytorch_lightning==1.9.4
13
+ scikit-image==0.19.2
14
+ fonts
15
+ font-roboto
16
+ timm==0.6.7
17
+ piexif==1.1.3
18
+ einops==0.4.1
19
+ jsonmerge==1.8.0
20
+ clean-fid==0.1.29
21
+ resize-right==0.0.2
22
+ torchdiffeq==0.2.3
23
+ kornia==0.6.7
24
+ lark==1.1.2
25
+ inflection==0.5.1
26
+ GitPython==3.1.30
27
+ torchsde==0.2.5
28
+ safetensors==0.3.1
29
+ httpcore<=0.15
30
+ fastapi==0.94.0
screenshot.png ADDED
script.js ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ function gradioApp() {
2
+ const elems = document.getElementsByTagName('gradio-app')
3
+ const elem = elems.length == 0 ? document : elems[0]
4
+
5
+ if (elem !== document) elem.getElementById = function(id){ return document.getElementById(id) }
6
+ return elem.shadowRoot ? elem.shadowRoot : elem
7
+ }
8
+
9
+ function get_uiCurrentTab() {
10
+ return gradioApp().querySelector('#tabs button.selected')
11
+ }
12
+
13
+ function get_uiCurrentTabContent() {
14
+ return gradioApp().querySelector('.tabitem[id^=tab_]:not([style*="display: none"])')
15
+ }
16
+
17
+ uiUpdateCallbacks = []
18
+ uiLoadedCallbacks = []
19
+ uiTabChangeCallbacks = []
20
+ optionsChangedCallbacks = []
21
+ let uiCurrentTab = null
22
+
23
+ function onUiUpdate(callback){
24
+ uiUpdateCallbacks.push(callback)
25
+ }
26
+ function onUiLoaded(callback){
27
+ uiLoadedCallbacks.push(callback)
28
+ }
29
+ function onUiTabChange(callback){
30
+ uiTabChangeCallbacks.push(callback)
31
+ }
32
+ function onOptionsChanged(callback){
33
+ optionsChangedCallbacks.push(callback)
34
+ }
35
+
36
+ function runCallback(x, m){
37
+ try {
38
+ x(m)
39
+ } catch (e) {
40
+ (console.error || console.log).call(console, e.message, e);
41
+ }
42
+ }
43
+ function executeCallbacks(queue, m) {
44
+ queue.forEach(function(x){runCallback(x, m)})
45
+ }
46
+
47
+ var executedOnLoaded = false;
48
+
49
+ document.addEventListener("DOMContentLoaded", function() {
50
+ var mutationObserver = new MutationObserver(function(m){
51
+ if(!executedOnLoaded && gradioApp().querySelector('#txt2img_prompt')){
52
+ executedOnLoaded = true;
53
+ executeCallbacks(uiLoadedCallbacks);
54
+ }
55
+
56
+ executeCallbacks(uiUpdateCallbacks, m);
57
+ const newTab = get_uiCurrentTab();
58
+ if ( newTab && ( newTab !== uiCurrentTab ) ) {
59
+ uiCurrentTab = newTab;
60
+ executeCallbacks(uiTabChangeCallbacks);
61
+ }
62
+ });
63
+ mutationObserver.observe( gradioApp(), { childList:true, subtree:true })
64
+ });
65
+
66
+ /**
67
+ * Add a ctrl+enter as a shortcut to start a generation
68
+ */
69
+ document.addEventListener('keydown', function(e) {
70
+ var handled = false;
71
+ if (e.key !== undefined) {
72
+ if((e.key == "Enter" && (e.metaKey || e.ctrlKey || e.altKey))) handled = true;
73
+ } else if (e.keyCode !== undefined) {
74
+ if((e.keyCode == 13 && (e.metaKey || e.ctrlKey || e.altKey))) handled = true;
75
+ }
76
+ if (handled) {
77
+ button = get_uiCurrentTabContent().querySelector('button[id$=_generate]');
78
+ if (button) {
79
+ button.click();
80
+ }
81
+ e.preventDefault();
82
+ }
83
+ })
84
+
85
+ /**
86
+ * checks that a UI element is not in another hidden element or tab content
87
+ */
88
+ function uiElementIsVisible(el) {
89
+ let isVisible = !el.closest('.\\!hidden');
90
+ if ( ! isVisible ) {
91
+ return false;
92
+ }
93
+
94
+ while( isVisible = el.closest('.tabitem')?.style.display !== 'none' ) {
95
+ if ( ! isVisible ) {
96
+ return false;
97
+ } else if ( el.parentElement ) {
98
+ el = el.parentElement
99
+ } else {
100
+ break;
101
+ }
102
+ }
103
+ return isVisible;
104
+ }
style.css ADDED
@@ -0,0 +1,859 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ /* general gradio fixes */
3
+
4
+ :root, .dark{
5
+ --checkbox-label-gap: 0.25em 0.1em;
6
+ --section-header-text-size: 12pt;
7
+ --block-background-fill: transparent;
8
+ }
9
+
10
+ .block.padded:not(.gradio-accordion) {
11
+ padding: 0 !important;
12
+ }
13
+
14
+ div.gradio-container{
15
+ max-width: unset !important;
16
+ }
17
+
18
+ .hidden{
19
+ display: none;
20
+ }
21
+
22
+ .compact{
23
+ background: transparent !important;
24
+ padding: 0 !important;
25
+ }
26
+
27
+ div.form{
28
+ border-width: 0;
29
+ box-shadow: none;
30
+ background: transparent;
31
+ overflow: visible;
32
+ gap: 0.5em;
33
+ }
34
+
35
+ .block.gradio-dropdown,
36
+ .block.gradio-slider,
37
+ .block.gradio-checkbox,
38
+ .block.gradio-textbox,
39
+ .block.gradio-radio,
40
+ .block.gradio-checkboxgroup,
41
+ .block.gradio-number,
42
+ .block.gradio-colorpicker
43
+ {
44
+ border-width: 0 !important;
45
+ box-shadow: none !important;
46
+ }
47
+
48
+ .gap.compact{
49
+ padding: 0;
50
+ gap: 0.2em 0;
51
+ }
52
+
53
+ div.compact{
54
+ gap: 1em;
55
+ }
56
+
57
+ .gradio-dropdown label span:not(.has-info),
58
+ .gradio-textbox label span:not(.has-info),
59
+ .gradio-number label span:not(.has-info)
60
+ {
61
+ margin-bottom: 0;
62
+ }
63
+
64
+ .gradio-dropdown ul.options{
65
+ z-index: 3000;
66
+ min-width: fit-content;
67
+ max-width: inherit;
68
+ white-space: nowrap;
69
+ }
70
+
71
+ .gradio-dropdown ul.options li.item {
72
+ padding: 0.05em 0;
73
+ }
74
+
75
+ .gradio-dropdown ul.options li.item.selected {
76
+ background-color: var(--neutral-100);
77
+ }
78
+
79
+ .dark .gradio-dropdown ul.options li.item.selected {
80
+ background-color: var(--neutral-900);
81
+ }
82
+
83
+ .gradio-dropdown div.wrap.wrap.wrap.wrap{
84
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
85
+ }
86
+
87
+ .gradio-dropdown:not(.multiselect) .wrap-inner.wrap-inner.wrap-inner{
88
+ flex-wrap: unset;
89
+ }
90
+
91
+ .gradio-dropdown .single-select{
92
+ white-space: nowrap;
93
+ overflow: hidden;
94
+ }
95
+
96
+ .gradio-dropdown .token-remove.remove-all.remove-all{
97
+ display: none;
98
+ }
99
+
100
+ .gradio-dropdown.multiselect .token-remove.remove-all.remove-all{
101
+ display: flex;
102
+ }
103
+
104
+ .gradio-slider input[type="number"]{
105
+ width: 6em;
106
+ }
107
+
108
+ .block.gradio-checkbox {
109
+ margin: 0.75em 1.5em 0 0;
110
+ }
111
+
112
+ .gradio-html div.wrap{
113
+ height: 100%;
114
+ }
115
+ div.gradio-html.min{
116
+ min-height: 0;
117
+ }
118
+
119
+ .block.gradio-gallery{
120
+ background: var(--input-background-fill);
121
+ }
122
+
123
+ .gradio-container .prose a, .gradio-container .prose a:visited{
124
+ color: unset;
125
+ text-decoration: none;
126
+ }
127
+
128
+
129
+
130
+ /* general styled components */
131
+
132
+ .gradio-button.tool{
133
+ max-width: 2.2em;
134
+ min-width: 2.2em !important;
135
+ height: 2.4em;
136
+ align-self: end;
137
+ line-height: 1em;
138
+ border-radius: 0.5em;
139
+ }
140
+
141
+ .gradio-button.secondary-down{
142
+ background: var(--button-secondary-background-fill);
143
+ color: var(--button-secondary-text-color);
144
+ }
145
+ .gradio-button.secondary-down, .gradio-button.secondary-down:hover{
146
+ box-shadow: 1px 1px 1px rgba(0,0,0,0.25) inset, 0px 0px 3px rgba(0,0,0,0.15) inset;
147
+ }
148
+ .gradio-button.secondary-down:hover{
149
+ background: var(--button-secondary-background-fill-hover);
150
+ color: var(--button-secondary-text-color-hover);
151
+ }
152
+
153
+ .checkboxes-row{
154
+ margin-bottom: 0.5em;
155
+ margin-left: 0em;
156
+ }
157
+ .checkboxes-row > div{
158
+ flex: 0;
159
+ white-space: nowrap;
160
+ min-width: auto;
161
+ }
162
+
163
+ button.custom-button{
164
+ border-radius: var(--button-large-radius);
165
+ padding: var(--button-large-padding);
166
+ font-weight: var(--button-large-text-weight);
167
+ border: var(--button-border-width) solid var(--button-secondary-border-color);
168
+ background: var(--button-secondary-background-fill);
169
+ color: var(--button-secondary-text-color);
170
+ font-size: var(--button-large-text-size);
171
+ display: inline-flex;
172
+ justify-content: center;
173
+ align-items: center;
174
+ transition: var(--button-transition);
175
+ box-shadow: var(--button-shadow);
176
+ text-align: center;
177
+ }
178
+
179
+
180
+ /* txt2img/img2img specific */
181
+
182
+ .block.token-counter{
183
+ position: absolute;
184
+ display: inline-block;
185
+ right: 1em;
186
+ min-width: 0 !important;
187
+ width: auto;
188
+ z-index: 100;
189
+ top: -0.75em;
190
+ }
191
+
192
+ .block.token-counter span{
193
+ background: var(--input-background-fill) !important;
194
+ box-shadow: 0 0 0.0 0.3em rgba(192,192,192,0.15), inset 0 0 0.6em rgba(192,192,192,0.075);
195
+ border: 2px solid rgba(192,192,192,0.4) !important;
196
+ border-radius: 0.4em;
197
+ }
198
+
199
+ .block.token-counter.error span{
200
+ box-shadow: 0 0 0.0 0.3em rgba(255,0,0,0.15), inset 0 0 0.6em rgba(255,0,0,0.075);
201
+ border: 2px solid rgba(255,0,0,0.4) !important;
202
+ }
203
+
204
+ .block.token-counter div{
205
+ display: inline;
206
+ }
207
+
208
+ .block.token-counter span{
209
+ padding: 0.1em 0.75em;
210
+ }
211
+
212
+ [id$=_subseed_show]{
213
+ min-width: auto !important;
214
+ flex-grow: 0 !important;
215
+ display: flex;
216
+ }
217
+
218
+ [id$=_subseed_show] label{
219
+ margin-bottom: 0.5em;
220
+ align-self: end;
221
+ }
222
+
223
+ .performance {
224
+ font-size: 0.85em;
225
+ color: #444;
226
+ }
227
+
228
+ .performance p{
229
+ display: inline-block;
230
+ }
231
+
232
+ .performance .time {
233
+ margin-right: 0;
234
+ }
235
+
236
+ .performance .vram {
237
+ }
238
+
239
+ #txt2img_generate, #img2img_generate {
240
+ min-height: 4.5em;
241
+ }
242
+
243
+ @media screen and (min-width: 2500px) {
244
+ #txt2img_gallery, #img2img_gallery {
245
+ min-height: 768px;
246
+ }
247
+ }
248
+
249
+ #txt2img_gallery img, #img2img_gallery img{
250
+ object-fit: scale-down;
251
+ }
252
+ #txt2img_actions_column, #img2img_actions_column {
253
+ gap: 0.5em;
254
+ }
255
+ #txt2img_tools, #img2img_tools{
256
+ gap: 0.4em;
257
+ }
258
+
259
+ .interrogate-col{
260
+ min-width: 0 !important;
261
+ max-width: fit-content;
262
+ gap: 0.5em;
263
+ }
264
+ .interrogate-col > button{
265
+ flex: 1;
266
+ }
267
+
268
+ .generate-box{
269
+ position: relative;
270
+ }
271
+ .gradio-button.generate-box-skip, .gradio-button.generate-box-interrupt{
272
+ position: absolute;
273
+ width: 50%;
274
+ height: 100%;
275
+ display: none;
276
+ background: #b4c0cc;
277
+ }
278
+ .gradio-button.generate-box-skip:hover, .gradio-button.generate-box-interrupt:hover{
279
+ background: #c2cfdb;
280
+ }
281
+ .gradio-button.generate-box-interrupt{
282
+ left: 0;
283
+ border-radius: 0.5rem 0 0 0.5rem;
284
+ }
285
+ .gradio-button.generate-box-skip{
286
+ right: 0;
287
+ border-radius: 0 0.5rem 0.5rem 0;
288
+ }
289
+
290
+ #txtimg_hr_finalres{
291
+ min-height: 0 !important;
292
+ padding: .625rem .75rem;
293
+ margin-left: -0.75em
294
+ }
295
+
296
+ #img2img_scale_resolution_preview.block{
297
+ display: flex;
298
+ align-items: end;
299
+ }
300
+
301
+ #txtimg_hr_finalres .resolution, #img2img_scale_resolution_preview .resolution{
302
+ font-weight: bold;
303
+ }
304
+
305
+ .inactive{
306
+ opacity: 0.5;
307
+ }
308
+
309
+ [id$=_column_batch]{
310
+ min-width: min(13.5em, 100%) !important;
311
+ }
312
+
313
+ div.dimensions-tools{
314
+ min-width: 0 !important;
315
+ max-width: fit-content;
316
+ flex-direction: row;
317
+ align-content: center;
318
+ }
319
+
320
+ div#extras_scale_to_tab div.form{
321
+ flex-direction: row;
322
+ }
323
+
324
+ #mode_img2img .gradio-image > div.fixed-height, #mode_img2img .gradio-image > div.fixed-height img{
325
+ height: 480px !important;
326
+ max-height: 480px !important;
327
+ min-height: 480px !important;
328
+ }
329
+
330
+ #img2img_sketch, #img2maskimg, #inpaint_sketch {
331
+ overflow: overlay !important;
332
+ resize: auto;
333
+ background: var(--panel-background-fill);
334
+ z-index: 5;
335
+ }
336
+
337
+ .image-buttons button{
338
+ min-width: auto;
339
+ }
340
+
341
+ .infotext {
342
+ overflow-wrap: break-word;
343
+ }
344
+
345
+ #img2img_column_batch{
346
+ align-self: end;
347
+ margin-bottom: 0.9em;
348
+ }
349
+
350
+ #img2img_unused_scale_by_slider{
351
+ visibility: hidden;
352
+ width: 0.5em;
353
+ max-width: 0.5em;
354
+ min-width: 0.5em;
355
+ }
356
+
357
+ /* settings */
358
+ #quicksettings {
359
+ width: fit-content;
360
+ align-items: end;
361
+ }
362
+
363
+ #quicksettings > div, #quicksettings > fieldset{
364
+ max-width: 24em;
365
+ min-width: 24em;
366
+ padding: 0;
367
+ border: none;
368
+ box-shadow: none;
369
+ background: none;
370
+ }
371
+
372
+ #settings{
373
+ display: block;
374
+ }
375
+
376
+ #settings > div{
377
+ border: none;
378
+ margin-left: 10em;
379
+ }
380
+
381
+ #settings > div.tab-nav{
382
+ float: left;
383
+ display: block;
384
+ margin-left: 0;
385
+ width: 10em;
386
+ }
387
+
388
+ #settings > div.tab-nav button{
389
+ display: block;
390
+ border: none;
391
+ text-align: left;
392
+ white-space: initial;
393
+ }
394
+
395
+ #settings_result{
396
+ height: 1.4em;
397
+ margin: 0 1.2em;
398
+ }
399
+
400
+
401
+ /* live preview */
402
+ .progressDiv{
403
+ position: relative;
404
+ height: 20px;
405
+ background: #b4c0cc;
406
+ border-radius: 3px !important;
407
+ margin-bottom: -3px;
408
+ }
409
+
410
+ .dark .progressDiv{
411
+ background: #424c5b;
412
+ }
413
+
414
+ .progressDiv .progress{
415
+ width: 0%;
416
+ height: 20px;
417
+ background: #0060df;
418
+ color: white;
419
+ font-weight: bold;
420
+ line-height: 20px;
421
+ padding: 0 8px 0 0;
422
+ text-align: right;
423
+ border-radius: 3px;
424
+ overflow: visible;
425
+ white-space: nowrap;
426
+ padding: 0 0.5em;
427
+ }
428
+
429
+ .livePreview{
430
+ position: absolute;
431
+ z-index: 300;
432
+ background-color: white;
433
+ margin: -4px;
434
+ }
435
+
436
+ .dark .livePreview{
437
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
438
+ }
439
+
440
+ .livePreview img{
441
+ position: absolute;
442
+ object-fit: contain;
443
+ width: 100%;
444
+ height: 100%;
445
+ }
446
+
447
+ /* fullscreen popup (ie in Lora's (i) button) */
448
+
449
+ .popup-metadata{
450
+ color: black;
451
+ background: white;
452
+ display: inline-block;
453
+ padding: 1em;
454
+ white-space: pre-wrap;
455
+ }
456
+
457
+ .global-popup{
458
+ display: flex;
459
+ position: fixed;
460
+ z-index: 1001;
461
+ left: 0;
462
+ top: 0;
463
+ width: 100%;
464
+ height: 100%;
465
+ overflow: auto;
466
+ background-color: rgba(20, 20, 20, 0.95);
467
+ }
468
+
469
+
470
+ .global-popup-close:before {
471
+ content: "×";
472
+ }
473
+
474
+ .global-popup-close{
475
+ position: fixed;
476
+ right: 0.25em;
477
+ top: 0;
478
+ cursor: pointer;
479
+ color: white;
480
+ font-size: 32pt;
481
+ }
482
+
483
+ .global-popup-inner{
484
+ display: inline-block;
485
+ margin: auto;
486
+ padding: 2em;
487
+ }
488
+
489
+ /* fullpage image viewer */
490
+
491
+ #lightboxModal{
492
+ display: none;
493
+ position: fixed;
494
+ z-index: 1001;
495
+ left: 0;
496
+ top: 0;
497
+ width: 100%;
498
+ height: 100%;
499
+ overflow: auto;
500
+ background-color: rgba(20, 20, 20, 0.95);
501
+ user-select: none;
502
+ -webkit-user-select: none;
503
+ flex-direction: column;
504
+ }
505
+
506
+ .modalControls {
507
+ display: flex;
508
+ gap: 1em;
509
+ padding: 1em;
510
+ background-color: rgba(0,0,0,0.2);
511
+ }
512
+ .modalClose {
513
+ margin-left: auto;
514
+ }
515
+ .modalControls span{
516
+ color: white;
517
+ font-size: 35px;
518
+ font-weight: bold;
519
+ cursor: pointer;
520
+ width: 1em;
521
+ }
522
+
523
+ .modalControls span:hover, .modalControls span:focus{
524
+ color: #999;
525
+ text-decoration: none;
526
+ }
527
+
528
+ #lightboxModal > img {
529
+ display: block;
530
+ margin: auto;
531
+ width: auto;
532
+ }
533
+
534
+ #lightboxModal > img.modalImageFullscreen{
535
+ object-fit: contain;
536
+ height: 100%;
537
+ }
538
+
539
+ .modalPrev,
540
+ .modalNext {
541
+ cursor: pointer;
542
+ position: absolute;
543
+ top: 50%;
544
+ width: auto;
545
+ padding: 16px;
546
+ margin-top: -50px;
547
+ color: white;
548
+ font-weight: bold;
549
+ font-size: 20px;
550
+ transition: 0.6s ease;
551
+ border-radius: 0 3px 3px 0;
552
+ user-select: none;
553
+ -webkit-user-select: none;
554
+ }
555
+
556
+ .modalNext {
557
+ right: 0;
558
+ border-radius: 3px 0 0 3px;
559
+ }
560
+
561
+ .modalPrev:hover,
562
+ .modalNext:hover {
563
+ background-color: rgba(0, 0, 0, 0.8);
564
+ }
565
+
566
+ #imageARPreview {
567
+ position: absolute;
568
+ top: 0px;
569
+ left: 0px;
570
+ border: 2px solid red;
571
+ background: rgba(255, 0, 0, 0.3);
572
+ z-index: 900;
573
+ pointer-events: none;
574
+ display: none;
575
+ }
576
+
577
+ /* context menu (ie for the generate button) */
578
+
579
+ #context-menu{
580
+ z-index:9999;
581
+ position:absolute;
582
+ display:block;
583
+ padding:0px 0;
584
+ border:2px solid #a55000;
585
+ border-radius:8px;
586
+ box-shadow:1px 1px 2px #CE6400;
587
+ width: 200px;
588
+ }
589
+
590
+ .context-menu-items{
591
+ list-style: none;
592
+ margin: 0;
593
+ padding: 0;
594
+ }
595
+
596
+ .context-menu-items a{
597
+ display:block;
598
+ padding:5px;
599
+ cursor:pointer;
600
+ }
601
+
602
+ .context-menu-items a:hover{
603
+ background: #a55000;
604
+ }
605
+
606
+
607
+ /* extensions */
608
+
609
+ #tab_extensions table{
610
+ border-collapse: collapse;
611
+ }
612
+
613
+ #tab_extensions table td, #tab_extensions table th{
614
+ border: 1px solid #ccc;
615
+ padding: 0.25em 0.5em;
616
+ }
617
+
618
+ #tab_extensions table input[type="checkbox"]{
619
+ margin-right: 0.5em;
620
+ appearance: checkbox;
621
+ }
622
+
623
+ #tab_extensions button{
624
+ max-width: 16em;
625
+ }
626
+
627
+ #tab_extensions input[disabled="disabled"]{
628
+ opacity: 0.5;
629
+ }
630
+
631
+ .extension-tag{
632
+ font-weight: bold;
633
+ font-size: 95%;
634
+ }
635
+
636
+ #available_extensions .info{
637
+ margin: 0;
638
+ }
639
+
640
+ #available_extensions .date_added{
641
+ opacity: 0.85;
642
+ font-size: 90%;
643
+ }
644
+
645
+ /* replace original footer with ours */
646
+
647
+ footer {
648
+ display: none !important;
649
+ }
650
+
651
+ #footer{
652
+ text-align: center;
653
+ }
654
+
655
+ #footer div{
656
+ display: inline-block;
657
+ }
658
+
659
+ #footer .versions{
660
+ font-size: 85%;
661
+ opacity: 0.85;
662
+ }
663
+
664
+ /* extra networks UI */
665
+
666
+ .extra-network-cards{
667
+ height: 725px;
668
+ overflow: scroll;
669
+ resize: vertical;
670
+ }
671
+
672
+ .extra-networks > div > [id *= '_extra_']{
673
+ margin: 0.3em;
674
+ }
675
+
676
+ .extra-network-subdirs{
677
+ padding: 0.2em 0.35em;
678
+ }
679
+
680
+ .extra-network-subdirs button{
681
+ margin: 0 0.15em;
682
+ }
683
+ .extra-networks .tab-nav .search{
684
+ display: inline-block;
685
+ max-width: 16em;
686
+ margin: 0.3em;
687
+ align-self: center;
688
+ width: 16em;
689
+ }
690
+
691
+ #txt2img_extra_view, #img2img_extra_view {
692
+ width: auto;
693
+ }
694
+
695
+ .extra-network-cards .nocards, .extra-network-thumbs .nocards{
696
+ margin: 1.25em 0.5em 0.5em 0.5em;
697
+ }
698
+
699
+ .extra-network-cards .nocards h1, .extra-network-thumbs .nocards h1{
700
+ font-size: 1.5em;
701
+ margin-bottom: 1em;
702
+ }
703
+
704
+ .extra-network-cards .nocards li, .extra-network-thumbs .nocards li{
705
+ margin-left: 0.5em;
706
+ }
707
+
708
+
709
+ .extra-network-cards .card .metadata-button:before, .extra-network-thumbs .card .metadata-button:before{
710
+ content: "🛈";
711
+ }
712
+ .extra-network-cards .card .metadata-button, .extra-network-thumbs .card .metadata-button{
713
+ display: none;
714
+ position: absolute;
715
+ right: 0;
716
+ color: white;
717
+ text-shadow: 2px 2px 3px black;
718
+ padding: 0.25em;
719
+ font-size: 22pt;
720
+ width: 1.5em;
721
+ }
722
+ .extra-network-cards .card:hover .metadata-button, .extra-network-thumbs .card:hover .metadata-button{
723
+ display: inline-block;
724
+ }
725
+ .extra-network-cards .card .metadata-button:hover, .extra-network-thumbs .card .metadata-button:hover{
726
+ color: red;
727
+ }
728
+
729
+
730
+ .extra-network-thumbs {
731
+ display: flex;
732
+ flex-flow: row wrap;
733
+ gap: 10px;
734
+ }
735
+
736
+ .extra-network-thumbs .card {
737
+ height: 6em;
738
+ width: 6em;
739
+ cursor: pointer;
740
+ background-image: url('./file=html/card-no-preview.png');
741
+ background-size: cover;
742
+ background-position: center center;
743
+ position: relative;
744
+ }
745
+
746
+ .extra-network-thumbs .card:hover .additional a {
747
+ display: inline-block;
748
+ }
749
+
750
+ .extra-network-thumbs .actions .additional a {
751
+ background-image: url('./file=html/image-update.svg');
752
+ background-repeat: no-repeat;
753
+ background-size: cover;
754
+ background-position: center center;
755
+ position: absolute;
756
+ top: 0;
757
+ left: 0;
758
+ width: 24px;
759
+ height: 24px;
760
+ display: none;
761
+ font-size: 0;
762
+ text-align: -9999;
763
+ }
764
+
765
+ .extra-network-thumbs .actions .name {
766
+ position: absolute;
767
+ bottom: 0;
768
+ font-size: 10px;
769
+ padding: 3px;
770
+ width: 100%;
771
+ overflow: hidden;
772
+ white-space: nowrap;
773
+ text-overflow: ellipsis;
774
+ background: rgba(0,0,0,.5);
775
+ color: white;
776
+ }
777
+
778
+ .extra-network-thumbs .card:hover .actions .name {
779
+ white-space: normal;
780
+ word-break: break-all;
781
+ }
782
+
783
+ .extra-network-cards .card{
784
+ display: inline-block;
785
+ margin: 0.5em;
786
+ width: 16em;
787
+ height: 24em;
788
+ box-shadow: 0 0 5px rgba(128, 128, 128, 0.5);
789
+ border-radius: 0.2em;
790
+ position: relative;
791
+
792
+ background-size: auto 100%;
793
+ background-position: center;
794
+ overflow: hidden;
795
+ cursor: pointer;
796
+
797
+ background-image: url('./file=html/card-no-preview.png')
798
+ }
799
+
800
+ .extra-network-cards .card:hover{
801
+ box-shadow: 0 0 2px 0.3em rgba(0, 128, 255, 0.35);
802
+ }
803
+
804
+ .extra-network-cards .card .actions .additional{
805
+ display: none;
806
+ }
807
+
808
+ .extra-network-cards .card .actions{
809
+ position: absolute;
810
+ bottom: 0;
811
+ left: 0;
812
+ right: 0;
813
+ padding: 0.5em;
814
+ background: rgba(0,0,0,0.5);
815
+ box-shadow: 0 0 0.25em 0.25em rgba(0,0,0,0.5);
816
+ text-shadow: 0 0 0.2em black;
817
+ }
818
+
819
+ .extra-network-cards .card .actions *{
820
+ color: white;
821
+ }
822
+
823
+ .extra-network-cards .card .actions:hover{
824
+ box-shadow: 0 0 0.75em 0.75em rgba(0,0,0,0.5) !important;
825
+ }
826
+
827
+ .extra-network-cards .card .actions .name{
828
+ font-size: 1.7em;
829
+ font-weight: bold;
830
+ line-break: anywhere;
831
+ }
832
+
833
+ .extra-network-cards .card .actions .description {
834
+ display: block;
835
+ max-height: 3em;
836
+ white-space: pre-wrap;
837
+ line-height: 1.1;
838
+ }
839
+
840
+ .extra-network-cards .card .actions .description:hover {
841
+ max-height: none;
842
+ }
843
+
844
+ .extra-network-cards .card .actions:hover .additional{
845
+ display: block;
846
+ }
847
+
848
+ .extra-network-cards .card ul{
849
+ margin: 0.25em 0 0.75em 0.25em;
850
+ cursor: unset;
851
+ }
852
+
853
+ .extra-network-cards .card ul a{
854
+ cursor: pointer;
855
+ }
856
+
857
+ .extra-network-cards .card ul a:hover{
858
+ color: red;
859
+ }
ui-config.json ADDED
@@ -0,0 +1,623 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "txt2img/Prompt/visible": true,
3
+ "txt2img/Prompt/value": "",
4
+ "txt2img/Negative prompt/visible": true,
5
+ "txt2img/Negative prompt/value": "",
6
+ "txt2img/Styles/visible": true,
7
+ "txt2img/Styles/value": [],
8
+ "txt2img/Tabs@txt2img_extra_tabs/selected": null,
9
+ "txt2img/Sampling method/visible": true,
10
+ "txt2img/Sampling method/value": "Euler a",
11
+ "txt2img/Sampling steps/visible": true,
12
+ "txt2img/Sampling steps/value": 20,
13
+ "txt2img/Sampling steps/minimum": 1,
14
+ "txt2img/Sampling steps/maximum": 150,
15
+ "txt2img/Sampling steps/step": 1,
16
+ "txt2img/Restore faces/visible": true,
17
+ "txt2img/Restore faces/value": false,
18
+ "txt2img/Tiling/visible": true,
19
+ "txt2img/Tiling/value": false,
20
+ "txt2img/Hires. fix/visible": true,
21
+ "txt2img/Hires. fix/value": false,
22
+ "txt2img/Upscaler/visible": true,
23
+ "txt2img/Upscaler/value": "Latent",
24
+ "txt2img/Hires steps/visible": true,
25
+ "txt2img/Hires steps/value": 0,
26
+ "txt2img/Hires steps/minimum": 0,
27
+ "txt2img/Hires steps/maximum": 150,
28
+ "txt2img/Hires steps/step": 1,
29
+ "txt2img/Denoising strength/visible": true,
30
+ "txt2img/Denoising strength/value": 0.7,
31
+ "txt2img/Denoising strength/minimum": 0.0,
32
+ "txt2img/Denoising strength/maximum": 1.0,
33
+ "txt2img/Denoising strength/step": 0.01,
34
+ "txt2img/Upscale by/visible": true,
35
+ "txt2img/Upscale by/value": 2.0,
36
+ "txt2img/Upscale by/minimum": 1.0,
37
+ "txt2img/Upscale by/maximum": 4.0,
38
+ "txt2img/Upscale by/step": 0.05,
39
+ "txt2img/Resize width to/visible": true,
40
+ "txt2img/Resize width to/value": 0,
41
+ "txt2img/Resize width to/minimum": 0,
42
+ "txt2img/Resize width to/maximum": 2048,
43
+ "txt2img/Resize width to/step": 8,
44
+ "txt2img/Resize height to/visible": true,
45
+ "txt2img/Resize height to/value": 0,
46
+ "txt2img/Resize height to/minimum": 0,
47
+ "txt2img/Resize height to/maximum": 2048,
48
+ "txt2img/Resize height to/step": 8,
49
+ "txt2img/Width/visible": true,
50
+ "txt2img/Width/value": 512,
51
+ "txt2img/Width/minimum": 64,
52
+ "txt2img/Width/maximum": 2048,
53
+ "txt2img/Width/step": 8,
54
+ "txt2img/Height/visible": true,
55
+ "txt2img/Height/value": 512,
56
+ "txt2img/Height/minimum": 64,
57
+ "txt2img/Height/maximum": 2048,
58
+ "txt2img/Height/step": 8,
59
+ "txt2img/Switch dims/visible": true,
60
+ "txt2img/Batch count/visible": true,
61
+ "txt2img/Batch count/value": 1,
62
+ "txt2img/Batch count/minimum": 1,
63
+ "txt2img/Batch count/maximum": 100,
64
+ "txt2img/Batch count/step": 1,
65
+ "txt2img/Batch size/visible": true,
66
+ "txt2img/Batch size/value": 1,
67
+ "txt2img/Batch size/minimum": 1,
68
+ "txt2img/Batch size/maximum": 8,
69
+ "txt2img/Batch size/step": 1,
70
+ "txt2img/CFG Scale/visible": true,
71
+ "txt2img/CFG Scale/value": 7.0,
72
+ "txt2img/CFG Scale/minimum": 1.0,
73
+ "txt2img/CFG Scale/maximum": 30.0,
74
+ "txt2img/CFG Scale/step": 0.5,
75
+ "txt2img/Seed/visible": true,
76
+ "txt2img/Seed/value": -1.0,
77
+ "txt2img/Random seed/visible": true,
78
+ "txt2img/Reuse seed/visible": true,
79
+ "txt2img/Extra/visible": true,
80
+ "txt2img/Extra/value": false,
81
+ "txt2img/Variation seed/visible": true,
82
+ "txt2img/Variation seed/value": -1.0,
83
+ "txt2img/Variation strength/visible": true,
84
+ "txt2img/Variation strength/value": 0.0,
85
+ "txt2img/Variation strength/minimum": 0,
86
+ "txt2img/Variation strength/maximum": 1,
87
+ "txt2img/Variation strength/step": 0.01,
88
+ "txt2img/Resize seed from width/visible": true,
89
+ "txt2img/Resize seed from width/value": 0,
90
+ "txt2img/Resize seed from width/minimum": 0,
91
+ "txt2img/Resize seed from width/maximum": 2048,
92
+ "txt2img/Resize seed from width/step": 8,
93
+ "txt2img/Resize seed from height/visible": true,
94
+ "txt2img/Resize seed from height/value": 0,
95
+ "txt2img/Resize seed from height/minimum": 0,
96
+ "txt2img/Resize seed from height/maximum": 2048,
97
+ "txt2img/Resize seed from height/step": 8,
98
+ "txt2img/Override settings/value": null,
99
+ "txt2img/Script/visible": true,
100
+ "txt2img/Script/value": "None",
101
+ "customscript/prompt_matrix.py/txt2img/Put variable parts at start of prompt/visible": true,
102
+ "customscript/prompt_matrix.py/txt2img/Put variable parts at start of prompt/value": false,
103
+ "customscript/prompt_matrix.py/txt2img/Use different seed for each picture/visible": true,
104
+ "customscript/prompt_matrix.py/txt2img/Use different seed for each picture/value": false,
105
+ "customscript/prompt_matrix.py/txt2img/Select prompt/visible": true,
106
+ "customscript/prompt_matrix.py/txt2img/Select prompt/value": "positive",
107
+ "customscript/prompt_matrix.py/txt2img/Select joining char/visible": true,
108
+ "customscript/prompt_matrix.py/txt2img/Select joining char/value": "comma",
109
+ "customscript/prompt_matrix.py/txt2img/Grid margins (px)/visible": true,
110
+ "customscript/prompt_matrix.py/txt2img/Grid margins (px)/value": 0,
111
+ "customscript/prompt_matrix.py/txt2img/Grid margins (px)/minimum": 0,
112
+ "customscript/prompt_matrix.py/txt2img/Grid margins (px)/maximum": 500,
113
+ "customscript/prompt_matrix.py/txt2img/Grid margins (px)/step": 2,
114
+ "customscript/prompts_from_file.py/txt2img/Iterate seed every line/visible": true,
115
+ "customscript/prompts_from_file.py/txt2img/Iterate seed every line/value": false,
116
+ "customscript/prompts_from_file.py/txt2img/Use same random seed for all lines/visible": true,
117
+ "customscript/prompts_from_file.py/txt2img/Use same random seed for all lines/value": false,
118
+ "customscript/prompts_from_file.py/txt2img/List of prompt inputs/visible": true,
119
+ "customscript/prompts_from_file.py/txt2img/List of prompt inputs/value": "",
120
+ "customscript/xyz_grid.py/txt2img/X type/visible": true,
121
+ "customscript/xyz_grid.py/txt2img/X type/value": "Seed",
122
+ "customscript/xyz_grid.py/txt2img/X values/visible": true,
123
+ "customscript/xyz_grid.py/txt2img/X values/value": "",
124
+ "customscript/xyz_grid.py/txt2img/Y type/visible": true,
125
+ "customscript/xyz_grid.py/txt2img/Y type/value": "Nothing",
126
+ "customscript/xyz_grid.py/txt2img/Y values/visible": true,
127
+ "customscript/xyz_grid.py/txt2img/Y values/value": "",
128
+ "customscript/xyz_grid.py/txt2img/Z type/visible": true,
129
+ "customscript/xyz_grid.py/txt2img/Z type/value": "Nothing",
130
+ "customscript/xyz_grid.py/txt2img/Z values/visible": true,
131
+ "customscript/xyz_grid.py/txt2img/Z values/value": "",
132
+ "customscript/xyz_grid.py/txt2img/Draw legend/visible": true,
133
+ "customscript/xyz_grid.py/txt2img/Draw legend/value": true,
134
+ "customscript/xyz_grid.py/txt2img/Keep -1 for seeds/visible": true,
135
+ "customscript/xyz_grid.py/txt2img/Keep -1 for seeds/value": false,
136
+ "customscript/xyz_grid.py/txt2img/Include Sub Images/visible": true,
137
+ "customscript/xyz_grid.py/txt2img/Include Sub Images/value": false,
138
+ "customscript/xyz_grid.py/txt2img/Include Sub Grids/visible": true,
139
+ "customscript/xyz_grid.py/txt2img/Include Sub Grids/value": false,
140
+ "customscript/xyz_grid.py/txt2img/Grid margins (px)/visible": true,
141
+ "customscript/xyz_grid.py/txt2img/Grid margins (px)/value": 0,
142
+ "customscript/xyz_grid.py/txt2img/Grid margins (px)/minimum": 0,
143
+ "customscript/xyz_grid.py/txt2img/Grid margins (px)/maximum": 500,
144
+ "customscript/xyz_grid.py/txt2img/Grid margins (px)/step": 2,
145
+ "img2img/Prompt/visible": true,
146
+ "img2img/Prompt/value": "",
147
+ "img2img/Negative prompt/visible": true,
148
+ "img2img/Negative prompt/value": "",
149
+ "img2img/Styles/visible": true,
150
+ "img2img/Styles/value": [],
151
+ "img2img/Tabs@img2img_extra_tabs/selected": null,
152
+ "img2img/Tabs@mode_img2img/selected": null,
153
+ "img2img/Input directory/visible": true,
154
+ "img2img/Input directory/value": "",
155
+ "img2img/Output directory/visible": true,
156
+ "img2img/Output directory/value": "",
157
+ "img2img/Inpaint batch mask directory (required for inpaint batch processing only)/visible": true,
158
+ "img2img/Inpaint batch mask directory (required for inpaint batch processing only)/value": "",
159
+ "img2img/Resize mode/visible": true,
160
+ "img2img/Resize mode/value": "Just resize",
161
+ "img2img/Mask blur/visible": true,
162
+ "img2img/Mask blur/value": 4,
163
+ "img2img/Mask blur/minimum": 0,
164
+ "img2img/Mask blur/maximum": 64,
165
+ "img2img/Mask blur/step": 1,
166
+ "img2img/Mask transparency/value": 0,
167
+ "img2img/Mask transparency/minimum": 0,
168
+ "img2img/Mask transparency/maximum": 100,
169
+ "img2img/Mask transparency/step": 1,
170
+ "img2img/Mask mode/visible": true,
171
+ "img2img/Mask mode/value": "Inpaint masked",
172
+ "img2img/Masked content/visible": true,
173
+ "img2img/Masked content/value": "original",
174
+ "img2img/Inpaint area/visible": true,
175
+ "img2img/Inpaint area/value": "Whole picture",
176
+ "img2img/Only masked padding, pixels/visible": true,
177
+ "img2img/Only masked padding, pixels/value": 32,
178
+ "img2img/Only masked padding, pixels/minimum": 0,
179
+ "img2img/Only masked padding, pixels/maximum": 256,
180
+ "img2img/Only masked padding, pixels/step": 4,
181
+ "img2img/Sampling method/visible": true,
182
+ "img2img/Sampling method/value": "Euler a",
183
+ "img2img/Sampling steps/visible": true,
184
+ "img2img/Sampling steps/value": 20,
185
+ "img2img/Sampling steps/minimum": 1,
186
+ "img2img/Sampling steps/maximum": 150,
187
+ "img2img/Sampling steps/step": 1,
188
+ "img2img/Restore faces/visible": true,
189
+ "img2img/Restore faces/value": false,
190
+ "img2img/Tiling/visible": true,
191
+ "img2img/Tiling/value": false,
192
+ "img2img/Width/visible": true,
193
+ "img2img/Width/value": 512,
194
+ "img2img/Width/minimum": 64,
195
+ "img2img/Width/maximum": 2048,
196
+ "img2img/Width/step": 8,
197
+ "img2img/Height/visible": true,
198
+ "img2img/Height/value": 512,
199
+ "img2img/Height/minimum": 64,
200
+ "img2img/Height/maximum": 2048,
201
+ "img2img/Height/step": 8,
202
+ "img2img/Scale/visible": true,
203
+ "img2img/Scale/value": 1.0,
204
+ "img2img/Scale/minimum": 0.05,
205
+ "img2img/Scale/maximum": 4.0,
206
+ "img2img/Scale/step": 0.05,
207
+ "img2img/Unused/visible": true,
208
+ "img2img/Unused/value": 0,
209
+ "img2img/Unused/minimum": 0,
210
+ "img2img/Unused/maximum": 100,
211
+ "img2img/Unused/step": 1,
212
+ "img2img/Batch count/visible": true,
213
+ "img2img/Batch count/value": 1,
214
+ "img2img/Batch count/minimum": 1,
215
+ "img2img/Batch count/maximum": 100,
216
+ "img2img/Batch count/step": 1,
217
+ "img2img/Batch size/visible": true,
218
+ "img2img/Batch size/value": 1,
219
+ "img2img/Batch size/minimum": 1,
220
+ "img2img/Batch size/maximum": 8,
221
+ "img2img/Batch size/step": 1,
222
+ "img2img/CFG Scale/visible": true,
223
+ "img2img/CFG Scale/value": 7.0,
224
+ "img2img/CFG Scale/minimum": 1.0,
225
+ "img2img/CFG Scale/maximum": 30.0,
226
+ "img2img/CFG Scale/step": 0.5,
227
+ "img2img/Image CFG Scale/value": 1.5,
228
+ "img2img/Image CFG Scale/minimum": 0,
229
+ "img2img/Image CFG Scale/maximum": 3.0,
230
+ "img2img/Image CFG Scale/step": 0.05,
231
+ "img2img/Denoising strength/visible": true,
232
+ "img2img/Denoising strength/value": 0.75,
233
+ "img2img/Denoising strength/minimum": 0.0,
234
+ "img2img/Denoising strength/maximum": 1.0,
235
+ "img2img/Denoising strength/step": 0.01,
236
+ "img2img/Seed/visible": true,
237
+ "img2img/Seed/value": -1.0,
238
+ "img2img/Random seed/visible": true,
239
+ "img2img/Reuse seed/visible": true,
240
+ "img2img/Extra/visible": true,
241
+ "img2img/Extra/value": false,
242
+ "img2img/Variation seed/visible": true,
243
+ "img2img/Variation seed/value": -1.0,
244
+ "img2img/Variation strength/visible": true,
245
+ "img2img/Variation strength/value": 0.0,
246
+ "img2img/Variation strength/minimum": 0,
247
+ "img2img/Variation strength/maximum": 1,
248
+ "img2img/Variation strength/step": 0.01,
249
+ "img2img/Resize seed from width/visible": true,
250
+ "img2img/Resize seed from width/value": 0,
251
+ "img2img/Resize seed from width/minimum": 0,
252
+ "img2img/Resize seed from width/maximum": 2048,
253
+ "img2img/Resize seed from width/step": 8,
254
+ "img2img/Resize seed from height/visible": true,
255
+ "img2img/Resize seed from height/value": 0,
256
+ "img2img/Resize seed from height/minimum": 0,
257
+ "img2img/Resize seed from height/maximum": 2048,
258
+ "img2img/Resize seed from height/step": 8,
259
+ "img2img/Override settings/value": null,
260
+ "img2img/Script/visible": true,
261
+ "img2img/Script/value": "None",
262
+ "customscript/img2imgalt.py/img2img/Override `Sampling method` to Euler?(this method is built for it)/visible": true,
263
+ "customscript/img2imgalt.py/img2img/Override `Sampling method` to Euler?(this method is built for it)/value": true,
264
+ "customscript/img2imgalt.py/img2img/Override `prompt` to the same value as `original prompt`?(and `negative prompt`)/visible": true,
265
+ "customscript/img2imgalt.py/img2img/Override `prompt` to the same value as `original prompt`?(and `negative prompt`)/value": true,
266
+ "customscript/img2imgalt.py/img2img/Original prompt/visible": true,
267
+ "customscript/img2imgalt.py/img2img/Original prompt/value": "",
268
+ "customscript/img2imgalt.py/img2img/Original negative prompt/visible": true,
269
+ "customscript/img2imgalt.py/img2img/Original negative prompt/value": "",
270
+ "customscript/img2imgalt.py/img2img/Override `Sampling Steps` to the same value as `Decode steps`?/visible": true,
271
+ "customscript/img2imgalt.py/img2img/Override `Sampling Steps` to the same value as `Decode steps`?/value": true,
272
+ "customscript/img2imgalt.py/img2img/Decode steps/visible": true,
273
+ "customscript/img2imgalt.py/img2img/Decode steps/value": 50,
274
+ "customscript/img2imgalt.py/img2img/Decode steps/minimum": 1,
275
+ "customscript/img2imgalt.py/img2img/Decode steps/maximum": 150,
276
+ "customscript/img2imgalt.py/img2img/Decode steps/step": 1,
277
+ "customscript/img2imgalt.py/img2img/Override `Denoising strength` to 1?/visible": true,
278
+ "customscript/img2imgalt.py/img2img/Override `Denoising strength` to 1?/value": true,
279
+ "customscript/img2imgalt.py/img2img/Decode CFG scale/visible": true,
280
+ "customscript/img2imgalt.py/img2img/Decode CFG scale/value": 1.0,
281
+ "customscript/img2imgalt.py/img2img/Decode CFG scale/minimum": 0.0,
282
+ "customscript/img2imgalt.py/img2img/Decode CFG scale/maximum": 15.0,
283
+ "customscript/img2imgalt.py/img2img/Decode CFG scale/step": 0.1,
284
+ "customscript/img2imgalt.py/img2img/Randomness/visible": true,
285
+ "customscript/img2imgalt.py/img2img/Randomness/value": 0.0,
286
+ "customscript/img2imgalt.py/img2img/Randomness/minimum": 0.0,
287
+ "customscript/img2imgalt.py/img2img/Randomness/maximum": 1.0,
288
+ "customscript/img2imgalt.py/img2img/Randomness/step": 0.01,
289
+ "customscript/img2imgalt.py/img2img/Sigma adjustment for finding noise for image/visible": true,
290
+ "customscript/img2imgalt.py/img2img/Sigma adjustment for finding noise for image/value": false,
291
+ "customscript/loopback.py/img2img/Loops/visible": true,
292
+ "customscript/loopback.py/img2img/Loops/value": 4,
293
+ "customscript/loopback.py/img2img/Loops/minimum": 1,
294
+ "customscript/loopback.py/img2img/Loops/maximum": 32,
295
+ "customscript/loopback.py/img2img/Loops/step": 1,
296
+ "customscript/loopback.py/img2img/Final denoising strength/visible": true,
297
+ "customscript/loopback.py/img2img/Final denoising strength/value": 0.5,
298
+ "customscript/loopback.py/img2img/Final denoising strength/minimum": 0,
299
+ "customscript/loopback.py/img2img/Final denoising strength/maximum": 1,
300
+ "customscript/loopback.py/img2img/Final denoising strength/step": 0.01,
301
+ "customscript/loopback.py/img2img/Denoising strength curve/visible": true,
302
+ "customscript/loopback.py/img2img/Denoising strength curve/value": "Linear",
303
+ "customscript/loopback.py/img2img/Append interrogated prompt at each iteration/visible": true,
304
+ "customscript/loopback.py/img2img/Append interrogated prompt at each iteration/value": "None",
305
+ "customscript/outpainting_mk_2.py/img2img/Pixels to expand/visible": true,
306
+ "customscript/outpainting_mk_2.py/img2img/Pixels to expand/value": 128,
307
+ "customscript/outpainting_mk_2.py/img2img/Pixels to expand/minimum": 8,
308
+ "customscript/outpainting_mk_2.py/img2img/Pixels to expand/maximum": 256,
309
+ "customscript/outpainting_mk_2.py/img2img/Pixels to expand/step": 8,
310
+ "customscript/outpainting_mk_2.py/img2img/Mask blur/visible": true,
311
+ "customscript/outpainting_mk_2.py/img2img/Mask blur/value": 8,
312
+ "customscript/outpainting_mk_2.py/img2img/Mask blur/minimum": 0,
313
+ "customscript/outpainting_mk_2.py/img2img/Mask blur/maximum": 64,
314
+ "customscript/outpainting_mk_2.py/img2img/Mask blur/step": 1,
315
+ "customscript/outpainting_mk_2.py/img2img/Fall-off exponent (lower=higher detail)/visible": true,
316
+ "customscript/outpainting_mk_2.py/img2img/Fall-off exponent (lower=higher detail)/value": 1.0,
317
+ "customscript/outpainting_mk_2.py/img2img/Fall-off exponent (lower=higher detail)/minimum": 0.0,
318
+ "customscript/outpainting_mk_2.py/img2img/Fall-off exponent (lower=higher detail)/maximum": 4.0,
319
+ "customscript/outpainting_mk_2.py/img2img/Fall-off exponent (lower=higher detail)/step": 0.01,
320
+ "customscript/outpainting_mk_2.py/img2img/Color variation/visible": true,
321
+ "customscript/outpainting_mk_2.py/img2img/Color variation/value": 0.05,
322
+ "customscript/outpainting_mk_2.py/img2img/Color variation/minimum": 0.0,
323
+ "customscript/outpainting_mk_2.py/img2img/Color variation/maximum": 1.0,
324
+ "customscript/outpainting_mk_2.py/img2img/Color variation/step": 0.01,
325
+ "customscript/poor_mans_outpainting.py/img2img/Pixels to expand/visible": true,
326
+ "customscript/poor_mans_outpainting.py/img2img/Pixels to expand/value": 128,
327
+ "customscript/poor_mans_outpainting.py/img2img/Pixels to expand/minimum": 8,
328
+ "customscript/poor_mans_outpainting.py/img2img/Pixels to expand/maximum": 256,
329
+ "customscript/poor_mans_outpainting.py/img2img/Pixels to expand/step": 8,
330
+ "customscript/poor_mans_outpainting.py/img2img/Mask blur/visible": true,
331
+ "customscript/poor_mans_outpainting.py/img2img/Mask blur/value": 4,
332
+ "customscript/poor_mans_outpainting.py/img2img/Mask blur/minimum": 0,
333
+ "customscript/poor_mans_outpainting.py/img2img/Mask blur/maximum": 64,
334
+ "customscript/poor_mans_outpainting.py/img2img/Mask blur/step": 1,
335
+ "customscript/poor_mans_outpainting.py/img2img/Masked content/visible": true,
336
+ "customscript/poor_mans_outpainting.py/img2img/Masked content/value": "fill",
337
+ "customscript/prompt_matrix.py/img2img/Put variable parts at start of prompt/visible": true,
338
+ "customscript/prompt_matrix.py/img2img/Put variable parts at start of prompt/value": false,
339
+ "customscript/prompt_matrix.py/img2img/Use different seed for each picture/visible": true,
340
+ "customscript/prompt_matrix.py/img2img/Use different seed for each picture/value": false,
341
+ "customscript/prompt_matrix.py/img2img/Select prompt/visible": true,
342
+ "customscript/prompt_matrix.py/img2img/Select prompt/value": "positive",
343
+ "customscript/prompt_matrix.py/img2img/Select joining char/visible": true,
344
+ "customscript/prompt_matrix.py/img2img/Select joining char/value": "comma",
345
+ "customscript/prompt_matrix.py/img2img/Grid margins (px)/visible": true,
346
+ "customscript/prompt_matrix.py/img2img/Grid margins (px)/value": 0,
347
+ "customscript/prompt_matrix.py/img2img/Grid margins (px)/minimum": 0,
348
+ "customscript/prompt_matrix.py/img2img/Grid margins (px)/maximum": 500,
349
+ "customscript/prompt_matrix.py/img2img/Grid margins (px)/step": 2,
350
+ "customscript/prompts_from_file.py/img2img/Iterate seed every line/visible": true,
351
+ "customscript/prompts_from_file.py/img2img/Iterate seed every line/value": false,
352
+ "customscript/prompts_from_file.py/img2img/Use same random seed for all lines/visible": true,
353
+ "customscript/prompts_from_file.py/img2img/Use same random seed for all lines/value": false,
354
+ "customscript/prompts_from_file.py/img2img/List of prompt inputs/visible": true,
355
+ "customscript/prompts_from_file.py/img2img/List of prompt inputs/value": "",
356
+ "customscript/sd_upscale.py/img2img/Tile overlap/visible": true,
357
+ "customscript/sd_upscale.py/img2img/Tile overlap/value": 64,
358
+ "customscript/sd_upscale.py/img2img/Tile overlap/minimum": 0,
359
+ "customscript/sd_upscale.py/img2img/Tile overlap/maximum": 256,
360
+ "customscript/sd_upscale.py/img2img/Tile overlap/step": 16,
361
+ "customscript/sd_upscale.py/img2img/Scale Factor/visible": true,
362
+ "customscript/sd_upscale.py/img2img/Scale Factor/value": 2.0,
363
+ "customscript/sd_upscale.py/img2img/Scale Factor/minimum": 1.0,
364
+ "customscript/sd_upscale.py/img2img/Scale Factor/maximum": 4.0,
365
+ "customscript/sd_upscale.py/img2img/Scale Factor/step": 0.05,
366
+ "customscript/sd_upscale.py/img2img/Upscaler/visible": true,
367
+ "customscript/sd_upscale.py/img2img/Upscaler/value": "None",
368
+ "customscript/xyz_grid.py/img2img/X type/visible": true,
369
+ "customscript/xyz_grid.py/img2img/X type/value": "Seed",
370
+ "customscript/xyz_grid.py/img2img/X values/visible": true,
371
+ "customscript/xyz_grid.py/img2img/X values/value": "",
372
+ "customscript/xyz_grid.py/img2img/Y type/visible": true,
373
+ "customscript/xyz_grid.py/img2img/Y type/value": "Nothing",
374
+ "customscript/xyz_grid.py/img2img/Y values/visible": true,
375
+ "customscript/xyz_grid.py/img2img/Y values/value": "",
376
+ "customscript/xyz_grid.py/img2img/Z type/visible": true,
377
+ "customscript/xyz_grid.py/img2img/Z type/value": "Nothing",
378
+ "customscript/xyz_grid.py/img2img/Z values/visible": true,
379
+ "customscript/xyz_grid.py/img2img/Z values/value": "",
380
+ "customscript/xyz_grid.py/img2img/Draw legend/visible": true,
381
+ "customscript/xyz_grid.py/img2img/Draw legend/value": true,
382
+ "customscript/xyz_grid.py/img2img/Keep -1 for seeds/visible": true,
383
+ "customscript/xyz_grid.py/img2img/Keep -1 for seeds/value": false,
384
+ "customscript/xyz_grid.py/img2img/Include Sub Images/visible": true,
385
+ "customscript/xyz_grid.py/img2img/Include Sub Images/value": false,
386
+ "customscript/xyz_grid.py/img2img/Include Sub Grids/visible": true,
387
+ "customscript/xyz_grid.py/img2img/Include Sub Grids/value": false,
388
+ "customscript/xyz_grid.py/img2img/Grid margins (px)/visible": true,
389
+ "customscript/xyz_grid.py/img2img/Grid margins (px)/value": 0,
390
+ "customscript/xyz_grid.py/img2img/Grid margins (px)/minimum": 0,
391
+ "customscript/xyz_grid.py/img2img/Grid margins (px)/maximum": 500,
392
+ "customscript/xyz_grid.py/img2img/Grid margins (px)/step": 2,
393
+ "extras/Tabs@mode_extras/selected": null,
394
+ "extras/Input directory/visible": true,
395
+ "extras/Input directory/value": "",
396
+ "extras/Output directory/visible": true,
397
+ "extras/Output directory/value": "",
398
+ "extras/Show result images/visible": true,
399
+ "extras/Show result images/value": true,
400
+ "extras/Tabs@extras_resize_mode/selected": null,
401
+ "customscript/postprocessing_upscale.py/extras/Resize/visible": true,
402
+ "customscript/postprocessing_upscale.py/extras/Resize/value": 4,
403
+ "customscript/postprocessing_upscale.py/extras/Resize/minimum": 1.0,
404
+ "customscript/postprocessing_upscale.py/extras/Resize/maximum": 8.0,
405
+ "customscript/postprocessing_upscale.py/extras/Resize/step": 0.05,
406
+ "customscript/postprocessing_upscale.py/extras/Width/visible": true,
407
+ "customscript/postprocessing_upscale.py/extras/Width/value": 512,
408
+ "customscript/postprocessing_upscale.py/extras/Width/minimum": 64,
409
+ "customscript/postprocessing_upscale.py/extras/Width/maximum": 2048,
410
+ "customscript/postprocessing_upscale.py/extras/Width/step": 8,
411
+ "customscript/postprocessing_upscale.py/extras/Height/visible": true,
412
+ "customscript/postprocessing_upscale.py/extras/Height/value": 512,
413
+ "customscript/postprocessing_upscale.py/extras/Height/minimum": 64,
414
+ "customscript/postprocessing_upscale.py/extras/Height/maximum": 2048,
415
+ "customscript/postprocessing_upscale.py/extras/Height/step": 8,
416
+ "customscript/postprocessing_upscale.py/extras/Crop to fit/visible": true,
417
+ "customscript/postprocessing_upscale.py/extras/Crop to fit/value": true,
418
+ "customscript/postprocessing_upscale.py/extras/Upscaler 1/visible": true,
419
+ "customscript/postprocessing_upscale.py/extras/Upscaler 1/value": "None",
420
+ "customscript/postprocessing_upscale.py/extras/Upscaler 2/visible": true,
421
+ "customscript/postprocessing_upscale.py/extras/Upscaler 2/value": "None",
422
+ "customscript/postprocessing_upscale.py/extras/Upscaler 2 visibility/visible": true,
423
+ "customscript/postprocessing_upscale.py/extras/Upscaler 2 visibility/value": 0.0,
424
+ "customscript/postprocessing_upscale.py/extras/Upscaler 2 visibility/minimum": 0.0,
425
+ "customscript/postprocessing_upscale.py/extras/Upscaler 2 visibility/maximum": 1.0,
426
+ "customscript/postprocessing_upscale.py/extras/Upscaler 2 visibility/step": 0.001,
427
+ "customscript/postprocessing_gfpgan.py/extras/GFPGAN visibility/visible": true,
428
+ "customscript/postprocessing_gfpgan.py/extras/GFPGAN visibility/value": 0,
429
+ "customscript/postprocessing_gfpgan.py/extras/GFPGAN visibility/minimum": 0.0,
430
+ "customscript/postprocessing_gfpgan.py/extras/GFPGAN visibility/maximum": 1.0,
431
+ "customscript/postprocessing_gfpgan.py/extras/GFPGAN visibility/step": 0.001,
432
+ "customscript/postprocessing_codeformer.py/extras/CodeFormer visibility/visible": true,
433
+ "customscript/postprocessing_codeformer.py/extras/CodeFormer visibility/value": 0,
434
+ "customscript/postprocessing_codeformer.py/extras/CodeFormer visibility/minimum": 0.0,
435
+ "customscript/postprocessing_codeformer.py/extras/CodeFormer visibility/maximum": 1.0,
436
+ "customscript/postprocessing_codeformer.py/extras/CodeFormer visibility/step": 0.001,
437
+ "customscript/postprocessing_codeformer.py/extras/CodeFormer weight (0 = maximum effect, 1 = minimum effect)/visible": true,
438
+ "customscript/postprocessing_codeformer.py/extras/CodeFormer weight (0 = maximum effect, 1 = minimum effect)/value": 0,
439
+ "customscript/postprocessing_codeformer.py/extras/CodeFormer weight (0 = maximum effect, 1 = minimum effect)/minimum": 0.0,
440
+ "customscript/postprocessing_codeformer.py/extras/CodeFormer weight (0 = maximum effect, 1 = minimum effect)/maximum": 1.0,
441
+ "customscript/postprocessing_codeformer.py/extras/CodeFormer weight (0 = maximum effect, 1 = minimum effect)/step": 0.001,
442
+ "modelmerger/Primary model (A)/visible": true,
443
+ "modelmerger/Primary model (A)/value": null,
444
+ "modelmerger/Secondary model (B)/visible": true,
445
+ "modelmerger/Secondary model (B)/value": null,
446
+ "modelmerger/Tertiary model (C)/visible": true,
447
+ "modelmerger/Tertiary model (C)/value": null,
448
+ "modelmerger/Custom Name (Optional)/visible": true,
449
+ "modelmerger/Custom Name (Optional)/value": "",
450
+ "modelmerger/Multiplier (M) - set to 0 to get model A/visible": true,
451
+ "modelmerger/Multiplier (M) - set to 0 to get model A/value": 0.3,
452
+ "modelmerger/Multiplier (M) - set to 0 to get model A/minimum": 0.0,
453
+ "modelmerger/Multiplier (M) - set to 0 to get model A/maximum": 1.0,
454
+ "modelmerger/Multiplier (M) - set to 0 to get model A/step": 0.05,
455
+ "modelmerger/Interpolation Method/visible": true,
456
+ "modelmerger/Interpolation Method/value": "Weighted sum",
457
+ "modelmerger/Checkpoint format/visible": true,
458
+ "modelmerger/Checkpoint format/value": "safetensors",
459
+ "modelmerger/Save as float16/visible": true,
460
+ "modelmerger/Save as float16/value": false,
461
+ "modelmerger/Save metadata (.safetensors only)/visible": true,
462
+ "modelmerger/Save metadata (.safetensors only)/value": true,
463
+ "modelmerger/Copy config from/visible": true,
464
+ "modelmerger/Copy config from/value": "A, B or C",
465
+ "modelmerger/Bake in VAE/visible": true,
466
+ "modelmerger/Bake in VAE/value": "None",
467
+ "modelmerger/Discard weights with matching name/visible": true,
468
+ "modelmerger/Discard weights with matching name/value": "",
469
+ "train/Tabs@train_tabs/selected": null,
470
+ "train/Name/visible": true,
471
+ "train/Name/value": "",
472
+ "train/Initialization text/visible": true,
473
+ "train/Initialization text/value": "*",
474
+ "train/Number of vectors per token/visible": true,
475
+ "train/Number of vectors per token/value": 1,
476
+ "train/Number of vectors per token/minimum": 1,
477
+ "train/Number of vectors per token/maximum": 75,
478
+ "train/Number of vectors per token/step": 1,
479
+ "train/Overwrite Old Embedding/visible": true,
480
+ "train/Overwrite Old Embedding/value": false,
481
+ "train/Enter hypernetwork layer structure/visible": true,
482
+ "train/Enter hypernetwork layer structure/value": "1, 2, 1",
483
+ "train/Select activation function of hypernetwork. Recommended : Swish / Linear(none)/visible": true,
484
+ "train/Select activation function of hypernetwork. Recommended : Swish / Linear(none)/value": "linear",
485
+ "train/Select Layer weights initialization. Recommended: Kaiming for relu-like, Xavier for sigmoid-like, Normal otherwise/visible": true,
486
+ "train/Select Layer weights initialization. Recommended: Kaiming for relu-like, Xavier for sigmoid-like, Normal otherwise/value": "Normal",
487
+ "train/Add layer normalization/visible": true,
488
+ "train/Add layer normalization/value": false,
489
+ "train/Use dropout/visible": true,
490
+ "train/Use dropout/value": false,
491
+ "train/Enter hypernetwork Dropout structure (or empty). Recommended : 0~0.35 incrementing sequence: 0, 0.05, 0.15/visible": true,
492
+ "train/Enter hypernetwork Dropout structure (or empty). Recommended : 0~0.35 incrementing sequence: 0, 0.05, 0.15/value": "0, 0, 0",
493
+ "train/Overwrite Old Hypernetwork/visible": true,
494
+ "train/Overwrite Old Hypernetwork/value": false,
495
+ "train/Source directory/visible": true,
496
+ "train/Source directory/value": "",
497
+ "train/Destination directory/visible": true,
498
+ "train/Destination directory/value": "",
499
+ "train/Width/visible": true,
500
+ "train/Width/value": 512,
501
+ "train/Width/minimum": 64,
502
+ "train/Width/maximum": 2048,
503
+ "train/Width/step": 8,
504
+ "train/Height/visible": true,
505
+ "train/Height/value": 512,
506
+ "train/Height/minimum": 64,
507
+ "train/Height/maximum": 2048,
508
+ "train/Height/step": 8,
509
+ "train/Existing Caption txt Action/visible": true,
510
+ "train/Existing Caption txt Action/value": "ignore",
511
+ "train/Keep original size/visible": true,
512
+ "train/Keep original size/value": false,
513
+ "train/Create flipped copies/visible": true,
514
+ "train/Create flipped copies/value": false,
515
+ "train/Split oversized images/visible": true,
516
+ "train/Split oversized images/value": false,
517
+ "train/Auto focal point crop/visible": true,
518
+ "train/Auto focal point crop/value": false,
519
+ "train/Auto-sized crop/visible": true,
520
+ "train/Auto-sized crop/value": false,
521
+ "train/Use BLIP for caption/visible": true,
522
+ "train/Use BLIP for caption/value": false,
523
+ "train/Use deepbooru for caption/visible": true,
524
+ "train/Use deepbooru for caption/value": false,
525
+ "train/Split image threshold/visible": true,
526
+ "train/Split image threshold/value": 0.5,
527
+ "train/Split image threshold/minimum": 0.0,
528
+ "train/Split image threshold/maximum": 1.0,
529
+ "train/Split image threshold/step": 0.05,
530
+ "train/Split image overlap ratio/visible": true,
531
+ "train/Split image overlap ratio/value": 0.2,
532
+ "train/Split image overlap ratio/minimum": 0.0,
533
+ "train/Split image overlap ratio/maximum": 0.9,
534
+ "train/Split image overlap ratio/step": 0.05,
535
+ "train/Focal point face weight/visible": true,
536
+ "train/Focal point face weight/value": 0.9,
537
+ "train/Focal point face weight/minimum": 0.0,
538
+ "train/Focal point face weight/maximum": 1.0,
539
+ "train/Focal point face weight/step": 0.05,
540
+ "train/Focal point entropy weight/visible": true,
541
+ "train/Focal point entropy weight/value": 0.15,
542
+ "train/Focal point entropy weight/minimum": 0.0,
543
+ "train/Focal point entropy weight/maximum": 1.0,
544
+ "train/Focal point entropy weight/step": 0.05,
545
+ "train/Focal point edges weight/visible": true,
546
+ "train/Focal point edges weight/value": 0.5,
547
+ "train/Focal point edges weight/minimum": 0.0,
548
+ "train/Focal point edges weight/maximum": 1.0,
549
+ "train/Focal point edges weight/step": 0.05,
550
+ "train/Create debug image/visible": true,
551
+ "train/Create debug image/value": false,
552
+ "train/Dimension lower bound/visible": true,
553
+ "train/Dimension lower bound/value": 384,
554
+ "train/Dimension lower bound/minimum": 64,
555
+ "train/Dimension lower bound/maximum": 2048,
556
+ "train/Dimension lower bound/step": 8,
557
+ "train/Dimension upper bound/visible": true,
558
+ "train/Dimension upper bound/value": 768,
559
+ "train/Dimension upper bound/minimum": 64,
560
+ "train/Dimension upper bound/maximum": 2048,
561
+ "train/Dimension upper bound/step": 8,
562
+ "train/Area lower bound/visible": true,
563
+ "train/Area lower bound/value": 4096,
564
+ "train/Area lower bound/minimum": 4096,
565
+ "train/Area lower bound/maximum": 4194304,
566
+ "train/Area lower bound/step": 1,
567
+ "train/Area upper bound/visible": true,
568
+ "train/Area upper bound/value": 409600,
569
+ "train/Area upper bound/minimum": 4096,
570
+ "train/Area upper bound/maximum": 4194304,
571
+ "train/Area upper bound/step": 1,
572
+ "train/Resizing objective/visible": true,
573
+ "train/Resizing objective/value": "Maximize area",
574
+ "train/Error threshold/visible": true,
575
+ "train/Error threshold/value": 0.1,
576
+ "train/Error threshold/minimum": 0,
577
+ "train/Error threshold/maximum": 1,
578
+ "train/Error threshold/step": 0.01,
579
+ "train/Embedding/visible": true,
580
+ "train/Embedding/value": null,
581
+ "train/Hypernetwork/visible": true,
582
+ "train/Hypernetwork/value": null,
583
+ "train/Embedding Learning rate/visible": true,
584
+ "train/Embedding Learning rate/value": "0.005",
585
+ "train/Hypernetwork Learning rate/visible": true,
586
+ "train/Hypernetwork Learning rate/value": "0.00001",
587
+ "train/Gradient Clipping/visible": true,
588
+ "train/Gradient Clipping/value": "disabled",
589
+ "train/Batch size/visible": true,
590
+ "train/Batch size/value": 1,
591
+ "train/Gradient accumulation steps/visible": true,
592
+ "train/Gradient accumulation steps/value": 1,
593
+ "train/Dataset directory/visible": true,
594
+ "train/Dataset directory/value": "",
595
+ "train/Log directory/visible": true,
596
+ "train/Log directory/value": "textual_inversion",
597
+ "train/Prompt template/visible": true,
598
+ "train/Prompt template/value": "style_filewords.txt",
599
+ "train/Do not resize images/visible": true,
600
+ "train/Do not resize images/value": false,
601
+ "train/Max steps/visible": true,
602
+ "train/Max steps/value": 100000,
603
+ "train/Save an image to log directory every N steps, 0 to disable/visible": true,
604
+ "train/Save an image to log directory every N steps, 0 to disable/value": 500,
605
+ "train/Save a copy of embedding to log directory every N steps, 0 to disable/visible": true,
606
+ "train/Save a copy of embedding to log directory every N steps, 0 to disable/value": 500,
607
+ "train/Use PNG alpha channel as loss weight/visible": true,
608
+ "train/Use PNG alpha channel as loss weight/value": false,
609
+ "train/Save images with embedding in PNG chunks/visible": true,
610
+ "train/Save images with embedding in PNG chunks/value": true,
611
+ "train/Read parameters (prompt, etc...) from txt2img tab when making previews/visible": true,
612
+ "train/Read parameters (prompt, etc...) from txt2img tab when making previews/value": false,
613
+ "train/Shuffle tags by ',' when creating prompts./visible": true,
614
+ "train/Shuffle tags by ',' when creating prompts./value": false,
615
+ "train/Drop out tags when creating prompts./visible": true,
616
+ "train/Drop out tags when creating prompts./value": 0,
617
+ "train/Drop out tags when creating prompts./minimum": 0,
618
+ "train/Drop out tags when creating prompts./maximum": 1,
619
+ "train/Drop out tags when creating prompts./step": 0.1,
620
+ "train/Choose latent sampling method/visible": true,
621
+ "train/Choose latent sampling method/value": "once",
622
+ "webui/Tabs@tabs/selected": null
623
+ }
webui-macos-env.sh ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ ####################################################################
3
+ # macOS defaults #
4
+ # Please modify webui-user.sh to change these instead of this file #
5
+ ####################################################################
6
+
7
+ if [[ -x "$(command -v python3.10)" ]]
8
+ then
9
+ python_cmd="python3.10"
10
+ fi
11
+
12
+ export install_dir="$HOME"
13
+ export COMMANDLINE_ARGS="--skip-torch-cuda-test --upcast-sampling --no-half-vae --use-cpu interrogate"
14
+ export TORCH_COMMAND="pip install torch torchvision"
15
+ export K_DIFFUSION_REPO="https://github.com/brkirch/k-diffusion.git"
16
+ export K_DIFFUSION_COMMIT_HASH="51c9778f269cedb55a4d88c79c0246d35bdadb71"
17
+ export PYTORCH_ENABLE_MPS_FALLBACK=1
18
+
19
+ ####################################################################
webui-user.bat ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ @echo off
2
+
3
+ set PYTHON=
4
+ set GIT=
5
+ set VENV_DIR=
6
+ set COMMANDLINE_ARGS=--share "--lowvram" "--precision" "full" "--no-half" "--skip-torch-cuda-test"
7
+
8
+
9
+
10
+ call webui.bat
webui-user.sh ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #########################################################
3
+ # Uncomment and change the variables below to your need:#
4
+ #########################################################
5
+
6
+ # Install directory without trailing slash
7
+ #install_dir="/home/$(whoami)"
8
+
9
+ # Name of the subdirectory
10
+ #clone_dir="stable-diffusion-webui"
11
+
12
+ # Commandline arguments for webui.py, for example: export COMMANDLINE_ARGS="--medvram --opt-split-attention"
13
+ #export COMMANDLINE_ARGS=""
14
+
15
+ # python3 executable
16
+ #python_cmd="python3"
17
+
18
+ # git executable
19
+ #export GIT="git"
20
+
21
+ # python3 venv without trailing slash (defaults to ${install_dir}/${clone_dir}/venv)
22
+ #venv_dir="venv"
23
+
24
+ # script to launch to start the app
25
+ #export LAUNCH_SCRIPT="launch.py"
26
+
27
+ # install command for torch
28
+ #export TORCH_COMMAND="pip install torch==1.12.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113"
29
+
30
+ # Requirements file to use for stable-diffusion-webui
31
+ #export REQS_FILE="requirements_versions.txt"
32
+
33
+ # Fixed git repos
34
+ #export K_DIFFUSION_PACKAGE=""
35
+ #export GFPGAN_PACKAGE=""
36
+
37
+ # Fixed git commits
38
+ #export STABLE_DIFFUSION_COMMIT_HASH=""
39
+ #export TAMING_TRANSFORMERS_COMMIT_HASH=""
40
+ #export CODEFORMER_COMMIT_HASH=""
41
+ #export BLIP_COMMIT_HASH=""
42
+
43
+ # Uncomment to enable accelerated launch
44
+ #export ACCELERATE="True"
45
+
46
+ # Uncomment to disable TCMalloc
47
+ #export NO_TCMALLOC="True"
48
+
49
+ ###########################################
webui.bat ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @echo off
2
+
3
+ if not defined PYTHON (set PYTHON=python)
4
+ if not defined VENV_DIR (set "VENV_DIR=%~dp0%venv")
5
+
6
+
7
+ set ERROR_REPORTING=FALSE
8
+
9
+ mkdir tmp 2>NUL
10
+
11
+ %PYTHON% -c "" >tmp/stdout.txt 2>tmp/stderr.txt
12
+ if %ERRORLEVEL% == 0 goto :check_pip
13
+ echo Couldn't launch python
14
+ goto :show_stdout_stderr
15
+
16
+ :check_pip
17
+ %PYTHON% -mpip --help >tmp/stdout.txt 2>tmp/stderr.txt
18
+ if %ERRORLEVEL% == 0 goto :start_venv
19
+ if "%PIP_INSTALLER_LOCATION%" == "" goto :show_stdout_stderr
20
+ %PYTHON% "%PIP_INSTALLER_LOCATION%" >tmp/stdout.txt 2>tmp/stderr.txt
21
+ if %ERRORLEVEL% == 0 goto :start_venv
22
+ echo Couldn't install pip
23
+ goto :show_stdout_stderr
24
+
25
+ :start_venv
26
+ if ["%VENV_DIR%"] == ["-"] goto :skip_venv
27
+ if ["%SKIP_VENV%"] == ["1"] goto :skip_venv
28
+
29
+ dir "%VENV_DIR%\Scripts\Python.exe" >tmp/stdout.txt 2>tmp/stderr.txt
30
+ if %ERRORLEVEL% == 0 goto :activate_venv
31
+
32
+ for /f "delims=" %%i in ('CALL %PYTHON% -c "import sys; print(sys.executable)"') do set PYTHON_FULLNAME="%%i"
33
+ echo Creating venv in directory %VENV_DIR% using python %PYTHON_FULLNAME%
34
+ %PYTHON_FULLNAME% -m venv "%VENV_DIR%" >tmp/stdout.txt 2>tmp/stderr.txt
35
+ if %ERRORLEVEL% == 0 goto :activate_venv
36
+ echo Unable to create venv in directory "%VENV_DIR%"
37
+ goto :show_stdout_stderr
38
+
39
+ :activate_venv
40
+ set PYTHON="%VENV_DIR%\Scripts\Python.exe"
41
+ echo venv %PYTHON%
42
+
43
+ :skip_venv
44
+ if [%ACCELERATE%] == ["True"] goto :accelerate
45
+ goto :launch
46
+
47
+ :accelerate
48
+ echo Checking for accelerate
49
+ set ACCELERATE="%VENV_DIR%\Scripts\accelerate.exe"
50
+ if EXIST %ACCELERATE% goto :accelerate_launch
51
+
52
+ :launch
53
+ %PYTHON% launch.py %*
54
+ pause
55
+ exit /b
56
+
57
+ :accelerate_launch
58
+ echo Accelerating
59
+ %ACCELERATE% launch --num_cpu_threads_per_process=6 launch.py
60
+ pause
61
+ exit /b
62
+
63
+ :show_stdout_stderr
64
+
65
+ echo.
66
+ echo exit code: %errorlevel%
67
+
68
+ for /f %%i in ("tmp\stdout.txt") do set size=%%~zi
69
+ if %size% equ 0 goto :show_stderr
70
+ echo.
71
+ echo stdout:
72
+ type tmp\stdout.txt
73
+
74
+ :show_stderr
75
+ for /f %%i in ("tmp\stderr.txt") do set size=%%~zi
76
+ if %size% equ 0 goto :show_stderr
77
+ echo.
78
+ echo stderr:
79
+ type tmp\stderr.txt
80
+
81
+ :endofscript
82
+
83
+ echo.
84
+ echo Launch unsuccessful. Exiting.
85
+ pause
webui.py ADDED
@@ -0,0 +1,413 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ import time
4
+ import importlib
5
+ import signal
6
+ import re
7
+ import warnings
8
+ import json
9
+ from fastapi import FastAPI
10
+ from fastapi.middleware.cors import CORSMiddleware
11
+ from fastapi.middleware.gzip import GZipMiddleware
12
+ from packaging import version
13
+
14
+ import logging
15
+ logging.getLogger("xformers").addFilter(lambda record: 'A matching Triton is not available' not in record.getMessage())
16
+
17
+ from modules import paths, timer, import_hook, errors
18
+
19
+ startup_timer = timer.Timer()
20
+
21
+ import torch
22
+ import pytorch_lightning # pytorch_lightning should be imported after torch, but it re-enables warnings on import so import once to disable them
23
+ warnings.filterwarnings(action="ignore", category=DeprecationWarning, module="pytorch_lightning")
24
+ warnings.filterwarnings(action="ignore", category=UserWarning, module="torchvision")
25
+
26
+
27
+ startup_timer.record("import torch")
28
+
29
+ import gradio
30
+ startup_timer.record("import gradio")
31
+
32
+ import ldm.modules.encoders.modules
33
+ startup_timer.record("import ldm")
34
+
35
+ from modules import extra_networks, ui_extra_networks_checkpoints
36
+ from modules import extra_networks_hypernet, ui_extra_networks_hypernets, ui_extra_networks_textual_inversion
37
+ from modules.call_queue import wrap_queued_call, queue_lock, wrap_gradio_gpu_call
38
+
39
+ # Truncate version number of nightly/local build of PyTorch to not cause exceptions with CodeFormer or Safetensors
40
+ if ".dev" in torch.__version__ or "+git" in torch.__version__:
41
+ torch.__long_version__ = torch.__version__
42
+ torch.__version__ = re.search(r'[\d.]+[\d]', torch.__version__).group(0)
43
+
44
+ from modules import shared, devices, sd_samplers, upscaler, extensions, localization, ui_tempdir, ui_extra_networks, config_states
45
+ import modules.codeformer_model as codeformer
46
+ import modules.face_restoration
47
+ import modules.gfpgan_model as gfpgan
48
+ import modules.img2img
49
+
50
+ import modules.lowvram
51
+ import modules.scripts
52
+ import modules.sd_hijack
53
+ import modules.sd_models
54
+ import modules.sd_vae
55
+ import modules.txt2img
56
+ import modules.script_callbacks
57
+ import modules.textual_inversion.textual_inversion
58
+ import modules.progress
59
+
60
+ import modules.ui
61
+ from modules import modelloader
62
+ from modules.shared import cmd_opts
63
+ import modules.hypernetworks.hypernetwork
64
+
65
+ startup_timer.record("other imports")
66
+
67
+
68
+ if cmd_opts.server_name:
69
+ server_name = cmd_opts.server_name
70
+ else:
71
+ server_name = "0.0.0.0" if cmd_opts.listen else None
72
+
73
+
74
+ def fix_asyncio_event_loop_policy():
75
+ """
76
+ The default `asyncio` event loop policy only automatically creates
77
+ event loops in the main threads. Other threads must create event
78
+ loops explicitly or `asyncio.get_event_loop` (and therefore
79
+ `.IOLoop.current`) will fail. Installing this policy allows event
80
+ loops to be created automatically on any thread, matching the
81
+ behavior of Tornado versions prior to 5.0 (or 5.0 on Python 2).
82
+ """
83
+
84
+ import asyncio
85
+
86
+ if sys.platform == "win32" and hasattr(asyncio, "WindowsSelectorEventLoopPolicy"):
87
+ # "Any thread" and "selector" should be orthogonal, but there's not a clean
88
+ # interface for composing policies so pick the right base.
89
+ _BasePolicy = asyncio.WindowsSelectorEventLoopPolicy # type: ignore
90
+ else:
91
+ _BasePolicy = asyncio.DefaultEventLoopPolicy
92
+
93
+ class AnyThreadEventLoopPolicy(_BasePolicy): # type: ignore
94
+ """Event loop policy that allows loop creation on any thread.
95
+ Usage::
96
+
97
+ asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy())
98
+ """
99
+
100
+ def get_event_loop(self) -> asyncio.AbstractEventLoop:
101
+ try:
102
+ return super().get_event_loop()
103
+ except (RuntimeError, AssertionError):
104
+ # This was an AssertionError in python 3.4.2 (which ships with debian jessie)
105
+ # and changed to a RuntimeError in 3.4.3.
106
+ # "There is no current event loop in thread %r"
107
+ loop = self.new_event_loop()
108
+ self.set_event_loop(loop)
109
+ return loop
110
+
111
+ asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy())
112
+
113
+
114
+ def check_versions():
115
+ if shared.cmd_opts.skip_version_check:
116
+ return
117
+
118
+ expected_torch_version = "2.0.0"
119
+
120
+ if version.parse(torch.__version__) < version.parse(expected_torch_version):
121
+ errors.print_error_explanation(f"""
122
+ You are running torch {torch.__version__}.
123
+ The program is tested to work with torch {expected_torch_version}.
124
+ To reinstall the desired version, run with commandline flag --reinstall-torch.
125
+ Beware that this will cause a lot of large files to be downloaded, as well as
126
+ there are reports of issues with training tab on the latest version.
127
+
128
+ Use --skip-version-check commandline argument to disable this check.
129
+ """.strip())
130
+
131
+ expected_xformers_version = "0.0.17"
132
+ if shared.xformers_available:
133
+ import xformers
134
+
135
+ if version.parse(xformers.__version__) < version.parse(expected_xformers_version):
136
+ errors.print_error_explanation(f"""
137
+ You are running xformers {xformers.__version__}.
138
+ The program is tested to work with xformers {expected_xformers_version}.
139
+ To reinstall the desired version, run with commandline flag --reinstall-xformers.
140
+
141
+ Use --skip-version-check commandline argument to disable this check.
142
+ """.strip())
143
+
144
+
145
+ def initialize():
146
+ fix_asyncio_event_loop_policy()
147
+
148
+ check_versions()
149
+
150
+ extensions.list_extensions()
151
+ localization.list_localizations(cmd_opts.localizations_dir)
152
+ startup_timer.record("list extensions")
153
+
154
+ config_state_file = shared.opts.restore_config_state_file
155
+ shared.opts.restore_config_state_file = ""
156
+ shared.opts.save(shared.config_filename)
157
+
158
+ if os.path.isfile(config_state_file):
159
+ print(f"*** About to restore extension state from file: {config_state_file}")
160
+ with open(config_state_file, "r", encoding="utf-8") as f:
161
+ config_state = json.load(f)
162
+ config_states.restore_extension_config(config_state)
163
+ startup_timer.record("restore extension config")
164
+ elif config_state_file:
165
+ print(f"!!! Config state backup not found: {config_state_file}")
166
+
167
+ if cmd_opts.ui_debug_mode:
168
+ shared.sd_upscalers = upscaler.UpscalerLanczos().scalers
169
+ modules.scripts.load_scripts()
170
+ return
171
+
172
+ modelloader.cleanup_models()
173
+ modules.sd_models.setup_model()
174
+ startup_timer.record("list SD models")
175
+
176
+ codeformer.setup_model(cmd_opts.codeformer_models_path)
177
+ startup_timer.record("setup codeformer")
178
+
179
+ gfpgan.setup_model(cmd_opts.gfpgan_models_path)
180
+ startup_timer.record("setup gfpgan")
181
+
182
+ modelloader.list_builtin_upscalers()
183
+ startup_timer.record("list builtin upscalers")
184
+
185
+ modules.scripts.load_scripts()
186
+ startup_timer.record("load scripts")
187
+
188
+ modules.sd_vae.refresh_vae_list()
189
+ startup_timer.record("refresh VAE")
190
+
191
+ modules.textual_inversion.textual_inversion.list_textual_inversion_templates()
192
+ startup_timer.record("refresh textual inversion templates")
193
+
194
+ try:
195
+ modules.sd_models.load_model()
196
+ except Exception as e:
197
+ errors.display(e, "loading stable diffusion model")
198
+ print("", file=sys.stderr)
199
+ print("Stable diffusion model failed to load, exiting", file=sys.stderr)
200
+ exit(1)
201
+ startup_timer.record("load SD checkpoint")
202
+
203
+ shared.opts.data["sd_model_checkpoint"] = shared.sd_model.sd_checkpoint_info.title
204
+
205
+ shared.opts.onchange("sd_model_checkpoint", wrap_queued_call(lambda: modules.sd_models.reload_model_weights()))
206
+ shared.opts.onchange("sd_vae", wrap_queued_call(lambda: modules.sd_vae.reload_vae_weights()), call=False)
207
+ shared.opts.onchange("sd_vae_as_default", wrap_queued_call(lambda: modules.sd_vae.reload_vae_weights()), call=False)
208
+ shared.opts.onchange("temp_dir", ui_tempdir.on_tmpdir_changed)
209
+ shared.opts.onchange("gradio_theme", shared.reload_gradio_theme)
210
+ startup_timer.record("opts onchange")
211
+
212
+ shared.reload_hypernetworks()
213
+ startup_timer.record("reload hypernets")
214
+
215
+ ui_extra_networks.intialize()
216
+ ui_extra_networks.register_page(ui_extra_networks_textual_inversion.ExtraNetworksPageTextualInversion())
217
+ ui_extra_networks.register_page(ui_extra_networks_hypernets.ExtraNetworksPageHypernetworks())
218
+ ui_extra_networks.register_page(ui_extra_networks_checkpoints.ExtraNetworksPageCheckpoints())
219
+
220
+ extra_networks.initialize()
221
+ extra_networks.register_extra_network(extra_networks_hypernet.ExtraNetworkHypernet())
222
+ startup_timer.record("extra networks")
223
+
224
+ if cmd_opts.tls_keyfile is not None and cmd_opts.tls_keyfile is not None:
225
+
226
+ try:
227
+ if not os.path.exists(cmd_opts.tls_keyfile):
228
+ print("Invalid path to TLS keyfile given")
229
+ if not os.path.exists(cmd_opts.tls_certfile):
230
+ print(f"Invalid path to TLS certfile: '{cmd_opts.tls_certfile}'")
231
+ except TypeError:
232
+ cmd_opts.tls_keyfile = cmd_opts.tls_certfile = None
233
+ print("TLS setup invalid, running webui without TLS")
234
+ else:
235
+ print("Running with TLS")
236
+ startup_timer.record("TLS")
237
+
238
+ # make the program just exit at ctrl+c without waiting for anything
239
+ def sigint_handler(sig, frame):
240
+ print(f'Interrupted with signal {sig} in {frame}')
241
+ os._exit(0)
242
+
243
+ signal.signal(signal.SIGINT, sigint_handler)
244
+
245
+
246
+ def setup_middleware(app):
247
+ app.middleware_stack = None # reset current middleware to allow modifying user provided list
248
+ app.add_middleware(GZipMiddleware, minimum_size=1000)
249
+ if cmd_opts.cors_allow_origins and cmd_opts.cors_allow_origins_regex:
250
+ app.add_middleware(CORSMiddleware, allow_origins=cmd_opts.cors_allow_origins.split(','), allow_origin_regex=cmd_opts.cors_allow_origins_regex, allow_methods=['*'], allow_credentials=True, allow_headers=['*'])
251
+ elif cmd_opts.cors_allow_origins:
252
+ app.add_middleware(CORSMiddleware, allow_origins=cmd_opts.cors_allow_origins.split(','), allow_methods=['*'], allow_credentials=True, allow_headers=['*'])
253
+ elif cmd_opts.cors_allow_origins_regex:
254
+ app.add_middleware(CORSMiddleware, allow_origin_regex=cmd_opts.cors_allow_origins_regex, allow_methods=['*'], allow_credentials=True, allow_headers=['*'])
255
+ app.build_middleware_stack() # rebuild middleware stack on-the-fly
256
+
257
+
258
+ def create_api(app):
259
+ from modules.api.api import Api
260
+ api = Api(app, queue_lock)
261
+ return api
262
+
263
+
264
+ def wait_on_server(demo=None):
265
+ while 1:
266
+ time.sleep(0.5)
267
+ if shared.state.need_restart:
268
+ shared.state.need_restart = False
269
+ time.sleep(0.5)
270
+ demo.close()
271
+ time.sleep(0.5)
272
+
273
+ modules.script_callbacks.app_reload_callback()
274
+ break
275
+
276
+
277
+ def api_only():
278
+ initialize()
279
+
280
+ app = FastAPI()
281
+ setup_middleware(app)
282
+ api = create_api(app)
283
+
284
+ modules.script_callbacks.app_started_callback(None, app)
285
+
286
+ print(f"Startup time: {startup_timer.summary()}.")
287
+ api.launch(server_name="0.0.0.0" if cmd_opts.listen else "127.0.0.1", port=cmd_opts.port if cmd_opts.port else 7861)
288
+
289
+
290
+ def webui():
291
+ launch_api = cmd_opts.api
292
+ initialize()
293
+
294
+ while 1:
295
+ if shared.opts.clean_temp_dir_at_start:
296
+ ui_tempdir.cleanup_tmpdr()
297
+ startup_timer.record("cleanup temp dir")
298
+
299
+ modules.script_callbacks.before_ui_callback()
300
+ startup_timer.record("scripts before_ui_callback")
301
+
302
+ shared.demo = modules.ui.create_ui()
303
+ startup_timer.record("create ui")
304
+
305
+ if not cmd_opts.no_gradio_queue:
306
+ shared.demo.queue(64)
307
+
308
+ gradio_auth_creds = []
309
+ if cmd_opts.gradio_auth:
310
+ gradio_auth_creds += [x.strip() for x in cmd_opts.gradio_auth.strip('"').replace('\n', '').split(',') if x.strip()]
311
+ if cmd_opts.gradio_auth_path:
312
+ with open(cmd_opts.gradio_auth_path, 'r', encoding="utf8") as file:
313
+ for line in file.readlines():
314
+ gradio_auth_creds += [x.strip() for x in line.split(',') if x.strip()]
315
+
316
+ app, local_url, share_url = shared.demo.launch(
317
+ share=cmd_opts.share,
318
+ server_name=server_name,
319
+ server_port=cmd_opts.port,
320
+ ssl_keyfile=cmd_opts.tls_keyfile,
321
+ ssl_certfile=cmd_opts.tls_certfile,
322
+ ssl_verify=cmd_opts.disable_tls_verify,
323
+ debug=cmd_opts.gradio_debug,
324
+ auth=[tuple(cred.split(':')) for cred in gradio_auth_creds] if gradio_auth_creds else None,
325
+ inbrowser=cmd_opts.autolaunch,
326
+ prevent_thread_lock=True
327
+ )
328
+ # after initial launch, disable --autolaunch for subsequent restarts
329
+ cmd_opts.autolaunch = False
330
+
331
+ startup_timer.record("gradio launch")
332
+
333
+ # gradio uses a very open CORS policy via app.user_middleware, which makes it possible for
334
+ # an attacker to trick the user into opening a malicious HTML page, which makes a request to the
335
+ # running web ui and do whatever the attacker wants, including installing an extension and
336
+ # running its code. We disable this here. Suggested by RyotaK.
337
+ app.user_middleware = [x for x in app.user_middleware if x.cls.__name__ != 'CORSMiddleware']
338
+
339
+ setup_middleware(app)
340
+
341
+ modules.progress.setup_progress_api(app)
342
+
343
+ if launch_api:
344
+ create_api(app)
345
+
346
+ ui_extra_networks.add_pages_to_demo(app)
347
+
348
+ modules.script_callbacks.app_started_callback(shared.demo, app)
349
+ startup_timer.record("scripts app_started_callback")
350
+
351
+ print(f"Startup time: {startup_timer.summary()}.")
352
+
353
+ wait_on_server(shared.demo)
354
+ print('Restarting UI...')
355
+
356
+ startup_timer.reset()
357
+
358
+ sd_samplers.set_samplers()
359
+
360
+ modules.script_callbacks.script_unloaded_callback()
361
+ extensions.list_extensions()
362
+ startup_timer.record("list extensions")
363
+
364
+ config_state_file = shared.opts.restore_config_state_file
365
+ shared.opts.restore_config_state_file = ""
366
+ shared.opts.save(shared.config_filename)
367
+
368
+ if os.path.isfile(config_state_file):
369
+ print(f"*** About to restore extension state from file: {config_state_file}")
370
+ with open(config_state_file, "r", encoding="utf-8") as f:
371
+ config_state = json.load(f)
372
+ config_states.restore_extension_config(config_state)
373
+ startup_timer.record("restore extension config")
374
+ elif config_state_file:
375
+ print(f"!!! Config state backup not found: {config_state_file}")
376
+
377
+ localization.list_localizations(cmd_opts.localizations_dir)
378
+
379
+ modelloader.forbid_loaded_nonbuiltin_upscalers()
380
+ modules.scripts.reload_scripts()
381
+ startup_timer.record("load scripts")
382
+
383
+ modules.script_callbacks.model_loaded_callback(shared.sd_model)
384
+ startup_timer.record("model loaded callback")
385
+
386
+ modelloader.load_upscalers()
387
+ startup_timer.record("load upscalers")
388
+
389
+ for module in [module for name, module in sys.modules.items() if name.startswith("modules.ui")]:
390
+ importlib.reload(module)
391
+ startup_timer.record("reload script modules")
392
+
393
+ modules.sd_models.list_models()
394
+ startup_timer.record("list SD models")
395
+
396
+ shared.reload_hypernetworks()
397
+ startup_timer.record("reload hypernetworks")
398
+
399
+ ui_extra_networks.intialize()
400
+ ui_extra_networks.register_page(ui_extra_networks_textual_inversion.ExtraNetworksPageTextualInversion())
401
+ ui_extra_networks.register_page(ui_extra_networks_hypernets.ExtraNetworksPageHypernetworks())
402
+ ui_extra_networks.register_page(ui_extra_networks_checkpoints.ExtraNetworksPageCheckpoints())
403
+
404
+ extra_networks.initialize()
405
+ extra_networks.register_extra_network(extra_networks_hypernet.ExtraNetworkHypernet())
406
+ startup_timer.record("initialize extra networks")
407
+
408
+
409
+ if __name__ == "__main__":
410
+ if cmd_opts.nowebui:
411
+ api_only()
412
+ else:
413
+ webui()
webui.sh ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ #################################################
3
+ # Please do not make any changes to this file, #
4
+ # change the variables in webui-user.sh instead #
5
+ #################################################
6
+
7
+ # If run from macOS, load defaults from webui-macos-env.sh
8
+ if [[ "$OSTYPE" == "darwin"* ]]; then
9
+ if [[ -f webui-macos-env.sh ]]
10
+ then
11
+ source ./webui-macos-env.sh
12
+ fi
13
+ fi
14
+
15
+ # Read variables from webui-user.sh
16
+ # shellcheck source=/dev/null
17
+ if [[ -f webui-user.sh ]]
18
+ then
19
+ source ./webui-user.sh
20
+ fi
21
+
22
+ # Set defaults
23
+ # Install directory without trailing slash
24
+ if [[ -z "${install_dir}" ]]
25
+ then
26
+ install_dir="$(pwd)"
27
+ fi
28
+
29
+ # Name of the subdirectory (defaults to stable-diffusion-webui)
30
+ if [[ -z "${clone_dir}" ]]
31
+ then
32
+ clone_dir="stable-diffusion-webui"
33
+ fi
34
+
35
+ # python3 executable
36
+ if [[ -z "${python_cmd}" ]]
37
+ then
38
+ python_cmd="python3"
39
+ fi
40
+
41
+ # git executable
42
+ if [[ -z "${GIT}" ]]
43
+ then
44
+ export GIT="git"
45
+ fi
46
+
47
+ # python3 venv without trailing slash (defaults to ${install_dir}/${clone_dir}/venv)
48
+ if [[ -z "${venv_dir}" ]]
49
+ then
50
+ venv_dir="venv"
51
+ fi
52
+
53
+ if [[ -z "${LAUNCH_SCRIPT}" ]]
54
+ then
55
+ LAUNCH_SCRIPT="launch.py"
56
+ fi
57
+
58
+ # this script cannot be run as root by default
59
+ can_run_as_root=0
60
+
61
+ # read any command line flags to the webui.sh script
62
+ while getopts "f" flag > /dev/null 2>&1
63
+ do
64
+ case ${flag} in
65
+ f) can_run_as_root=1;;
66
+ *) break;;
67
+ esac
68
+ done
69
+
70
+ # Disable sentry logging
71
+ export ERROR_REPORTING=FALSE
72
+
73
+ # Do not reinstall existing pip packages on Debian/Ubuntu
74
+ export PIP_IGNORE_INSTALLED=0
75
+
76
+ # Pretty print
77
+ delimiter="################################################################"
78
+
79
+ printf "\n%s\n" "${delimiter}"
80
+ printf "\e[1m\e[32mInstall script for stable-diffusion + Web UI\n"
81
+ printf "\e[1m\e[34mTested on Debian 11 (Bullseye)\e[0m"
82
+ printf "\n%s\n" "${delimiter}"
83
+
84
+ # Do not run as root
85
+ if [[ $(id -u) -eq 0 && can_run_as_root -eq 0 ]]
86
+ then
87
+ printf "\n%s\n" "${delimiter}"
88
+ printf "\e[1m\e[31mERROR: This script must not be launched as root, aborting...\e[0m"
89
+ printf "\n%s\n" "${delimiter}"
90
+ exit 1
91
+ else
92
+ printf "\n%s\n" "${delimiter}"
93
+ printf "Running on \e[1m\e[32m%s\e[0m user" "$(whoami)"
94
+ printf "\n%s\n" "${delimiter}"
95
+ fi
96
+
97
+ if [[ -d .git ]]
98
+ then
99
+ printf "\n%s\n" "${delimiter}"
100
+ printf "Repo already cloned, using it as install directory"
101
+ printf "\n%s\n" "${delimiter}"
102
+ install_dir="${PWD}/../"
103
+ clone_dir="${PWD##*/}"
104
+ fi
105
+
106
+ # Check prerequisites
107
+ gpu_info=$(lspci 2>/dev/null | grep VGA)
108
+ case "$gpu_info" in
109
+ *"Navi 1"*|*"Navi 2"*) export HSA_OVERRIDE_GFX_VERSION=10.3.0
110
+ ;;
111
+ *"Renoir"*) export HSA_OVERRIDE_GFX_VERSION=9.0.0
112
+ printf "\n%s\n" "${delimiter}"
113
+ printf "Experimental support for Renoir: make sure to have at least 4GB of VRAM and 10GB of RAM or enable cpu mode: --use-cpu all --no-half"
114
+ printf "\n%s\n" "${delimiter}"
115
+ ;;
116
+ *)
117
+ ;;
118
+ esac
119
+ if echo "$gpu_info" | grep -q "AMD" && [[ -z "${TORCH_COMMAND}" ]]
120
+ then
121
+ # AMD users will still use torch 1.13 because 2.0 does not seem to work.
122
+ export TORCH_COMMAND="pip install torch==1.13.1+rocm5.2 torchvision==0.14.1+rocm5.2 --index-url https://download.pytorch.org/whl/rocm5.2"
123
+ fi
124
+
125
+ for preq in "${GIT}" "${python_cmd}"
126
+ do
127
+ if ! hash "${preq}" &>/dev/null
128
+ then
129
+ printf "\n%s\n" "${delimiter}"
130
+ printf "\e[1m\e[31mERROR: %s is not installed, aborting...\e[0m" "${preq}"
131
+ printf "\n%s\n" "${delimiter}"
132
+ exit 1
133
+ fi
134
+ done
135
+
136
+ if ! "${python_cmd}" -c "import venv" &>/dev/null
137
+ then
138
+ printf "\n%s\n" "${delimiter}"
139
+ printf "\e[1m\e[31mERROR: python3-venv is not installed, aborting...\e[0m"
140
+ printf "\n%s\n" "${delimiter}"
141
+ exit 1
142
+ fi
143
+
144
+ cd "${install_dir}"/ || { printf "\e[1m\e[31mERROR: Can't cd to %s/, aborting...\e[0m" "${install_dir}"; exit 1; }
145
+ if [[ -d "${clone_dir}" ]]
146
+ then
147
+ cd "${clone_dir}"/ || { printf "\e[1m\e[31mERROR: Can't cd to %s/%s/, aborting...\e[0m" "${install_dir}" "${clone_dir}"; exit 1; }
148
+ else
149
+ printf "\n%s\n" "${delimiter}"
150
+ printf "Clone stable-diffusion-webui"
151
+ printf "\n%s\n" "${delimiter}"
152
+ "${GIT}" clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git "${clone_dir}"
153
+ cd "${clone_dir}"/ || { printf "\e[1m\e[31mERROR: Can't cd to %s/%s/, aborting...\e[0m" "${install_dir}" "${clone_dir}"; exit 1; }
154
+ fi
155
+
156
+ printf "\n%s\n" "${delimiter}"
157
+ printf "Create and activate python venv"
158
+ printf "\n%s\n" "${delimiter}"
159
+ cd "${install_dir}"/"${clone_dir}"/ || { printf "\e[1m\e[31mERROR: Can't cd to %s/%s/, aborting...\e[0m" "${install_dir}" "${clone_dir}"; exit 1; }
160
+ if [[ ! -d "${venv_dir}" ]]
161
+ then
162
+ "${python_cmd}" -m venv "${venv_dir}"
163
+ first_launch=1
164
+ fi
165
+ # shellcheck source=/dev/null
166
+ if [[ -f "${venv_dir}"/bin/activate ]]
167
+ then
168
+ source "${venv_dir}"/bin/activate
169
+ else
170
+ printf "\n%s\n" "${delimiter}"
171
+ printf "\e[1m\e[31mERROR: Cannot activate python venv, aborting...\e[0m"
172
+ printf "\n%s\n" "${delimiter}"
173
+ exit 1
174
+ fi
175
+
176
+ # Try using TCMalloc on Linux
177
+ prepare_tcmalloc() {
178
+ if [[ "${OSTYPE}" == "linux"* ]] && [[ -z "${NO_TCMALLOC}" ]] && [[ -z "${LD_PRELOAD}" ]]; then
179
+ TCMALLOC="$(ldconfig -p | grep -Po "libtcmalloc.so.\d" | head -n 1)"
180
+ if [[ ! -z "${TCMALLOC}" ]]; then
181
+ echo "Using TCMalloc: ${TCMALLOC}"
182
+ export LD_PRELOAD="${TCMALLOC}"
183
+ else
184
+ printf "\e[1m\e[31mCannot locate TCMalloc (improves CPU memory usage)\e[0m\n"
185
+ fi
186
+ fi
187
+ }
188
+
189
+ if [[ ! -z "${ACCELERATE}" ]] && [ ${ACCELERATE}="True" ] && [ -x "$(command -v accelerate)" ]
190
+ then
191
+ printf "\n%s\n" "${delimiter}"
192
+ printf "Accelerating launch.py..."
193
+ printf "\n%s\n" "${delimiter}"
194
+ prepare_tcmalloc
195
+ exec accelerate launch --num_cpu_threads_per_process=6 "${LAUNCH_SCRIPT}" "$@"
196
+ else
197
+ printf "\n%s\n" "${delimiter}"
198
+ printf "Launching launch.py..."
199
+ printf "\n%s\n" "${delimiter}"
200
+ prepare_tcmalloc
201
+ exec "${python_cmd}" "${LAUNCH_SCRIPT}" "$@"
202
+ fi