This release includes support for FLUX IP Adapter v2 and image "batching" for Workflows.
Image Batching for Workflows
The Workflow Editor now supports running a given workflow for each image in a collection of images.
Add an `Image Batch` node, drag some images into its image collection, and connect its output to any other node(s). Invoke will run the workflow once for each image in the collection.
Here are a few examples to help build intuition for the feature. Click the arrow to expand each example.
<details>
<summary>Example 1 - Single Batch -> Single Node</summary>
The simplest case is using a batch image output with a single node. Here's a workflow that resizes 5 images to 200x200 thumbnails.
Workflow
<img width="538" alt="image" src="https://github.com/user-attachments/assets/04c92e39-1743-4239-9e47-e8d7d6973f70">
Results
<img width="493" alt="image" src="https://github.com/user-attachments/assets/693feb96-ab9f-4f2e-b40a-b3f654e015e8">
This batch queues 5 graphs, each containing a single resize node with one of the 5 images in the batch list. Note the images are 200x200 pixels.
</details>
<details>
<summary>Example 2 - Single Batch -> Multiple Nodes</summary>
You can also use a batch image output with multiple nodes. This contrived workflow resizes the image to a 200x200 thumbnail, like the previous example, the pastes the thumbnail on the full size image.
Workflow
<img width="805" alt="image" src="https://github.com/user-attachments/assets/3ee76c97-95a0-43fd-b1e1-939449c2427b">
Results
<img width="495" alt="image" src="https://github.com/user-attachments/assets/b4e5449e-b614-4378-b4a0-1b6eb8cf0606">
This batch also queues 5 graphs, each of which contains one resize and one paste node. In each graph, the nodes get the image of the 5 images in the batch collection. The batch node can connect to any number of other nodes. For each queued graph, all connected nodes will get the same image.
</details>
<details>
<summary>Example 3 - Multiple Batches (Product Batching)</summary>
When multiple batches are used, they are combined such that all permutations are queued (e.g. the product of batches is taken).
Workflow
<img width="929" alt="image" src="https://github.com/user-attachments/assets/85665851-3c77-4680-a002-1eed785d78dc">
Results
<img width="492" alt="image" src="https://github.com/user-attachments/assets/2f28f18e-cf39-4afe-8d20-a5911e61a6ce">
In this case, the product of the two batches is 15 graphs. Each image of the 3-image batch is used as the base image, and a thumbnail of each tiger is pasted on top of it. We'll call this "product" batching.
Zipped Batching
The batching API supports "zipped" batches, where the batch collections are merged into a single batch.
For example, imagine two batches of 5 images. As described in the "product" example above, you'd get 5 images * 5 images = 25 graphs. Zipped batching would instead take the first image from each of the two batches and use them together in the first graph, then take the second two images for the second graph, and so on.
Zipped batching is not supported in the UI at this time.
</details>
Versus `Iterate` Nodes
We support similar functionality to batching with `Iterate` nodes, so why add batching? In short, `Iterate` nodes have some technical issues which are addressed by batching.
<details>
<summary>Why `Iterate` Nodes are Scary</summary>
They result in unbounded graph complexity and size. If you don't know what these words mean, but they sound kinda scary, congrats! You are on the right track. They are indeed scary words.
- When using `Iterate` nodes, the graph is expanded with new nodes and edges _during execution_. Pretty scary.
- We cannot know ahead of time how much the graph will expand, because iterate nodes' collections are dynamic. Terrifying.
- Multiple iterate nodes combine via Cartesian product, resulting in combinatorial explosion. Your graph could be running at the heat death of the universe. Existential dread.
Batch collections are defined up front and don't expand the graph. We know exactly the complexity we are getting into before the graph executes. Sanity restored!
</details>
Batching also more intuitive - we run exactly this graph, once for each image.
Unlike `Iterate` nodes, `Image Batch` nodes' collections cannot be provided by other nodes in the graph. The collection must be defined up-front, so you cannot replace `Iterate` with `Image Batch` for all use-cases.
Nevertheless, we suggest using batching where possible.
Other Notes
- We've added `Image Batch` nodes first because it images are the highest-impact field type, but the batching API supports arbitrary field types. In fact, the Canvas uses both `int` and `str` fields internally. We'll save nodes for other field types for a future enhancement.
- If you want to batch over a board, you'll need to drag all images from the board into the batch collection. We'll explore a simpler way to use a board's images for a batch in a future enhancement.
- It is not possible to combine all outputs from a batch within the same workflow.
Other Changes
Enhancements
- Support for FLUX IP Adapter v2. **We've optimized internal handling for v2, and you may find FLUX IP Adapter v1 results are degraded. Update to v2 to fix this.**
- Updated image collection inputs for nodes. You may now drag images into collections directly.
- Brought some of dwringer's often-requested [composition nodes](https://github.com/dwringer/composition-nodes) into Invoke's core nodes. They have been renamed to not conflict with your existing install of the node pack. Thanks for your work on these very useful nodes dwringer!
- Show tab-specific info in the Invoke button's tooltip.
- Update the `New from Image` context menu actions. The actions that resize the image after creating a new Canvas are clearly named.
- Change the `Reset Canvas` button, which was too similar to the `Delete Image` button, into a menu with more options:
- New Canvas Session: Resets all generation settings, resets all layers, and enables Send to Canvas.
- New Gallery Session: Resets all generation settings, resets all layers, and enables Send to Gallery.
- Reset Generation Settings: Resets all generation settings, leaving layers alone.
- Reset Canvas Layers: Resets all layers, leaving generation settings alone.
- New Support Videos button in the bottom-left corner of the app, which lists and links to videos on our YouTube channel.
Fixes
- Added padding to the metadata recall buttons in the metadata viewer, so they aren't cut off by other UI elements.
- The progress bar stopped throbbing in the last release. We apologize for this oversight. Throbbing has been restored.
- Addressed some edge cases that could cause the UI to crash with an error about an entity not found.
- Updated grid size for SD3.5 models to 16px. Thanks for the heads up dunkeroni.
Internal
- Removed a node with a GPL-3 dependency (`easing-functions`), which had been contributed in the `step_param_easing` node that used it. While this node has been deprecated, please let us know if you were using this node, and the use-cases, so that we can better design inputs where these are found helpful.
Translations
> We have had some issues communicating with "walk-in" translators on Weblate, resulting in translations being changed when they are already correct. To mitigate this, we are trying a more restricted Weblate translation setup. Access to contribute translations must be granted by Harvester62. Please them in the [translators channel on discord](https://discord.com/channels/1020123559063990373/1054129386447716433) to get access.
> Our Weblate also has an account issue and is currently locked. This is unrelated to the access restriction changes.
We apologize for any inconvenience this change may cause. Thanks to all our translators for their continued efforts!
- Updated Chinese (Simplified). Thanks youo0o0!
- Updated Italian. Thanks Harvester62!
- Updated Spanish. Thanks gallegonovato (weblate user)!
Installation and Updating
To install or update, [download the latest installer](https://github.com/invoke-ai/InvokeAI/releases/download/v5.4.2/InvokeAI-installer-v5.4.2.zip) and follow the [installation instructions](https://invoke-ai.github.io/InvokeAI/installation/installer/)
To update, select the same installation location. Your user data (images, models, etc) will be retained.
What's Changed
* feat(ui): deferred invocation progress details for model loading by maryhipp in https://github.com/invoke-ai/InvokeAI/pull/7320
* fix(ui): add padding to the metadata recall section so buttons are not blocked by maryhipp in https://github.com/invoke-ai/InvokeAI/pull/7326
* ui: translations update from weblate by weblate in https://github.com/invoke-ai/InvokeAI/pull/7323
* remove GPL-3 licensed package easing-functions by maryhipp in https://github.com/invoke-ai/InvokeAI/pull/7337
* fix(ui): progress bar not throbbing when it should by psychedelicious in https://github.com/invoke-ai/InvokeAI/pull/7332
* fix(ui): prevent entity not found errors by psychedelicious in https://github.com/invoke-ai/InvokeAI/pull/7340
* XLabs FLUX IP-Adapter v2 by RyanJDick in https://github.com/invoke-ai/InvokeAI/pull/7338
* feat(ui): image batching in workflows by psychedelicious in https://github.com/invoke-ai/InvokeAI/pull/7343
* fix(ui): add sd-3 grid size of 16px to grid util by psychedelicious in https://github.com/invoke-ai/InvokeAI/pull/7346
* chore: bump version to v5.4.2rc1 by psychedelicious in https://github.com/invoke-ai/InvokeAI/pull/7344
* ui: translations update from weblate by weblate in https://github.com/invoke-ai/InvokeAI/pull/7331
* feat: ingest composition nodes into core by brandonrising in https://github.com/invoke-ai/InvokeAI/pull/7341
* fix(ui): simplify logic for non-local invocation progress alerts by maryhipp in https://github.com/invoke-ai/InvokeAI/pull/7353
* feat(ui): update invoke button tooltip for batching by psychedelicious in https://github.com/invoke-ai/InvokeAI/pull/7350
* feat(ui): change reset canvas icon to "empty" by psychedelicious in https://github.com/invoke-ai/InvokeAI/pull/7351
* feat(ui): clarified new from image menu items by psychedelicious in https://github.com/invoke-ai/InvokeAI/pull/7352
* feat(ui): change reset canvas button to new session menu by psychedelicious in https://github.com/invoke-ai/InvokeAI/pull/7356
* feat(ui): support videos modal by psychedelicious in https://github.com/invoke-ai/InvokeAI/pull/7300
* ui: translations update from weblate by weblate in https://github.com/invoke-ai/InvokeAI/pull/7355
* chore: bump version to v5.4.2 by psychedelicious in https://github.com/invoke-ai/InvokeAI/pull/7354
**Full Changelog**: https://github.com/invoke-ai/InvokeAI/compare/v5.4.1...v5.4.2