{"record":{"id":"cc4951abe1b9eec4","repo":"invoke-ai/InvokeAI","slug":"call-saved-workflow-does-not-yet-support-connected","errorCode":null,"errorMessage":"call_saved_workflow does not yet support connected batch child workflow inputs on node '{node_id}'","messagePattern":"call_saved_workflow does not yet support connected batch child workflow inputs on node '(.+?)'","errorType":"exception","errorClass":"UnsupportedWorkflowNodeError","httpStatus":null,"severity":"error","filePath":"invokeai/app/services/session_processor/workflow_call_batch.py","lineNumber":542,"sourceCode":"    incoming_source_ids = [edge.get(\"source\") for edge in incoming_edges if isinstance(edge.get(\"source\"), str)]\n    if len(incoming_source_ids) != 1:\n        raise UnsupportedWorkflowNodeError(\n            f\"call_saved_workflow does not yet support multiple connected batch inputs on node '{node_id}'\"\n        )\n    source_id = incoming_source_ids[0]\n    source_node = workflow_nodes.get(source_id)\n    if _is_invocation_node(source_node) and source_node[\"data\"].get(\"type\", \"\").endswith(\"_generator\"):\n        return source_id\n    if _is_connector_node(source_node):\n        resolved_source = _resolve_connector_source(source_id, workflow_nodes, workflow_edges)\n        if resolved_source is not None:\n            resolved_source_id, _resolved_source_handle = resolved_source\n            resolved_source_node = workflow_nodes.get(resolved_source_id)\n            if _is_invocation_node(resolved_source_node) and resolved_source_node[\"data\"].get(\"type\", \"\").endswith(\n                \"_generator\"\n            ):\n                return resolved_source_id\n    raise UnsupportedWorkflowNodeError(\n        f\"call_saved_workflow does not yet support connected batch child workflow inputs on node '{node_id}'\"\n    )\n\n\ndef build_batch_child_workflow_session_results(\n    *,\n    parent_session: GraphExecutionState,\n    workflow: Mapping[str, Any],\n    workflow_inputs: Mapping[str, Any],\n    call_frame: WorkflowCallFrame,\n    maximum_children: int,\n    services: Any = None,\n    user_id: str | None = None,\n    resolve_generator_items: bool = True,\n) -> list[GraphExecutionState]:\n    mutable_workflow = copy.deepcopy(workflow)\n    apply_workflow_inputs_to_workflow(mutable_workflow, workflow_inputs)\n","sourceCodeStart":524,"sourceCodeEnd":560,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/services/session_processor/workflow_call_batch.py#L524-L560","documentation":"When a batch field's incoming edge traces back (through connector nodes) to something other than a direct generator invocation node, _resolve_batch_items_from_inputs cannot resolve a generator source and raises this error. Connected batch child workflow inputs that aren't generator-backed are not supported.","triggerScenarios":"A batch node's field is fed via a connector node or by a non-generator invocation node, and the resolved source chain never terminates at a *_generator node.","commonSituations":"Routing batch items through intermediate nodes (collectors, passthroughs) before the batch node; connecting an image node's output to a batch input; complex sub-workflow nesting.","solutions":["Connect the batch field directly to a *_generator invocation node output","Remove intermediate connector/non-generator nodes from the batch input path","Restructure the workflow so batch items originate from a supported generator node"],"exampleFix":"// before: image node output wired into batch input\n{\"target\": \"batch-1\", \"targetHandle\": \"images\", \"source\": \"img-7\", \"type\": \"default\"}\n// after: wire from the generator instead\n{\"target\": \"batch-1\", \"targetHandle\": \"images\", \"source\": \"image_generator-1\", \"type\": \"default\"}","handlingStrategy":"validation","validationCode":"for e in workflow.get(\"edges\", []):\n    if e.get(\"target\") in batch_node_ids and e.get(\"type\") == \"default\":\n        src = workflow_nodes_by_id.get(e.get(\"source\"))\n        if not (src and src.get(\"data\", {}).get(\"type\", \"\").endswith(\"_generator\")):\n            raise ValueError(f\"batch input on {e['target']} must come directly from a *_generator node\")","typeGuard":"def is_generator_source(node: object) -> TypeGuard[dict]:\n    return (isinstance(node, Mapping) and node.get(\"type\") == \"invocation\"\n            and str(node.get(\"data\", {}).get(\"type\", \"\")).endswith(\"_generator\"))","tryCatchPattern":"try:\n    build_batch_child_workflow_session_results(...)\nexcept UnsupportedWorkflowNodeError as e:\n    if \"connected batch child workflow inputs\" in str(e):\n        rewire_batch_input_to_generator(extract_node_id(str(e)))","preventionTips":["Connect batch fields directly to generator node outputs, no intermediaries","Avoid routing batch items through collectors or passthrough nodes","Keep sub-workflow nesting shallow and generator-backed"],"tags":["workflow","graph-edges","unsupported-feature"],"backgroundTag":"unsupported-workflow-node","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}