returnfalse commited on
Commit
eb083da
1 Parent(s): 0285d68

first commit

Browse files
Files changed (16) hide show
  1. .gitignore +35 -0
  2. .pylintrc +3 -0
  3. CODEOWNERS +12 -0
  4. LICENSE.txt +663 -0
  5. README.md +161 -12
  6. environment-wsl2.yaml +11 -0
  7. launch.py +361 -0
  8. requirements.txt +32 -0
  9. requirements_versions.txt +30 -0
  10. screenshot.png +0 -0
  11. script.js +102 -0
  12. style.css +961 -0
  13. webui-macos-env.sh +19 -0
  14. webui.bat +85 -0
  15. webui.py +286 -0
  16. webui.sh +186 -0
.gitignore ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
.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
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,12 +1,161 @@
1
- ---
2
- title: Teset Webui
3
- emoji: 📉
4
- colorFrom: pink
5
- colorTo: red
6
- sdk: gradio
7
- sdk_version: 3.20.0
8
- app_file: app.py
9
- pinned: false
10
- ---
11
-
12
- 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
+
96
+ ## Installation and Running
97
+ 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.
98
+
99
+ Alternatively, use online services (like Google Colab):
100
+
101
+ - [List of Online Services](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Online-Services)
102
+
103
+ ### Automatic Installation on Windows
104
+ 1. Install [Python 3.10.6](https://www.python.org/downloads/windows/), checking "Add Python to PATH"
105
+ 2. Install [git](https://git-scm.com/download/win).
106
+ 3. Download the stable-diffusion-webui repository, for example by running `git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git`.
107
+ 4. Run `webui-user.bat` from Windows Explorer as normal, non-administrator, user.
108
+
109
+ ### Automatic Installation on Linux
110
+ 1. Install the dependencies:
111
+ ```bash
112
+ # Debian-based:
113
+ sudo apt install wget git python3 python3-venv
114
+ # Red Hat-based:
115
+ sudo dnf install wget git python3
116
+ # Arch-based:
117
+ sudo pacman -S wget git python3
118
+ ```
119
+ 2. To install in `/home/$(whoami)/stable-diffusion-webui/`, run:
120
+ ```bash
121
+ bash <(wget -qO- https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh)
122
+ ```
123
+ 3. Run `webui.sh`.
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
+ - Initial Gradio script - posted on 4chan by an Anonymous user. Thank you Anonymous user.
161
+ - (You)
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=22.2.2
8
+ - cudatoolkit=11.3
9
+ - pytorch=1.12.1
10
+ - torchvision=0.13.1
11
+ - numpy=1.23.1
launch.py ADDED
@@ -0,0 +1,361 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 argparse
9
+ import json
10
+
11
+ dir_repos = "repositories"
12
+ dir_extensions = "extensions"
13
+ python = sys.executable
14
+ git = os.environ.get('GIT', "git")
15
+ index_url = os.environ.get('INDEX_URL', "")
16
+ stored_commit_hash = None
17
+ skip_install = False
18
+
19
+
20
+ def check_python_version():
21
+ is_windows = platform.system() == "Windows"
22
+ major = sys.version_info.major
23
+ minor = sys.version_info.minor
24
+ micro = sys.version_info.micro
25
+
26
+ if is_windows:
27
+ supported_minors = [10]
28
+ else:
29
+ supported_minors = [7, 8, 9, 10, 11]
30
+
31
+ if not (major == 3 and minor in supported_minors):
32
+ import modules.errors
33
+
34
+ modules.errors.print_error_explanation(f"""
35
+ INCOMPATIBLE PYTHON VERSION
36
+
37
+ This program is tested with 3.10.6 Python, but you have {major}.{minor}.{micro}.
38
+ If you encounter an error with "RuntimeError: Couldn't install torch." message,
39
+ or any other error regarding unsuccessful package (library) installation,
40
+ please downgrade (or upgrade) to the latest version of 3.10 Python
41
+ and delete current Python and "venv" folder in WebUI's directory.
42
+
43
+ You can download 3.10 Python from here: https://www.python.org/downloads/release/python-3109/
44
+
45
+ {"Alternatively, use a binary release of WebUI: https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases" if is_windows else ""}
46
+
47
+ Use --skip-python-version-check to suppress this warning.
48
+ """)
49
+
50
+
51
+ def commit_hash():
52
+ global stored_commit_hash
53
+
54
+ if stored_commit_hash is not None:
55
+ return stored_commit_hash
56
+
57
+ try:
58
+ stored_commit_hash = run(f"{git} rev-parse HEAD").strip()
59
+ except Exception:
60
+ stored_commit_hash = "<none>"
61
+
62
+ return stored_commit_hash
63
+
64
+
65
+ def extract_arg(args, name):
66
+ return [x for x in args if x != name], name in args
67
+
68
+
69
+ def extract_opt(args, name):
70
+ opt = None
71
+ is_present = False
72
+ if name in args:
73
+ is_present = True
74
+ idx = args.index(name)
75
+ del args[idx]
76
+ if idx < len(args) and args[idx][0] != "-":
77
+ opt = args[idx]
78
+ del args[idx]
79
+ return args, is_present, opt
80
+
81
+
82
+ def run(command, desc=None, errdesc=None, custom_env=None, live=False):
83
+ if desc is not None:
84
+ print(desc)
85
+
86
+ if live:
87
+ result = subprocess.run(command, shell=True, env=os.environ if custom_env is None else custom_env)
88
+ if result.returncode != 0:
89
+ raise RuntimeError(f"""{errdesc or 'Error running command'}.
90
+ Command: {command}
91
+ Error code: {result.returncode}""")
92
+
93
+ return ""
94
+
95
+ result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, env=os.environ if custom_env is None else custom_env)
96
+
97
+ if result.returncode != 0:
98
+
99
+ message = f"""{errdesc or 'Error running command'}.
100
+ Command: {command}
101
+ Error code: {result.returncode}
102
+ stdout: {result.stdout.decode(encoding="utf8", errors="ignore") if len(result.stdout)>0 else '<empty>'}
103
+ stderr: {result.stderr.decode(encoding="utf8", errors="ignore") if len(result.stderr)>0 else '<empty>'}
104
+ """
105
+ raise RuntimeError(message)
106
+
107
+ return result.stdout.decode(encoding="utf8", errors="ignore")
108
+
109
+
110
+ def check_run(command):
111
+ result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
112
+ return result.returncode == 0
113
+
114
+
115
+ def is_installed(package):
116
+ try:
117
+ spec = importlib.util.find_spec(package)
118
+ except ModuleNotFoundError:
119
+ return False
120
+
121
+ return spec is not None
122
+
123
+
124
+ def repo_dir(name):
125
+ return os.path.join(dir_repos, name)
126
+
127
+
128
+ def run_python(code, desc=None, errdesc=None):
129
+ return run(f'"{python}" -c "{code}"', desc, errdesc)
130
+
131
+
132
+ def run_pip(args, desc=None):
133
+ if skip_install:
134
+ return
135
+
136
+ index_url_line = f' --index-url {index_url}' if index_url != '' else ''
137
+ return run(f'"{python}" -m pip {args} --prefer-binary{index_url_line}', desc=f"Installing {desc}", errdesc=f"Couldn't install {desc}")
138
+
139
+
140
+ def check_run_python(code):
141
+ return check_run(f'"{python}" -c "{code}"')
142
+
143
+
144
+ def git_clone(url, dir, name, commithash=None):
145
+ # TODO clone into temporary dir and move if successful
146
+
147
+ if os.path.exists(dir):
148
+ if commithash is None:
149
+ return
150
+
151
+ current_hash = run(f'"{git}" -C "{dir}" rev-parse HEAD', None, f"Couldn't determine {name}'s hash: {commithash}").strip()
152
+ if current_hash == commithash:
153
+ return
154
+
155
+ run(f'"{git}" -C "{dir}" fetch', f"Fetching updates for {name}...", f"Couldn't fetch {name}")
156
+ run(f'"{git}" -C "{dir}" checkout {commithash}', f"Checking out commit for {name} with hash: {commithash}...", f"Couldn't checkout commit {commithash} for {name}")
157
+ return
158
+
159
+ run(f'"{git}" clone "{url}" "{dir}"', f"Cloning {name} into {dir}...", f"Couldn't clone {name}")
160
+
161
+ if commithash is not None:
162
+ run(f'"{git}" -C "{dir}" checkout {commithash}', None, "Couldn't checkout {name}'s hash: {commithash}")
163
+
164
+
165
+ def version_check(commit):
166
+ try:
167
+ import requests
168
+ commits = requests.get('https://api.github.com/repos/AUTOMATIC1111/stable-diffusion-webui/branches/master').json()
169
+ if commit != "<none>" and commits['commit']['sha'] != commit:
170
+ print("--------------------------------------------------------")
171
+ print("| You are not up to date with the most recent release. |")
172
+ print("| Consider running `git pull` to update. |")
173
+ print("--------------------------------------------------------")
174
+ elif commits['commit']['sha'] == commit:
175
+ print("You are up to date with the most recent release.")
176
+ else:
177
+ print("Not a git clone, can't perform version check.")
178
+ except Exception as e:
179
+ print("version check failed", e)
180
+
181
+
182
+ def run_extension_installer(extension_dir):
183
+ path_installer = os.path.join(extension_dir, "install.py")
184
+ if not os.path.isfile(path_installer):
185
+ return
186
+
187
+ try:
188
+ env = os.environ.copy()
189
+ env['PYTHONPATH'] = os.path.abspath(".")
190
+
191
+ print(run(f'"{python}" "{path_installer}"', errdesc=f"Error running install.py for extension {extension_dir}", custom_env=env))
192
+ except Exception as e:
193
+ print(e, file=sys.stderr)
194
+
195
+
196
+ def list_extensions(settings_file):
197
+ settings = {}
198
+
199
+ try:
200
+ if os.path.isfile(settings_file):
201
+ with open(settings_file, "r", encoding="utf8") as file:
202
+ settings = json.load(file)
203
+ except Exception as e:
204
+ print(e, file=sys.stderr)
205
+
206
+ disabled_extensions = set(settings.get('disabled_extensions', []))
207
+
208
+ return [x for x in os.listdir(dir_extensions) if x not in disabled_extensions]
209
+
210
+
211
+ def run_extensions_installers(settings_file):
212
+ if not os.path.isdir(dir_extensions):
213
+ return
214
+
215
+ for dirname_extension in list_extensions(settings_file):
216
+ run_extension_installer(os.path.join(dir_extensions, dirname_extension))
217
+
218
+
219
+ def prepare_environment():
220
+ global skip_install
221
+
222
+ torch_command = os.environ.get('TORCH_COMMAND', "pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117")
223
+ requirements_file = os.environ.get('REQS_FILE', "requirements_versions.txt")
224
+ commandline_args = os.environ.get('COMMANDLINE_ARGS', "")
225
+
226
+ xformers_package = os.environ.get('XFORMERS_PACKAGE', 'xformers==0.0.16rc425')
227
+ gfpgan_package = os.environ.get('GFPGAN_PACKAGE', "git+https://github.com/TencentARC/GFPGAN.git@8d2447a2d918f8eba5a4a01463fd48e45126a379")
228
+ clip_package = os.environ.get('CLIP_PACKAGE', "git+https://github.com/openai/CLIP.git@d50d76daa670286dd6cacf3bcd80b5e4823fc8e1")
229
+ openclip_package = os.environ.get('OPENCLIP_PACKAGE', "git+https://github.com/mlfoundations/open_clip.git@bb6e834e9c70d9c27d0dc3ecedeebeaeb1ffad6b")
230
+
231
+ stable_diffusion_repo = os.environ.get('STABLE_DIFFUSION_REPO', "https://github.com/Stability-AI/stablediffusion.git")
232
+ taming_transformers_repo = os.environ.get('TAMING_TRANSFORMERS_REPO', "https://github.com/CompVis/taming-transformers.git")
233
+ k_diffusion_repo = os.environ.get('K_DIFFUSION_REPO', 'https://github.com/crowsonkb/k-diffusion.git')
234
+ codeformer_repo = os.environ.get('CODEFORMER_REPO', 'https://github.com/sczhou/CodeFormer.git')
235
+ blip_repo = os.environ.get('BLIP_REPO', 'https://github.com/salesforce/BLIP.git')
236
+
237
+ stable_diffusion_commit_hash = os.environ.get('STABLE_DIFFUSION_COMMIT_HASH', "47b6b607fdd31875c9279cd2f4f16b92e4ea958e")
238
+ taming_transformers_commit_hash = os.environ.get('TAMING_TRANSFORMERS_COMMIT_HASH', "24268930bf1dce879235a7fddd0b2355b84d7ea6")
239
+ k_diffusion_commit_hash = os.environ.get('K_DIFFUSION_COMMIT_HASH', "5b3af030dd83e0297272d861c19477735d0317ec")
240
+ codeformer_commit_hash = os.environ.get('CODEFORMER_COMMIT_HASH', "c5b4593074ba6214284d6acd5f1719b6c5d739af")
241
+ blip_commit_hash = os.environ.get('BLIP_COMMIT_HASH', "48211a1594f1321b00f14c9f7a5b4813144b2fb9")
242
+
243
+ sys.argv += shlex.split(commandline_args)
244
+
245
+ parser = argparse.ArgumentParser(add_help=False)
246
+ parser.add_argument("--ui-settings-file", type=str, help="filename to use for ui settings", default='config.json')
247
+ args, _ = parser.parse_known_args(sys.argv)
248
+
249
+ sys.argv, _ = extract_arg(sys.argv, '-f')
250
+ sys.argv, skip_torch_cuda_test = extract_arg(sys.argv, '--skip-torch-cuda-test')
251
+ sys.argv, skip_python_version_check = extract_arg(sys.argv, '--skip-python-version-check')
252
+ sys.argv, reinstall_xformers = extract_arg(sys.argv, '--reinstall-xformers')
253
+ sys.argv, reinstall_torch = extract_arg(sys.argv, '--reinstall-torch')
254
+ sys.argv, update_check = extract_arg(sys.argv, '--update-check')
255
+ sys.argv, run_tests, test_dir = extract_opt(sys.argv, '--tests')
256
+ sys.argv, skip_install = extract_arg(sys.argv, '--skip-install')
257
+ xformers = '--xformers' in sys.argv
258
+ ngrok = '--ngrok' in sys.argv
259
+
260
+ if not skip_python_version_check:
261
+ check_python_version()
262
+
263
+ commit = commit_hash()
264
+
265
+ print(f"Python {sys.version}")
266
+ print(f"Commit hash: {commit}")
267
+
268
+ if reinstall_torch or not is_installed("torch") or not is_installed("torchvision"):
269
+ run(f'"{python}" -m {torch_command}', "Installing torch and torchvision", "Couldn't install torch", live=True)
270
+
271
+ if not skip_torch_cuda_test:
272
+ 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'")
273
+
274
+ if not is_installed("gfpgan"):
275
+ run_pip(f"install {gfpgan_package}", "gfpgan")
276
+
277
+ if not is_installed("clip"):
278
+ run_pip(f"install {clip_package}", "clip")
279
+
280
+ if not is_installed("open_clip"):
281
+ run_pip(f"install {openclip_package}", "open_clip")
282
+
283
+ if (not is_installed("xformers") or reinstall_xformers) and xformers:
284
+ if platform.system() == "Windows":
285
+ if platform.python_version().startswith("3.10"):
286
+ run_pip(f"install -U -I --no-deps {xformers_package}", "xformers")
287
+ else:
288
+ print("Installation of xformers is not supported in this version of Python.")
289
+ print("You can also check this and build manually: https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Xformers#building-xformers-on-windows-by-duckness")
290
+ if not is_installed("xformers"):
291
+ exit(0)
292
+ elif platform.system() == "Linux":
293
+ run_pip(f"install {xformers_package}", "xformers")
294
+
295
+ if not is_installed("pyngrok") and ngrok:
296
+ run_pip("install pyngrok", "ngrok")
297
+
298
+ os.makedirs(dir_repos, exist_ok=True)
299
+
300
+ git_clone(stable_diffusion_repo, repo_dir('stable-diffusion-stability-ai'), "Stable Diffusion", stable_diffusion_commit_hash)
301
+ git_clone(taming_transformers_repo, repo_dir('taming-transformers'), "Taming Transformers", taming_transformers_commit_hash)
302
+ git_clone(k_diffusion_repo, repo_dir('k-diffusion'), "K-diffusion", k_diffusion_commit_hash)
303
+ git_clone(codeformer_repo, repo_dir('CodeFormer'), "CodeFormer", codeformer_commit_hash)
304
+ git_clone(blip_repo, repo_dir('BLIP'), "BLIP", blip_commit_hash)
305
+
306
+ if not is_installed("lpips"):
307
+ run_pip(f"install -r {os.path.join(repo_dir('CodeFormer'), 'requirements.txt')}", "requirements for CodeFormer")
308
+
309
+ run_pip(f"install -r {requirements_file}", "requirements for Web UI")
310
+
311
+ run_extensions_installers(settings_file=args.ui_settings_file)
312
+
313
+ if update_check:
314
+ version_check(commit)
315
+
316
+ if "--exit" in sys.argv:
317
+ print("Exiting because of --exit argument")
318
+ exit(0)
319
+
320
+ if run_tests:
321
+ exitcode = tests(test_dir)
322
+ exit(exitcode)
323
+
324
+
325
+ def tests(test_dir):
326
+ if "--api" not in sys.argv:
327
+ sys.argv.append("--api")
328
+ if "--ckpt" not in sys.argv:
329
+ sys.argv.append("--ckpt")
330
+ sys.argv.append("./test/test_files/empty.pt")
331
+ if "--skip-torch-cuda-test" not in sys.argv:
332
+ sys.argv.append("--skip-torch-cuda-test")
333
+ if "--disable-nan-check" not in sys.argv:
334
+ sys.argv.append("--disable-nan-check")
335
+
336
+ print(f"Launching Web UI in another process for testing with arguments: {' '.join(sys.argv[1:])}")
337
+
338
+ os.environ['COMMANDLINE_ARGS'] = ""
339
+ with open('test/stdout.txt', "w", encoding="utf8") as stdout, open('test/stderr.txt', "w", encoding="utf8") as stderr:
340
+ proc = subprocess.Popen([sys.executable, *sys.argv], stdout=stdout, stderr=stderr)
341
+
342
+ import test.server_poll
343
+ exitcode = test.server_poll.run_tests(proc, test_dir)
344
+
345
+ print(f"Stopping Web UI process with id {proc.pid}")
346
+ proc.kill()
347
+ return exitcode
348
+
349
+
350
+ def start():
351
+ print(f"Launching {'API server' if '--nowebui' in sys.argv else 'Web UI'} with arguments: {' '.join(sys.argv[1:])}")
352
+ import webui
353
+ if '--nowebui' in sys.argv:
354
+ webui.api_only()
355
+ else:
356
+ webui.webui()
357
+
358
+
359
+ if __name__ == "__main__":
360
+ prepare_environment()
361
+ start()
requirements.txt ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ blendmodes
2
+ accelerate
3
+ basicsr
4
+ fonts
5
+ font-roboto
6
+ gfpgan
7
+ gradio==3.16.2
8
+ invisible-watermark
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
requirements_versions.txt ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ blendmodes==2022
2
+ transformers==4.25.1
3
+ accelerate==0.12.0
4
+ basicsr==1.4.2
5
+ gfpgan==1.3.8
6
+ gradio==3.16.2
7
+ numpy==1.23.3
8
+ Pillow==9.4.0
9
+ realesrgan==0.3.0
10
+ torch
11
+ omegaconf==2.2.3
12
+ pytorch_lightning==1.7.6
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.27
27
+ torchsde==0.2.5
28
+ safetensors==0.2.7
29
+ httpcore<=0.15
30
+ fastapi==0.90.1
screenshot.png ADDED
script.js ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ function gradioApp() {
2
+ const elems = document.getElementsByTagName('gradio-app')
3
+ const gradioShadowRoot = elems.length == 0 ? null : elems[0].shadowRoot
4
+ return !!gradioShadowRoot ? gradioShadowRoot : document;
5
+ }
6
+
7
+ function get_uiCurrentTab() {
8
+ return gradioApp().querySelector('#tabs button:not(.border-transparent)')
9
+ }
10
+
11
+ function get_uiCurrentTabContent() {
12
+ return gradioApp().querySelector('.tabitem[id^=tab_]:not([style*="display: none"])')
13
+ }
14
+
15
+ uiUpdateCallbacks = []
16
+ uiLoadedCallbacks = []
17
+ uiTabChangeCallbacks = []
18
+ optionsChangedCallbacks = []
19
+ let uiCurrentTab = null
20
+
21
+ function onUiUpdate(callback){
22
+ uiUpdateCallbacks.push(callback)
23
+ }
24
+ function onUiLoaded(callback){
25
+ uiLoadedCallbacks.push(callback)
26
+ }
27
+ function onUiTabChange(callback){
28
+ uiTabChangeCallbacks.push(callback)
29
+ }
30
+ function onOptionsChanged(callback){
31
+ optionsChangedCallbacks.push(callback)
32
+ }
33
+
34
+ function runCallback(x, m){
35
+ try {
36
+ x(m)
37
+ } catch (e) {
38
+ (console.error || console.log).call(console, e.message, e);
39
+ }
40
+ }
41
+ function executeCallbacks(queue, m) {
42
+ queue.forEach(function(x){runCallback(x, m)})
43
+ }
44
+
45
+ var executedOnLoaded = false;
46
+
47
+ document.addEventListener("DOMContentLoaded", function() {
48
+ var mutationObserver = new MutationObserver(function(m){
49
+ if(!executedOnLoaded && gradioApp().querySelector('#txt2img_prompt')){
50
+ executedOnLoaded = true;
51
+ executeCallbacks(uiLoadedCallbacks);
52
+ }
53
+
54
+ executeCallbacks(uiUpdateCallbacks, m);
55
+ const newTab = get_uiCurrentTab();
56
+ if ( newTab && ( newTab !== uiCurrentTab ) ) {
57
+ uiCurrentTab = newTab;
58
+ executeCallbacks(uiTabChangeCallbacks);
59
+ }
60
+ });
61
+ mutationObserver.observe( gradioApp(), { childList:true, subtree:true })
62
+ });
63
+
64
+ /**
65
+ * Add a ctrl+enter as a shortcut to start a generation
66
+ */
67
+ document.addEventListener('keydown', function(e) {
68
+ var handled = false;
69
+ if (e.key !== undefined) {
70
+ if((e.key == "Enter" && (e.metaKey || e.ctrlKey || e.altKey))) handled = true;
71
+ } else if (e.keyCode !== undefined) {
72
+ if((e.keyCode == 13 && (e.metaKey || e.ctrlKey || e.altKey))) handled = true;
73
+ }
74
+ if (handled) {
75
+ button = get_uiCurrentTabContent().querySelector('button[id$=_generate]');
76
+ if (button) {
77
+ button.click();
78
+ }
79
+ e.preventDefault();
80
+ }
81
+ })
82
+
83
+ /**
84
+ * checks that a UI element is not in another hidden element or tab content
85
+ */
86
+ function uiElementIsVisible(el) {
87
+ let isVisible = !el.closest('.\\!hidden');
88
+ if ( ! isVisible ) {
89
+ return false;
90
+ }
91
+
92
+ while( isVisible = el.closest('.tabitem')?.style.display !== 'none' ) {
93
+ if ( ! isVisible ) {
94
+ return false;
95
+ } else if ( el.parentElement ) {
96
+ el = el.parentElement
97
+ } else {
98
+ break;
99
+ }
100
+ }
101
+ return isVisible;
102
+ }
style.css ADDED
@@ -0,0 +1,961 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .container {
2
+ max-width: 100%;
3
+ }
4
+
5
+ .token-counter{
6
+ position: absolute;
7
+ display: inline-block;
8
+ right: 2em;
9
+ min-width: 0 !important;
10
+ width: auto;
11
+ z-index: 100;
12
+ }
13
+
14
+ .token-counter.error span{
15
+ 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);
16
+ border: 2px solid rgba(255,0,0,0.4) !important;
17
+ }
18
+
19
+ .token-counter div{
20
+ display: inline;
21
+ }
22
+
23
+ .token-counter span{
24
+ padding: 0.1em 0.75em;
25
+ }
26
+
27
+ #sh{
28
+ min-width: 2em;
29
+ min-height: 2em;
30
+ max-width: 2em;
31
+ max-height: 2em;
32
+ flex-grow: 0;
33
+ padding-left: 0.25em;
34
+ padding-right: 0.25em;
35
+ margin: 0.1em 0;
36
+ opacity: 0%;
37
+ cursor: default;
38
+ }
39
+
40
+ .output-html p {margin: 0 0.5em;}
41
+
42
+ .row > *,
43
+ .row > .gr-form > * {
44
+ min-width: min(120px, 100%);
45
+ flex: 1 1 0%;
46
+ }
47
+
48
+ .performance {
49
+ font-size: 0.85em;
50
+ color: #444;
51
+ }
52
+
53
+ .performance p{
54
+ display: inline-block;
55
+ }
56
+
57
+ .performance .time {
58
+ margin-right: 0;
59
+ }
60
+
61
+ .performance .vram {
62
+ }
63
+
64
+ #txt2img_generate, #img2img_generate {
65
+ min-height: 4.5em;
66
+ }
67
+
68
+ @media screen and (min-width: 2500px) {
69
+ #txt2img_gallery, #img2img_gallery {
70
+ min-height: 768px;
71
+ }
72
+ }
73
+
74
+ #txt2img_gallery img, #img2img_gallery img{
75
+ object-fit: scale-down;
76
+ }
77
+ #txt2img_actions_column, #img2img_actions_column {
78
+ margin: 0.35rem 0.75rem 0.35rem 0;
79
+ }
80
+ #script_list {
81
+ padding: .625rem .75rem 0 .625rem;
82
+ }
83
+ .justify-center.overflow-x-scroll {
84
+ justify-content: left;
85
+ }
86
+
87
+ .justify-center.overflow-x-scroll button:first-of-type {
88
+ margin-left: auto;
89
+ }
90
+
91
+ .justify-center.overflow-x-scroll button:last-of-type {
92
+ margin-right: auto;
93
+ }
94
+
95
+ [id$=_random_seed], [id$=_random_subseed], [id$=_reuse_seed], [id$=_reuse_subseed], #open_folder{
96
+ min-width: 2.3em;
97
+ height: 2.5em;
98
+ flex-grow: 0;
99
+ padding-left: 0.25em;
100
+ padding-right: 0.25em;
101
+ }
102
+
103
+ #hidden_element{
104
+ display: none;
105
+ }
106
+
107
+ [id$=_seed_row], [id$=_subseed_row]{
108
+ gap: 0.5rem;
109
+ padding: 0.6em;
110
+ }
111
+
112
+ [id$=_subseed_show_box]{
113
+ min-width: auto;
114
+ flex-grow: 0;
115
+ }
116
+
117
+ [id$=_subseed_show_box] > div{
118
+ border: 0;
119
+ height: 100%;
120
+ }
121
+
122
+ [id$=_subseed_show]{
123
+ min-width: auto;
124
+ flex-grow: 0;
125
+ padding: 0;
126
+ }
127
+
128
+ [id$=_subseed_show] label{
129
+ height: 100%;
130
+ }
131
+
132
+ #txt2img_actions_column, #img2img_actions_column{
133
+ gap: 0;
134
+ margin-right: .75rem;
135
+ }
136
+
137
+ #txt2img_tools, #img2img_tools{
138
+ gap: 0.4em;
139
+ }
140
+
141
+ #interrogate_col{
142
+ min-width: 0 !important;
143
+ max-width: 8em !important;
144
+ margin-right: 1em;
145
+ gap: 0;
146
+ }
147
+ #interrogate, #deepbooru{
148
+ margin: 0em 0.25em 0.5em 0.25em;
149
+ min-width: 8em;
150
+ max-width: 8em;
151
+ }
152
+
153
+ #style_pos_col, #style_neg_col{
154
+ min-width: 8em !important;
155
+ }
156
+
157
+ #txt2img_styles_row, #img2img_styles_row{
158
+ gap: 0.25em;
159
+ margin-top: 0.3em;
160
+ }
161
+
162
+ #txt2img_styles_row > button, #img2img_styles_row > button{
163
+ margin: 0;
164
+ }
165
+
166
+ #txt2img_styles, #img2img_styles{
167
+ padding: 0;
168
+ }
169
+
170
+ #txt2img_styles > label > div, #img2img_styles > label > div{
171
+ min-height: 3.2em;
172
+ }
173
+
174
+ ul.list-none{
175
+ max-height: 35em;
176
+ z-index: 2000;
177
+ }
178
+
179
+ .gr-form{
180
+ background: transparent;
181
+ }
182
+
183
+ .my-4{
184
+ margin-top: 0;
185
+ margin-bottom: 0;
186
+ }
187
+
188
+ #resize_mode{
189
+ flex: 1.5;
190
+ }
191
+
192
+ button{
193
+ align-self: stretch !important;
194
+ }
195
+
196
+ .overflow-hidden, .gr-panel{
197
+ overflow: visible !important;
198
+ }
199
+
200
+ #x_type, #y_type{
201
+ max-width: 10em;
202
+ }
203
+
204
+ #txt2img_preview, #img2img_preview, #ti_preview{
205
+ position: absolute;
206
+ width: 320px;
207
+ left: 0;
208
+ right: 0;
209
+ margin-left: auto;
210
+ margin-right: auto;
211
+ margin-top: 34px;
212
+ z-index: 100;
213
+ border: none;
214
+ border-top-left-radius: 0;
215
+ border-top-right-radius: 0;
216
+ }
217
+
218
+ @media screen and (min-width: 768px) {
219
+ #txt2img_preview, #img2img_preview, #ti_preview {
220
+ position: absolute;
221
+ }
222
+ }
223
+
224
+ @media screen and (max-width: 767px) {
225
+ #txt2img_preview, #img2img_preview, #ti_preview {
226
+ position: relative;
227
+ }
228
+ }
229
+
230
+ #txt2img_preview div.left-0.top-0, #img2img_preview div.left-0.top-0, #ti_preview div.left-0.top-0{
231
+ display: none;
232
+ }
233
+
234
+ fieldset span.text-gray-500, .gr-block.gr-box span.text-gray-500, label.block span{
235
+ position: absolute;
236
+ top: -0.7em;
237
+ line-height: 1.2em;
238
+ padding: 0;
239
+ margin: 0 0.5em;
240
+
241
+ background-color: white;
242
+ box-shadow: 6px 0 6px 0px white, -6px 0 6px 0px white;
243
+
244
+ z-index: 300;
245
+ }
246
+
247
+ .dark fieldset span.text-gray-500, .dark .gr-block.gr-box span.text-gray-500, .dark label.block span{
248
+ background-color: rgb(31, 41, 55);
249
+ box-shadow: none;
250
+ border: 1px solid rgba(128, 128, 128, 0.1);
251
+ border-radius: 6px;
252
+ padding: 0.1em 0.5em;
253
+ }
254
+
255
+ #txt2img_column_batch, #img2img_column_batch{
256
+ min-width: min(13.5em, 100%) !important;
257
+ }
258
+
259
+ #settings fieldset span.text-gray-500, #settings .gr-block.gr-box span.text-gray-500, #settings label.block span{
260
+ position: relative;
261
+ border: none;
262
+ margin-right: 8em;
263
+ }
264
+
265
+ #settings .gr-panel div.flex-col div.justify-between div{
266
+ position: relative;
267
+ z-index: 200;
268
+ }
269
+
270
+ #settings{
271
+ display: block;
272
+ }
273
+
274
+ #settings > div{
275
+ border: none;
276
+ margin-left: 10em;
277
+ }
278
+
279
+ #settings > div.flex-wrap{
280
+ float: left;
281
+ display: block;
282
+ margin-left: 0;
283
+ width: 10em;
284
+ }
285
+
286
+ #settings > div.flex-wrap button{
287
+ display: block;
288
+ border: none;
289
+ text-align: left;
290
+ }
291
+
292
+ #settings_result{
293
+ height: 1.4em;
294
+ margin: 0 1.2em;
295
+ }
296
+
297
+ input[type="range"]{
298
+ margin: 0.5em 0 -0.3em 0;
299
+ }
300
+
301
+ #mask_bug_info {
302
+ text-align: center;
303
+ display: block;
304
+ margin-top: -0.75em;
305
+ margin-bottom: -0.75em;
306
+ }
307
+
308
+ #txt2img_negative_prompt, #img2img_negative_prompt{
309
+ }
310
+
311
+ /* gradio 3.8 adds opacity to progressbar which makes it blink; disable it here */
312
+ .transition.opacity-20 {
313
+ opacity: 1 !important;
314
+ }
315
+
316
+ /* more gradio's garbage cleanup */
317
+ .min-h-\[4rem\] { min-height: unset !important; }
318
+ .min-h-\[6rem\] { min-height: unset !important; }
319
+
320
+ .progressDiv{
321
+ position: relative;
322
+ height: 20px;
323
+ background: #b4c0cc;
324
+ border-radius: 3px !important;
325
+ margin-bottom: -3px;
326
+ }
327
+
328
+ .dark .progressDiv{
329
+ background: #424c5b;
330
+ }
331
+
332
+ .progressDiv .progress{
333
+ width: 0%;
334
+ height: 20px;
335
+ background: #0060df;
336
+ color: white;
337
+ font-weight: bold;
338
+ line-height: 20px;
339
+ padding: 0 8px 0 0;
340
+ text-align: right;
341
+ border-radius: 3px;
342
+ overflow: visible;
343
+ white-space: nowrap;
344
+ padding: 0 0.5em;
345
+ }
346
+
347
+ .livePreview{
348
+ position: absolute;
349
+ z-index: 300;
350
+ background-color: white;
351
+ margin: -4px;
352
+ }
353
+
354
+ .dark .livePreview{
355
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
356
+ }
357
+
358
+ .livePreview img{
359
+ position: absolute;
360
+ object-fit: contain;
361
+ width: 100%;
362
+ height: 100%;
363
+ }
364
+
365
+ #lightboxModal{
366
+ display: none;
367
+ position: fixed;
368
+ z-index: 1001;
369
+ padding-top: 100px;
370
+ left: 0;
371
+ top: 0;
372
+ width: 100%;
373
+ height: 100%;
374
+ overflow: auto;
375
+ background-color: rgba(20, 20, 20, 0.95);
376
+ user-select: none;
377
+ -webkit-user-select: none;
378
+ }
379
+
380
+ .modalControls {
381
+ display: grid;
382
+ grid-template-columns: 32px 32px 32px 1fr 32px;
383
+ grid-template-areas: "zoom tile save space close";
384
+ position: absolute;
385
+ top: 0;
386
+ left: 0;
387
+ right: 0;
388
+ padding: 16px;
389
+ gap: 16px;
390
+ background-color: rgba(0,0,0,0.2);
391
+ }
392
+
393
+ .modalClose {
394
+ grid-area: close;
395
+ }
396
+
397
+ .modalZoom {
398
+ grid-area: zoom;
399
+ }
400
+
401
+ .modalSave {
402
+ grid-area: save;
403
+ }
404
+
405
+ .modalTileImage {
406
+ grid-area: tile;
407
+ }
408
+
409
+ .modalClose,
410
+ .modalZoom,
411
+ .modalTileImage {
412
+ color: white;
413
+ font-size: 35px;
414
+ font-weight: bold;
415
+ cursor: pointer;
416
+ }
417
+
418
+ .modalSave {
419
+ color: white;
420
+ font-size: 28px;
421
+ margin-top: 8px;
422
+ font-weight: bold;
423
+ cursor: pointer;
424
+ }
425
+
426
+ .modalClose:hover,
427
+ .modalClose:focus,
428
+ .modalSave:hover,
429
+ .modalSave:focus,
430
+ .modalZoom:hover,
431
+ .modalZoom:focus {
432
+ color: #999;
433
+ text-decoration: none;
434
+ cursor: pointer;
435
+ }
436
+
437
+ #modalImage {
438
+ display: block;
439
+ margin-left: auto;
440
+ margin-right: auto;
441
+ margin-top: auto;
442
+ width: auto;
443
+ }
444
+
445
+ .modalImageFullscreen {
446
+ object-fit: contain;
447
+ height: 90%;
448
+ }
449
+
450
+ .modalPrev,
451
+ .modalNext {
452
+ cursor: pointer;
453
+ position: absolute;
454
+ top: 50%;
455
+ width: auto;
456
+ padding: 16px;
457
+ margin-top: -50px;
458
+ color: white;
459
+ font-weight: bold;
460
+ font-size: 20px;
461
+ transition: 0.6s ease;
462
+ border-radius: 0 3px 3px 0;
463
+ user-select: none;
464
+ -webkit-user-select: none;
465
+ }
466
+
467
+ .modalNext {
468
+ right: 0;
469
+ border-radius: 3px 0 0 3px;
470
+ }
471
+
472
+ .modalPrev:hover,
473
+ .modalNext:hover {
474
+ background-color: rgba(0, 0, 0, 0.8);
475
+ }
476
+
477
+ #imageARPreview{
478
+ position:absolute;
479
+ top:0px;
480
+ left:0px;
481
+ border:2px solid red;
482
+ background:rgba(255, 0, 0, 0.3);
483
+ z-index: 900;
484
+ pointer-events:none;
485
+ display:none
486
+ }
487
+
488
+ #txt2img_generate_box, #img2img_generate_box{
489
+ position: relative;
490
+ }
491
+
492
+ #txt2img_interrupt, #img2img_interrupt, #txt2img_skip, #img2img_skip{
493
+ position: absolute;
494
+ width: 50%;
495
+ height: 100%;
496
+ background: #b4c0cc;
497
+ display: none;
498
+ }
499
+
500
+ #txt2img_interrupt, #img2img_interrupt{
501
+ left: 0;
502
+ border-radius: 0.5rem 0 0 0.5rem;
503
+ }
504
+ #txt2img_skip, #img2img_skip{
505
+ right: 0;
506
+ border-radius: 0 0.5rem 0.5rem 0;
507
+ }
508
+
509
+ .red {
510
+ color: red;
511
+ }
512
+
513
+ .gallery-item {
514
+ --tw-bg-opacity: 0 !important;
515
+ }
516
+
517
+ #context-menu{
518
+ z-index:9999;
519
+ position:absolute;
520
+ display:block;
521
+ padding:0px 0;
522
+ border:2px solid #a55000;
523
+ border-radius:8px;
524
+ box-shadow:1px 1px 2px #CE6400;
525
+ width: 200px;
526
+ }
527
+
528
+ .context-menu-items{
529
+ list-style: none;
530
+ margin: 0;
531
+ padding: 0;
532
+ }
533
+
534
+ .context-menu-items a{
535
+ display:block;
536
+ padding:5px;
537
+ cursor:pointer;
538
+ }
539
+
540
+ .context-menu-items a:hover{
541
+ background: #a55000;
542
+ }
543
+
544
+ #quicksettings {
545
+ width: fit-content;
546
+ }
547
+
548
+ #quicksettings > div, #quicksettings > fieldset{
549
+ max-width: 24em;
550
+ min-width: 24em;
551
+ padding: 0;
552
+ border: none;
553
+ box-shadow: none;
554
+ background: none;
555
+ margin-right: 10px;
556
+ }
557
+
558
+ #quicksettings > div > div > div > label > span {
559
+ position: relative;
560
+ margin-right: 9em;
561
+ margin-bottom: -1em;
562
+ }
563
+
564
+ canvas[key="mask"] {
565
+ z-index: 12 !important;
566
+ filter: invert();
567
+ mix-blend-mode: multiply;
568
+ pointer-events: none;
569
+ }
570
+
571
+
572
+ /* gradio 3.4.1 stuff for editable scrollbar values */
573
+ .gr-box > div > div > input.gr-text-input{
574
+ position: absolute;
575
+ right: 0.5em;
576
+ top: -0.6em;
577
+ z-index: 400;
578
+ width: 6em;
579
+ }
580
+ #quicksettings .gr-box > div > div > input.gr-text-input {
581
+ top: -1.12em;
582
+ }
583
+
584
+ .row.gr-compact{
585
+ overflow: visible;
586
+ }
587
+
588
+ #img2img_image, #img2img_image > .h-60, #img2img_image > .h-60 > div, #img2img_image > .h-60 > div > img,
589
+ #img2img_sketch, #img2img_sketch > .h-60, #img2img_sketch > .h-60 > div, #img2img_sketch > .h-60 > div > img,
590
+ #img2maskimg, #img2maskimg > .h-60, #img2maskimg > .h-60 > div, #img2maskimg > .h-60 > div > img,
591
+ #inpaint_sketch, #inpaint_sketch > .h-60, #inpaint_sketch > .h-60 > div, #inpaint_sketch > .h-60 > div > img
592
+ {
593
+ height: 480px !important;
594
+ max-height: 480px !important;
595
+ min-height: 480px !important;
596
+ }
597
+
598
+ /* Extensions */
599
+
600
+ #tab_extensions table{
601
+ border-collapse: collapse;
602
+ }
603
+
604
+ #tab_extensions table td, #tab_extensions table th{
605
+ border: 1px solid #ccc;
606
+ padding: 0.25em 0.5em;
607
+ }
608
+
609
+ #tab_extensions table input[type="checkbox"]{
610
+ margin-right: 0.5em;
611
+ }
612
+
613
+ #tab_extensions button{
614
+ max-width: 16em;
615
+ }
616
+
617
+ #tab_extensions input[disabled="disabled"]{
618
+ opacity: 0.5;
619
+ }
620
+
621
+ .extension-tag{
622
+ font-weight: bold;
623
+ font-size: 95%;
624
+ }
625
+
626
+ #available_extensions .info{
627
+ margin: 0;
628
+ }
629
+
630
+ #available_extensions .date_added{
631
+ opacity: 0.85;
632
+ font-size: 90%;
633
+ }
634
+
635
+ #image_buttons_txt2img button, #image_buttons_img2img button, #image_buttons_extras button{
636
+ min-width: auto;
637
+ padding-left: 0.5em;
638
+ padding-right: 0.5em;
639
+ }
640
+
641
+ .gr-form{
642
+ background-color: white;
643
+ }
644
+
645
+ .dark .gr-form{
646
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
647
+ }
648
+
649
+ .gr-button-tool, .gr-button-tool-top{
650
+ max-width: 2.5em;
651
+ min-width: 2.5em !important;
652
+ height: 2.4em;
653
+ }
654
+
655
+ .gr-button-tool{
656
+ margin: 0.6em 0em 0.55em 0;
657
+ }
658
+
659
+ .gr-button-tool-top, #settings .gr-button-tool{
660
+ margin: 1.6em 0.7em 0.55em 0;
661
+ }
662
+
663
+
664
+ #modelmerger_results_container{
665
+ margin-top: 1em;
666
+ overflow: visible;
667
+ }
668
+
669
+ #modelmerger_models{
670
+ gap: 0;
671
+ }
672
+
673
+
674
+ #quicksettings .gr-button-tool{
675
+ margin: 0;
676
+ border-color: unset;
677
+ background-color: unset;
678
+ }
679
+
680
+ #modelmerger_interp_description>p {
681
+ margin: 0!important;
682
+ text-align: center;
683
+ }
684
+ #modelmerger_interp_description {
685
+ margin: 0.35rem 0.75rem 1.23rem;
686
+ }
687
+ #img2img_settings > div.gr-form, #txt2img_settings > div.gr-form {
688
+ padding-top: 0.9em;
689
+ padding-bottom: 0.9em;
690
+ }
691
+ #txt2img_settings {
692
+ padding-top: 1.16em;
693
+ padding-bottom: 0.9em;
694
+ }
695
+ #img2img_settings {
696
+ padding-bottom: 0.9em;
697
+ }
698
+
699
+ #img2img_settings div.gr-form .gr-form, #txt2img_settings div.gr-form .gr-form, #train_tabs div.gr-form .gr-form{
700
+ border: none;
701
+ padding-bottom: 0.5em;
702
+ }
703
+
704
+ footer {
705
+ display: none !important;
706
+ }
707
+
708
+ #footer{
709
+ text-align: center;
710
+ }
711
+
712
+ #footer div{
713
+ display: inline-block;
714
+ }
715
+
716
+ #footer .versions{
717
+ font-size: 85%;
718
+ opacity: 0.85;
719
+ }
720
+
721
+ #txtimg_hr_finalres{
722
+ min-height: 0 !important;
723
+ padding: .625rem .75rem;
724
+ margin-left: -0.75em
725
+
726
+ }
727
+
728
+ #txtimg_hr_finalres .resolution{
729
+ font-weight: bold;
730
+ }
731
+
732
+ #txt2img_checkboxes, #img2img_checkboxes{
733
+ margin-bottom: 0.5em;
734
+ margin-left: 0em;
735
+ }
736
+ #txt2img_checkboxes > div, #img2img_checkboxes > div{
737
+ flex: 0;
738
+ white-space: nowrap;
739
+ min-width: auto;
740
+ }
741
+
742
+ #img2img_copy_to_img2img, #img2img_copy_to_sketch, #img2img_copy_to_inpaint, #img2img_copy_to_inpaint_sketch{
743
+ margin-left: 0em;
744
+ }
745
+
746
+ #axis_options {
747
+ margin-left: 0em;
748
+ }
749
+
750
+ .inactive{
751
+ opacity: 0.5;
752
+ }
753
+
754
+ [id*='_prompt_container']{
755
+ gap: 0;
756
+ }
757
+
758
+ [id*='_prompt_container'] > div{
759
+ margin: -0.4em 0 0 0;
760
+ }
761
+
762
+ .gr-compact {
763
+ border: none;
764
+ }
765
+
766
+ .dark .gr-compact{
767
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
768
+ margin-left: 0;
769
+ }
770
+
771
+ .gr-compact{
772
+ overflow: visible;
773
+ }
774
+
775
+ .gr-compact > *{
776
+ }
777
+
778
+ .gr-compact .gr-block, .gr-compact .gr-form{
779
+ border: none;
780
+ box-shadow: none;
781
+ }
782
+
783
+ .gr-compact .gr-box{
784
+ border-radius: .5rem !important;
785
+ border-width: 1px !important;
786
+ }
787
+
788
+ #mode_img2img > div > div{
789
+ gap: 0 !important;
790
+ }
791
+
792
+ [id*='img2img_copy_to_'] {
793
+ border: none;
794
+ }
795
+
796
+ [id*='img2img_copy_to_'] > button {
797
+ }
798
+
799
+ [id*='img2img_label_copy_to_'] {
800
+ font-size: 1.0em;
801
+ font-weight: bold;
802
+ text-align: center;
803
+ line-height: 2.4em;
804
+ }
805
+
806
+ .extra-networks > div > [id *= '_extra_']{
807
+ margin: 0.3em;
808
+ }
809
+
810
+ .extra-network-subdirs{
811
+ padding: 0.2em 0.35em;
812
+ }
813
+
814
+ .extra-network-subdirs button{
815
+ margin: 0 0.15em;
816
+ }
817
+
818
+ #txt2img_extra_networks .search, #img2img_extra_networks .search{
819
+ display: inline-block;
820
+ max-width: 16em;
821
+ margin: 0.3em;
822
+ align-self: center;
823
+ }
824
+
825
+ #txt2img_extra_view, #img2img_extra_view {
826
+ width: auto;
827
+ }
828
+
829
+ .extra-network-cards .nocards, .extra-network-thumbs .nocards{
830
+ margin: 1.25em 0.5em 0.5em 0.5em;
831
+ }
832
+
833
+ .extra-network-cards .nocards h1, .extra-network-thumbs .nocards h1{
834
+ font-size: 1.5em;
835
+ margin-bottom: 1em;
836
+ }
837
+
838
+ .extra-network-cards .nocards li, .extra-network-thumbs .nocards li{
839
+ margin-left: 0.5em;
840
+ }
841
+
842
+ .extra-network-thumbs {
843
+ display: flex;
844
+ flex-flow: row wrap;
845
+ gap: 10px;
846
+ }
847
+
848
+ .extra-network-thumbs .card {
849
+ height: 6em;
850
+ width: 6em;
851
+ cursor: pointer;
852
+ background-image: url('./file=html/card-no-preview.png');
853
+ background-size: cover;
854
+ background-position: center center;
855
+ position: relative;
856
+ }
857
+
858
+ .extra-network-thumbs .card:hover .additional a {
859
+ display: block;
860
+ }
861
+
862
+ .extra-network-thumbs .actions .additional a {
863
+ background-image: url('./file=html/image-update.svg');
864
+ background-repeat: no-repeat;
865
+ background-size: cover;
866
+ background-position: center center;
867
+ position: absolute;
868
+ top: 0;
869
+ left: 0;
870
+ width: 24px;
871
+ height: 24px;
872
+ display: none;
873
+ font-size: 0;
874
+ text-align: -9999;
875
+ }
876
+
877
+ .extra-network-thumbs .actions .name {
878
+ position: absolute;
879
+ bottom: 0;
880
+ font-size: 10px;
881
+ padding: 3px;
882
+ width: 100%;
883
+ overflow: hidden;
884
+ white-space: nowrap;
885
+ text-overflow: ellipsis;
886
+ background: rgba(0,0,0,.5);
887
+ color: white;
888
+ }
889
+
890
+ .extra-network-thumbs .card:hover .actions .name {
891
+ white-space: normal;
892
+ word-break: break-all;
893
+ }
894
+
895
+ .extra-network-cards .card{
896
+ display: inline-block;
897
+ margin: 0.5em;
898
+ width: 16em;
899
+ height: 24em;
900
+ box-shadow: 0 0 5px rgba(128, 128, 128, 0.5);
901
+ border-radius: 0.2em;
902
+ position: relative;
903
+
904
+ background-size: auto 100%;
905
+ background-position: center;
906
+ overflow: hidden;
907
+ cursor: pointer;
908
+
909
+ background-image: url('./file=html/card-no-preview.png')
910
+ }
911
+
912
+ .extra-network-cards .card:hover{
913
+ box-shadow: 0 0 2px 0.3em rgba(0, 128, 255, 0.35);
914
+ }
915
+
916
+ .extra-network-cards .card .actions .additional{
917
+ display: none;
918
+ }
919
+
920
+ .extra-network-cards .card .actions{
921
+ position: absolute;
922
+ bottom: 0;
923
+ left: 0;
924
+ right: 0;
925
+ padding: 0.5em;
926
+ color: white;
927
+ background: rgba(0,0,0,0.5);
928
+ box-shadow: 0 0 0.25em 0.25em rgba(0,0,0,0.5);
929
+ text-shadow: 0 0 0.2em black;
930
+ }
931
+
932
+ .extra-network-cards .card .actions:hover{
933
+ box-shadow: 0 0 0.75em 0.75em rgba(0,0,0,0.5) !important;
934
+ }
935
+
936
+ .extra-network-cards .card .actions .name{
937
+ font-size: 1.7em;
938
+ font-weight: bold;
939
+ line-break: anywhere;
940
+ }
941
+
942
+ .extra-network-cards .card .actions:hover .additional{
943
+ display: block;
944
+ }
945
+
946
+ .extra-network-cards .card ul{
947
+ margin: 0.25em 0 0.75em 0.25em;
948
+ cursor: unset;
949
+ }
950
+
951
+ .extra-network-cards .card ul a{
952
+ cursor: pointer;
953
+ }
954
+
955
+ .extra-network-cards .card ul a:hover{
956
+ color: red;
957
+ }
958
+
959
+ [id*='_prompt_container'] > div {
960
+ margin: 0!important;
961
+ }
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==1.12.1 torchvision==0.13.1"
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.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,286 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ import time
4
+ import importlib
5
+ import signal
6
+ import re
7
+ from fastapi import FastAPI
8
+ from fastapi.middleware.cors import CORSMiddleware
9
+ from fastapi.middleware.gzip import GZipMiddleware
10
+ from packaging import version
11
+
12
+ import logging
13
+ logging.getLogger("xformers").addFilter(lambda record: 'A matching Triton is not available' not in record.getMessage())
14
+
15
+ from modules import import_hook, errors, extra_networks, ui_extra_networks_checkpoints
16
+ from modules import extra_networks_hypernet, ui_extra_networks_hypernets, ui_extra_networks_textual_inversion
17
+ from modules.call_queue import wrap_queued_call, queue_lock, wrap_gradio_gpu_call
18
+
19
+ import torch
20
+
21
+ # Truncate version number of nightly/local build of PyTorch to not cause exceptions with CodeFormer or Safetensors
22
+ if ".dev" in torch.__version__ or "+git" in torch.__version__:
23
+ torch.__long_version__ = torch.__version__
24
+ torch.__version__ = re.search(r'[\d.]+[\d]', torch.__version__).group(0)
25
+
26
+ from modules import shared, devices, sd_samplers, upscaler, extensions, localization, ui_tempdir, ui_extra_networks
27
+ import modules.codeformer_model as codeformer
28
+ import modules.face_restoration
29
+ import modules.gfpgan_model as gfpgan
30
+ import modules.img2img
31
+
32
+ import modules.lowvram
33
+ import modules.paths
34
+ import modules.scripts
35
+ import modules.sd_hijack
36
+ import modules.sd_models
37
+ import modules.sd_vae
38
+ import modules.txt2img
39
+ import modules.script_callbacks
40
+ import modules.textual_inversion.textual_inversion
41
+ import modules.progress
42
+
43
+ import modules.ui
44
+ from modules import modelloader
45
+ from modules.shared import cmd_opts
46
+ import modules.hypernetworks.hypernetwork
47
+
48
+
49
+ if cmd_opts.server_name:
50
+ server_name = cmd_opts.server_name
51
+ else:
52
+ server_name = "0.0.0.0" if cmd_opts.listen else None
53
+
54
+
55
+ def check_versions():
56
+ if shared.cmd_opts.skip_version_check:
57
+ return
58
+
59
+ expected_torch_version = "1.13.1"
60
+
61
+ if version.parse(torch.__version__) < version.parse(expected_torch_version):
62
+ errors.print_error_explanation(f"""
63
+ You are running torch {torch.__version__}.
64
+ The program is tested to work with torch {expected_torch_version}.
65
+ To reinstall the desired version, run with commandline flag --reinstall-torch.
66
+ Beware that this will cause a lot of large files to be downloaded, as well as
67
+ there are reports of issues with training tab on the latest version.
68
+
69
+ Use --skip-version-check commandline argument to disable this check.
70
+ """.strip())
71
+
72
+ expected_xformers_version = "0.0.16rc425"
73
+ if shared.xformers_available:
74
+ import xformers
75
+
76
+ if version.parse(xformers.__version__) < version.parse(expected_xformers_version):
77
+ errors.print_error_explanation(f"""
78
+ You are running xformers {xformers.__version__}.
79
+ The program is tested to work with xformers {expected_xformers_version}.
80
+ To reinstall the desired version, run with commandline flag --reinstall-xformers.
81
+
82
+ Use --skip-version-check commandline argument to disable this check.
83
+ """.strip())
84
+
85
+
86
+ def initialize():
87
+ check_versions()
88
+
89
+ extensions.list_extensions()
90
+ localization.list_localizations(cmd_opts.localizations_dir)
91
+
92
+ if cmd_opts.ui_debug_mode:
93
+ shared.sd_upscalers = upscaler.UpscalerLanczos().scalers
94
+ modules.scripts.load_scripts()
95
+ return
96
+
97
+ modelloader.cleanup_models()
98
+ modules.sd_models.setup_model()
99
+ codeformer.setup_model(cmd_opts.codeformer_models_path)
100
+ gfpgan.setup_model(cmd_opts.gfpgan_models_path)
101
+
102
+ modelloader.list_builtin_upscalers()
103
+ modules.scripts.load_scripts()
104
+ modelloader.load_upscalers()
105
+
106
+ modules.sd_vae.refresh_vae_list()
107
+
108
+ modules.textual_inversion.textual_inversion.list_textual_inversion_templates()
109
+
110
+ try:
111
+ modules.sd_models.load_model()
112
+ except Exception as e:
113
+ errors.display(e, "loading stable diffusion model")
114
+ print("", file=sys.stderr)
115
+ print("Stable diffusion model failed to load, exiting", file=sys.stderr)
116
+ exit(1)
117
+
118
+ shared.opts.data["sd_model_checkpoint"] = shared.sd_model.sd_checkpoint_info.title
119
+
120
+ shared.opts.onchange("sd_model_checkpoint", wrap_queued_call(lambda: modules.sd_models.reload_model_weights()))
121
+ shared.opts.onchange("sd_vae", wrap_queued_call(lambda: modules.sd_vae.reload_vae_weights()), call=False)
122
+ shared.opts.onchange("sd_vae_as_default", wrap_queued_call(lambda: modules.sd_vae.reload_vae_weights()), call=False)
123
+ shared.opts.onchange("temp_dir", ui_tempdir.on_tmpdir_changed)
124
+
125
+ shared.reload_hypernetworks()
126
+
127
+ ui_extra_networks.intialize()
128
+ ui_extra_networks.register_page(ui_extra_networks_textual_inversion.ExtraNetworksPageTextualInversion())
129
+ ui_extra_networks.register_page(ui_extra_networks_hypernets.ExtraNetworksPageHypernetworks())
130
+ ui_extra_networks.register_page(ui_extra_networks_checkpoints.ExtraNetworksPageCheckpoints())
131
+
132
+ extra_networks.initialize()
133
+ extra_networks.register_extra_network(extra_networks_hypernet.ExtraNetworkHypernet())
134
+
135
+ if cmd_opts.tls_keyfile is not None and cmd_opts.tls_keyfile is not None:
136
+
137
+ try:
138
+ if not os.path.exists(cmd_opts.tls_keyfile):
139
+ print("Invalid path to TLS keyfile given")
140
+ if not os.path.exists(cmd_opts.tls_certfile):
141
+ print(f"Invalid path to TLS certfile: '{cmd_opts.tls_certfile}'")
142
+ except TypeError:
143
+ cmd_opts.tls_keyfile = cmd_opts.tls_certfile = None
144
+ print("TLS setup invalid, running webui without TLS")
145
+ else:
146
+ print("Running with TLS")
147
+
148
+ # make the program just exit at ctrl+c without waiting for anything
149
+ def sigint_handler(sig, frame):
150
+ print(f'Interrupted with signal {sig} in {frame}')
151
+ os._exit(0)
152
+
153
+ signal.signal(signal.SIGINT, sigint_handler)
154
+
155
+
156
+ def setup_cors(app):
157
+ if cmd_opts.cors_allow_origins and cmd_opts.cors_allow_origins_regex:
158
+ 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=['*'])
159
+ elif cmd_opts.cors_allow_origins:
160
+ app.add_middleware(CORSMiddleware, allow_origins=cmd_opts.cors_allow_origins.split(','), allow_methods=['*'], allow_credentials=True, allow_headers=['*'])
161
+ elif cmd_opts.cors_allow_origins_regex:
162
+ app.add_middleware(CORSMiddleware, allow_origin_regex=cmd_opts.cors_allow_origins_regex, allow_methods=['*'], allow_credentials=True, allow_headers=['*'])
163
+
164
+
165
+ def create_api(app):
166
+ from modules.api.api import Api
167
+ api = Api(app, queue_lock)
168
+ return api
169
+
170
+
171
+ def wait_on_server(demo=None):
172
+ while 1:
173
+ time.sleep(0.5)
174
+ if shared.state.need_restart:
175
+ shared.state.need_restart = False
176
+ time.sleep(0.5)
177
+ demo.close()
178
+ time.sleep(0.5)
179
+ break
180
+
181
+
182
+ def api_only():
183
+ initialize()
184
+
185
+ app = FastAPI()
186
+ setup_cors(app)
187
+ app.add_middleware(GZipMiddleware, minimum_size=1000)
188
+ api = create_api(app)
189
+
190
+ modules.script_callbacks.app_started_callback(None, app)
191
+
192
+ 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)
193
+
194
+
195
+ def webui():
196
+ launch_api = cmd_opts.api
197
+ initialize()
198
+
199
+ while 1:
200
+ if shared.opts.clean_temp_dir_at_start:
201
+ ui_tempdir.cleanup_tmpdr()
202
+
203
+ modules.script_callbacks.before_ui_callback()
204
+
205
+ shared.demo = modules.ui.create_ui()
206
+
207
+ if cmd_opts.gradio_queue:
208
+ shared.demo.queue(64)
209
+
210
+ gradio_auth_creds = []
211
+ if cmd_opts.gradio_auth:
212
+ gradio_auth_creds += cmd_opts.gradio_auth.strip('"').replace('\n', '').split(',')
213
+ if cmd_opts.gradio_auth_path:
214
+ with open(cmd_opts.gradio_auth_path, 'r', encoding="utf8") as file:
215
+ for line in file.readlines():
216
+ gradio_auth_creds += [x.strip() for x in line.split(',')]
217
+
218
+ app, local_url, share_url = shared.demo.launch(
219
+ share=cmd_opts.share,
220
+ server_name=server_name,
221
+ server_port=cmd_opts.port,
222
+ ssl_keyfile=cmd_opts.tls_keyfile,
223
+ ssl_certfile=cmd_opts.tls_certfile,
224
+ debug=cmd_opts.gradio_debug,
225
+ auth=[tuple(cred.split(':')) for cred in gradio_auth_creds] if gradio_auth_creds else None,
226
+ inbrowser=cmd_opts.autolaunch,
227
+ prevent_thread_lock=True
228
+ )
229
+ # after initial launch, disable --autolaunch for subsequent restarts
230
+ cmd_opts.autolaunch = False
231
+
232
+ # gradio uses a very open CORS policy via app.user_middleware, which makes it possible for
233
+ # an attacker to trick the user into opening a malicious HTML page, which makes a request to the
234
+ # running web ui and do whatever the attacker wants, including installing an extension and
235
+ # running its code. We disable this here. Suggested by RyotaK.
236
+ app.user_middleware = [x for x in app.user_middleware if x.cls.__name__ != 'CORSMiddleware']
237
+
238
+ setup_cors(app)
239
+
240
+ app.add_middleware(GZipMiddleware, minimum_size=1000)
241
+
242
+ modules.progress.setup_progress_api(app)
243
+
244
+ if launch_api:
245
+ create_api(app)
246
+
247
+ ui_extra_networks.add_pages_to_demo(app)
248
+
249
+ modules.script_callbacks.app_started_callback(shared.demo, app)
250
+
251
+ wait_on_server(shared.demo)
252
+ print('Restarting UI...')
253
+
254
+ sd_samplers.set_samplers()
255
+
256
+ modules.script_callbacks.script_unloaded_callback()
257
+ extensions.list_extensions()
258
+
259
+ localization.list_localizations(cmd_opts.localizations_dir)
260
+
261
+ modelloader.forbid_loaded_nonbuiltin_upscalers()
262
+ modules.scripts.reload_scripts()
263
+ modules.script_callbacks.model_loaded_callback(shared.sd_model)
264
+ modelloader.load_upscalers()
265
+
266
+ for module in [module for name, module in sys.modules.items() if name.startswith("modules.ui")]:
267
+ importlib.reload(module)
268
+
269
+ modules.sd_models.list_models()
270
+
271
+ shared.reload_hypernetworks()
272
+
273
+ ui_extra_networks.intialize()
274
+ ui_extra_networks.register_page(ui_extra_networks_textual_inversion.ExtraNetworksPageTextualInversion())
275
+ ui_extra_networks.register_page(ui_extra_networks_hypernets.ExtraNetworksPageHypernetworks())
276
+ ui_extra_networks.register_page(ui_extra_networks_checkpoints.ExtraNetworksPageCheckpoints())
277
+
278
+ extra_networks.initialize()
279
+ extra_networks.register_extra_network(extra_networks_hypernet.ExtraNetworkHypernet())
280
+
281
+
282
+ if __name__ == "__main__":
283
+ if cmd_opts.nowebui:
284
+ api_only()
285
+ else:
286
+ webui()
webui.sh ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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="/home/$(whoami)"
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
+ export TORCH_COMMAND="pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/rocm5.2"
122
+ fi
123
+
124
+ for preq in "${GIT}" "${python_cmd}"
125
+ do
126
+ if ! hash "${preq}" &>/dev/null
127
+ then
128
+ printf "\n%s\n" "${delimiter}"
129
+ printf "\e[1m\e[31mERROR: %s is not installed, aborting...\e[0m" "${preq}"
130
+ printf "\n%s\n" "${delimiter}"
131
+ exit 1
132
+ fi
133
+ done
134
+
135
+ if ! "${python_cmd}" -c "import venv" &>/dev/null
136
+ then
137
+ printf "\n%s\n" "${delimiter}"
138
+ printf "\e[1m\e[31mERROR: python3-venv is not installed, aborting...\e[0m"
139
+ printf "\n%s\n" "${delimiter}"
140
+ exit 1
141
+ fi
142
+
143
+ cd "${install_dir}"/ || { printf "\e[1m\e[31mERROR: Can't cd to %s/, aborting...\e[0m" "${install_dir}"; exit 1; }
144
+ if [[ -d "${clone_dir}" ]]
145
+ then
146
+ cd "${clone_dir}"/ || { printf "\e[1m\e[31mERROR: Can't cd to %s/%s/, aborting...\e[0m" "${install_dir}" "${clone_dir}"; exit 1; }
147
+ else
148
+ printf "\n%s\n" "${delimiter}"
149
+ printf "Clone stable-diffusion-webui"
150
+ printf "\n%s\n" "${delimiter}"
151
+ "${GIT}" clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git "${clone_dir}"
152
+ cd "${clone_dir}"/ || { printf "\e[1m\e[31mERROR: Can't cd to %s/%s/, aborting...\e[0m" "${install_dir}" "${clone_dir}"; exit 1; }
153
+ fi
154
+
155
+ printf "\n%s\n" "${delimiter}"
156
+ printf "Create and activate python venv"
157
+ printf "\n%s\n" "${delimiter}"
158
+ 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; }
159
+ if [[ ! -d "${venv_dir}" ]]
160
+ then
161
+ "${python_cmd}" -m venv "${venv_dir}"
162
+ first_launch=1
163
+ fi
164
+ # shellcheck source=/dev/null
165
+ if [[ -f "${venv_dir}"/bin/activate ]]
166
+ then
167
+ source "${venv_dir}"/bin/activate
168
+ else
169
+ printf "\n%s\n" "${delimiter}"
170
+ printf "\e[1m\e[31mERROR: Cannot activate python venv, aborting...\e[0m"
171
+ printf "\n%s\n" "${delimiter}"
172
+ exit 1
173
+ fi
174
+
175
+ if [[ ! -z "${ACCELERATE}" ]] && [ ${ACCELERATE}="True" ] && [ -x "$(command -v accelerate)" ]
176
+ then
177
+ printf "\n%s\n" "${delimiter}"
178
+ printf "Accelerating launch.py..."
179
+ printf "\n%s\n" "${delimiter}"
180
+ exec accelerate launch --num_cpu_threads_per_process=6 "${LAUNCH_SCRIPT}" "$@"
181
+ else
182
+ printf "\n%s\n" "${delimiter}"
183
+ printf "Launching launch.py..."
184
+ printf "\n%s\n" "${delimiter}"
185
+ exec "${python_cmd}" "${LAUNCH_SCRIPT}" "$@"
186
+ fi