invoke-ai/InvokeAI · error · ValueError

'${field_name}' is not a call_saved_workflow dynamic input f

Error message

'${field_name}' is not a call_saved_workflow dynamic input field

What it means

parse_call_saved_workflow_dynamic_input() raises ValueError when given a field name that lacks the call_saved_workflow dynamic-field prefix. These special field names encode '<node_id>::<input_field_name>' and are generated for sub-workflow (call_saved_workflow) invocations; anything not starting with the prefix is not parseable.

Source

Thrown at invokeai/app/invocations/call_saved_workflow.py:18

from typing import Any

from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation
from invokeai.app.invocations.fields import InputField, UIType
from invokeai.app.invocations.workflow_return import WorkflowReturnOutput
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.app.services.workflow_records.workflow_records_common import WorkflowCategory, WorkflowNotFoundError

CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX = "saved_workflow_input::"


def is_call_saved_workflow_dynamic_input(field_name: str) -> bool:
    return field_name.startswith(CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX)


def parse_call_saved_workflow_dynamic_input(field_name: str) -> tuple[str, str]:
    if not is_call_saved_workflow_dynamic_input(field_name):
        raise ValueError(f"'{field_name}' is not a call_saved_workflow dynamic input field")

    raw_identifier = field_name.removeprefix(CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX)
    node_id, separator, input_field_name = raw_identifier.rpartition("::")
    if not separator or not node_id or not input_field_name:
        raise ValueError(f"Invalid call_saved_workflow dynamic input field '{field_name}'")

    return node_id, input_field_name


@invocation(
    "call_saved_workflow",
    title="Call Saved Workflow",
    tags=["workflow", "saved", "library"],
    category="workflow",
    version="1.0.0",
    use_cache=False,
    classification=Classification.Beta,
)

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Filter inputs through is_call_saved_workflow_dynamic_input() before parsing; skip or handle non-dynamic fields separately.
  2. Construct the field name with the dynamic prefix: prefix + node_id + '::' + input_field_name.
  3. Check callers (_build_compatibility_workflow_inputs, apply_workflow_inputs_to_workflow/graph) so only dynamic fields reach this parser.

Example fix

// before
node_id, field = parse_call_saved_workflow_dynamic_input(name)  # ValueError on plain names

// after
if is_call_saved_workflow_dynamic_input(name):
    node_id, field = parse_call_saved_workflow_dynamic_input(name)
else:
    continue  # or handle as a plain input
Defensive patterns

Strategy: type-guard

Validate before calling

CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX = "call_saved_workflow_input_"  # adjust to actual constant
assert field_name.startswith(CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX), f"{field_name} is not a dynamic input"

Type guard

def is_dynamic_input(field_name: str) -> bool:
    return field_name.startswith(CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX)

Try / catch

try:
    node_id, field = parse_call_saved_workflow_dynamic_input(field_name)
except ValueError:
    node_id, field = None, None  # not a dynamic field; handle as plain input

Prevention

When it happens

Trigger: Calling parse_call_saved_workflow_dynamic_input on a plain input field name (e.g. 'image' or 'prompt') that was not generated with the dynamic prefix, e.g. from apply_workflow_inputs_to_graph / _build_compatibility_workflow_inputs iterating arbitrary workflow inputs.

Common situations: Passing regular workflow inputs to the compatibility layer which only accepts prefixed dynamic inputs; custom tooling building field names without the required CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX.

Related errors


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