{"record":{"id":"d8bee9953ddf0555","repo":"invoke-ai/InvokeAI","slug":"call-saved-workflow-generator-node-generator-nod","errorCode":null,"errorMessage":"call_saved_workflow generator node '{generator_node_data.get('id')}' is missing generator input","messagePattern":"call_saved_workflow generator node '(.+?)' is missing generator input","errorType":"exception","errorClass":"UnsupportedWorkflowNodeError","httpStatus":null,"severity":"error","filePath":"invokeai/app/services/session_processor/workflow_call_batch.py","lineNumber":410,"sourceCode":"        \"integer_generator_linear_distribution\",\n        \"integer_generator_random_distribution_uniform\",\n        \"string_generator_dynamic_prompts_random\",\n    }:\n        return int(value.get(\"count\", 10))\n    return None\n\n\ndef _resolve_generator_items(\n    generator_node: Mapping[str, Any], services: Any, user_id: str | None, maximum_items: int\n) -> list[Any]:\n    generator_node_data = generator_node[\"data\"]\n    node_type = generator_node_data.get(\"type\")\n    inputs = generator_node_data.get(\"inputs\")\n    if not isinstance(node_type, str) or not _is_mapping(inputs):\n        raise UnsupportedWorkflowNodeError(\"call_saved_workflow generator node is malformed\")\n    generator_input = inputs.get(\"generator\")\n    if not _is_mapping(generator_input):\n        raise UnsupportedWorkflowNodeError(\n            f\"call_saved_workflow generator node '{generator_node_data.get('id')}' is missing generator input\"\n        )\n    generator_value = generator_input.get(\"value\")\n    if not _is_mapping(generator_value):\n        raise UnsupportedWorkflowNodeError(\n            f\"call_saved_workflow generator node '{generator_node_data.get('id')}' has invalid generator value\"\n        )\n    declared_item_count = _get_declared_generator_item_count(generator_value)\n    if declared_item_count is not None and declared_item_count > maximum_items:\n        raise TooManySessionsError(\"call_saved_workflow exceeds remaining queue capacity for child workflow executions\")\n    if node_type == \"integer_generator\":\n        return _resolve_integer_generator(generator_value)\n    if node_type == \"float_generator\":\n        return _resolve_float_generator(generator_value)\n    if node_type == \"string_generator\":\n        return _resolve_string_generator(generator_value)\n    if node_type == \"image_generator\":\n        return _resolve_image_generator(generator_value, services, user_id)","sourceCodeStart":392,"sourceCodeEnd":428,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/services/session_processor/workflow_call_batch.py#L392-L428","documentation":"After confirming the node is otherwise well-formed, _resolve_generator_items looks for inputs.generator and requires it to be a mapping. A missing or non-mapping 'generator' input means the node has no generator configuration, so it raises this error naming the offending node id.","triggerScenarios":"An integer/float/string/image generator node whose data.inputs either omits the 'generator' key or stores a non-mapping (e.g. a plain value or list) at inputs.generator.","commonSituations":"Older workflow formats where generator config lived elsewhere; workflow JSON edited by scripts that wrote generator config at the wrong level; partially migrated saved workflows.","solutions":["Add a valid mapping under data.inputs.generator of the generator node (with a 'value' mapping inside)","Re-save the workflow from the InvokeAI UI to regenerate the correct input structure","Delete and re-add the generator node to recreate its default inputs"],"exampleFix":"// before\n{\"data\": {\"type\": \"string_generator\", \"inputs\": {\"count\": {\"value\": 5}}}}\n// after\n{\"data\": {\"type\": \"string_generator\", \"inputs\": {\"generator\": {\"value\": {\"count\": 5, \"start\": 0, \"stop\": 10, \"step\": 1}}}}}","handlingStrategy":"validation","validationCode":"inputs = node[\"data\"][\"inputs\"]\nif not isinstance(inputs.get(\"generator\"), dict):\n    raise ValueError(f\"generator node {node['data']['id']} lacks a mapping inputs.generator\")","typeGuard":"def has_generator_input(node: dict) -> TypeGuard[dict]:\n    return isinstance(node.get(\"data\", {}).get(\"inputs\", {}).get(\"generator\"), Mapping)","tryCatchPattern":"try:\n    build_batch_child_workflow_session_results(...)\nexcept UnsupportedWorkflowNodeError as e:\n    if \"missing generator input\" in str(e):\n        fix_node_generator_input(extract_node_id(str(e)))","preventionTips":["Create generator nodes via the canvas so inputs.generator is always populated","Sanity-check workflow JSON after any scripted transformation","Test queued workflows on a dev queue before production"],"tags":["workflow","missing-input","schema-validation"],"backgroundTag":"missing-required-field","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}