invoke-ai/InvokeAI · error · InvalidWorkflowInputError

call_saved_workflow input '{input_name}' targets missing chi

Error message

call_saved_workflow input '{input_name}' targets missing child workflow field '{field_name}'

What it means

The targeted node resolves to a registered invocation type, but the input's field_name is not a declared model field of that invocation class (or the type isn't registered at all). The input targets a field that does not exist on the node's invocation.

Source

Thrown at invokeai/app/services/shared/workflow_graph_builder.py:153

                and _is_mapping(node.get("data"))
                and node.get("id") == node_id
                and node["data"].get("id") == node_id
            ),
            None,
        )
        if matching_node is None:
            raise InvalidWorkflowInputError(
                f"call_saved_workflow input '{input_name}' targets missing child workflow node '{node_id}'"
            )
        matching_node_data = matching_node["data"]
        node_type = matching_node_data.get("type")
        if not isinstance(node_type, str):
            raise InvalidWorkflowInputError(
                f"call_saved_workflow input '{input_name}' targets missing child workflow node '{node_id}'"
            )
        invocation_class = InvocationRegistry.get_invocation_for_type(node_type)
        if invocation_class is None or field_name not in invocation_class.model_fields:
            raise InvalidWorkflowInputError(
                f"call_saved_workflow input '{input_name}' targets missing child workflow field '{field_name}'"
            )
        inputs = matching_node_data.setdefault("inputs", {})
        if not _is_mapping(inputs):
            raise InvalidWorkflowInputError(
                f"call_saved_workflow input '{input_name}' targets invalid child workflow inputs on '{node_id}'"
            )
        inputs[field_name] = {"value": value}


def apply_workflow_inputs_to_graph(
    graph: Graph, workflow: Mapping[str, Any], workflow_inputs: Mapping[str, Any]
) -> None:
    if not workflow_inputs:
        return

    mutable_workflow = dict(workflow)
    apply_workflow_inputs_to_workflow(mutable_workflow, workflow_inputs)

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Update the field name in the input key to the current field on the invocation (check the node type's model fields).
  2. Upgrade or reinstall the custom node pack that provides the invocation type if it resolves to None.
  3. Pin the application version matching the workflow's original field names, or migrate saved workflows after upgrades.

Example fix

// before: field renamed by upgrade
inputs = {"call_saved_workflow:13:positive_prompt": "cat"}
// after
inputs = {"call_saved_workflow:13:prompt": "cat"}
Defensive patterns

Strategy: validation

Validate before calling

from invokeai.app.invocations.baseinvocation import InvocationRegistry
for name in workflow_inputs:
    node_id, field = parse_call_saved_workflow_dynamic_input(name)
    node = next(n for n in workflow["nodes"] if n.get("id") == node_id)
    cls = InvocationRegistry.get_invocation_for_type(node["data"]["type"])
    if cls is None or field not in cls.model_fields:
        raise ValueError(f"'{field}' is not a field of node '{node_id}' ({type(cls).__name__ if cls else 'unregistered'})")

Type guard

def field_is_settable(node: dict, field: str) -> bool:
    cls = InvocationRegistry.get_invocation_for_type(node["data"].get("type"))
    return cls is not None and field in cls.model_fields

Try / catch

try:
    apply_workflow_inputs_to_workflow(workflow, workflow_inputs)
except InvalidWorkflowInputError as e:
    if "missing child workflow field" in str(e):
        log.warning("dropping stale field after upgrade: %s", e)
        valid = {k: v for k, v in workflow_inputs.items() if k != offending_input}
        apply_workflow_inputs_to_workflow(workflow, valid)
    else:
        raise

Prevention

When it happens

Trigger: apply_workflow_inputs_to_workflow: InvocationRegistry.get_invocation_for_type(node_type) returns None, or field_name (from parse_call_saved_workflow_dynamic_input) not in invocation_class.model_fields.

Common situations: App or custom-node upgrade renamed/removed the invocation field while old saved batch inputs still reference it; typo in the field segment of the input name; targeting connection-only fields that are not settable model fields.

Related errors


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