Skip to content

14 bundled default workflows pin stale invocation versions; the registry test only covers the video ones #116

Description

@lstein

Summary

14 of the 31 bundled workflows in invokeai/app/services/workflow_records/default_workflows/ pin invocation versions that no longer match the invocations they reference. Three reference node types that have been deleted from the registry outright, and two carry inputs that are no longer fields of the invocation.

Nothing catches this. tests/app/services/workflow_records/test_default_workflows_registry.py asserts exactly these invariants — every node type registered, every embedded version equal to the invocation's, every embedded input a real field — but only over a glob of the Wan and MiniMax H3 video workflows. The other 14 files are never checked, so the drift accumulated silently.

User-visible effect

getNeedsUpdate (invokeai/frontend/web/src/features/nodes/util/node/nodeUpdate.ts:32) flags any string inequality, so a user opening e.g. Text to Image - SD1.5 sees "needs update" badges on five of its nodes. Where only the minor differs, getMayUpdateNode permits an in-place update, so it is mostly cosmetic noise. Where it is not:

  • flux_denoise is pinned 3.0.0 against a current 4.6.0 in FLUX Image to Image and Flux Text to Image — a major-version gap, which is exactly the case in-place update refuses.
  • Those same two files list flux_denoise.board and flux_denoise.metadata as inputs. FluxDenoiseInvocation no longer inherits WithBoard/WithMetadata, so neither is a field any more and both are dropped on load.
  • Three files reference node types that no longer exist at all, so those nodes cannot render:
    • canny_image_processorESRGAN Upscaling with Canny ControlNet, Face Detailer with IP-Adapter & Canny, Multi ControlNet (Canny & Depth)
    • midas_depth_image_processorMulti ControlNet (Canny & Depth)

Full report

Generated against the live InvocationRegistry.

Deleted node types

Workflow Missing node type
ESRGAN Upscaling with Canny ControlNet canny_image_processor
Face Detailer with IP-Adapter & Canny canny_image_processor
Multi ControlNet (Canny & Depth) canny_image_processor, midas_depth_image_processor

Inputs that are no longer fields

Workflow Input
FLUX Image to Image flux_denoise.board, flux_denoise.metadata
Flux Text to Image flux_denoise.board, flux_denoise.metadata

Version drift

Distinct invocations, with the pinned value(s) found and the current version:

Invocation Pinned Current
cogview4_denoise 1.0.0 1.1.0
collect 1.0.0 1.1.0
compel 1.2.0 1.2.1
controlnet 1.1.2 1.1.3
denoise_latents 1.5.3 1.6.0
flux_denoise 3.0.0 4.6.0
flux_model_loader 1.0.4 1.1.0
flux_text_encoder 1.0.0 1.1.2
flux_vae_decode 1.0.0 1.0.2
flux_vae_encode 1.0.0 1.0.1
i2l 1.1.0 1.2.0
ip_adapter 1.4.1 1.5.1
l2i 1.3.0 1.3.2
lora_loader 1.0.3 1.0.4
main_model_loader 1.0.3 1.0.4
model_identifier 1.0.0 1.0.1
noise 1.0.2 1.1.0
sd3_denoise 1.0.0 1.2.0
sd3_l2i 1.3.0 1.3.2
sd3_model_loader 1.0.0 1.0.1
sd3_text_encoder 1.0.0 1.0.1
sdxl_compel_prompt 1.2.0 1.2.1
sdxl_model_loader 1.0.3 1.0.4
tiled_multi_diffusion_denoise_latents 1.0.0 1.0.1
vae_loader 1.0.3 1.0.4

Affected workflows: CogView4_TextToImage, ESRGAN Upscaling with Canny ControlNet, FLUX Image to Image, Face Detailer with IP-Adapter & Canny, Flux Text to Image, Multi ControlNet (Canny & Depth), MultiDiffusion SD1.5, MultiDiffusion SDXL, Prompt from File, SD3.5 Text to Image, Text to Image - SD1.5, Text to Image - SDXL, Text to Image with LoRA, Tiled Upscaling (Beta).

Clean (17): all Wan and MiniMax H3 video workflows, plus Wan 2.2 Image to Image and Wan 2.2 Text to Image — i.e. exactly the set the existing test covers.

Suggested fix

  1. Widen test_default_workflows_registry.py from its Wan/MiniMax glob to the whole default_workflows directory, so this cannot drift again.
  2. Re-pin the versions and drop the two dead flux_denoise inputs. Mostly mechanical — a script can re-pin from the registry.
  3. Decide what to do about the three workflows referencing deleted node types: repoint them at the replacement processors, or retire the workflows.

Steps 1 and 2 should land together, since widening the test fails until the files are re-pinned.

Reproduction

import glob, json
from invokeai.app.invocations.baseinvocation import InvocationRegistry
from invokeai.app.services.shared.graph import Graph  # registers invocations

by_type = {i.get_type(): i for i in InvocationRegistry.get_invocation_classes()}
for path in sorted(glob.glob("invokeai/app/services/workflow_records/default_workflows/*.json")):
    for node in json.load(open(path))["nodes"]:
        data = node["data"]
        cls = by_type.get(data["type"])
        if cls is None:
            print(f"{path}: unknown node type {data['type']}")
            continue
        if data.get("version") != cls.UIConfig.version:
            print(f"{path}: {data['type']} pinned {data['version']} != {cls.UIConfig.version}")
        for field in data.get("inputs", {}):
            if field not in cls.model_fields:
                print(f"{path}: {data['type']}.{field} is not a field")

Found while reviewing #113, which touches the video workflows in the same directory.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions