invoke-ai/InvokeAI · error · UnsupportedWorkflowNodeError

call_saved_workflow image-generator-backed batch child workf

Error message

call_saved_workflow image-generator-backed batch child workflows require runtime services

What it means

When a batch-collect node inside a called saved workflow pulls its items from an 'image_generator' node, InvokeAI must query the image database via runtime services to enumerate the images. If build_batch_child_workflow_session_results is invoked without a services object (services=None) while generator-item resolution is enabled, the library cannot expand the batch and raises UnsupportedWorkflowNodeError.

Source

Thrown at invokeai/app/services/session_processor/workflow_call_batch.py:589

        node_type = node_data.get("type")
        if not isinstance(node_id, str) or not isinstance(node_type, str):
            continue
        if node_type.endswith("_generator"):
            continue
        if node_type not in SUPPORTED_BATCH_TYPES:
            continue

        field_name = BATCH_FIELD_NAMES[node_type]
        generator_source_id = _resolve_batch_items_from_inputs(node_id, field_name, workflow_edges, workflow_nodes)
        if generator_source_id is not None:
            generator_node = workflow_nodes.get(generator_source_id)
            if generator_node is None:
                raise UnsupportedWorkflowNodeError(
                    f"call_saved_workflow generator-backed batch child workflow is missing generator node '{generator_source_id}'"
                )
            generator_node_type = generator_node["data"].get("type") if _is_invocation_node(generator_node) else None
            if generator_node_type == "image_generator" and services is None and resolve_generator_items:
                raise UnsupportedWorkflowNodeError(
                    "call_saved_workflow image-generator-backed batch child workflows require runtime services"
                )
            batch_items = (
                _resolve_generator_items(generator_node, services, user_id, maximum_children)
                if resolve_generator_items
                else _get_generator_placeholder_items(generator_node)
            )
            used_generator_node_ids.add(generator_source_id)
            if not batch_items:
                raise UnsupportedWorkflowNodeError(
                    f"call_saved_workflow generator-backed batch child workflow node '{generator_source_id}' produced no batch items"
                )
        else:
            batch_items = _get_batch_items(node_data, field_name)
            if not batch_items:
                raise UnsupportedWorkflowNodeError(
                    f"call_saved_workflow batch child workflow node '{node_id}' must provide at least one batch item"
                )

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Pass the application services object (services=...) to build_batch_child_workflow_session_results / build_child_workflow_session_results so image_generator items can be resolved from the database.
  2. If no services are available and you only need placeholder sessions, call with resolve_generator_items=False so _get_generator_placeholder_items is used instead of hitting the DB.
  3. Replace the image_generator wiring in the saved workflow with an inline collection batch node carrying explicit items.
  4. Pre-check the workflow: resolve the batch node's generator source and skip/branch before calling when its type is image_generator and services are unavailable.

Example fix

// before
results = build_child_workflow_session_results(
    parent_session=session, workflow=wf, workflow_inputs=inputs,
    call_frame=frame, maximum_children=10)
// after
results = build_child_workflow_session_results(
    parent_session=session, workflow=wf, workflow_inputs=inputs,
    call_frame=frame, maximum_children=10,
    services=services, user_id=user_id)
Defensive patterns

Strategy: validation

Validate before calling

def generator_needs_services(workflow):
    for node in workflow.get("nodes", []):
        if node.get("data", {}).get("type") == "image_generator":
            return True
    return False
if generator_needs_services(wf) and services is None:
    raise ValueError("image_generator batch requires services")

Type guard

def has_services(services) -> bool:
    return services is not None

Try / catch

try:
    results = build_child_workflow_session_results(..., services=services)
except UnsupportedWorkflowNodeError as e:
    if "require runtime services" in str(e):
        results = build_child_workflow_session_results(..., resolve_generator_items=False)

Prevention

When it happens

Trigger: Calling build_batch_child_workflow_session_results (or build_child_workflow_session_results) with a saved workflow whose batch node (e.g. batch/iterate) is wired to an image_generator node, without passing services, while resolve_generator_items=True (the default).

Common situations: Unit tests or tooling that build child sessions in isolation without dependency injection; offline/preprocessing scripts that call the batch builder directly; calling build_batch_child_workflow_sessions instead of the placeholder-based variant.

Related errors


AI-assisted analysis of invoke-ai/InvokeAI@0b6a024f2f (2026-08-29). Data as JSON: /api/errors/e6e0ede5c97e7f4a. Report an issue: GitHub.