Compare commits

...

15 Commits

Author SHA1 Message Date
b3abc7252d recover gracefully from VRAM out of memory errors 2024-02-24 12:10:52 -05:00
9986fce1a6 translationBot(ui): update translation (German)
Currently translated at 80.0% (1176 of 1470 strings)

Co-authored-by: Alexander Eichhorn <pfannkuchensack@einfach-doof.de>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/de/
Translation: InvokeAI/Web UI
2024-02-23 07:57:15 +11:00
228f1d7f62 translationBot(ui): update translation (Italian)
Currently translated at 95.6% (1406 of 1470 strings)

translationBot(ui): update translation (Italian)

Currently translated at 93.9% (1381 of 1470 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
2024-02-23 07:57:15 +11:00
B N
01a6378dc1 translationBot(ui): update translation (German)
Currently translated at 78.8% (1159 of 1470 strings)

Co-authored-by: B N <berndnieschalk@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/de/
Translation: InvokeAI/Web UI
2024-02-23 07:57:15 +11:00
e01769294f translationBot(ui): update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/
Translation: InvokeAI/Web UI
2024-02-20 22:33:03 +11:00
16aa261e28 updated tooltip popovers (#5751)
## What type of PR is this? (check all applicable)

- [ ] Refactor
- [ ] Feature
- [ ] Bug Fix
- [X] Optimization
- [ ] Documentation Update
- [ ] Community Node Submission


## Have you discussed this change with the InvokeAI team?
- [X] Yes
- [ ] No, because:

      
## Have you updated all relevant documentation?
- [ ] Yes
- [ ] No


## Description
Added new tooltip popovers and updated copy of existing ones

## Related Tickets & Documents

<!--
For pull requests that relate or close an issue, please include them
below. 

For example having the text: "closes #1234" would connect the current
pull
request to issue 1234.  And when we merge the pull request, Github will
automatically close the issue.
-->

- Related Issue #
- Closes #

## QA Instructions, Screenshots, Recordings

<!-- 
Please provide steps on how to test changes, any hardware or 
software specifications as well as any other pertinent information. 
-->

## Merge Plan

<!--
A merge plan describes how this PR should be handled after it is
approved.

Example merge plans:
- "This PR can be merged when approved"
- "This must be squash-merged when approved"
- "DO NOT MERGE - I will rebase and tidy commits before merging"
- "#dev-chat on discord needs to be advised of this change when it is
merged"

A merge plan is particularly important for large PRs or PRs that touch
the
database in any way.
-->

## Added/updated tests?

- [ ] Yes
- [ ] No : _please replace this line with details on why tests
      have not been included_

## [optional] Are there any post deployment tasks we need to perform?
2024-02-19 13:12:47 -05:00
1dabf18d14 Merge branch 'main' into chainchompa/tooltip-popovers 2024-02-19 13:04:15 -05:00
115d92b1ae updated copy 2024-02-19 12:50:35 -05:00
f0d4c71960 updated tooltip popovers 2024-02-19 12:50:11 -05:00
3e48edda6f add latent-upscale to communityNodes.md (#5728)
Adds the 'latent upscale' community node
2024-02-19 16:53:35 +00:00
716b584f03 translationBot(ui): update translation (Italian)
Currently translated at 97.1% (1384 of 1424 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
2024-02-19 08:18:33 +11:00
B N
d43b843c23 translationBot(ui): update translation (German)
Currently translated at 80.2% (1143 of 1424 strings)

Co-authored-by: B N <berndnieschalk@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/de/
Translation: InvokeAI/Web UI
2024-02-18 01:47:01 +11:00
f36b5990ed fix(ui): do not provide auth headers for openapi.json 2024-02-15 10:38:26 -05:00
5706237ec7 {release} 3.7.0 (#5727)
## What type of PR is this? (check all applicable)

Release - Invoke 3.7.0

## Have you discussed this change with the InvokeAI team?
- [X] Yes
- [ ] No, because:

      
## Have you updated all relevant documentation?
- [X] Yes
- [ ] No


## Description
Invoke 3.7.0 Release

## QA Instructions, Screenshots, Recordings
Test Installer: 

[InvokeAI-installer-v3.7.0.zip](https://github.com/invoke-ai/InvokeAI/files/14298200/InvokeAI-installer-v3.7.0.zip)

<!-- 
Please provide steps on how to test changes, any hardware or 
software specifications as well as any other pertinent information. 
-->

## Merge Plan
Merge once approved
<!--
A merge plan describes how this PR should be handled after it is
approved.

Example merge plans:
- "This PR can be merged when approved"
- "This must be squash-merged when approved"
- "DO NOT MERGE - I will rebase and tidy commits before merging"
- "#dev-chat on discord needs to be advised of this change when it is
merged"

A merge plan is particularly important for large PRs or PRs that touch
the
database in any way.
-->

## Added/updated tests?

- [ ] Yes
- [X] No : _please replace this line with details on why tests
      have not been included_

## [optional] Are there any post deployment tasks we need to perform?
1. Release on PyPi
2. Release on GitHub
3. Announce on Discord
2024-02-15 07:59:20 -07:00
163b22a7b3 {release} 3.7.0 2024-02-15 07:34:31 -07:00
33 changed files with 608 additions and 190 deletions

View File

@ -32,6 +32,7 @@ To use a community workflow, download the the `.json` node graph file and load i
+ [Image to Character Art Image Nodes](#image-to-character-art-image-nodes) + [Image to Character Art Image Nodes](#image-to-character-art-image-nodes)
+ [Image Picker](#image-picker) + [Image Picker](#image-picker)
+ [Image Resize Plus](#image-resize-plus) + [Image Resize Plus](#image-resize-plus)
+ [Latent Upscale](#latent-upscale)
+ [Load Video Frame](#load-video-frame) + [Load Video Frame](#load-video-frame)
+ [Make 3D](#make-3d) + [Make 3D](#make-3d)
+ [Mask Operations](#mask-operations) + [Mask Operations](#mask-operations)
@ -290,6 +291,13 @@ View:
</br><img src="https://raw.githubusercontent.com/VeyDlin/image-resize-plus-node/master/.readme/node.png" width="500" /> </br><img src="https://raw.githubusercontent.com/VeyDlin/image-resize-plus-node/master/.readme/node.png" width="500" />
--------------------------------
### Latent Upscale
**Description:** This node uses a small (~2.4mb) model to upscale the latents used in a Stable Diffusion 1.5 or Stable Diffusion XL image generation, rather than the typical interpolation method, avoiding the traditional downsides of the latent upscale technique.
**Node Link:** [https://github.com/gogurtenjoyer/latent-upscale](https://github.com/gogurtenjoyer/latent-upscale)
-------------------------------- --------------------------------
### Load Video Frame ### Load Video Frame

View File

@ -287,6 +287,14 @@ class ModelCache(object):
if torch.device(source_device).type == torch.device(target_device).type: if torch.device(source_device).type == torch.device(target_device).type:
return return
if target_device.type == "cuda":
vram_device = (
target_device if target_device.index is not None else torch.device(str(target_device), index=0)
)
free_mem, _ = torch.cuda.mem_get_info(torch.device(vram_device))
if cache_entry.size > free_mem:
raise torch.cuda.OutOfMemoryError
start_model_to_time = time.time() start_model_to_time = time.time()
snapshot_before = self._capture_memory_snapshot() snapshot_before = self._capture_memory_snapshot()
cache_entry.model.to(target_device) cache_entry.model.to(target_device)
@ -356,6 +364,10 @@ class ModelCache(object):
self.cache.logger.debug(f"Locking {self.key} in {self.cache.execution_device}") self.cache.logger.debug(f"Locking {self.key} in {self.cache.execution_device}")
self.cache._print_cuda_stats() self.cache._print_cuda_stats()
except torch.cuda.OutOfMemoryError:
self.cache.logger.warning("Out of GPU memory encountered.")
self.cache_entry.unlock()
raise
except Exception: except Exception:
self.cache_entry.unlock() self.cache_entry.unlock()
raise raise
@ -524,7 +536,6 @@ class ModelCache(object):
break break
if not cache_entry.locked and cache_entry.loaded: if not cache_entry.locked and cache_entry.loaded:
self._move_model_to_device(model_key, self.storage_device) self._move_model_to_device(model_key, self.storage_device)
vram_in_use = torch.cuda.memory_allocated() vram_in_use = torch.cuda.memory_allocated()
self.logger.debug(f"{(vram_in_use/GIG):.2f}GB VRAM used for models; max allowed={(reserved/GIG):.2f}GB") self.logger.debug(f"{(vram_in_use/GIG):.2f}GB VRAM used for models; max allowed={(reserved/GIG):.2f}GB")

View File

@ -81,7 +81,7 @@
"outputs": "Ausgabe", "outputs": "Ausgabe",
"data": "Daten", "data": "Daten",
"safetensors": "Safe-Tensors", "safetensors": "Safe-Tensors",
"outpaint": "Ausmalen", "outpaint": "Outpaint (Außen ausmalen)",
"details": "Details", "details": "Details",
"format": "Format", "format": "Format",
"unknown": "Unbekannt", "unknown": "Unbekannt",
@ -110,17 +110,18 @@
"nextPage": "Nächste Seite", "nextPage": "Nächste Seite",
"unknownError": "Unbekannter Fehler", "unknownError": "Unbekannter Fehler",
"unsaved": "Nicht gespeichert", "unsaved": "Nicht gespeichert",
"aboutDesc": "Verwenden Sie Invoke für die Arbeit? Dann siehe hier:", "aboutDesc": "Verwenden Sie Invoke für die Arbeit? Siehe hier:",
"localSystem": "Lokales System", "localSystem": "Lokales System",
"orderBy": "Ordnen nach", "orderBy": "Ordnen nach",
"saveAs": "Speicher als", "saveAs": "Speichern als",
"updated": "Aktualisiert", "updated": "Aktualisiert",
"copy": "Kopieren", "copy": "Kopieren",
"aboutHeading": "Nutzen Sie Ihre kreative Energie" "aboutHeading": "Nutzen Sie Ihre kreative Energie",
"toResolve": "Lösen"
}, },
"gallery": { "gallery": {
"generations": "Erzeugungen", "generations": "Erzeugungen",
"showGenerations": "Zeige Erzeugnisse", "showGenerations": "Zeige Ergebnisse",
"uploads": "Uploads", "uploads": "Uploads",
"showUploads": "Zeige Uploads", "showUploads": "Zeige Uploads",
"galleryImageSize": "Bildgröße", "galleryImageSize": "Bildgröße",
@ -150,9 +151,9 @@
"problemDeletingImagesDesc": "Ein oder mehrere Bilder konnten nicht gelöscht werden", "problemDeletingImagesDesc": "Ein oder mehrere Bilder konnten nicht gelöscht werden",
"starImage": "Bild markieren", "starImage": "Bild markieren",
"assets": "Ressourcen", "assets": "Ressourcen",
"unstarImage": "Markierung Entfernen", "unstarImage": "Markierung entfernen",
"image": "Bild", "image": "Bild",
"deleteSelection": "Lösche markierte", "deleteSelection": "Lösche Auswahl",
"dropToUpload": "$t(gallery.drop) zum hochladen", "dropToUpload": "$t(gallery.drop) zum hochladen",
"dropOrUpload": "$t(gallery.drop) oder hochladen", "dropOrUpload": "$t(gallery.drop) oder hochladen",
"drop": "Ablegen", "drop": "Ablegen",
@ -590,10 +591,18 @@
"general": "Allgemein", "general": "Allgemein",
"hiresStrength": "High Res Stärke", "hiresStrength": "High Res Stärke",
"hidePreview": "Verstecke Vorschau", "hidePreview": "Verstecke Vorschau",
"showPreview": "Zeige Vorschau" "showPreview": "Zeige Vorschau",
"aspect": "Seitenverhältnis",
"aspectRatio": "Seitenverhältnis",
"scheduler": "Planer",
"aspectRatioFree": "Frei",
"setToOptimalSizeTooLarge": "$t(parameters.setToOptimalSize) (kann zu groß sein)",
"lockAspectRatio": "Seitenverhältnis sperren",
"swapDimensions": "Seitenverhältnis umkehren",
"setToOptimalSize": "Optimiere Größe für Modell"
}, },
"settings": { "settings": {
"displayInProgress": "Bilder in Bearbeitung anzeigen", "displayInProgress": "Zwischenbilder anzeigen",
"saveSteps": "Speichern der Bilder alle n Schritte", "saveSteps": "Speichern der Bilder alle n Schritte",
"confirmOnDelete": "Bestätigen beim Löschen", "confirmOnDelete": "Bestätigen beim Löschen",
"displayHelpIcons": "Hilfesymbole anzeigen", "displayHelpIcons": "Hilfesymbole anzeigen",
@ -606,7 +615,34 @@
"useSlidersForAll": "Schieberegler für alle Optionen verwenden", "useSlidersForAll": "Schieberegler für alle Optionen verwenden",
"showAdvancedOptions": "Erweiterte Optionen anzeigen", "showAdvancedOptions": "Erweiterte Optionen anzeigen",
"alternateCanvasLayout": "Alternatives Leinwand-Layout", "alternateCanvasLayout": "Alternatives Leinwand-Layout",
"clearIntermediatesDesc1": "Das Löschen der Zwischenprodukte setzt Leinwand und ControlNet zurück." "clearIntermediatesDesc1": "Das Löschen der Zwischenbilder setzt Leinwand und ControlNet zurück.",
"favoriteSchedulers": "Lieblings-Planer",
"favoriteSchedulersPlaceholder": "Keine Planer favorisiert",
"generation": "Erzeugung",
"enableInformationalPopovers": "Info-Popouts anzeigen",
"shouldLogToConsole": "Konsole loggen",
"showProgressInViewer": "Zwischenbilder im Viewer anzeigen",
"clearIntermediatesDesc3": "Ihre Bilder werden nicht gelöscht.",
"clearIntermediatesWithCount_one": "Lösche {{count}} Zwischenbilder",
"clearIntermediatesWithCount_other": "Lösche {{count}} Zwischenbilder",
"reloadingIn": "Neuladen in",
"enableNodesEditor": "Nodes Editor aktivieren",
"autoChangeDimensions": "Breite/Höhe auf Modellstandard setzen",
"experimental": "Experimentell",
"intermediatesCleared_one": "{{count}} Zwischenbilder gelöscht",
"intermediatesCleared_other": "{{count}} Zwischenbilder gelöscht",
"enableInvisibleWatermark": "Unsichtbares Wasserzeichen aktivieren",
"general": "Allgemein",
"consoleLogLevel": "Protokollierungsstufe",
"clearIntermediatesDisabled": "Warteschlange muss leer sein, um Zwischenbilder zu löschen",
"developer": "Entwickler",
"antialiasProgressImages": "Zwischenbilder mit Anti-Alias",
"beta": "Beta",
"ui": "Benutzeroberfläche",
"clearIntermediatesDesc2": "Zwischenbilder sind Nebenprodukte der Erstellung. Sie zu löschen macht Festplattenspeicher frei.",
"clearIntermediates": "Zwischenbilder löschen",
"intermediatesClearedFailed": "Problem beim Löschen der Zwischenbilder",
"enableNSFWChecker": "Auf unangemessene Inhalte prüfen"
}, },
"toast": { "toast": {
"tempFoldersEmptied": "Temp-Ordner geleert", "tempFoldersEmptied": "Temp-Ordner geleert",
@ -651,7 +687,9 @@
"problemCopyingCanvas": "Problem beim Kopieren der Leinwand", "problemCopyingCanvas": "Problem beim Kopieren der Leinwand",
"problemCopyingCanvasDesc": "Kann Basis-Layer nicht exportieren", "problemCopyingCanvasDesc": "Kann Basis-Layer nicht exportieren",
"problemDownloadingCanvas": "Problem beim Herunterladen der Leinwand", "problemDownloadingCanvas": "Problem beim Herunterladen der Leinwand",
"setAsCanvasInitialImage": "Als Ausgangsbild gesetzt" "setAsCanvasInitialImage": "Als Ausgangsbild gesetzt",
"addedToBoard": "Dem Board hinzugefügt",
"loadedWithWarnings": "Workflow mit Warnungen geladen"
}, },
"tooltip": { "tooltip": {
"feature": { "feature": {
@ -733,23 +771,23 @@
"accessibility": { "accessibility": {
"modelSelect": "Modell-Auswahl", "modelSelect": "Modell-Auswahl",
"uploadImage": "Bild hochladen", "uploadImage": "Bild hochladen",
"previousImage": "Voriges Bild", "previousImage": "Vorheriges Bild",
"useThisParameter": "Benutze diesen Parameter", "useThisParameter": "Benutze diesen Parameter",
"copyMetadataJson": "Kopiere Metadaten JSON", "copyMetadataJson": "Kopiere JSON-Metadaten",
"zoomIn": "Vergrößern", "zoomIn": "Vergrößern",
"rotateClockwise": "Im Uhrzeigersinn drehen", "rotateClockwise": "Im Uhrzeigersinn drehen",
"flipHorizontally": "Horizontal drehen", "flipHorizontally": "Horizontal drehen",
"flipVertically": "Vertikal drehen", "flipVertically": "Vertikal drehen",
"modifyConfig": "Optionen einstellen", "modifyConfig": "Optionen einstellen",
"toggleAutoscroll": "Auroscroll ein/ausschalten", "toggleAutoscroll": "Auroscroll ein/ausschalten",
"toggleLogViewer": "Log Betrachter ein/ausschalten", "toggleLogViewer": "Log-Betrachter ein/ausschalten",
"showOptionsPanel": "Seitenpanel anzeigen", "showOptionsPanel": "Seitenpanel anzeigen",
"reset": "Zurücksetzten", "reset": "Zurücksetzten",
"nextImage": "Nächstes Bild", "nextImage": "Nächstes Bild",
"zoomOut": "Verkleinern", "zoomOut": "Verkleinern",
"rotateCounterClockwise": "Gegen den Uhrzeigersinn drehen", "rotateCounterClockwise": "Gegen den Uhrzeigersinn drehen",
"showGalleryPanel": "Galeriefenster anzeigen", "showGalleryPanel": "Galerie-Panel anzeigen",
"exitViewer": "Betrachten beenden", "exitViewer": "Betrachter beenden",
"menu": "Menü", "menu": "Menü",
"loadMore": "Mehr laden", "loadMore": "Mehr laden",
"invokeProgressBar": "Invoke Fortschrittsanzeige", "invokeProgressBar": "Invoke Fortschrittsanzeige",
@ -759,7 +797,7 @@
"about": "Über" "about": "Über"
}, },
"boards": { "boards": {
"autoAddBoard": "Automatisches Hinzufügen zum Ordner", "autoAddBoard": "Automatisches Hinzufügen zum Board",
"topMessage": "Dieser Ordner enthält Bilder die in den folgenden Funktionen verwendet werden:", "topMessage": "Dieser Ordner enthält Bilder die in den folgenden Funktionen verwendet werden:",
"move": "Bewegen", "move": "Bewegen",
"menuItemAutoAdd": "Auto-Hinzufügen zu diesem Ordner", "menuItemAutoAdd": "Auto-Hinzufügen zu diesem Ordner",
@ -768,13 +806,13 @@
"noMatching": "Keine passenden Ordner", "noMatching": "Keine passenden Ordner",
"selectBoard": "Ordner aussuchen", "selectBoard": "Ordner aussuchen",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"addBoard": "Ordner hinzufügen", "addBoard": "Board hinzufügen",
"uncategorized": "Ohne Kategorie", "uncategorized": "Ohne Kategorie",
"downloadBoard": "Ordner runterladen", "downloadBoard": "Ordner runterladen",
"changeBoard": "Ordner wechseln", "changeBoard": "Ordner wechseln",
"loading": "Laden...", "loading": "Laden...",
"clearSearch": "Suche leeren", "clearSearch": "Suche leeren",
"bottomMessage": "Durch das Löschen dieses Ordners und seiner Bilder werden alle Funktionen zurückgesetzt, die sie derzeit verwenden.", "bottomMessage": "Löschen des Boards und seiner Bilder setzt alle Funktionen zurück, die sie gerade verwenden.",
"deleteBoardOnly": "Nur Ordner löschen", "deleteBoardOnly": "Nur Ordner löschen",
"deleteBoard": "Löschen Ordner", "deleteBoard": "Löschen Ordner",
"deleteBoardAndImages": "Löschen Ordner und Bilder", "deleteBoardAndImages": "Löschen Ordner und Bilder",
@ -865,11 +903,15 @@
"maxFaces": "Maximale Anzahl Gesichter", "maxFaces": "Maximale Anzahl Gesichter",
"resizeSimple": "Größe ändern (einfach)", "resizeSimple": "Größe ändern (einfach)",
"large": "Groß", "large": "Groß",
"modelSize": "Modell Größe", "modelSize": "Modellgröße",
"small": "Klein", "small": "Klein",
"base": "Basis", "base": "Basis",
"depthAnything": "Depth Anything / \"Tiefe irgendwas\"", "depthAnything": "Depth Anything",
"depthAnythingDescription": "Erstellung einer Tiefenkarte mit der Depth Anything-Technik" "depthAnythingDescription": "Erstellung einer Tiefenkarte mit der Depth-Anything-Technik",
"face": "Gesicht",
"body": "Körper",
"hands": "Hände",
"dwOpenpose": "DW Openpose"
}, },
"queue": { "queue": {
"status": "Status", "status": "Status",
@ -904,7 +946,7 @@
"batchValues": "Stapel Werte", "batchValues": "Stapel Werte",
"queueCountPrediction": "{{promptsCount}} Prompts × {{iterations}} Iterationen -> {{count}} Generationen", "queueCountPrediction": "{{promptsCount}} Prompts × {{iterations}} Iterationen -> {{count}} Generationen",
"queuedCount": "{{pending}} wartenden Elemente", "queuedCount": "{{pending}} wartenden Elemente",
"clearQueueAlertDialog": "Die Warteschlange leeren, stoppt den aktuellen Prozess und leert die Warteschlange komplett.", "clearQueueAlertDialog": "\"Die Warteschlange leeren\" stoppt den aktuellen Prozess und leert die Warteschlange komplett.",
"completedIn": "Fertig in", "completedIn": "Fertig in",
"cancelBatchSucceeded": "Stapel abgebrochen", "cancelBatchSucceeded": "Stapel abgebrochen",
"cancelBatch": "Stapel stoppen", "cancelBatch": "Stapel stoppen",
@ -913,20 +955,20 @@
"cancelBatchFailed": "Problem beim Abbruch vom Stapel", "cancelBatchFailed": "Problem beim Abbruch vom Stapel",
"clearQueueAlertDialog2": "Warteschlange wirklich leeren?", "clearQueueAlertDialog2": "Warteschlange wirklich leeren?",
"pruneSucceeded": "{{item_count}} abgeschlossene Elemente aus der Warteschlange entfernt", "pruneSucceeded": "{{item_count}} abgeschlossene Elemente aus der Warteschlange entfernt",
"pauseSucceeded": "Prozessor angehalten", "pauseSucceeded": "Prozess angehalten",
"cancelFailed": "Problem beim Stornieren des Auftrags", "cancelFailed": "Problem beim Stornieren des Auftrags",
"pauseFailed": "Problem beim Anhalten des Prozessors", "pauseFailed": "Problem beim Anhalten des Prozesses",
"front": "Vorne", "front": "Vorne",
"pruneTooltip": "Bereinigen Sie {{item_count}} abgeschlossene Aufträge", "pruneTooltip": "Bereinigen Sie {{item_count}} abgeschlossene Aufträge",
"resumeFailed": "Problem beim wieder aufnehmen von Prozessor", "resumeFailed": "Problem beim Fortsetzen des Prozesses",
"pruneFailed": "Problem beim leeren der Warteschlange", "pruneFailed": "Problem beim leeren der Warteschlange",
"pauseTooltip": "Pause von Prozessor", "pauseTooltip": "Prozess anhalten",
"back": "Hinten", "back": "Hinten",
"resumeSucceeded": "Prozessor wieder aufgenommen", "resumeSucceeded": "Prozess wird fortgesetzt",
"resumeTooltip": "Prozessor wieder aufnehmen", "resumeTooltip": "Prozess wieder aufnehmen",
"time": "Zeit", "time": "Zeit",
"batchQueuedDesc_one": "{{count}} Eintrag ans {{direction}} der Wartschlange hinzugefügt", "batchQueuedDesc_one": "{{count}} Eintrag an {{direction}} der Wartschlange hinzugefügt",
"batchQueuedDesc_other": "{{count}} Einträge ans {{direction}} der Wartschlange hinzugefügt", "batchQueuedDesc_other": "{{count}} Einträge an {{direction}} der Wartschlange hinzugefügt",
"openQueue": "Warteschlange öffnen", "openQueue": "Warteschlange öffnen",
"batchFailedToQueue": "Fehler beim Einreihen in die Stapelverarbeitung", "batchFailedToQueue": "Fehler beim Einreihen in die Stapelverarbeitung",
"batchFieldValues": "Stapelverarbeitungswerte", "batchFieldValues": "Stapelverarbeitungswerte",
@ -965,7 +1007,7 @@
}, },
"popovers": { "popovers": {
"noiseUseCPU": { "noiseUseCPU": {
"heading": "Nutze Prozessor rauschen", "heading": "Nutze CPU-Rauschen",
"paragraphs": [ "paragraphs": [
"Entscheidet, ob auf der CPU oder GPU Rauschen erzeugt wird.", "Entscheidet, ob auf der CPU oder GPU Rauschen erzeugt wird.",
"Mit aktiviertem CPU-Rauschen wird ein bestimmter Seedwert das gleiche Bild auf jeder Maschine erzeugen.", "Mit aktiviertem CPU-Rauschen wird ein bestimmter Seedwert das gleiche Bild auf jeder Maschine erzeugen.",
@ -975,8 +1017,7 @@
"paramModel": { "paramModel": {
"heading": "Modell", "heading": "Modell",
"paragraphs": [ "paragraphs": [
"Modell für die Entrauschungsschritte.", "Modell für die Entrauschungsschritte."
"Verschiedene Modelle werden in der Regel so trainiert, dass sie sich auf die Erzeugung bestimmter Ästhetik und/oder Inhalte spezialisiert."
] ]
}, },
"paramIterations": { "paramIterations": {
@ -1084,12 +1125,18 @@
"Wie stark wird das ControlNet das generierte Bild beeinflussen wird." "Wie stark wird das ControlNet das generierte Bild beeinflussen wird."
], ],
"heading": "Einfluss" "heading": "Einfluss"
},
"paramScheduler": {
"paragraphs": [
"\"Planer\" definiert, wie iterativ Rauschen zu einem Bild hinzugefügt wird, oder wie ein Sample bei der Ausgabe eines Modells aktualisiert wird."
],
"heading": "Planer"
} }
}, },
"ui": { "ui": {
"lockRatio": "Verhältnis sperren", "lockRatio": "Verhältnis sperren",
"hideProgressImages": "Verstecke Prozess Bild", "hideProgressImages": "Fortschrittsbilder verbergen",
"showProgressImages": "Zeige Prozess Bild", "showProgressImages": "Fortschrittsbilder anzeigen",
"swapSizes": "Tausche Größen" "swapSizes": "Tausche Größen"
}, },
"invocationCache": { "invocationCache": {
@ -1287,7 +1334,19 @@
"vaeFieldDescription": "VAE Submodell.", "vaeFieldDescription": "VAE Submodell.",
"unknownInput": "Unbekannte Eingabe: {{name}}", "unknownInput": "Unbekannte Eingabe: {{name}}",
"unknownNodeType": "Unbekannter Knotentyp", "unknownNodeType": "Unbekannter Knotentyp",
"float": "Kommazahlen" "float": "Kommazahlen",
"latentsPolymorphic": "Latents Polymorph",
"integerPolymorphicDescription": "Eine Sammlung von ganzen Zahlen.",
"integerPolymorphic": "Ganze Zahl Polymorph",
"ipAdapterPolymorphic": "IP-Adapter Polymorph",
"floatPolymorphic": "Fließkommazahl Polymorph",
"enumDescription": "Aufzählungen sind Werte, die eine von mehreren Optionen sein können.",
"floatCollection": "Fließkommazahl Sammlung",
"enum": "Aufzählung",
"floatPolymorphicDescription": "Eine Sammlung von Fließkommazahlen",
"fullyContainNodes": "Vollständig ausgewählte Nodes auswählen",
"editMode": "Im Workflow-Editor bearbeiten",
"floatCollectionDescription": "Eine Sammlung von Fließkommazahlen"
}, },
"hrf": { "hrf": {
"enableHrf": "Korrektur für hohe Auflösungen", "enableHrf": "Korrektur für hohe Auflösungen",
@ -1336,12 +1395,12 @@
}, },
"control": { "control": {
"title": "Kontrolle", "title": "Kontrolle",
"controlAdaptersTab": "Kontroll Adapter", "controlAdaptersTab": "Kontroll-Adapter",
"ipTab": "Bild Beschreibung" "ipTab": "Bild-Prompts"
}, },
"compositing": { "compositing": {
"coherenceTab": "Kohärenzpass", "coherenceTab": "Kohärenzpass",
"infillTab": "Füllung", "infillTab": "Füllung / Infill",
"title": "Compositing" "title": "Compositing"
} }
}, },
@ -1379,5 +1438,15 @@
}, },
"app": { "app": {
"storeNotInitialized": "App-Store ist nicht initialisiert" "storeNotInitialized": "App-Store ist nicht initialisiert"
},
"sdxl": {
"concatPromptStyle": "Verknüpfen von Prompt & Stil",
"scheduler": "Planer",
"steps": "Schritte",
"useRefiner": "Refiner verwenden",
"selectAModel": "Modell auswählen"
},
"dynamicPrompts": {
"showDynamicPrompts": "Dynamische Prompts anzeigen"
} }
} }

View File

@ -1424,9 +1424,8 @@
"clipSkip": { "clipSkip": {
"heading": "CLIP Skip", "heading": "CLIP Skip",
"paragraphs": [ "paragraphs": [
"Choose how many layers of the CLIP model to skip.", "How many layers of the CLIP model to skip.",
"Some models work better with certain CLIP Skip settings.", "Certain models are better suited to be used with CLIP Skip."
"A higher value typically results in a less detailed image."
] ]
}, },
"paramNegativeConditioning": { "paramNegativeConditioning": {
@ -1446,7 +1445,8 @@
"paramScheduler": { "paramScheduler": {
"heading": "Scheduler", "heading": "Scheduler",
"paragraphs": [ "paragraphs": [
"Scheduler defines how to iteratively add noise to an image or how to update a sample based on a model's output." "Scheduler used during the generation process.",
"Each scheduler defines how to iteratively add noise to an image or how to update a sample based on a model's output."
] ]
}, },
"compositingBlur": { "compositingBlur": {
@ -1463,47 +1463,52 @@
}, },
"compositingCoherenceMode": { "compositingCoherenceMode": {
"heading": "Mode", "heading": "Mode",
"paragraphs": ["The mode of the Coherence Pass."] "paragraphs": ["Method used to create a coherent image with the newly generated masked area."]
}, },
"compositingCoherenceSteps": { "compositingCoherenceSteps": {
"heading": "Steps", "heading": "Steps",
"paragraphs": ["Number of denoising steps used in the Coherence Pass.", "Same as the main Steps parameter."] "paragraphs": ["Number of steps in the Coherence Pass.", "Similar to Generation Steps."]
}, },
"compositingStrength": { "compositingStrength": {
"heading": "Strength", "heading": "Strength",
"paragraphs": [ "paragraphs": ["Amount of noise added for the Coherence Pass.", "Similar to Denoising Strength."]
"Denoising strength for the Coherence Pass.",
"Same as the Image to Image Denoising Strength parameter."
]
}, },
"compositingMaskAdjustments": { "compositingMaskAdjustments": {
"heading": "Mask Adjustments", "heading": "Mask Adjustments",
"paragraphs": ["Adjust the mask."] "paragraphs": ["Adjust the mask."]
}, },
"controlNetBeginEnd": {
"heading": "Begin / End Step Percentage",
"paragraphs": [
"Which steps of the denoising process will have the ControlNet applied.",
"ControlNets applied at the beginning of the process guide composition, and ControlNets applied at the end guide details."
]
},
"controlNetControlMode": {
"heading": "Control Mode",
"paragraphs": ["Lends more weight to either the prompt or ControlNet."]
},
"controlNetResizeMode": {
"heading": "Resize Mode",
"paragraphs": ["How the ControlNet image will be fit to the image output size."]
},
"controlNet": { "controlNet": {
"heading": "ControlNet", "heading": "ControlNet",
"paragraphs": [ "paragraphs": [
"ControlNets provide guidance to the generation process, helping create images with controlled composition, structure, or style, depending on the model selected." "ControlNets provide guidance to the generation process, helping create images with controlled composition, structure, or style, depending on the model selected."
] ]
}, },
"controlNetBeginEnd": {
"heading": "Begin / End Step Percentage",
"paragraphs": [
"The part of the of the denoising process that will have the Control Adapter applied.",
"Generally, Control Adapters applied at the start of the process guide composition, and Control Adapters applied at the end guide details."
]
},
"controlNetControlMode": {
"heading": "Control Mode",
"paragraphs": ["Lend more weight to either the prompt or ControlNet."]
},
"controlNetProcessor": {
"heading": "Processor",
"paragraphs": [
"Method of processing the input image to guide the generation process. Different processors will providedifferent effects or styles in your generated images."
]
},
"controlNetResizeMode": {
"heading": "Resize Mode",
"paragraphs": ["Method to fit Control Adapter's input image size to the output generation size."]
},
"controlNetWeight": { "controlNetWeight": {
"heading": "Weight", "heading": "Weight",
"paragraphs": ["How strongly the ControlNet will impact the generated image."] "paragraphs": [
"Weight of the Control Adapter. Higher weight will lead to larger impacts on the final image."
]
}, },
"dynamicPrompts": { "dynamicPrompts": {
"heading": "Dynamic Prompts", "heading": "Dynamic Prompts",
@ -1526,13 +1531,23 @@
"Per Image will use a unique seed for each image. This provides more variation." "Per Image will use a unique seed for each image. This provides more variation."
] ]
}, },
"imageFit": {
"heading": "Fit Initial Image to Output Size",
"paragraphs": [
"Resizes the initial image to the width and height of the output image. Recommended to enable."
]
},
"infillMethod": { "infillMethod": {
"heading": "Infill Method", "heading": "Infill Method",
"paragraphs": ["Method to infill the selected area."] "paragraphs": ["Method of infilling during the Outpainting or Inpainting process."]
}, },
"lora": { "lora": {
"heading": "LoRA Weight", "heading": "LoRA",
"paragraphs": ["Higher LoRA weight will lead to larger impacts on the final image."] "paragraphs": ["Lightweight models that are used in conjunction with base models."]
},
"loraWeight": {
"heading": "Weight",
"paragraphs": ["Weight of the LoRA. Higher weight will lead to larger impacts on the final image."]
}, },
"noiseUseCPU": { "noiseUseCPU": {
"heading": "Use CPU Noise", "heading": "Use CPU Noise",
@ -1542,14 +1557,25 @@
"There is no performance impact to enabling CPU Noise." "There is no performance impact to enabling CPU Noise."
] ]
}, },
"paramAspect": {
"heading": "Aspect",
"paragraphs": [
"Aspect ratio of the generated image. Changing the ratio will update the Width and Height accordingly.",
"“Optimize” will set the Width and Height to optimal dimensions for the chosen model."
]
},
"paramCFGScale": { "paramCFGScale": {
"heading": "CFG Scale", "heading": "CFG Scale",
"paragraphs": ["Controls how much your prompt influences the generation process."] "paragraphs": [
"Controls how much the prompt influences the generation process.",
"High CFG Scale values can result in over-saturation and distorted generation results. "
]
}, },
"paramCFGRescaleMultiplier": { "paramCFGRescaleMultiplier": {
"heading": "CFG Rescale Multiplier", "heading": "CFG Rescale Multiplier",
"paragraphs": [ "paragraphs": [
"Rescale multiplier for CFG guidance, used for models trained using zero-terminal SNR (ztsnr). Suggested value 0.7." "Rescale multiplier for CFG guidance, used for models trained using zero-terminal SNR (ztsnr).",
"Suggested value of 0.7 for these models."
] ]
}, },
"paramDenoisingStrength": { "paramDenoisingStrength": {
@ -1559,6 +1585,16 @@
"0 will result in an identical image, while 1 will result in a completely new image." "0 will result in an identical image, while 1 will result in a completely new image."
] ]
}, },
"paramHeight": {
"heading": "Height",
"paragraphs": ["Height of the generated image. Must be a multiple of 8."]
},
"paramHrf": {
"heading": "Enable High Resolution Fix",
"paragraphs": [
"Generate high quality images at a larger resolution than optimal for the model. Generally used to prevent duplication in the generated image."
]
},
"paramIterations": { "paramIterations": {
"heading": "Iterations", "heading": "Iterations",
"paragraphs": [ "paragraphs": [
@ -1569,8 +1605,7 @@
"paramModel": { "paramModel": {
"heading": "Model", "heading": "Model",
"paragraphs": [ "paragraphs": [
"Model used for the denoising steps.", "Model used for generation. Different models are trained to specialize in producing different aesthetic results and content."
"Different models are typically trained to specialize in producing particular aesthetic results and content."
] ]
}, },
"paramRatio": { "paramRatio": {
@ -1584,7 +1619,7 @@
"heading": "Seed", "heading": "Seed",
"paragraphs": [ "paragraphs": [
"Controls the starting noise used for generation.", "Controls the starting noise used for generation.",
"Disable “Random Seed” to produce identical results with the same generation settings." "Disable the “Random” option to produce identical results with the same generation settings."
] ]
}, },
"paramSteps": { "paramSteps": {
@ -1594,6 +1629,10 @@
"Higher step counts will typically create better images but will require more generation time." "Higher step counts will typically create better images but will require more generation time."
] ]
}, },
"paramUpscaleMethod": {
"heading": "Upscale Method",
"paragraphs": ["Method used to upscale the image for High Resolution Fix."]
},
"paramVAE": { "paramVAE": {
"heading": "VAE", "heading": "VAE",
"paragraphs": ["Model used for translating AI output into the final image."] "paragraphs": ["Model used for translating AI output into the final image."]
@ -1601,14 +1640,82 @@
"paramVAEPrecision": { "paramVAEPrecision": {
"heading": "VAE Precision", "heading": "VAE Precision",
"paragraphs": [ "paragraphs": [
"The precision used during VAE encoding and decoding. FP16/half precision is more efficient, at the expense of minor image variations." "The precision used during VAE encoding and decoding.",
"Fp16/Half precision is more efficient, at the expense of minor image variations."
]
},
"paramWidth": {
"heading": "Width",
"paragraphs": ["Width of the generated image. Must be a multiple of 8."]
},
"patchmatchDownScaleSize": {
"heading": "Downscale",
"paragraphs": [
"How much downscaling occurs before infilling.",
"Higher downscaling will improve performance and reduce quality."
]
},
"refinerModel": {
"heading": "Refiner Model",
"paragraphs": [
"Model used during the refiner portion of the generation process.",
"Similar to the Generation Model."
]
},
"refinerPositiveAestheticScore": {
"heading": "Positive Aesthetic Score",
"paragraphs": [
"Weight generations to be more similar to images with a high aesthetic score, based on the training data."
]
},
"refinerNegativeAestheticScore": {
"heading": "Negative Aesthetic Score",
"paragraphs": [
"Weight generations to be more similar to images with a low aesthetic score, based on the training data."
]
},
"refinerScheduler": {
"heading": "Scheduler",
"paragraphs": [
"Scheduler used during the refiner portion of the generation process.",
"Similar to the Generation Scheduler."
]
},
"refinerStart": {
"heading": "Refiner Start",
"paragraphs": [
"Where in the generation process the refiner will start to be used.",
"0 means the refiner will be used for the entire generation process, 0.8 means the refiner will be used for the last 20% of the generation process."
]
},
"refinerSteps": {
"heading": "Steps",
"paragraphs": [
"Number of steps that will be performed during the refiner portion of the generation process.",
"Similar to the Generation Steps."
]
},
"refinerCfgScale": {
"heading": "CFG Scale",
"paragraphs": [
"Controls how much the prompt influences the generation process.",
"Similar to the Generation CFG Scale."
] ]
}, },
"scaleBeforeProcessing": { "scaleBeforeProcessing": {
"heading": "Scale Before Processing", "heading": "Scale Before Processing",
"paragraphs": [ "paragraphs": [
"Scales the selected area to the size best suited for the model before the image generation process." "“Auto” scales the selected area to the size best suited for the model before the image generation process.",
"“Manual” allows you to choose the width and height the selected area will be scaled to before the image generation process."
] ]
},
"seamlessTilingXAxis": {
"heading": "Seamless Tiling X Axis",
"paragraphs": ["Seamlessly tile an image along the horizontal axis."]
},
"seamlessTilingYAxis": {
"heading": "Seamless Tiling Y Axis",
"paragraphs": ["Seamlessly tile an image along the vertical axis."]
} }
}, },
"ui": { "ui": {

View File

@ -1138,7 +1138,11 @@
"unsupportedAnyOfLength": "unione di troppi elementi ({{count}})", "unsupportedAnyOfLength": "unione di troppi elementi ({{count}})",
"clearWorkflowDesc": "Cancellare questo flusso di lavoro e avviarne uno nuovo?", "clearWorkflowDesc": "Cancellare questo flusso di lavoro e avviarne uno nuovo?",
"clearWorkflow": "Cancella il flusso di lavoro", "clearWorkflow": "Cancella il flusso di lavoro",
"clearWorkflowDesc2": "Il tuo flusso di lavoro attuale presenta modifiche non salvate." "clearWorkflowDesc2": "Il tuo flusso di lavoro attuale presenta modifiche non salvate.",
"viewMode": "Utilizzare nella vista lineare",
"reorderLinearView": "Riordina la vista lineare",
"editMode": "Modifica nell'editor del flusso di lavoro",
"resetToDefaultValue": "Ripristina il valore predefinito"
}, },
"boards": { "boards": {
"autoAddBoard": "Aggiungi automaticamente bacheca", "autoAddBoard": "Aggiungi automaticamente bacheca",
@ -1241,7 +1245,11 @@
"large": "Grande", "large": "Grande",
"small": "Piccolo", "small": "Piccolo",
"depthAnythingDescription": "Generazione di mappe di profondità utilizzando la tecnica Depth Anything", "depthAnythingDescription": "Generazione di mappe di profondità utilizzando la tecnica Depth Anything",
"modelSize": "Dimensioni del modello" "modelSize": "Dimensioni del modello",
"dwOpenposeDescription": "Stima della posa umana utilizzando DW Openpose",
"face": "Viso",
"body": "Corpo",
"hands": "Mani"
}, },
"queue": { "queue": {
"queueFront": "Aggiungi all'inizio della coda", "queueFront": "Aggiungi all'inizio della coda",
@ -1371,7 +1379,8 @@
"popovers": { "popovers": {
"paramScheduler": { "paramScheduler": {
"paragraphs": [ "paragraphs": [
"Il campionatore definisce come aggiungere in modo iterativo il rumore a un'immagine o come aggiornare un campione in base all'output di un modello." "Il campionatore utilizzato durante il processo di generazione.",
"Ciascun campionatore definisce come aggiungere in modo iterativo il rumore a un'immagine o come aggiornare un campione in base all'output di un modello."
], ],
"heading": "Campionatore" "heading": "Campionatore"
}, },
@ -1384,8 +1393,8 @@
"compositingCoherenceSteps": { "compositingCoherenceSteps": {
"heading": "Passi", "heading": "Passi",
"paragraphs": [ "paragraphs": [
"Numero di passi di riduzione del rumore utilizzati nel Passaggio di Coerenza.", "Numero di passi utilizzati nel Passaggio di Coerenza.",
"Uguale al parametro principale Passi." "Simile ai passi di generazione."
] ]
}, },
"compositingBlur": { "compositingBlur": {
@ -1397,14 +1406,13 @@
"compositingCoherenceMode": { "compositingCoherenceMode": {
"heading": "Modalità", "heading": "Modalità",
"paragraphs": [ "paragraphs": [
"La modalità del Passaggio di Coerenza." "Metodo utilizzato per creare un'immagine coerente con l'area mascherata appena generata."
] ]
}, },
"clipSkip": { "clipSkip": {
"paragraphs": [ "paragraphs": [
"Scegli quanti livelli del modello CLIP saltare.", "Scegli quanti livelli del modello CLIP saltare.",
"Alcuni modelli funzionano meglio con determinate impostazioni di CLIP Skip.", "Alcuni modelli funzionano meglio con determinate impostazioni di CLIP Skip."
"Un valore più alto in genere produce un'immagine meno dettagliata."
] ]
}, },
"compositingCoherencePass": { "compositingCoherencePass": {
@ -1416,8 +1424,8 @@
"compositingStrength": { "compositingStrength": {
"heading": "Forza", "heading": "Forza",
"paragraphs": [ "paragraphs": [
"Intensità di riduzione del rumore per il passaggio di coerenza.", "Quantità di rumore aggiunta per il Passaggio di Coerenza.",
"Uguale al parametro intensità di riduzione del rumore da immagine a immagine." "Simile alla forza di riduzione del rumore."
] ]
}, },
"paramNegativeConditioning": { "paramNegativeConditioning": {
@ -1443,8 +1451,8 @@
"controlNetBeginEnd": { "controlNetBeginEnd": {
"heading": "Percentuale passi Inizio / Fine", "heading": "Percentuale passi Inizio / Fine",
"paragraphs": [ "paragraphs": [
"A quali passi del processo di rimozione del rumore verrà applicato ControlNet.", "La parte del processo di rimozione del rumore in cui verrà applicato l'adattatore di controllo.",
"I ControlNet applicati all'inizio del processo guidano la composizione, mentre i ControlNet applicati alla fine guidano i dettagli." "In genere, gli adattatori di controllo applicati all'inizio del processo guidano la composizione, mentre quelli applicati alla fine guidano i dettagli."
] ]
}, },
"noiseUseCPU": { "noiseUseCPU": {
@ -1457,7 +1465,7 @@
}, },
"scaleBeforeProcessing": { "scaleBeforeProcessing": {
"paragraphs": [ "paragraphs": [
"Ridimensiona l'area selezionata alla dimensione più adatta al modello prima del processo di generazione dell'immagine." "\"Auto\" ridimensiona l'area selezionata alla dimensione più adatta al modello prima del processo di generazione dell'immagine."
], ],
"heading": "Scala prima dell'elaborazione" "heading": "Scala prima dell'elaborazione"
}, },
@ -1492,20 +1500,21 @@
"paramVAEPrecision": { "paramVAEPrecision": {
"heading": "Precisione VAE", "heading": "Precisione VAE",
"paragraphs": [ "paragraphs": [
"La precisione utilizzata durante la codifica e decodifica VAE. FP16/mezza precisione è più efficiente, a scapito di minori variazioni dell'immagine." "La precisione utilizzata durante la codifica e decodifica VAE.",
"Fp16/Mezza precisione è più efficiente, a scapito di minori variazioni dell'immagine."
] ]
}, },
"paramSeed": { "paramSeed": {
"paragraphs": [ "paragraphs": [
"Controlla il rumore iniziale utilizzato per la generazione.", "Controlla il rumore iniziale utilizzato per la generazione.",
"Disabilita seme \"Casuale\" per produrre risultati identici con le stesse impostazioni di generazione." "Disabilita l'opzione \"Casuale\" per produrre risultati identici con le stesse impostazioni di generazione."
], ],
"heading": "Seme" "heading": "Seme"
}, },
"controlNetResizeMode": { "controlNetResizeMode": {
"heading": "Modalità ridimensionamento", "heading": "Modalità ridimensionamento",
"paragraphs": [ "paragraphs": [
"Come l'immagine ControlNet verrà adattata alle dimensioni di output dell'immagine." "Metodo per adattare le dimensioni dell'immagine in ingresso dell'adattatore di controllo alle dimensioni della generazione di output."
] ]
}, },
"dynamicPromptsSeedBehaviour": { "dynamicPromptsSeedBehaviour": {
@ -1520,8 +1529,7 @@
"paramModel": { "paramModel": {
"heading": "Modello", "heading": "Modello",
"paragraphs": [ "paragraphs": [
"Modello utilizzato per i passaggi di riduzione del rumore.", "Modello utilizzato per la generazione. Diversi modelli vengono addestrati per specializzarsi nella produzione di risultati e contenuti estetici diversi."
"Diversi modelli sono generalmente addestrati per specializzarsi nella produzione di particolari risultati e contenuti estetici."
] ]
}, },
"paramDenoisingStrength": { "paramDenoisingStrength": {
@ -1539,25 +1547,26 @@
}, },
"infillMethod": { "infillMethod": {
"paragraphs": [ "paragraphs": [
"Metodo per riempire l'area selezionata." "Metodo di riempimento durante il processo di Outpainting o Inpainting."
], ],
"heading": "Metodo di riempimento" "heading": "Metodo di riempimento"
}, },
"controlNetWeight": { "controlNetWeight": {
"heading": "Peso", "heading": "Peso",
"paragraphs": [ "paragraphs": [
"Quanto forte sarà l'impatto di ControlNet sull'immagine generata." "Peso dell'adattatore di controllo. Un peso maggiore porterà a impatti maggiori sull'immagine finale."
] ]
}, },
"paramCFGScale": { "paramCFGScale": {
"heading": "Scala CFG", "heading": "Scala CFG",
"paragraphs": [ "paragraphs": [
"Controlla quanto il tuo prompt influenza il processo di generazione." "Controlla quanto il prompt influenza il processo di generazione.",
"Valori elevati della scala CFG possono provocare una saturazione eccessiva e distorsioni nei risultati della generazione. "
] ]
}, },
"controlNetControlMode": { "controlNetControlMode": {
"paragraphs": [ "paragraphs": [
"Attribuisce più peso al prompt o a ControlNet." "Attribuisce più peso al prompt oppure a ControlNet."
], ],
"heading": "Modalità di controllo" "heading": "Modalità di controllo"
}, },
@ -1569,9 +1578,9 @@
] ]
}, },
"lora": { "lora": {
"heading": "Peso LoRA", "heading": "LoRA",
"paragraphs": [ "paragraphs": [
"Un peso LoRA più elevato porterà a impatti maggiori sull'immagine finale." "Modelli leggeri utilizzati insieme ai modelli base."
] ]
}, },
"controlNet": { "controlNet": {
@ -1583,8 +1592,65 @@
"paramCFGRescaleMultiplier": { "paramCFGRescaleMultiplier": {
"heading": "Moltiplicatore di riscala CFG", "heading": "Moltiplicatore di riscala CFG",
"paragraphs": [ "paragraphs": [
"Moltiplicatore di riscala per la guida CFG, utilizzato per modelli addestrati utilizzando SNR a terminale zero (ztsnr). Valore suggerito 0.7." "Moltiplicatore di riscala per la guida CFG, utilizzato per modelli addestrati utilizzando SNR a terminale zero (ztsnr).",
"Valore suggerito di 0.7 per questi modelli."
] ]
},
"controlNetProcessor": {
"heading": "Processore",
"paragraphs": [
"Metodo di elaborazione dell'immagine di input per guidare il processo di generazione. Processori diversi forniranno effetti o stili diversi nelle immagini generate."
]
},
"imageFit": {
"heading": "Adatta l'immagine iniziale alle dimensioni di output",
"paragraphs": [
"Ridimensiona l'immagine iniziale in base alla larghezza e all'altezza dell'immagine di output. Si consiglia di abilitarlo."
]
},
"loraWeight": {
"heading": "Peso",
"paragraphs": [
"Peso del LoRA. Un peso maggiore comporterà un impatto maggiore sull'immagine finale."
]
},
"paramAspect": {
"heading": "Aspetto",
"paragraphs": [
"Proporzioni dell'immagine generata. La modifica del rapporto aggiornerà di conseguenza la larghezza e l'altezza.",
"\"Ottimizza\" imposterà la larghezza e l'altezza alle dimensioni ottimali per il modello scelto."
]
},
"paramHeight": {
"heading": "Altezza",
"paragraphs": [
"Altezza dell'immagine generata. Deve essere un multiplo di 8."
]
},
"paramHrf": {
"heading": "Abilita correzione alta risoluzione",
"paragraphs": [
"Genera immagini di alta qualità con una risoluzione maggiore di quella ottimale per il modello. Generalmente utilizzato per impedire la duplicazione nell'immagine generata."
]
},
"paramUpscaleMethod": {
"heading": "Metodo di ampliamento",
"paragraphs": [
"Metodo utilizzato per eseguire l'ampliamento dell'immagine per la correzione ad alta risoluzione."
]
},
"patchmatchDownScaleSize": {
"heading": "Ridimensiona",
"paragraphs": [
"Quanto ridimensionamento avviene prima del riempimento.",
"Un ridimensionamento più elevato migliorerà le prestazioni e ridurrà la qualità."
]
},
"paramWidth": {
"paragraphs": [
"Larghezza dell'immagine generata. Deve essere un multiplo di 8."
],
"heading": "Larghezza"
} }
}, },
"sdxl": { "sdxl": {

View File

@ -1217,16 +1217,14 @@
"clipSkip": { "clipSkip": {
"paragraphs": [ "paragraphs": [
"Kies hoeveel CLIP-modellagen je wilt overslaan.", "Kies hoeveel CLIP-modellagen je wilt overslaan.",
"Bepaalde modellen werken beter met bepaalde Overslaan CLIP-instellingen.", "Bepaalde modellen werken beter met bepaalde Overslaan CLIP-instellingen."
"Een hogere waarde geeft meestal een minder gedetailleerde afbeelding."
], ],
"heading": "Overslaan CLIP" "heading": "Overslaan CLIP"
}, },
"paramModel": { "paramModel": {
"heading": "Model", "heading": "Model",
"paragraphs": [ "paragraphs": [
"Model gebruikt voor de ontruisingsstappen.", "Model gebruikt voor de ontruisingsstappen."
"Verschillende modellen zijn meestal getraind om zich te specialiseren in het maken van bepaalde esthetische resultaten en materiaal."
] ]
}, },
"compositingCoherencePass": { "compositingCoherencePass": {

View File

@ -1353,16 +1353,14 @@
"clipSkip": { "clipSkip": {
"paragraphs": [ "paragraphs": [
"Выберите, сколько слоев модели CLIP нужно пропустить.", "Выберите, сколько слоев модели CLIP нужно пропустить.",
"Некоторые модели работают лучше с определенными настройками пропуска CLIP.", "Некоторые модели работают лучше с определенными настройками пропуска CLIP."
"Более высокое значение обычно приводит к менее детализированному изображению."
], ],
"heading": "CLIP пропуск" "heading": "CLIP пропуск"
}, },
"paramModel": { "paramModel": {
"heading": "Модель", "heading": "Модель",
"paragraphs": [ "paragraphs": [
"Модель, используемая для шагов шумоподавления.", "Модель, используемая для шагов шумоподавления."
"Различные модели обычно обучаются, чтобы специализироваться на достижении определенных эстетических результатов и содержания."
] ]
}, },
"compositingCoherencePass": { "compositingCoherencePass": {

View File

@ -1444,16 +1444,14 @@
"clipSkip": { "clipSkip": {
"paragraphs": [ "paragraphs": [
"选择要跳过 CLIP 模型多少层。", "选择要跳过 CLIP 模型多少层。",
"部分模型跳过特定数值的层时效果会更好。", "部分模型跳过特定数值的层时效果会更好。"
"较高的数值通常会导致图像细节更少。"
], ],
"heading": "CLIP 跳过层" "heading": "CLIP 跳过层"
}, },
"paramModel": { "paramModel": {
"heading": "模型", "heading": "模型",
"paragraphs": [ "paragraphs": [
"用于去噪过程的模型。", "用于去噪过程的模型。"
"不同的模型一般会通过接受训练来专门产生特定的美学内容和结果。"
] ]
}, },
"paramIterations": { "paramIterations": {

View File

@ -13,28 +13,46 @@ export type Feature =
| 'compositingCoherenceSteps' | 'compositingCoherenceSteps'
| 'compositingStrength' | 'compositingStrength'
| 'compositingMaskAdjustments' | 'compositingMaskAdjustments'
| 'controlNet'
| 'controlNetBeginEnd' | 'controlNetBeginEnd'
| 'controlNetControlMode' | 'controlNetControlMode'
| 'controlNetProcessor'
| 'controlNetResizeMode' | 'controlNetResizeMode'
| 'controlNet'
| 'controlNetWeight' | 'controlNetWeight'
| 'dynamicPrompts' | 'dynamicPrompts'
| 'dynamicPromptsMaxPrompts' | 'dynamicPromptsMaxPrompts'
| 'dynamicPromptsSeedBehaviour' | 'dynamicPromptsSeedBehaviour'
| 'imageFit'
| 'infillMethod' | 'infillMethod'
| 'lora' | 'lora'
| 'loraWeight'
| 'noiseUseCPU' | 'noiseUseCPU'
| 'paramAspect'
| 'paramCFGScale' | 'paramCFGScale'
| 'paramCFGRescaleMultiplier' | 'paramCFGRescaleMultiplier'
| 'paramDenoisingStrength' | 'paramDenoisingStrength'
| 'paramHeight'
| 'paramHrf'
| 'paramIterations' | 'paramIterations'
| 'paramModel' | 'paramModel'
| 'paramRatio' | 'paramRatio'
| 'paramSeed' | 'paramSeed'
| 'paramSteps' | 'paramSteps'
| 'paramUpscaleMethod'
| 'paramVAE' | 'paramVAE'
| 'paramVAEPrecision' | 'paramVAEPrecision'
| 'scaleBeforeProcessing'; | 'paramWidth'
| 'patchmatchDownScaleSize'
| 'refinerModel'
| 'refinerNegativeAestheticScore'
| 'refinerPositiveAestheticScore'
| 'refinerScheduler'
| 'refinerStart'
| 'refinerSteps'
| 'refinerCfgScale'
| 'scaleBeforeProcessing'
| 'seamlessTilingXAxis'
| 'seamlessTilingYAxis';
export type PopoverData = PopoverProps & { export type PopoverData = PopoverProps & {
image?: string; image?: string;
@ -46,21 +64,57 @@ export const POPOVER_DATA: { [key in Feature]?: PopoverData } = {
paramNegativeConditioning: { paramNegativeConditioning: {
placement: 'right', placement: 'right',
}, },
clipSkip: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings',
},
controlNet: { controlNet: {
href: 'https://support.invoke.ai/support/solutions/articles/151000105880', href: 'https://support.invoke.ai/support/solutions/articles/151000105880',
}, },
controlNetBeginEnd: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178148',
},
controlNetWeight: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178148',
},
lora: { lora: {
href: 'https://support.invoke.ai/support/solutions/articles/151000159072', href: 'https://support.invoke.ai/support/solutions/articles/151000159072',
}, },
loraWeight: {
href: 'https://support.invoke.ai/support/solutions/articles/151000159072-concepts-low-rank-adaptations-loras-',
},
compositingBlur: {
href: 'https://support.invoke.ai/support/solutions/articles/151000158838-compositing-settings',
},
compositingBlurMethod: {
href: 'https://support.invoke.ai/support/solutions/articles/151000158838-compositing-settings',
},
compositingCoherenceMode: { compositingCoherenceMode: {
href: 'https://support.invoke.ai/support/solutions/articles/151000158838', href: 'https://support.invoke.ai/support/solutions/articles/151000158838-compositing-settings',
},
compositingCoherenceSteps: {
href: 'https://support.invoke.ai/support/solutions/articles/151000158838-compositing-settings',
},
compositingStrength: {
href: 'https://support.invoke.ai/support/solutions/articles/151000158838-compositing-settings',
}, },
infillMethod: { infillMethod: {
href: 'https://support.invoke.ai/support/solutions/articles/151000158841', href: 'https://support.invoke.ai/support/solutions/articles/151000158841-infill-and-scaling',
}, },
scaleBeforeProcessing: { scaleBeforeProcessing: {
href: 'https://support.invoke.ai/support/solutions/articles/151000158841', href: 'https://support.invoke.ai/support/solutions/articles/151000158841',
}, },
paramCFGScale: {
href: 'https://www.youtube.com/watch?v=1OeHEJrsTpI',
},
paramCFGRescaleMultiplier: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings',
},
paramDenoisingStrength: {
href: 'https://support.invoke.ai/support/solutions/articles/151000094998-image-to-image',
},
paramHrf: {
href: 'https://support.invoke.ai/support/solutions/articles/151000096700-how-can-i-get-larger-images-what-does-upscaling-do-',
},
paramIterations: { paramIterations: {
href: 'https://support.invoke.ai/support/solutions/articles/151000159073', href: 'https://support.invoke.ai/support/solutions/articles/151000159073',
}, },
@ -70,7 +124,10 @@ export const POPOVER_DATA: { [key in Feature]?: PopoverData } = {
}, },
paramScheduler: { paramScheduler: {
placement: 'right', placement: 'right',
href: 'https://support.invoke.ai/support/solutions/articles/151000159073', href: 'https://www.youtube.com/watch?v=1OeHEJrsTpI',
},
paramSeed: {
href: 'https://support.invoke.ai/support/solutions/articles/151000096684-what-is-a-seed-how-do-i-use-it-to-recreate-the-same-image-',
}, },
paramModel: { paramModel: {
placement: 'right', placement: 'right',
@ -81,15 +138,53 @@ export const POPOVER_DATA: { [key in Feature]?: PopoverData } = {
}, },
controlNetControlMode: { controlNetControlMode: {
placement: 'right', placement: 'right',
href: 'https://support.invoke.ai/support/solutions/articles/151000178148',
},
controlNetProcessor: {
placement: 'right',
href: 'https://support.invoke.ai/support/solutions/articles/151000105880-using-controlnet',
}, },
controlNetResizeMode: { controlNetResizeMode: {
placement: 'right', placement: 'right',
href: 'https://support.invoke.ai/support/solutions/articles/151000178148',
}, },
paramVAE: { paramVAE: {
placement: 'right', placement: 'right',
href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings',
}, },
paramVAEPrecision: { paramVAEPrecision: {
placement: 'right', placement: 'right',
href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings',
},
paramUpscaleMethod: {
href: 'https://support.invoke.ai/support/solutions/articles/151000096700-how-can-i-get-larger-images-what-does-upscaling-do-',
},
refinerModel: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner',
},
refinerNegativeAestheticScore: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner',
},
refinerPositiveAestheticScore: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner',
},
refinerScheduler: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner',
},
refinerStart: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner',
},
refinerSteps: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner',
},
refinerCfgScale: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner',
},
seamlessTilingXAxis: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings',
},
seamlessTilingYAxis: {
href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings',
}, },
} as const; } as const;

View File

@ -1,5 +1,6 @@
import { CompositeRangeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { CompositeRangeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppDispatch } from 'app/store/storeHooks'; import { useAppDispatch } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { useControlAdapterBeginEndStepPct } from 'features/controlAdapters/hooks/useControlAdapterBeginEndStepPct'; import { useControlAdapterBeginEndStepPct } from 'features/controlAdapters/hooks/useControlAdapterBeginEndStepPct';
import { useControlAdapterIsEnabled } from 'features/controlAdapters/hooks/useControlAdapterIsEnabled'; import { useControlAdapterIsEnabled } from 'features/controlAdapters/hooks/useControlAdapterIsEnabled';
import { import {
@ -61,12 +62,10 @@ export const ParamControlAdapterBeginEnd = memo(({ id }: Props) => {
} }
return ( return (
<FormControl <FormControl isDisabled={!isEnabled} orientation="vertical">
isDisabled={!isEnabled} <InformationalPopover feature="controlNetBeginEnd">
// feature="controlNetBeginEnd" <FormLabel>{t('controlnet.beginEndStepPercent')}</FormLabel>
orientation="vertical" </InformationalPopover>
>
<FormLabel>{t('controlnet.beginEndStepPercent')}</FormLabel>
<CompositeRangeSlider <CompositeRangeSlider
aria-label={ariaLabel} aria-label={ariaLabel}
value={value} value={value}

View File

@ -2,6 +2,7 @@ import type { ComboboxOnChange, ComboboxOption } from '@invoke-ai/ui-library';
import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { createMemoizedSelector } from 'app/store/createMemoizedSelector'; import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { useControlAdapterIsEnabled } from 'features/controlAdapters/hooks/useControlAdapterIsEnabled'; import { useControlAdapterIsEnabled } from 'features/controlAdapters/hooks/useControlAdapterIsEnabled';
import { useControlAdapterProcessorNode } from 'features/controlAdapters/hooks/useControlAdapterProcessorNode'; import { useControlAdapterProcessorNode } from 'features/controlAdapters/hooks/useControlAdapterProcessorNode';
import { CONTROLNET_PROCESSORS } from 'features/controlAdapters/store/constants'; import { CONTROLNET_PROCESSORS } from 'features/controlAdapters/store/constants';
@ -58,7 +59,9 @@ const ParamControlAdapterProcessorSelect = ({ id }: Props) => {
} }
return ( return (
<FormControl isDisabled={!isEnabled}> <FormControl isDisabled={!isEnabled}>
<FormLabel>{t('controlnet.processor')}</FormLabel> <InformationalPopover feature="controlNetProcessor">
<FormLabel>{t('controlnet.processor')}</FormLabel>
</InformationalPopover>
<Combobox value={value} options={options} onChange={onChange} /> <Combobox value={value} options={options} onChange={onChange} />
</FormControl> </FormControl>
); );

View File

@ -1,6 +1,7 @@
import type { ComboboxOnChange, ComboboxOption } from '@invoke-ai/ui-library'; import type { ComboboxOnChange, ComboboxOption } from '@invoke-ai/ui-library';
import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setHrfMethod } from 'features/hrf/store/hrfSlice'; import { setHrfMethod } from 'features/hrf/store/hrfSlice';
import { isParameterHRFMethod } from 'features/parameters/types/parameterSchemas'; import { isParameterHRFMethod } from 'features/parameters/types/parameterSchemas';
import { memo, useCallback, useMemo } from 'react'; import { memo, useCallback, useMemo } from 'react';
@ -30,7 +31,9 @@ const ParamHrfMethodSelect = () => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('hrf.upscaleMethod')}</FormLabel> <InformationalPopover feature="paramUpscaleMethod">
<FormLabel>{t('hrf.upscaleMethod')}</FormLabel>
</InformationalPopover>
<Combobox value={value} options={options} onChange={onChange} /> <Combobox value={value} options={options} onChange={onChange} />
</FormControl> </FormControl>
); );

View File

@ -1,5 +1,6 @@
import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setHrfStrength } from 'features/hrf/store/hrfSlice'; import { setHrfStrength } from 'features/hrf/store/hrfSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -25,7 +26,9 @@ const ParamHrfStrength = () => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('parameters.denoisingStrength')}</FormLabel> <InformationalPopover feature="paramDenoisingStrength">
<FormLabel>{`${t('parameters.denoisingStrength')}`}</FormLabel>
</InformationalPopover>
<CompositeSlider <CompositeSlider
min={sliderMin} min={sliderMin}
max={sliderMax} max={sliderMax}

View File

@ -1,5 +1,6 @@
import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library'; import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setHrfEnabled } from 'features/hrf/store/hrfSlice'; import { setHrfEnabled } from 'features/hrf/store/hrfSlice';
import type { ChangeEvent } from 'react'; import type { ChangeEvent } from 'react';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
@ -18,7 +19,9 @@ const ParamHrfToggle = () => {
return ( return (
<FormControl w="full"> <FormControl w="full">
<FormLabel flexGrow={1}>{t('hrf.enableHrf')}</FormLabel> <InformationalPopover feature="paramHrf">
<FormLabel flexGrow={1}>{t('hrf.enableHrf')}</FormLabel>
</InformationalPopover>
<Switch isChecked={hrfEnabled} onChange={handleHrfEnabled} /> <Switch isChecked={hrfEnabled} onChange={handleHrfEnabled} />
</FormControl> </FormControl>
); );

View File

@ -10,6 +10,7 @@ import {
Text, Text,
} from '@invoke-ai/ui-library'; } from '@invoke-ai/ui-library';
import { useAppDispatch } from 'app/store/storeHooks'; import { useAppDispatch } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import type { LoRA } from 'features/lora/store/loraSlice'; import type { LoRA } from 'features/lora/store/loraSlice';
import { loraIsEnabledChanged, loraRemoved, loraWeightChanged } from 'features/lora/store/loraSlice'; import { loraIsEnabledChanged, loraRemoved, loraWeightChanged } from 'features/lora/store/loraSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
@ -57,29 +58,31 @@ export const LoRACard = memo((props: LoRACardProps) => {
</Flex> </Flex>
</Flex> </Flex>
</CardHeader> </CardHeader>
<CardBody> <InformationalPopover feature="loraWeight">
<CompositeSlider <CardBody>
value={lora.weight} <CompositeSlider
onChange={handleChange} value={lora.weight}
min={-1} onChange={handleChange}
max={2} min={-1}
step={0.01} max={2}
marks={marks} step={0.01}
defaultValue={0.75} marks={marks}
isDisabled={!lora.isEnabled} defaultValue={0.75}
/> isDisabled={!lora.isEnabled}
<CompositeNumberInput />
value={lora.weight} <CompositeNumberInput
onChange={handleChange} value={lora.weight}
min={-5} onChange={handleChange}
max={5} min={-5}
step={0.01} max={5}
w={20} step={0.01}
flexShrink={0} w={20}
defaultValue={0.75} flexShrink={0}
isDisabled={!lora.isEnabled} defaultValue={0.75}
/> isDisabled={!lora.isEnabled}
</CardBody> />
</CardBody>
</InformationalPopover>
</Card> </Card>
); );
}); });

View File

@ -2,6 +2,7 @@ import type { ChakraProps } from '@invoke-ai/ui-library';
import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { createMemoizedSelector } from 'app/store/createMemoizedSelector'; import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox'; import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox';
import { loraAdded, selectLoraSlice } from 'features/lora/store/loraSlice'; import { loraAdded, selectLoraSlice } from 'features/lora/store/loraSlice';
import { memo, useCallback, useMemo } from 'react'; import { memo, useCallback, useMemo } from 'react';
@ -57,7 +58,9 @@ const LoRASelect = () => {
return ( return (
<FormControl isDisabled={!options.length}> <FormControl isDisabled={!options.length}>
<FormLabel>{t('models.lora')} </FormLabel> <InformationalPopover feature="lora">
<FormLabel>{t('models.lora')} </FormLabel>
</InformationalPopover>
<Combobox <Combobox
placeholder={placeholder} placeholder={placeholder}
value={null} value={null}

View File

@ -1,5 +1,6 @@
import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setInfillPatchmatchDownscaleSize } from 'features/parameters/store/generationSlice'; import { setInfillPatchmatchDownscaleSize } from 'features/parameters/store/generationSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -27,7 +28,9 @@ const ParamInfillPatchmatchDownscaleSize = () => {
return ( return (
<FormControl isDisabled={infillMethod !== 'patchmatch'}> <FormControl isDisabled={infillMethod !== 'patchmatch'}>
<FormLabel>{t('parameters.patchmatchDownScaleSize')}</FormLabel> <InformationalPopover feature="patchmatchDownScaleSize">
<FormLabel>{t('parameters.patchmatchDownScaleSize')}</FormLabel>
</InformationalPopover>
<CompositeSlider <CompositeSlider
min={sliderMin} min={sliderMin}
max={sliderMax} max={sliderMax}

View File

@ -1,5 +1,6 @@
import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppSelector } from 'app/store/storeHooks'; import { useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { useImageSizeContext } from 'features/parameters/components/ImageSize/ImageSizeContext'; import { useImageSizeContext } from 'features/parameters/components/ImageSize/ImageSizeContext';
import { selectOptimalDimension } from 'features/parameters/store/generationSlice'; import { selectOptimalDimension } from 'features/parameters/store/generationSlice';
import { memo, useCallback, useMemo } from 'react'; import { memo, useCallback, useMemo } from 'react';
@ -27,7 +28,9 @@ export const ParamHeight = memo(() => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('parameters.height')}</FormLabel> <InformationalPopover feature="paramHeight">
<FormLabel>{t('parameters.height')}</FormLabel>
</InformationalPopover>
<CompositeSlider <CompositeSlider
value={ctx.height} value={ctx.height}
defaultValue={optimalDimension} defaultValue={optimalDimension}

View File

@ -1,5 +1,6 @@
import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppSelector } from 'app/store/storeHooks'; import { useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { useImageSizeContext } from 'features/parameters/components/ImageSize/ImageSizeContext'; import { useImageSizeContext } from 'features/parameters/components/ImageSize/ImageSizeContext';
import { selectOptimalDimension } from 'features/parameters/store/generationSlice'; import { selectOptimalDimension } from 'features/parameters/store/generationSlice';
import { memo, useCallback, useMemo } from 'react'; import { memo, useCallback, useMemo } from 'react';
@ -27,7 +28,9 @@ export const ParamWidth = memo(() => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('parameters.width')}</FormLabel> <InformationalPopover feature="paramWidth">
<FormLabel>{t('parameters.width')}</FormLabel>
</InformationalPopover>
<CompositeSlider <CompositeSlider
value={ctx.width} value={ctx.width}
onChange={onChange} onChange={onChange}

View File

@ -1,6 +1,7 @@
import type { ComboboxOption, SystemStyleObject } from '@invoke-ai/ui-library'; import type { ComboboxOption, SystemStyleObject } from '@invoke-ai/ui-library';
import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library';
import type { SingleValue } from 'chakra-react-select'; import type { SingleValue } from 'chakra-react-select';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { ASPECT_RATIO_OPTIONS } from 'features/parameters/components/ImageSize/constants'; import { ASPECT_RATIO_OPTIONS } from 'features/parameters/components/ImageSize/constants';
import { useImageSizeContext } from 'features/parameters/components/ImageSize/ImageSizeContext'; import { useImageSizeContext } from 'features/parameters/components/ImageSize/ImageSizeContext';
import { isAspectRatioID } from 'features/parameters/components/ImageSize/types'; import { isAspectRatioID } from 'features/parameters/components/ImageSize/types';
@ -28,7 +29,9 @@ export const AspectRatioSelect = memo(() => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('parameters.aspect')}</FormLabel> <InformationalPopover feature="paramAspect">
<FormLabel>{t('parameters.aspect')}</FormLabel>
</InformationalPopover>
<Combobox value={value} onChange={onChange} options={ASPECT_RATIO_OPTIONS} sx={selectStyles} /> <Combobox value={value} onChange={onChange} options={ASPECT_RATIO_OPTIONS} sx={selectStyles} />
</FormControl> </FormControl>
); );

View File

@ -1,6 +1,7 @@
import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library'; import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library';
import type { RootState } from 'app/store/store'; import type { RootState } from 'app/store/store';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setShouldFitToWidthHeight } from 'features/parameters/store/generationSlice'; import { setShouldFitToWidthHeight } from 'features/parameters/store/generationSlice';
import type { ChangeEvent } from 'react'; import type { ChangeEvent } from 'react';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
@ -22,7 +23,9 @@ const ImageToImageFit = () => {
return ( return (
<FormControl w="full"> <FormControl w="full">
<FormLabel flexGrow={1}>{t('parameters.imageFit')}</FormLabel> <InformationalPopover feature="imageFit">
<FormLabel flexGrow={1}>{t('parameters.imageFit')}</FormLabel>
</InformationalPopover>
<Switch isChecked={shouldFitToWidthHeight} onChange={handleChangeFit} /> <Switch isChecked={shouldFitToWidthHeight} onChange={handleChangeFit} />
</FormControl> </FormControl>
); );

View File

@ -1,6 +1,7 @@
import { Combobox, FormControl, FormLabel, Tooltip } from '@invoke-ai/ui-library'; import { Box, Combobox, FormControl, FormLabel, Tooltip } from '@invoke-ai/ui-library';
import { createMemoizedSelector } from 'app/store/createMemoizedSelector'; import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox'; import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox';
import { modelSelected } from 'features/parameters/store/actions'; import { modelSelected } from 'features/parameters/store/actions';
import { selectGenerationSlice } from 'features/parameters/store/generationSlice'; import { selectGenerationSlice } from 'features/parameters/store/generationSlice';
@ -41,18 +42,22 @@ const ParamMainModelSelect = () => {
}); });
return ( return (
<Tooltip label={tooltipLabel}> <FormControl isDisabled={!options.length} isInvalid={!options.length}>
<FormControl isDisabled={!options.length} isInvalid={!options.length}> <InformationalPopover feature="paramModel">
<FormLabel>{t('modelManager.model')}</FormLabel> <FormLabel>{t('modelManager.model')}</FormLabel>
<Combobox </InformationalPopover>
value={value} <Tooltip label={tooltipLabel}>
placeholder={placeholder} <Box w="full">
options={options} <Combobox
onChange={onChange} value={value}
noOptionsMessage={noOptionsMessage} placeholder={placeholder}
/> options={options}
</FormControl> onChange={onChange}
</Tooltip> noOptionsMessage={noOptionsMessage}
/>
</Box>
</Tooltip>
</FormControl>
); );
}; };

View File

@ -1,5 +1,6 @@
import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library'; import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setSeamlessXAxis } from 'features/parameters/store/generationSlice'; import { setSeamlessXAxis } from 'features/parameters/store/generationSlice';
import type { ChangeEvent } from 'react'; import type { ChangeEvent } from 'react';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
@ -20,7 +21,9 @@ const ParamSeamlessXAxis = () => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('parameters.seamlessXAxis')}</FormLabel> <InformationalPopover feature="seamlessTilingXAxis">
<FormLabel>{t('parameters.seamlessXAxis')}</FormLabel>
</InformationalPopover>
<Switch isChecked={seamlessXAxis} onChange={handleChange} /> <Switch isChecked={seamlessXAxis} onChange={handleChange} />
</FormControl> </FormControl>
); );

View File

@ -1,5 +1,6 @@
import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library'; import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setSeamlessYAxis } from 'features/parameters/store/generationSlice'; import { setSeamlessYAxis } from 'features/parameters/store/generationSlice';
import type { ChangeEvent } from 'react'; import type { ChangeEvent } from 'react';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
@ -18,7 +19,9 @@ const ParamSeamlessYAxis = () => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('parameters.seamlessYAxis')}</FormLabel> <InformationalPopover feature="seamlessTilingYAxis">
<FormLabel>{t('parameters.seamlessYAxis')}</FormLabel>
</InformationalPopover>
<Switch isChecked={seamlessYAxis} onChange={handleChange} /> <Switch isChecked={seamlessYAxis} onChange={handleChange} />
</FormControl> </FormControl>
); );

View File

@ -1,5 +1,6 @@
import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setRefinerCFGScale } from 'features/sdxl/store/sdxlSlice'; import { setRefinerCFGScale } from 'features/sdxl/store/sdxlSlice';
import { memo, useCallback, useMemo } from 'react'; import { memo, useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -21,7 +22,9 @@ const ParamSDXLRefinerCFGScale = () => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('sdxl.cfgScale')}</FormLabel> <InformationalPopover feature="refinerCfgScale">
<FormLabel>{t('sdxl.cfgScale')}</FormLabel>
</InformationalPopover>
<CompositeSlider <CompositeSlider
value={refinerCFGScale} value={refinerCFGScale}
defaultValue={initial} defaultValue={initial}

View File

@ -1,6 +1,7 @@
import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { createMemoizedSelector } from 'app/store/createMemoizedSelector'; import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { useModelCombobox } from 'common/hooks/useModelCombobox'; import { useModelCombobox } from 'common/hooks/useModelCombobox';
import { refinerModelChanged, selectSdxlSlice } from 'features/sdxl/store/sdxlSlice'; import { refinerModelChanged, selectSdxlSlice } from 'features/sdxl/store/sdxlSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
@ -43,7 +44,9 @@ const ParamSDXLRefinerModelSelect = () => {
}); });
return ( return (
<FormControl isDisabled={!options.length} isInvalid={!options.length}> <FormControl isDisabled={!options.length} isInvalid={!options.length}>
<FormLabel>{t('sdxl.refinermodel')}</FormLabel> <InformationalPopover feature="refinerModel">
<FormLabel>{t('sdxl.refinermodel')}</FormLabel>
</InformationalPopover>
<Combobox <Combobox
value={value} value={value}
placeholder={placeholder} placeholder={placeholder}

View File

@ -1,5 +1,6 @@
import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setRefinerNegativeAestheticScore } from 'features/sdxl/store/sdxlSlice'; import { setRefinerNegativeAestheticScore } from 'features/sdxl/store/sdxlSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -14,7 +15,9 @@ const ParamSDXLRefinerNegativeAestheticScore = () => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('sdxl.negAestheticScore')}</FormLabel> <InformationalPopover feature="refinerNegativeAestheticScore">
<FormLabel>{t('sdxl.negAestheticScore')}</FormLabel>
</InformationalPopover>
<CompositeSlider <CompositeSlider
min={1} min={1}
max={10} max={10}

View File

@ -1,5 +1,6 @@
import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setRefinerPositiveAestheticScore } from 'features/sdxl/store/sdxlSlice'; import { setRefinerPositiveAestheticScore } from 'features/sdxl/store/sdxlSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -13,7 +14,9 @@ const ParamSDXLRefinerPositiveAestheticScore = () => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('sdxl.posAestheticScore')}</FormLabel> <InformationalPopover feature="refinerPositiveAestheticScore">
<FormLabel>{t('sdxl.posAestheticScore')}</FormLabel>
</InformationalPopover>
<CompositeSlider <CompositeSlider
step={0.5} step={0.5}
min={1} min={1}

View File

@ -1,6 +1,7 @@
import type { ComboboxOnChange } from '@invoke-ai/ui-library'; import type { ComboboxOnChange } from '@invoke-ai/ui-library';
import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { SCHEDULER_OPTIONS } from 'features/parameters/types/constants'; import { SCHEDULER_OPTIONS } from 'features/parameters/types/constants';
import { isParameterScheduler } from 'features/parameters/types/parameterSchemas'; import { isParameterScheduler } from 'features/parameters/types/parameterSchemas';
import { setRefinerScheduler } from 'features/sdxl/store/sdxlSlice'; import { setRefinerScheduler } from 'features/sdxl/store/sdxlSlice';
@ -26,7 +27,9 @@ const ParamSDXLRefinerScheduler = () => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('sdxl.scheduler')}</FormLabel> <InformationalPopover feature="refinerScheduler">
<FormLabel>{t('sdxl.scheduler')}</FormLabel>
</InformationalPopover>
<Combobox value={value} options={SCHEDULER_OPTIONS} onChange={onChange} /> <Combobox value={value} options={SCHEDULER_OPTIONS} onChange={onChange} />
</FormControl> </FormControl>
); );

View File

@ -1,5 +1,6 @@
import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setRefinerStart } from 'features/sdxl/store/sdxlSlice'; import { setRefinerStart } from 'features/sdxl/store/sdxlSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -12,7 +13,9 @@ const ParamSDXLRefinerStart = () => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('sdxl.refinerStart')}</FormLabel> <InformationalPopover feature="refinerStart">
<FormLabel>{t('sdxl.refinerStart')}</FormLabel>
</InformationalPopover>
<CompositeSlider <CompositeSlider
step={0.01} step={0.01}
min={0} min={0}

View File

@ -1,5 +1,6 @@
import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setRefinerSteps } from 'features/sdxl/store/sdxlSlice'; import { setRefinerSteps } from 'features/sdxl/store/sdxlSlice';
import { memo, useCallback, useMemo } from 'react'; import { memo, useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -27,7 +28,9 @@ const ParamSDXLRefinerSteps = () => {
return ( return (
<FormControl> <FormControl>
<FormLabel>{t('sdxl.steps')}</FormLabel> <InformationalPopover feature="refinerSteps">
<FormLabel>{t('sdxl.steps')}</FormLabel>
</InformationalPopover>
<CompositeSlider <CompositeSlider
value={refinerSteps} value={refinerSteps}
defaultValue={initial} defaultValue={initial}

View File

@ -52,10 +52,22 @@ const dynamicBaseQuery: BaseQueryFn<string | FetchArgs, unknown, FetchBaseQueryE
const baseUrl = $baseUrl.get(); const baseUrl = $baseUrl.get();
const authToken = $authToken.get(); const authToken = $authToken.get();
const projectId = $projectId.get(); const projectId = $projectId.get();
const isOpenAPIRequest =
(args instanceof Object && args.url.includes('openapi.json')) ||
(typeof args === 'string' && args.includes('openapi.json'));
const fetchBaseQueryArgs: FetchBaseQueryArgs = { const fetchBaseQueryArgs: FetchBaseQueryArgs = {
baseUrl: baseUrl ? `${baseUrl}/api/v1` : `${window.location.href.replace(/\/$/, '')}/api/v1`, baseUrl: baseUrl ? `${baseUrl}/api/v1` : `${window.location.href.replace(/\/$/, '')}/api/v1`,
prepareHeaders: (headers) => { };
// When fetching the openapi.json, we need to remove circular references from the JSON.
if (isOpenAPIRequest) {
fetchBaseQueryArgs.jsonReplacer = getCircularReplacer();
}
// openapi.json isn't protected by authorization, but all other requests need to include the auth token and project id.
if (!isOpenAPIRequest) {
fetchBaseQueryArgs.prepareHeaders = (headers) => {
if (authToken) { if (authToken) {
headers.set('Authorization', `Bearer ${authToken}`); headers.set('Authorization', `Bearer ${authToken}`);
} }
@ -64,15 +76,7 @@ const dynamicBaseQuery: BaseQueryFn<string | FetchArgs, unknown, FetchBaseQueryE
} }
return headers; return headers;
}, };
};
// When fetching the openapi.json, we need to remove circular references from the JSON.
if (
(args instanceof Object && args.url.includes('openapi.json')) ||
(typeof args === 'string' && args.includes('openapi.json'))
) {
fetchBaseQueryArgs.jsonReplacer = getCircularReplacer();
} }
const rawBaseQuery = fetchBaseQuery(fetchBaseQueryArgs); const rawBaseQuery = fetchBaseQuery(fetchBaseQueryArgs);

View File

@ -1 +1 @@
__version__ = "3.6.3" __version__ = "3.7.0"