Refactor services folder/module structure.
**Motivation**
While working on our services I've repeatedly encountered circular imports and a general lack of clarity regarding where to put things. The structure introduced goes a long way towards resolving those issues, setting us up for a clean structure going forward.
**Services**
Services are now in their own folder with a few files:
- `services/{service_name}/__init__.py`: init as needed, mostly empty now
- `services/{service_name}/{service_name}_base.py`: the base class for the service
- `services/{service_name}/{service_name}_{impl_type}.py`: the default concrete implementation of the service - typically one of `sqlite`, `default`, or `memory`
- `services/{service_name}/{service_name}_common.py`: any common items - models, exceptions, utilities, etc
Though it's a bit verbose to have the service name both as the folder name and the prefix for files, I found it is _extremely_ confusing to have all of the base classes just be named `base.py`. So, at the cost of some verbosity when importing things, I've included the service name in the filename.
There are some minor logic changes. For example, in `InvocationProcessor`, instead of assigning the model manager service to a variable to be used later in the file, the service is used directly via the `Invoker`.
**Shared**
Things that are used across disparate services are in `services/shared/`:
- `default_graphs.py`: previously in `services/`
- `graphs.py`: previously in `services/`
- `paginatation`: generic pagination models used in a few services
- `sqlite`: the `SqliteDatabase` class, other sqlite-specific things
**Service Dependencies**
Services that depend on other services now access those services via the `Invoker` object. This object is provided to the service as a kwarg to its `start()` method.
Until now, most services did not utilize this feature, and several services required their dependencies to be initialized and passed in on init.
Additionally, _all_ services are now registered as invocation services - including the low-level services. This obviates issues with inter-dependent services we would otherwise experience as we add workflow storage.
**Database Access**
Previously, we were passing in a separate sqlite connection and corresponding lock as args to services in their init. A good amount of posturing was done in each service that uses the db.
These objects, along with the sqlite startup and cleanup logic, is now abstracted into a simple `SqliteDatabase` class. This creates the shared connection and lock objects, enables foreign keys, and provides a `clean()` method to do startup db maintenance.
This is not a service as it's only used by sqlite services.
Currently translated at 98.0% (1186 of 1210 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 98.0% (1179 of 1203 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 97.9% (1175 of 1199 strings)
Co-authored-by: Surisen <zhonghx0804@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/zh_Hans/
Translation: InvokeAI/Web UI
Currently translated at 92.0% (1104 of 1199 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 92.1% (1105 of 1199 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 83.2% (998 of 1199 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 83.0% (996 of 1199 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 67.5% (810 of 1199 strings)
Co-authored-by: Surisen <zhonghx0804@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/zh_Hans/
Translation: InvokeAI/Web UI
Currently translated at 85.5% (1026 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 84.7% (1016 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 84.7% (1016 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 84.4% (1012 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 84.3% (1011 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 83.5% (1002 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.5% (978 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 80.8% (969 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 80.7% (968 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.3% (959 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.3% (959 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.3% (959 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.3% (959 of 1179 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (607 of 607 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (605 of 605 strings)
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/es/
Translation: InvokeAI/Web UI
Currently translated at 65.5% (643 of 981 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (605 of 605 strings)
Co-authored-by: System X - Files <vasyasos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ru/
Translation: InvokeAI/Web UI
Currently translated at 81.2% (958 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.2% (958 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 76.6% (904 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 76.5% (903 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 71.9% (848 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 71.7% (845 of 1177 strings)
translationBot(ui): update translation (Italian)
Currently translated at 71.7% (845 of 1177 strings)
translationBot(ui): update translation (Italian)
Currently translated at 67.8% (799 of 1177 strings)
translationBot(ui): update translation (Italian)
Currently translated at 58.5% (689 of 1177 strings)
translationBot(ui): update translation (Italian)
Currently translated at 59.8% (640 of 1069 strings)
translationBot(ui): update translation (Italian)
Currently translated at 57.2% (612 of 1069 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (607 of 607 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (605 of 605 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (605 of 605 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (602 of 602 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 97.8% (589 of 602 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (603 of 603 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (599 of 599 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (596 of 596 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (595 of 595 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (595 of 595 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (593 of 593 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (592 of 592 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 99.6% (601 of 603 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 99.5% (600 of 603 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (599 of 599 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (596 of 596 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 99.8% (594 of 595 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (593 of 593 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (592 of 592 strings)
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/es/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (563 of 563 strings)
translationBot(ui): update translation (Dutch)
Currently translated at 100.0% (563 of 563 strings)
Co-authored-by: Dennis <dennis@vanzoerlandt.nl>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/nl/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (591 of 591 strings)
translationBot(ui): update translation (Italian)
Currently translated at 99.3% (587 of 591 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (586 of 586 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (578 of 578 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (563 of 563 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (559 of 559 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (559 of 559 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (551 of 551 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 99.5% (602 of 605 strings)
translationBot(ui): update translation (Russian)
Currently translated at 99.8% (605 of 606 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (596 of 596 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (595 of 595 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (593 of 593 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (592 of 592 strings)
translationBot(ui): update translation (Russian)
Currently translated at 90.2% (534 of 592 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (543 of 543 strings)
Co-authored-by: System X - Files <vasyasos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ru/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (550 of 550 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (548 of 548 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (546 of 546 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (541 of 541 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (544 of 544 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (543 of 543 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 88.0% (477 of 542 strings)
Co-authored-by: Song, Pengcheng <17528592@qq.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/zh_Hans/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Russian)
Currently translated at 98.8% (536 of 542 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (533 of 533 strings)
Co-authored-by: System X - Files <vasyasos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ru/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (540 of 540 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (538 of 538 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Italian)
Currently translated at 99.8% (535 of 536 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (533 of 533 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (533 of 533 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (591 of 591 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (586 of 586 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (578 of 578 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (563 of 563 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (550 of 550 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (550 of 550 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (548 of 548 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (546 of 546 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (544 of 544 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (543 of 543 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (540 of 540 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (533 of 533 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 99.8% (532 of 533 strings)
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/es/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (526 of 526 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (519 of 519 strings)
Co-authored-by: System X - Files <vasyasos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ru/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (526 of 526 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (523 of 523 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (519 of 519 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (515 of 515 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (526 of 526 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (523 of 523 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (519 of 519 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (515 of 515 strings)
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/es/
Translation: InvokeAI/Web UI
Currently translated at 98.0% (1186 of 1210 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 98.0% (1179 of 1203 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 97.9% (1175 of 1199 strings)
Co-authored-by: Surisen <zhonghx0804@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/zh_Hans/
Translation: InvokeAI/Web UI
Currently translated at 92.0% (1104 of 1199 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 92.1% (1105 of 1199 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 83.2% (998 of 1199 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 83.0% (996 of 1199 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 67.5% (810 of 1199 strings)
Co-authored-by: Surisen <zhonghx0804@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/zh_Hans/
Translation: InvokeAI/Web UI
Currently translated at 87.1% (1054 of 1210 strings)
translationBot(ui): update translation (Italian)
Currently translated at 85.5% (1026 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 84.7% (1016 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 84.7% (1016 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 84.4% (1012 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 84.3% (1011 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 83.5% (1002 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.5% (978 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 80.8% (969 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 80.7% (968 of 1199 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.3% (959 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.3% (959 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.3% (959 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.3% (959 of 1179 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (607 of 607 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (605 of 605 strings)
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/es/
Translation: InvokeAI/Web UI
Currently translated at 65.5% (643 of 981 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (605 of 605 strings)
Co-authored-by: System X - Files <vasyasos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ru/
Translation: InvokeAI/Web UI
Currently translated at 81.2% (958 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 81.2% (958 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 76.6% (904 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 76.5% (903 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 71.9% (848 of 1179 strings)
translationBot(ui): update translation (Italian)
Currently translated at 71.7% (845 of 1177 strings)
translationBot(ui): update translation (Italian)
Currently translated at 71.7% (845 of 1177 strings)
translationBot(ui): update translation (Italian)
Currently translated at 67.8% (799 of 1177 strings)
translationBot(ui): update translation (Italian)
Currently translated at 58.5% (689 of 1177 strings)
translationBot(ui): update translation (Italian)
Currently translated at 59.8% (640 of 1069 strings)
translationBot(ui): update translation (Italian)
Currently translated at 57.2% (612 of 1069 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (607 of 607 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (605 of 605 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (605 of 605 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (602 of 602 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 97.8% (589 of 602 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (603 of 603 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (599 of 599 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (596 of 596 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (595 of 595 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (595 of 595 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (593 of 593 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (592 of 592 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 99.6% (601 of 603 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 99.5% (600 of 603 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (599 of 599 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (596 of 596 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 99.8% (594 of 595 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (593 of 593 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (592 of 592 strings)
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/es/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (563 of 563 strings)
translationBot(ui): update translation (Dutch)
Currently translated at 100.0% (563 of 563 strings)
Co-authored-by: Dennis <dennis@vanzoerlandt.nl>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/nl/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (591 of 591 strings)
translationBot(ui): update translation (Italian)
Currently translated at 99.3% (587 of 591 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (586 of 586 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (578 of 578 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (563 of 563 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (559 of 559 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (559 of 559 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (551 of 551 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 99.5% (602 of 605 strings)
translationBot(ui): update translation (Russian)
Currently translated at 99.8% (605 of 606 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (596 of 596 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (595 of 595 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (593 of 593 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (592 of 592 strings)
translationBot(ui): update translation (Russian)
Currently translated at 90.2% (534 of 592 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (543 of 543 strings)
Co-authored-by: System X - Files <vasyasos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ru/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (550 of 550 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (548 of 548 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (546 of 546 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (541 of 541 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (544 of 544 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (543 of 543 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Chinese (Simplified))
Currently translated at 88.0% (477 of 542 strings)
Co-authored-by: Song, Pengcheng <17528592@qq.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/zh_Hans/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Russian)
Currently translated at 98.8% (536 of 542 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (533 of 533 strings)
Co-authored-by: System X - Files <vasyasos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ru/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (540 of 540 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (538 of 538 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Italian)
Currently translated at 99.8% (535 of 536 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (533 of 533 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (533 of 533 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (591 of 591 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (586 of 586 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (578 of 578 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (563 of 563 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (550 of 550 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (550 of 550 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (548 of 548 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (546 of 546 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (544 of 544 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (543 of 543 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (542 of 542 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (540 of 540 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (536 of 536 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (533 of 533 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 99.8% (532 of 533 strings)
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/es/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (526 of 526 strings)
translationBot(ui): update translation (Russian)
Currently translated at 100.0% (519 of 519 strings)
Co-authored-by: System X - Files <vasyasos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ru/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (526 of 526 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (523 of 523 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (519 of 519 strings)
translationBot(ui): update translation (Italian)
Currently translated at 100.0% (515 of 515 strings)
Co-authored-by: Riccardo Giovanetti <riccardo.giovanetti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/
Translation: InvokeAI/Web UI
Currently translated at 100.0% (526 of 526 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (523 of 523 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (519 of 519 strings)
translationBot(ui): update translation (Spanish)
Currently translated at 100.0% (515 of 515 strings)
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/es/
Translation: InvokeAI/Web UI
* UI for bulk downloading boards or groups of images
* placeholder route for bulk downloads that does nothing
* lint
---------
Co-authored-by: Mary Hipp <maryhipp@Marys-MacBook-Air.local>
Add support for FreeU. See:
- https://huggingface.co/docs/diffusers/main/en/using-diffusers/freeu
- https://github.com/ChenyangSi/FreeU
Implementation:
- `ModelPatcher.apply_freeu()` handles the enabling freeu (which is very simple with diffusers).
- `FreeUConfig` model added to hold the hyperparameters.
- `freeu_config` added as optional sub-field on `UNetField`.
- `FreeUInvocation` added, works like LoRA - chain it to add the FreeU config to the UNet
- No support for model-dependent presets, this will be a future workflow editor enhancement
Closes#4845
The canvas needs to be set to staging mode as soon as a canvas-destined batch is enqueued. If the batch is is fully canceled before an image is generated, we need to remove that batch from the canvas `batchIds` watchlist, else canvas gets stuck in staging mode with no way to exit.
The changes here allow the batch status to be tracked, and if a batch has all its items completed, we can remove it from the `batchIds` watchlist. The `batchIds` watchlist now accurately represents *incomplete* canvas batches, fixing this cause of soft lock.
The UI will always re-fetch queue and batch status on receiving this event, so we may as well jsut include that data in the event and save the extra network roundtrips.
- Update backend metadata for t2i adapter
- Fix typo in `T2IAdapterInvocation`: `ip_adapter_model` -> `t2i_adapter_model`
- Update linear graphs to use t2i adapter
- Add client metadata recall for t2i adapter
- Fix bug with controlnet metadata recall - processor should be set to 'none' when recalling a control adapter
Control adapters logic/state/ui is now generalized to hold controlnet, ip_adapter and t2i_adapter. In the future, other control adapter types can be added.
TODO:
- Limit IP adapter to 1
- Add T2I adapter to linear graphs
- Fix autoprocess
- T2I metadata saving & recall
- Improve on control adapters UI
* Bump diffusers to 0.21.2.
* Add T2IAdapterInvocation boilerplate.
* Add T2I-Adapter model to model-management.
* (minor) Tidy prepare_control_image(...).
* Add logic to run the T2I-Adapter models at the start of the DenoiseLatentsInvocation.
* Add logic for applying T2I-Adapter weights and accumulating.
* Add T2IAdapter to MODEL_CLASSES map.
* yarn typegen
* Add model probes for T2I-Adapter models.
* Add all of the frontend boilerplate required to use T2I-Adapter in the nodes editor.
* Add T2IAdapterModel.convert_if_required(...).
* Fix errors in T2I-Adapter input image sizing logic.
* Fix bug with handling of multiple T2I-Adapters.
* black / flake8
* Fix typo
* yarn build
* Add num_channels param to prepare_control_image(...).
* Link to upstream diffusers bugfix PR that currently requires a workaround.
* feat: Add Color Map Preprocessor
Needed for the color T2I Adapter
* feat: Add Color Map Preprocessor to Linear UI
* Revert "feat: Add Color Map Preprocessor"
This reverts commit a1119a00bf.
* Revert "feat: Add Color Map Preprocessor to Linear UI"
This reverts commit bd8a9b82d8.
* Fix T2I-Adapter field rendering in workflow editor.
* yarn build, yarn typegen
---------
Co-authored-by: blessedcoolant <54517381+blessedcoolant@users.noreply.github.com>
Co-authored-by: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
When the processor has an error and it has a queue item, mark that item failed.
This addresses processor errors resulting in `in_progress` queue items, which create a soft lock of the processor, requiring the user to cancel the `in_progress` item before anything else processes.
Makes graph validation logic more rigorous, validating graphs when they are created as part of a session or batch.
`validate_self()` method added to `Graph` model. It does all the validation that `is_valid()` did, plus a few extras:
- unique `node.id` values across graph
- node ids match their key in `Graph.nodes`
- recursively validate subgraphs
- validate all edges
- validate graph is acyclical
The new method is required because `is_valid()` just returned a boolean. That behaviour is retained, but `validate_self()` now raises appropriate exceptions for validation errors. This are then surfaced to the client.
The function is named `validate_self()` because pydantic reserves `validate()`.
There are two main places where graphs are created - in batches and in sessions.
Field validators are added to each of these for their `graph` fields, which call the new validation logic.
**Closes #4744**
In this issue, a batch is enqueued with an invalid graph. The output field is typed as optional while the input field is required. The field types themselves are not relevant - this change addresses the case where an invalid graph was created.
The mismatched types problem is not noticed until we attempt to invoke the graph, because the graph was never *fully* validated. An error is raised during the call to `graph_execution_state.next()` in `invoker.py`. This function prepares the edges and validates them, raising an exception due to the mismatched types.
This exception is caught by the session processor, but it doesn't handle this situation well - the graph is not marked as having an error and the queue item status is never changed. The queue item is therefore forever `in_progress`, so no new queue items are popped - the app won't do anything until the queue item is canceled manually.
This commit addresses this by preventing invalid graphs from being created in the first place, addressing a substantial number of fail cases.
The compress_level setting of PIL.Image.save(), used for PNG encoding. All settings are lossless. 0 = fastest, largest filesize, 9 = slowest, smallest filesize
Closes#4786
This is fired when the dnd image is moved over the 'none' board. Weren't defaulting to 'none' for the image's board_id, resulting in it being possible to drag a 'none' image onto 'none'.
Selections were not being `uniqBy()`'d, or were `uniqBy()`'d without a proper iteratee. This results in duplicate images in selections in certain situations.
Add correct `uniqBy()` to the reducer to prevent this in the future.
This caused a crapload of network requests any time an image was generated.
The counts are necessary to handle the logic for inserting images into existing image list caches; we have to keep track of the counts.
Replace tag invalidation with manual cache updates in all cases, except the initial request (which is necessary to get the initial image counts).
One subtle change is to make the counts an object instead of a number. This is required for `immer` to handle draft states. This should be raised as a bug with RTK Query, as no error is thrown when attempting to update a primitive immer draft.
The helper function `generate_face_box_mask()` had a bug that prevented larger faces from being detected in some situations. This is resolved, and its dependent nodes (all the FaceTools nodes) have a patch version bump.
* feat(ui): max upscale pixels config
Add `maxUpscalePixels: number` to the app config. The number should be the *total* number of pixels eg `maxUpscalePixels: 4096 * 4096`.
If not provided, any size image may be upscaled.
If the config is provided, users will see be advised if their image is too large for either model, or told to switch to an x2 model if it's only too large for x4.
The message is via tooltip in the popover and via toast if the user uses the hotkey to upscale.
* feat(ui): "mayUpscale" -> "isAllowedToUpscale"
* Initial commit of edge drag feature.
* Fixed build warnings
* code cleanup and drag to existing node
* improved isValidConnection check
* fixed build issues, removed cyclic dependency
* edge created nodes now spawn at cursor
* Add Node popover will no longer show when using drag to delete an edge.
* Fixed collection handling, added priority for handles matching name of source handle, removed current image/notes nodes from filtered list
* Fixed not properly clearing startParams when closing the Add Node popover
* fix(ui): do not allow Collect -> Iterate connection
This can be removed when #3956 is resolved
* feat(ui): use existing node validation logic in add-node-on-drop
This logic handles a number of special cases
---------
Co-authored-by: Millun Atluri <Millu@users.noreply.github.com>
Co-authored-by: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
* node-FaceTools
* Added more documentation for facetools
* invert FaceMask masking
- FaceMask had face protected and surroundings change by default (face white, else black)
- Change to how FaceOff/others work: the opposite where surroundings protected, face changes by default (face black, else white)
* reflect changed facemask behaviour in docs
* add FaceOff+FaceMask workflows
- Add FaceOff and FaceMask example workflows to docs/workflows
* add FaceMask+FaceOff workflows to exampleworkflows.md
- used invokeai URL paths mimicking other workflow URLs, hopefully they translate when/if merged
* inheriting, typehints, black/isort/flake8
- modified FaceMask and FaceOff output classes to inherit base image, height, width from ImageOutput
- Added type annotations to helper functions, required some reworking of code's stored data
* remove credit header
- Was in my personal/repo copy, don't think it's necessary if merged.
* Optionals & image declaration duplication
- Added Optional[] to optional outputs and types
- removed duplication of image = context.services.images.get_pil_images(self.image.image_name) declaration
- Still need to find a way to deal with mask_pil None typing errors
* face(facetools): fix typing issues, add validation, clean up structure
* feat(facetools): update field descriptions
* Update FaceOff_FaceScale2x.json
- update FaceOff workflow after Bounded Image field removed in place of inheriting Image out field from ImageOutput
* feat(facetools): pass through original image on facemask if invalid face ids requested
* feat(facetools): tidy variable names & fn calls
* feat(facetools): bundle inter font, draw ids with it
Inter is a SIL Open Font license. The license is included and is fully permissive. Inter is the same font the UI and commercial application already uses.
Only the "regular" version is bundled.
* chore(facetools): isort & fix mypy issues
* docs(facetools): update and format docs
---------
Co-authored-by: Millun Atluri <millun.atluri@gmail.com>
Co-authored-by: Millun Atluri <Millu@users.noreply.github.com>
Co-authored-by: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
* add control net to useRecallParams
* got recall controlnets working
* fix metadata viewer controlnet
* fix type errors
* fix controlnet metadata viewer
* add ip adapter to metadata
* added ip adapter to recall parameters
* got ip adapter recall working, still need to fix type errors
* fix type issues
* clean up logs
* python formatting
* cleanup
* fix(ui): only store `image_name` as ip adapter image
* fix(ui): use nullish coalescing operator for numbers
Need to use the nullish coalescing operator `??` instead of false-y coalescing operator `||` when the value being check is a number. This prevents unintended coalescing when the value is zero and therefore false-y.
* feat(ui): fall back on default values for ip adapter metadata
* fix(ui): remove unused schema
* feat(ui): re-use existing schemas in metadata schema
* fix(ui): do not disable invocationCache
---------
Co-authored-by: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
This hook was rerendering any time anything changed. Moved it to a logical component, put its useEffects inside the component. This reduces the effect of the rerenders to just that tiny always-null component.
* add control net to useRecallParams
* got recall controlnets working
* fix metadata viewer controlnet
* fix type errors
* fix controlnet metadata viewer
* set control image and use correct processor type and node
* clean up logs
* recall processor using substring
* feat(ui): enable controlNet when recalling one
---------
Co-authored-by: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
- Current image number & total are displayed
- Left/right wrap around instead of stopping on first/last image
- Disable the left/right/number buttons when showing base layer
- improved translations
- Drag the end of an edge away from its handle to disconnect it
- Drop in empty space to delete the edge
- Drop on valid handle to reconnect it
- Update connection logic slightly to allow edge updates
* feat(ui): add error handling for enqueueBatch route, remove sessions
This re-implements the handling for the session create/invoke errors, but for batches.
Also remove all references to the old sessions routes in the UI.
* feat(ui): improve canvas image error UI
* make canvas error state gray instead of red
---------
Co-authored-by: Mary Hipp <maryhipp@Marys-MacBook-Air.local>
* Add 'Random Float' node <3
does what it says on the tin :)
* Add random float + random seeded float nodes
altered my random float node as requested by Millu, kept the seeded version as an alternate variant for those that would like to control the randomization seed :)
* Update math.py
* Update math.py
* feat(nodes): standardize fields to match other nodes
---------
Co-authored-by: Millun Atluri <Millu@users.noreply.github.com>
Co-authored-by: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
* fix(nodes): do not disable invocation cache delete methods
When the runtime disabled flag is on, do not skip the delete methods. This could lead to a hit on a missing resource.
Do skip them when the cache size is 0, because the user cannot change this (must restart app to change it).
* fix(nodes): do not use double-underscores in cache service
* Thread lock for cache
* Making cache LRU
* Bug fixes
* bugfix
* Switching to one Lock and OrderedDict cache
* Removing unused imports
* Move lock cache instance
* Addressing PR comments
---------
Co-authored-by: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
Co-authored-by: Martin Kristiansen <martin@modyfi.io>
* add skeleton loading state for queue lit
* hide use cache checkbox if cache is disabled
* undo accidental add
* feat(ui): hide node footer entirely if nothing to show there
---------
Co-authored-by: Mary Hipp <maryhipp@Marys-MacBook-Air.local>
Co-authored-by: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
Skeletons are for when we know the number of specific content items that are loading. When the queue is loading, we don't know how many items there are, or how many will load, so the whole list should be replaced with loading state.
The previous behaviour rendered a static number of skeletons. That number would rarely be the right number - the app shouldn't say "I'm loading 7 queue items", then load none, or load 50.
A future enhancement could use the queue item skeleton component and go by the total number of queue items, as reported by the queue status. I tried this but had some layout jankiness, not worth the effort right now.
The queue item skeleton component's styling was updated to support this future enhancement, making it exactly the same size as a queue item (it was a bit smaller before).