diff --git a/docs/assets/nodes/groupsallscale.png b/docs/assets/nodes/groupsallscale.png new file mode 100644 index 0000000000..aa67db9a3e Binary files /dev/null and b/docs/assets/nodes/groupsallscale.png differ diff --git a/docs/assets/nodes/groupsconditioning.png b/docs/assets/nodes/groupsconditioning.png new file mode 100644 index 0000000000..b988cee78c Binary files /dev/null and b/docs/assets/nodes/groupsconditioning.png differ diff --git a/docs/assets/nodes/groupscontrol.png b/docs/assets/nodes/groupscontrol.png new file mode 100644 index 0000000000..ad696c3087 Binary files /dev/null and b/docs/assets/nodes/groupscontrol.png differ diff --git a/docs/assets/nodes/groupsimgvae.png b/docs/assets/nodes/groupsimgvae.png new file mode 100644 index 0000000000..c60bf40d67 Binary files /dev/null and b/docs/assets/nodes/groupsimgvae.png differ diff --git a/docs/assets/nodes/groupsiterate.png b/docs/assets/nodes/groupsiterate.png new file mode 100644 index 0000000000..9c1cd15bc2 Binary files /dev/null and b/docs/assets/nodes/groupsiterate.png differ diff --git a/docs/assets/nodes/groupslora.png b/docs/assets/nodes/groupslora.png new file mode 100644 index 0000000000..befcee6490 Binary files /dev/null and b/docs/assets/nodes/groupslora.png differ diff --git a/docs/assets/nodes/groupsmultigenseeding.png b/docs/assets/nodes/groupsmultigenseeding.png new file mode 100644 index 0000000000..a644146c86 Binary files /dev/null and b/docs/assets/nodes/groupsmultigenseeding.png differ diff --git a/docs/assets/nodes/groupsnoise.png b/docs/assets/nodes/groupsnoise.png new file mode 100644 index 0000000000..afb1e23e81 Binary files /dev/null and b/docs/assets/nodes/groupsnoise.png differ diff --git a/docs/assets/nodes/groupsrandseed.png b/docs/assets/nodes/groupsrandseed.png new file mode 100644 index 0000000000..06430cdee4 Binary files /dev/null and b/docs/assets/nodes/groupsrandseed.png differ diff --git a/docs/assets/nodes/nodescontrol.png b/docs/assets/nodes/nodescontrol.png new file mode 100644 index 0000000000..8b179e43ac Binary files /dev/null and b/docs/assets/nodes/nodescontrol.png differ diff --git a/docs/assets/nodes/nodesi2i.png b/docs/assets/nodes/nodesi2i.png new file mode 100644 index 0000000000..9908833804 Binary files /dev/null and b/docs/assets/nodes/nodesi2i.png differ diff --git a/docs/assets/nodes/nodest2i.png b/docs/assets/nodes/nodest2i.png new file mode 100644 index 0000000000..7e882dbf1b Binary files /dev/null and b/docs/assets/nodes/nodest2i.png differ diff --git a/docs/features/NODES.md b/docs/features/NODES.md index 1f276d2012..94663d9f1d 100644 --- a/docs/features/NODES.md +++ b/docs/features/NODES.md @@ -116,49 +116,49 @@ There are several node grouping concepts that can be examined with a narrow focu As described, an initial noise tensor is necessary for the latent diffusion process. As a result, all non-image *ToLatents nodes require a noise node input. -groupsnoise +![groupsnoise](../assets/nodes/groupsnoise.png) ### Conditioning As described, conditioning is necessary for the latent diffusion process, whether empty or not. As a result, all non-image *ToLatents nodes require positive and negative conditioning inputs. Conditioning is reliant on a CLIP tokenizer provided by the Model Loader node. -groupsconditioning +![groupsconditioning](../assets/nodes/groupsconditioning.png) ### Image Space & VAE The ImageToLatents node doesn't require a noise node input, but requires a VAE input to convert the image from image space into latent space. In reverse, the LatentsToImage node requires a VAE input to convert from latent space back into image space. -groupsimgvae +![groupsimgvae](../assets/nodes/groupsimgvae.png) ### Defined & Random Seeds It is common to want to use both the same seed (for continuity) and random seeds (for variance). To define a seed, simply enter it into the 'Seed' field on a noise node. Conversely, the RandomInt node generates a random integer between 'Low' and 'High', and can be used as input to the 'Seed' edge point on a noise node to randomize your seed. -groupsrandseed +![groupsrandseed](../assets/nodes/groupsrandseed.png) ### Control Control means to guide the diffusion process to adhere to a defined input or structure. Control can be provided as input to non-image *ToLatents nodes from ControlNet nodes. ControlNet nodes usually require an image processor which converts an input image for use with ControlNet. -groupscontrol +![groupscontrol](../assets/nodes/groupscontrol.png) ### LoRA The Lora Loader node lets you load a LoRA (say that ten times fast) and pass it as output to both the Prompt (Compel) and non-image *ToLatents nodes. A model's CLIP tokenizer is passed through the LoRA into Prompt (Compel), where it affects conditioning. A model's U-Net is also passed through the LoRA into a non-image *ToLatents node, where it affects noise prediction. -groupslora +![groupslora](../assets/nodes/groupslora.png) ### Scaling Use the ImageScale, ScaleLatents, and Upscale nodes to upscale images and/or latent images. The chosen method differs across contexts. However, be aware that latents are already noisy and compressed at their original resolution; scaling an image could produce more detailed results. -groupsallscale +![groupsallscale](../assets/nodes/groupsallscale.png) ### Iteration + Multiple Images as Input Iteration is a common concept in any processing, and means to repeat a process with given input. In nodes, you're able to use the Iterate node to iterate through collections usually gathered by the Collect node. The Iterate node has many potential uses, from processing a collection of images one after another, to varying seeds across multiple image generations and more. This screenshot demonstrates how to collect several images and pass them out one at a time. -groupsiterate +![groupsiterate](../assets/nodes/groupsiterate.png) ### Multiple Image Generation + Random Seeds @@ -166,7 +166,7 @@ Multiple image generation in the node editor is done using the RandomRange node. To control seeds across generations takes some care. The first row in the screenshot will generate multiple images with different seeds, but using the same RandomRange parameters across invocations will result in the same group of random seeds being used across the images, producing repeatable results. In the second row, adding the RandomInt node as input to RandomRange's 'Seed' edge point will ensure that seeds are varied across all images across invocations, producing varied results. -groupsmultigenseeding +![groupsmultigenseeding](../assets/nodes/groupsmultigenseeding.png) ## Examples @@ -174,7 +174,7 @@ With our knowledge of node grouping and the diffusion process, let’s break dow ### Basic text-to-image Node Graph -nodest2i +![nodest2i](../assets/nodes/nodest2i.png) - Model Loader: A necessity to generating images (as we’ve read above). We choose our model from the dropdown. It outputs a U-Net, CLIP tokenizer, and VAE. - Prompt (Compel): Another necessity. Two prompt nodes are created. One will output positive conditioning (what you want, ‘dog’), one will output negative (what you don’t want, ‘cat’). They both input the CLIP tokenizer that the Model Loader node outputs. @@ -184,7 +184,7 @@ With our knowledge of node grouping and the diffusion process, let’s break dow ### Basic image-to-image Node Graph -nodesi2i +![nodesi2i](../assets/nodes/nodesi2i.png) - Model Loader: Choose a model from the dropdown. - Prompt (Compel): Two prompt nodes. One positive (dog), one negative (dog). Same CLIP inputs from the Model Loader node as before. @@ -195,7 +195,7 @@ With our knowledge of node grouping and the diffusion process, let’s break dow ### Basic ControlNet Node Graph -nodescontrol +![nodescontrol](../assets/nodes/nodescontrol.png) - Model Loader - Prompt (Compel) diff --git a/invokeai/frontend/web/src/app/types/invokeai.ts b/invokeai/frontend/web/src/app/types/invokeai.ts index be642a6435..b38790e0c9 100644 --- a/invokeai/frontend/web/src/app/types/invokeai.ts +++ b/invokeai/frontend/web/src/app/types/invokeai.ts @@ -95,7 +95,8 @@ export type AppFeature = | 'localization' | 'consoleLogging' | 'dynamicPrompting' - | 'batches'; + | 'batches' + | 'syncModels'; /** * A disable-able Stable Diffusion feature diff --git a/invokeai/frontend/web/src/features/nodes/components/fields/ModelInputFieldComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/fields/ModelInputFieldComponent.tsx index b578298149..625ce0d5ca 100644 --- a/invokeai/frontend/web/src/features/nodes/components/fields/ModelInputFieldComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/fields/ModelInputFieldComponent.tsx @@ -16,6 +16,7 @@ import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useGetMainModelsQuery } from 'services/api/endpoints/models'; import { FieldComponentProps } from './types'; +import { useFeatureStatus } from '../../../system/hooks/useFeatureStatus'; const ModelInputFieldComponent = ( props: FieldComponentProps @@ -24,6 +25,7 @@ const ModelInputFieldComponent = ( const dispatch = useAppDispatch(); const { t } = useTranslation(); + const isSyncModelEnabled = useFeatureStatus('syncModels').isFeatureEnabled; const { data: mainModels, isLoading } = useGetMainModelsQuery(); @@ -103,9 +105,11 @@ const ModelInputFieldComponent = ( disabled={data.length === 0} onChange={handleChangeModel} /> - - - + {isSyncModelEnabled && ( + + + + )} ); }; diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/MainModel/ParamMainModelSelect.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/MainModel/ParamMainModelSelect.tsx index 75f1bc8bd9..a98d100467 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/MainModel/ParamMainModelSelect.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/MainModel/ParamMainModelSelect.tsx @@ -15,6 +15,7 @@ import { modelIdToMainModelParam } from 'features/parameters/util/modelIdToMainM import SyncModelsButton from 'features/ui/components/tabs/ModelManager/subpanels/ModelManagerSettingsPanel/SyncModelsButton'; import { forEach } from 'lodash-es'; import { useGetMainModelsQuery } from 'services/api/endpoints/models'; +import { useFeatureStatus } from '../../../../system/hooks/useFeatureStatus'; const selector = createSelector( stateSelector, @@ -29,6 +30,7 @@ const ParamMainModelSelect = () => { const { model } = useAppSelector(selector); const { data: mainModels, isLoading } = useGetMainModelsQuery(); + const isSyncModelEnabled = useFeatureStatus('syncModels').isFeatureEnabled; const data = useMemo(() => { if (!mainModels) { @@ -98,9 +100,11 @@ const ParamMainModelSelect = () => { onChange={handleChangeModel} w="100%" /> - - - + {isSyncModelEnabled && ( + + + + )} ); }; diff --git a/mkdocs.yml b/mkdocs.yml index 7d3e0e0b85..cbcaf52af6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -101,7 +101,7 @@ plugins: nav: - Home: 'index.md' - - Installation: + - Installation: - Overview: 'installation/index.md' - Installing with the Automated Installer: 'installation/010_INSTALL_AUTOMATED.md' - Installing manually: 'installation/020_INSTALL_MANUAL.md' @@ -122,14 +122,14 @@ nav: - Community Nodes: - Community Nodes: 'nodes/communityNodes.md' - Overview: 'nodes/overview.md' - - Features: + - Features: - Overview: 'features/index.md' - Concepts: 'features/CONCEPTS.md' - Configuration: 'features/CONFIGURATION.md' - ControlNet: 'features/CONTROLNET.md' - Image-to-Image: 'features/IMG2IMG.md' - Controlling Logging: 'features/LOGGING.md' - - Model Mergeing: 'features/MODEL_MERGING.md' + - Model Merging: 'features/MODEL_MERGING.md' - Nodes Editor (Experimental): 'features/NODES.md' - NSFW Checker: 'features/NSFW.md' - Postprocessing: 'features/POSTPROCESS.md' @@ -140,9 +140,9 @@ nav: - InvokeAI Web Server: 'features/WEB.md' - WebUI Hotkeys: "features/WEBUIHOTKEYS.md" - Other: 'features/OTHER.md' - - Contributing: + - Contributing: - How to Contribute: 'contributing/CONTRIBUTING.md' - - Development: + - Development: - Overview: 'contributing/contribution_guides/development.md' - InvokeAI Architecture: 'contributing/ARCHITECTURE.md' - Frontend Documentation: 'contributing/contribution_guides/development_guides/contributingToFrontend.md' @@ -161,5 +161,3 @@ nav: - Other: - Contributors: 'other/CONTRIBUTORS.md' - CompViz-README: 'other/README-CompViz.md' - -