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
- Catch SessionQueueItemNotFoundError and treat the item as already gone (idempotent handling)
- Fetch a fresh queue item list before transitioning instead of using cached ids
- Check for concurrent delete/cancel operations in your automation scripts
- 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
- Treat item deletion as making subsequent transitions no-ops (idempotent handlers)
- Re-fetch queue items instead of caching ids across operations
- Avoid deleting queue items from another thread/worker while processors run
- Verify the item_id against list_queue_items before transitioning
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
- ImageRecordNotFoundException
- Workflow with id {workflow_id} not found
- Image not found
- Board not found
- Board not found
AI-assisted analysis of invoke-ai/InvokeAI@0b6a024f2f (2026-08-29).
Data as JSON: /api/errors/73014c7c231d739c.
Report an issue: GitHub.