invoke-ai/InvokeAI · error · ValueError

call_saved_workflow exceeds remaining queue capacity for chi

Error message

call_saved_workflow exceeds remaining queue capacity for child workflow executions

What it means

begin_workflow_call_boundary checks the session queue status before expanding a called workflow: remaining capacity = max_queue_size - pending. If nothing is left (<= 0), it raises ValueError immediately instead of building children that could not be enqueued.

Source

Thrown at invokeai/app/services/session_processor/workflow_call_runtime.py:78

            "field_values": field_values,
        }
        if hasattr(queue_item, "model_copy"):
            return queue_item.model_copy(update=child_updates)

        child_queue_item = type(queue_item).__new__(type(queue_item))
        child_queue_item.__dict__ = {**queue_item.__dict__, **child_updates}
        return child_queue_item

    def begin_workflow_call_boundary(
        self,
        invocation: CallSavedWorkflowInvocation,
        queue_item: SessionQueueItem,
        workflow_record,
    ) -> SessionQueueItem:
        queue_status = self._session_runner._services.session_queue.get_queue_status(queue_item.queue_id)
        remaining_queue_capacity = self._session_runner._services.configuration.max_queue_size - queue_status.pending
        if remaining_queue_capacity <= 0:
            raise ValueError("call_saved_workflow exceeds remaining queue capacity for child workflow executions")

        call_frame = queue_item.session.build_workflow_call_frame(invocation.id, invocation.workflow_id)
        workflow_inputs = self._collect_call_saved_workflow_inputs(invocation, queue_item)
        child_session_results = build_child_workflow_session_results(
            parent_session=queue_item.session,
            workflow=workflow_record.workflow.model_dump(),
            workflow_inputs=workflow_inputs,
            call_frame=call_frame,
            maximum_children=remaining_queue_capacity,
            services=self._session_runner._services,
            user_id=getattr(queue_item, "user_id", None),
        )
        child_sessions = [child_result.session for child_result in child_session_results]
        if len(child_sessions) > remaining_queue_capacity:
            raise ValueError("call_saved_workflow exceeds remaining queue capacity for child workflow executions")
        queue_item.session.begin_waiting_on_workflow_call(call_frame)
        queue_item.session.attach_waiting_workflow_call_child_sessions(child_sessions)
        child_queue_item = None

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Wait for or cancel pending queue items until capacity frees, then retry the call.
  2. Increase configuration.max_queue_size to accommodate the expected child count plus current pending load.
  3. Catch this ValueError and surface a 'queue full' user message with a retry/backoff, e.g. poll get_queue_status before submitting.
  4. Pre-check capacity yourself: services.session_queue.get_queue_status(qid).pending < services.configuration.max_queue_size - expected_children.

Example fix

// before
child = coordinator.run(...)  # raises when queue full
// after
status = services.session_queue.get_queue_status(qid)
if services.configuration.max_queue_size - status.pending <= 0:
    raise QueueFull(...)  # or wait and retry
Defensive patterns

Strategy: validation

Validate before calling

status = services.session_queue.get_queue_status(queue_item.queue_id)
remaining = services.configuration.max_queue_size - status.pending
if remaining <= 0:
    raise QueueFullError("wait for queue capacity before workflow call")

Type guard

def has_queue_capacity(services, needed=1) -> bool:
    status = services.session_queue.get_queue_status(status.queue_id)
    return services.configuration.max_queue_size - status.pending >= needed

Try / catch

try:
    child = begin_workflow_call_boundary(...)
except ValueError as e:
    if "exceeds remaining queue capacity" in str(e):
        await wait_for_capacity(...); retry()

Prevention

When it happens

Trigger: Calling a saved workflow via call_saved_workflow while the queue is at or over configuration.max_queue_size pending items — get_queue_status().pending >= max_queue_size.

Common situations: Busy shared queue at max_queue_size; max_queue_size lowered in config while jobs are pending; burst submissions exhausting capacity; test fixtures enqueuing items up to the cap.

Related errors


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