invoke-ai/InvokeAI · error · SessionQueueItemNotFoundError

No queue item with id {item_id}

Error message

No queue item with id {item_id}

What it means

_transition_queue_item_status reads the current status of a queue item before updating it; if no row exists for the given item_id, SessionQueueItemNotFoundError is raised. This protects status transitions (including cancellation sweeps) from acting on nonexistent or already-deleted items.

Source

Thrown at invokeai/app/services/session_queue/session_queue_sqlite.py:529

        the SQL: the guard is a Python check between the SELECT and the UPDATE, valid only while
        every writer goes through that lock. When no transition happens, the item is returned
        unchanged and no status-changed event is emitted; a vanished row raises
        SessionQueueItemNotFoundError.
        """
        if queue_item is not None and queue_item.item_id != item_id:
            raise ValueError(f"Queue item {queue_item.item_id} does not match requested item {item_id}")

        updated_status_row: sqlite3.Row | None = None
        with self._db.transaction() as cursor:
            cursor.execute(
                """--sql
                SELECT status FROM session_queue WHERE item_id = ?
                """,
                (item_id,),
            )
            row = cursor.fetchone()
            if row is None:
                raise SessionQueueItemNotFoundError(f"No queue item with id {item_id}")
            current_status = row[0]

            # Only update if not already finished (completed, failed or canceled).
            if current_status not in ("completed", "failed", "canceled"):
                cursor.execute(
                    """--sql
                    UPDATE session_queue
                    SET status = ?, status_sequence = COALESCE(status_sequence, 0) + 1, error_type = ?, error_message = ?, error_traceback = ?, device = COALESCE(?, device)
                    WHERE item_id = ?
                    """,
                    (status, error_type, error_message, error_traceback, device, item_id),
                )
                cursor.execute(
                    """--sql
                    SELECT
                        status,
                        status_sequence,
                        error_type,

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Catch SessionQueueItemNotFoundError and treat the item as already gone (idempotent handling)
  2. Fetch a fresh queue item list before transitioning instead of using cached ids
  3. Check for concurrent delete/cancel operations in your automation scripts
  4. If it recurs, inspect the SQLite session_queue table for the item_id

Example fix

// before
services.session_queue._set_queue_item_status(item_id, "canceled")
// after
try:
    services.session_queue._set_queue_item_status(item_id, "canceled")
except SessionQueueItemNotFoundError:
    pass  # item already deleted
Defensive patterns

Strategy: try-catch

Validate before calling

def queue_item_exists(services, item_id: int) -> bool:
    try:
        services.session_queue.get_queue_item(item_id)
        return True
    except SessionQueueItemNotFoundError:
        return False

Try / catch

try:
    services.session_queue._set_queue_item_status(item_id, status)
except SessionQueueItemNotFoundError:
    logger.info("Queue item %s already deleted; skipping transition.", item_id)

Prevention

When it happens

Trigger: Calling _set_queue_item_status or _cancel_in_progress_matching with an item_id that was deleted (e.g. by delete_queue_item in another request/worker) or never existed, against the SQLite session queue.

Common situations: Race between canceling/deleting a queue item from the UI while a processor thread transitions its status; passing a stale item_id cached client-side; double-deletion handling.

Related errors


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