Skip to content

v5.12.0

Latest
Compare
Choose a tag to compare
@psychedelicious psychedelicious released this 22 May 04:59
· 81 commits to main since this release

This release includes support for Nvidia 50xx GPUs, a way to relate models (e.g. LoRAs with a specific main model), new IP Adapter methods and other smaller changes..

Changes

  • Bumped PyTorch dependency to v2.7.0, which means Invoke now supports Nvidia 50xx GPUs.
  • New model relationship feature. In the model manager tab, you may "link" two models. At this time, the primary intended use case is to link LoRAs to main models. When you have the main model selected, the linked LoRAs will be at the top of the LoRA list. Thanks @xiaden!
  • New IP Adapter methods Style (Strong) and Style (Precise). The previous style method is renamed to Style (Simple). Thanks @cubiq!
  • Fixed GGUF quantization on MPS. Thanks @Vargol!
  • Updated translations. Thanks @Harvester62 @rikublock @Linos1391 @RyoK0220!
  • Internal: Invocation model changes, which aim to reduce occurrences of ValidationError errors.
  • Internal: Addressed pydantic deprecation warning.
  • Internal: Re-enabled new model classification API with safeguards.

🚨 Stricter Rules for Nodes, including Custom Nodes

This section is for node authors, whose nodes may be affected by the stricter rules.

Default values for node fields are now validated as the app starts up.

For example, this node defines my_image as an ImageField, but it provides a default value of None, which is not a valid ImageField:

@invocation("my_invocation")
class MyInvocation(BaseInvocation):
    my_image: ImageField = InputField(default=None)
    
    def invoke(self, context: InvocationContext) -> ImageOutput:
        ...

This node will error on app startup:

# 😱 Error on startup!
InvalidFieldError: Default value for field "my_image" on invocation "my_invocation" is invalid, 1 validation error for MyInvocation
my_image
  Input should be a valid dictionary or instance of ImageField [type=model_type, input_value=None, input_type=NoneType]

There are two ways to fix this, depending on the node author's intention.

1. If the field is truly optional, update the type annotation.

Using the example invocation from above, make the type annotation for my_image a union with None:

@invocation("my_invocation")
class MyInvocation(BaseInvocation):
    my_image: ImageField | None = InputField(default=None)

    def invoke(self, context: InvocationContext) -> ImageOutput:
        ...

ImageField | None is equivalent to Optional[ImageField]. Either works.

2. If the field is not optional, remove the default or provide a valid default value.

Using the example invocation from above, simply remove default=None:

@invocation("my_invocation")
class MyInvocation(BaseInvocation):
    my_image: ImageField = InputField()

    def invoke(self, context: InvocationContext) -> ImageOutput:
        ...

This node has an integer field that must be greater than 10, but the provided default value of 5. This will error:

@invocation("my_other_invocation")
class MyOtherInvocation(BaseInvocation):
    my_number: int = InputField(default=5, gt=10)

    def invoke(self, context: InvocationContext) -> IntegerOutput:
        ...

Either remove the default, or provide a default value greater than 10.

Installing and Updating

The new Invoke Launcher is the recommended way to install, update and run Invoke. It takes care of a lot of details for you - like installing the right version of python - and runs Invoke as a desktop application.

Follow the Quick Start guide to get started with the launcher.

If you don't want to use the launcher, or need a headless install, you can follow the manual install guide.

What's Changed

New Contributors

Full Changelog: v5.11.0...v5.12.0