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 invocation

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Inspect session-queue logs around the boundary call to find why enqueue produced no child queue item (usually a swallowed exception just above).
  2. Verify the session-queue service implementation returns a real SessionQueueItem from enqueue; fix stubs/mocks in tests.
  3. Catch this ValueError, end the workflow call with status 'failed' on the parent session, and re-raise so run_node surfaces the failure.
  4. 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

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


AI-assisted analysis of invoke-ai/InvokeAI@0b6a024f2f (2026-08-29). Data as JSON: /api/errors/8c03b739e7ded854. Report an issue: GitHub.