invoke-ai/InvokeAI · error · ValueError
Workflow call did not produce any child executions.
Error message
Workflow call did not produce any child executions.
What it means
After the boundary setup, the parent queue item is marked 'waiting' and a child queue item must exist. If child_queue_item is still None (no child was successfully enqueued and none of the earlier failures fired), the runtime raises ValueError because a workflow call with zero children is a no-op / broken state.
Source
Thrown at invokeai/app/services/session_processor/workflow_call_runtime.py:117
self._session_runner._services.session_queue.save_queue_item_session(queue_item.item_id, queue_item.session)
for child_result in child_session_results:
child_queue_item = self._session_runner._services.session_queue.enqueue_workflow_call_child(
parent_queue_item=queue_item,
child_session=child_result.session,
field_values=child_result.field_values,
)
enqueued_child_item_ids.append(child_queue_item.item_id)
queue_item.session.set_waiting_workflow_call_child_item_ids(enqueued_child_item_ids)
self._session_runner._services.session_queue.save_queue_item_session(queue_item.item_id, queue_item.session)
self._session_runner._services.session_queue.suspend_queue_item(queue_item.item_id, queue_item=queue_item)
except Exception as e:
if enqueued_child_item_ids:
self._session_runner._services.session_queue.delete_queue_items_by_id(enqueued_child_item_ids)
queue_item.session.end_waiting_on_workflow_call(status="failed", error_message=str(e))
raise
queue_item.status = "waiting"
if child_queue_item is None:
raise ValueError("Workflow call did not produce any child executions.")
return child_queue_item
class WorkflowCallQueueLifecycle:
"""Coordinates queue-visible child workflow execution and parent lifecycle transitions."""
def __init__(self, session_runner: DefaultSessionRunner) -> None:
self._session_runner = session_runner
@staticmethod
def get_waiting_workflow_call_invocation(queue_item: SessionQueueItem) -> CallSavedWorkflowInvocation:
waiting_frame = queue_item.session.waiting_workflow_call
if waiting_frame is None:
raise ValueError("Execution state is not waiting on a workflow call.")
invocation = queue_item.session.execution_graph.nodes.get(waiting_frame.prepared_call_node_id)
if not isinstance(invocation, CallSavedWorkflowInvocation):
raise ValueError("Waiting workflow call frame does not point to a call_saved_workflow invocation.")
return invocationView on GitHub (pinned to 0b6a024f2f)
Solutions
- Inspect session-queue logs around the boundary call to find why enqueue produced no child queue item (usually a swallowed exception just above).
- Verify the session-queue service implementation returns a real SessionQueueItem from enqueue; fix stubs/mocks in tests.
- Catch this ValueError, end the workflow call with status 'failed' on the parent session, and re-raise so run_node surfaces the failure.
- Upgrade/patch the coordinator so the enqueue failure path (which deletes enqueued children and re-raises) always fires instead of leaving child_queue_item None.
Example fix
// before
child_queue_item = maybe_enqueue(...) # may return None
// after
if child_queue_item is None:
queue_item.session.end_waiting_on_workflow_call(status="failed", error_message="no child enqueued")
raise ValueError("Workflow call did not produce any child executions.") Defensive patterns
Strategy: try-catch
Validate before calling
if child_queue_item is None:
queue_item.session.end_waiting_on_workflow_call(status="failed", error_message="no child enqueued")
raise ValueError("Workflow call did not produce any child executions.") Type guard
def child_was_enqueued(item) -> bool:
return item is not None and getattr(item, "item_id", None) is not None Try / catch
try:
child = begin_workflow_call_boundary(...)
except ValueError as e:
if "did not produce any child executions" in str(e):
mark_parent_failed(queue_item, str(e)); raise Prevention
- Ensure enqueue paths always either return a queue item or raise
- Log and alert on swallowed exceptions in the enqueue lifecycle
- Test queue backends so None returns are impossible
- Keep parent-session cleanup (end_waiting_on_workflow_call) on all failure paths
When it happens
Trigger: begin_workflow_call_boundary completes enqueue/attach logic but the child queue item creation path left child_queue_item None — e.g. enqueue returned nothing or an internal branch skipped assignment while swallowing the failure.
Common situations: Downstream queue-service failures during enqueue that were partially handled; custom session-queue backends returning None; regressions in the WorkflowCallQueueLifecycle enqueue path; test setups with stubbed queue services.
Related errors
- call_saved_workflow exceeds remaining queue capacity for chi
- call_saved_workflow image-generator-backed batch child workf
- call_saved_workflow generator-backed batch child workflow no
- call_saved_workflow batch child workflow node '{node_id}' mu
- call_saved_workflow batch child workflow node '{node_id}' is
AI-assisted analysis of invoke-ai/InvokeAI@0b6a024f2f (2026-08-29).
Data as JSON: /api/errors/8c03b739e7ded854.
Report an issue: GitHub.