{"record":{"id":"0b1ab1dfbd030b14","repo":"invoke-ai/InvokeAI","slug":"call-saved-workflow-generator-backed-batch-child-w-0b1ab1","errorCode":null,"errorMessage":"call_saved_workflow generator-backed batch child workflow node '{generator_source_id}' produced no batch items","messagePattern":"call_saved_workflow generator-backed batch child workflow node '(.+?)' produced no batch items","errorType":"validation","errorClass":"UnsupportedWorkflowNodeError","httpStatus":null,"severity":"error","filePath":"invokeai/app/services/session_processor/workflow_call_batch.py","lineNumber":599,"sourceCode":"        if generator_source_id is not None:\n            generator_node = workflow_nodes.get(generator_source_id)\n            if generator_node is None:\n                raise UnsupportedWorkflowNodeError(\n                    f\"call_saved_workflow generator-backed batch child workflow is missing generator node '{generator_source_id}'\"\n                )\n            generator_node_type = generator_node[\"data\"].get(\"type\") if _is_invocation_node(generator_node) else None\n            if generator_node_type == \"image_generator\" and services is None and resolve_generator_items:\n                raise UnsupportedWorkflowNodeError(\n                    \"call_saved_workflow image-generator-backed batch child workflows require runtime services\"\n                )\n            batch_items = (\n                _resolve_generator_items(generator_node, services, user_id, maximum_children)\n                if resolve_generator_items\n                else _get_generator_placeholder_items(generator_node)\n            )\n            used_generator_node_ids.add(generator_source_id)\n            if not batch_items:\n                raise UnsupportedWorkflowNodeError(\n                    f\"call_saved_workflow generator-backed batch child workflow node '{generator_source_id}' produced no batch items\"\n                )\n        else:\n            batch_items = _get_batch_items(node_data, field_name)\n            if not batch_items:\n                raise UnsupportedWorkflowNodeError(\n                    f\"call_saved_workflow batch child workflow node '{node_id}' must provide at least one batch item\"\n                )\n        batch_group_id = _get_batch_group_id(node_data)\n        destinations = _resolve_batch_destinations(node_id, field_name, workflow_nodes, workflow_edges)\n        if not destinations:\n            raise UnsupportedWorkflowNodeError(\n                f\"call_saved_workflow batch child workflow node '{node_id}' is not connected to any invocation input\"\n            )\n        group_batch_data = batch_data_by_group.setdefault(batch_group_id, [])\n        for destination_node_id, destination_field in destinations:\n            group_batch_data.append(\n                BatchDatum(","sourceCodeStart":581,"sourceCodeEnd":617,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/services/session_processor/workflow_call_batch.py#L581-L617","documentation":"A batch node whose items come from a generator node (e.g. rand_int_generator, range_generator, image_generator) resolved to an empty item list after expansion. InvokeAI refuses to build child sessions for an empty batch because it would produce zero child workflow executions.","triggerScenarios":"build_batch_child_workflow_session_results encounters a generator-backed batch node where _resolve_generator_items returns [] (e.g. image_generator matching no images, range generator with empty range, or placeholder resolution yielding nothing).","commonSituations":"Saved workflow wired to an image_generator whose gallery/collection has no images under the given user; a range/iteration generator configured with zero count; deleting the source images between workflow save and call.","solutions":["Ensure the generator node actually yields items: for image_generator, verify matching images exist for the user; for range/count-based generators, set a count >= 1.","Check the generator node's configuration in the saved workflow (seed/count/collection fields) and correct it in the workflow editor before calling.","If placeholders are acceptable, call with resolve_generator_items=False so placeholder items are derived from the node itself.","Wrap the call and surface a user-facing message to fix the generator configuration, retrying only after the generator yields items."],"exampleFix":"// before (range generator with count 0)\n{\"id\":\"g1\",\"data\":{\"type\":\"range_generator\",\"count\":0}}\n// after\n{\"id\":\"g1\",\"data\":{\"type\":\"range_generator\",\"count\":5}}","handlingStrategy":"validation","validationCode":"def generator_yields_items(gen_node):\n    t = gen_node.get(\"data\", {}).get(\"type\", \"\")\n    if t == \"image_generator\":\n        return len(services.images.get_many_by_user(...).items) > 0\n    if t in (\"range_generator\", \"rand_int_generator\"):\n        return gen_node[\"data\"].get(\"count\", 0) > 0\n    return True","typeGuard":"def is_generator_node(node) -> bool:\n    return isinstance(node, dict) and str(node.get(\"data\", {}).get(\"type\", \"\")).endswith(\"_generator\")","tryCatchPattern":"try:\n    results = build_batch_child_workflow_session_results(...)\nexcept UnsupportedWorkflowNodeError as e:\n    if \"produced no batch items\" in str(e):\n        fix_generator_config(e)  # surface to user, do not retry blindly","preventionTips":["Verify generator counts/collections are non-empty before enqueueing workflow calls","Check image existence for image_generator-backed workflows at save time","Re-validate saved workflows after editing or importing","Never assume placeholder resolution returns items without resolve_generator_items=False"],"tags":["invokeai","batch","workflow-call","empty-collection"],"backgroundTag":"batch-generator-produced-no-items","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}