calesthio/OpenMontage · error · FileNotFoundError

Image not found

Error message

Image not found: {image_path}

What it means

Standard FileNotFoundError raised by image_file_to_raw_base64() in tools/_kling/media.py when the given path does not exist as a regular file (is_file() is false for missing paths and for directories). The offending path is included in the message.

Solutions

  1. Check the path with Path(p).resolve() and confirm it exists from the process's actual cwd
  2. Use absolute paths, e.g. build them from a known root: BASE_DIR / 'assets' / 'ref.png'
  3. If you meant to pass a hosted image, use the url= parameter instead of path=

Example fix

// before
b64 = image_file_to_raw_base64('assets/ref.png')  # relative, wrong cwd

// after
from pathlib import Path
img = Path('assets/ref.png').resolve()
if not img.is_file():
    raise FileNotFoundError(f'expected reference image missing: {img}')
b64 = image_file_to_raw_base64(img)
Defensive patterns

Strategy: validation

Validate before calling

from pathlib import Path

def image_input_ready(path: str) -> bool:
    p = Path(path)
    return p.is_file() and p.stat().st_size > 0

Try / catch

try:
    b64 = image_file_to_raw_base64(path)
except FileNotFoundError as e:
    logger.error('reference image missing: %s', e)
    raise

Prevention

When it happens

Trigger: Calling normalize_image_input(path=...) or any function that base64-encodes a local image with a wrong path, a relative path resolved against an unexpected working directory, a directory path, or a file that was moved/deleted after the path was captured.

Common situations: Relative paths ('assets/ref.png') run from a different cwd; typos or wrong extension (.jpg vs .png); temp files cleaned up before the call; passing a URL where a local path was expected.

Related errors


AI-assisted analysis of calesthio/OpenMontage@95e1c3d0ab (2026-08-15). Data as JSON: /api/errors/512d3fd79b088ec1. Report an issue: GitHub.

Appendix: source

Thrown at tools/_kling/media.py:27


def strip_data_uri_prefix(value: str | None) -> str | None:
    """Return raw base64/content by removing a data URI prefix if present."""

    if value is None:
        return None
    marker = ";base64,"
    if value.startswith("data:") and marker in value:
        return value.split(marker, 1)[1]
    return value


def image_file_to_raw_base64(path: str | Path) -> str:
    """Read a local image file and return raw base64 without data URI prefix."""

    image_path = Path(path)
    if not image_path.is_file():
        raise FileNotFoundError(f"Image not found: {image_path}")
    return base64.b64encode(image_path.read_bytes()).decode("ascii")


def file_to_raw_base64(path: str | Path, *, label: str = "File") -> str:
    """Read a local media file and return raw base64 without a data URI prefix."""

    media_path = Path(path)
    if not media_path.is_file():
        raise FileNotFoundError(f"{label} not found: {media_path}")
    return base64.b64encode(media_path.read_bytes()).decode("ascii")


def normalize_image_input(url: str | None = None, path: str | Path | None = None) -> str | None:
    """Normalize a Kling image input to either URL or raw base64."""

    if url:
        return strip_data_uri_prefix(url)
    if path:

View on GitHub (pinned to 95e1c3d0ab)