{"record":{"id":"3771d20ec30ee4f7","repo":"invoke-ai/InvokeAI","slug":"call-saved-workflow-input-input-name-targets-m-3771d2","errorCode":null,"errorMessage":"call_saved_workflow input '{input_name}' targets missing child workflow field '{field_name}'","messagePattern":"call_saved_workflow input '(.+?)' targets missing child workflow field '(.+?)'","errorType":"validation","errorClass":"InvalidWorkflowInputError","httpStatus":400,"severity":"error","filePath":"invokeai/app/services/shared/workflow_graph_builder.py","lineNumber":153,"sourceCode":"                and _is_mapping(node.get(\"data\"))\n                and node.get(\"id\") == node_id\n                and node[\"data\"].get(\"id\") == node_id\n            ),\n            None,\n        )\n        if matching_node is None:\n            raise InvalidWorkflowInputError(\n                f\"call_saved_workflow input '{input_name}' targets missing child workflow node '{node_id}'\"\n            )\n        matching_node_data = matching_node[\"data\"]\n        node_type = matching_node_data.get(\"type\")\n        if not isinstance(node_type, str):\n            raise InvalidWorkflowInputError(\n                f\"call_saved_workflow input '{input_name}' targets missing child workflow node '{node_id}'\"\n            )\n        invocation_class = InvocationRegistry.get_invocation_for_type(node_type)\n        if invocation_class is None or field_name not in invocation_class.model_fields:\n            raise InvalidWorkflowInputError(\n                f\"call_saved_workflow input '{input_name}' targets missing child workflow field '{field_name}'\"\n            )\n        inputs = matching_node_data.setdefault(\"inputs\", {})\n        if not _is_mapping(inputs):\n            raise InvalidWorkflowInputError(\n                f\"call_saved_workflow input '{input_name}' targets invalid child workflow inputs on '{node_id}'\"\n            )\n        inputs[field_name] = {\"value\": value}\n\n\ndef apply_workflow_inputs_to_graph(\n    graph: Graph, workflow: Mapping[str, Any], workflow_inputs: Mapping[str, Any]\n) -> None:\n    if not workflow_inputs:\n        return\n\n    mutable_workflow = dict(workflow)\n    apply_workflow_inputs_to_workflow(mutable_workflow, workflow_inputs)","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/services/shared/workflow_graph_builder.py#L135-L171","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Update the field name in the input key to the current field on the invocation (check the node type's model fields).","Upgrade or reinstall the custom node pack that provides the invocation type if it resolves to None.","Pin the application version matching the workflow's original field names, or migrate saved workflows after upgrades."],"exampleFix":"// before: field renamed by upgrade\ninputs = {\"call_saved_workflow:13:positive_prompt\": \"cat\"}\n// after\ninputs = {\"call_saved_workflow:13:prompt\": \"cat\"}","handlingStrategy":"validation","validationCode":"from invokeai.app.invocations.baseinvocation import InvocationRegistry\nfor name in workflow_inputs:\n    node_id, field = parse_call_saved_workflow_dynamic_input(name)\n    node = next(n for n in workflow[\"nodes\"] if n.get(\"id\") == node_id)\n    cls = InvocationRegistry.get_invocation_for_type(node[\"data\"][\"type\"])\n    if cls is None or field not in cls.model_fields:\n        raise ValueError(f\"'{field}' is not a field of node '{node_id}' ({type(cls).__name__ if cls else 'unregistered'})\")","typeGuard":"def field_is_settable(node: dict, field: str) -> bool:\n    cls = InvocationRegistry.get_invocation_for_type(node[\"data\"].get(\"type\"))\n    return cls is not None and field in cls.model_fields","tryCatchPattern":"try:\n    apply_workflow_inputs_to_workflow(workflow, workflow_inputs)\nexcept InvalidWorkflowInputError as e:\n    if \"missing child workflow field\" in str(e):\n        log.warning(\"dropping stale field after upgrade: %s\", e)\n        valid = {k: v for k, v in workflow_inputs.items() if k != offending_input}\n        apply_workflow_inputs_to_workflow(workflow, valid)\n    else:\n        raise","preventionTips":["After upgrading the app or node packs, regenerate saved batch input keys.","Check the invocation's model_fields for the exact field name instead of guessing.","Pin app versions for workflows that rely on stable field names.","Test saved workflows on a scratch session before batch runs."],"tags":["workflow","validation","input"],"backgroundTag":"workflow-field-not-found","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}