invoke-ai/InvokeAI · error · UnsupportedWorkflowNodeError

call_saved_workflow could not access board '{board_id}' for

Error message

call_saved_workflow could not access board '{board_id}' for image generator expansion

What it means

While expanding an image_generator (images_from_board) node in a called batch child workflow, InvokeAI tried to fetch the referenced board and the board_records.get(board_id) call raised. The underlying storage exception is chained ('from e'); the board may not exist, may be corrupted, or the store may be failing, and expansion cannot enumerate the board's images.

Source

Thrown at invokeai/app/services/session_processor/workflow_call_batch.py:328

def _assert_user_can_access_board(board_id: str, services: Any, user_id: str | None) -> None:
    if not user_id:
        return

    board_records = getattr(services, "board_records", None)
    if board_records is None or not hasattr(board_records, "get"):
        return

    users = getattr(services, "users", None)
    user = users.get(user_id) if users is not None and hasattr(users, "get") else None
    is_admin = bool(user and getattr(user, "is_admin", False))
    if is_admin:
        return

    try:
        board_record = board_records.get(board_id)
    except Exception as e:
        raise UnsupportedWorkflowNodeError(
            f"call_saved_workflow could not access board '{board_id}' for image generator expansion"
        ) from e

    if getattr(board_record, "user_id", None) == user_id:
        return

    board_visibility = getattr(board_record, "board_visibility", BoardVisibility.Private)
    if isinstance(board_visibility, str):
        try:
            board_visibility = BoardVisibility(board_visibility)
        except ValueError:
            board_visibility = BoardVisibility.Private
    if board_visibility in {BoardVisibility.Shared, BoardVisibility.Public}:
        return

    if hasattr(board_records, "get_all"):
        try:
            accessible_boards = board_records.get_all(

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Verify the board_id exists (e.g. list boards via the API) and update the workflow's image_generator node to a valid board id
  2. Remove the board reference and supply images via a direct list on an image_batch node instead
  3. Restore the missing board or repair the board records database if the store is failing
  4. Call without a user_id context only if board access control is not required, or run as an admin user

Example fix

// before
{ "type": "image_generator_images_from_board", "board_id": "b0ard-from-old-install" }
// after
{ "type": "image_generator_images_from_board", "board_id": "1a2b3c4d-..." }  // existing board id
Defensive patterns

Strategy: try-catch

Validate before calling

def board_exists(services, board_id: str) -> bool:
    try:
        services.board_records.get(board_id)
        return True
    except Exception:
        return False

# before building child sessions
bad = [v for node in workflow.get("nodes", []) if isinstance(node, dict)
       for v in [node.get("data", {}).get("inputs", {}).get("generator", {}).get("value", {})]
       if isinstance(v, dict) and v.get("type") == "image_generator_images_from_board"
       and v.get("board_id") and not board_exists(services, v["board_id"])]

Type guard

def board_record_ok(record: object) -> bool:
    return record is not None and getattr(record, "board_id", None) is not None

Try / catch

try:
    sessions = build_batch_child_workflow_sessions(...)
except UnsupportedWorkflowNodeError as e:
    m = re.search(r"could not access board '(.+?)'", str(e))
    if m:
        board_id = m.group(1)
        # check board exists via API before retrying
        if not board_exists(services, board_id):
            raise BoardGoneError(board_id) from e
    raise

Prevention

When it happens

Trigger: Calling a saved workflow whose image_generator node references a board_id that does not exist in the board records store (deleted board, board from another install/database, or a transient DB failure), when the caller has a user_id and the service layer propagates the error.

Common situations: Sharing workflows between machines/databases where board ids don't resolve; deleting a board that a saved workflow still references; SQLite/database corruption or read failures; running with multi-user auth where boards live in another account's records.

Related errors


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