sgl-project/sglang · error · ValueError

{b64_format_hint} (empty data payload)

Error message

{b64_format_hint} (empty data payload)

What it means

The data URI parsed correctly but the payload after the comma is empty, so there is nothing to decode and write to disk. This usually indicates a truncated or placeholder image string.

Source

Thrown at python/sglang/multimodal_gen/runtime/utils/image_io.py:22

import re


def save_base64_image_to_path(base64_data: str, target_path: str) -> str:
    b64_format_hint = (
        "Failed to decode base64 image. "
        "Expected format: `data:[<media-type>];base64,<data>`"
    )

    match = re.match(r"data:(.*?)(;base64)?,(.*)", base64_data)
    if not match:
        raise ValueError(b64_format_hint)
    media_type = match.group(1)
    is_base64 = match.group(2)
    if not is_base64:
        raise ValueError(f"{b64_format_hint} (missing ;base64 marker)")
    data = match.group(3)
    if not data:
        raise ValueError(f"{b64_format_hint} (empty data payload)")

    if media_type.startswith("image/"):
        ext = media_type.split("/")[-1].lower()
        if ext == "jpeg":
            ext = "jpg"
    else:
        ext = "jpg"
    target_path = f"{target_path}.{ext}"
    os.makedirs(os.path.dirname(target_path), exist_ok=True)

    try:
        image_data = base64.b64decode(data)
    except Exception as exc:
        raise Exception(f"Failed to decode base64 image: {str(exc)}") from exc

    with open(target_path, "wb") as f:
        f.write(image_data)

View on GitHub (pinned to 0132848349)

Solutions

  1. Check the producer side for truncation (log len(base64_data))
  2. Treat empty payloads as missing images upstream instead of forwarding them

Example fix

// before
save_base64_image_to_path("data:image/png;base64,", "/tmp/img")
// after
if payload:
    save_base64_image_to_path(f"data:image/png;base64,{payload}", "/tmp/img")
Defensive patterns

Strategy: validation

Validate before calling

def has_payload(uri: str) -> bool:
    return uri.rsplit(",", 1)[-1].strip() != ""

Try / catch

try:
    save_base64_image_to_path(uri, path)
except ValueError as e:
    if "empty data payload" in str(e):
        skip_image()  # treat as missing

Prevention

When it happens

Trigger: Passing data:image/png;base64, (nothing after the comma) via _maybe_url_image or prepare_warmup_image_path.

Common situations: Template placeholders, upstream truncation of the base64 string, string slicing bugs that drop the payload, empty image fields in request payloads treated as set.

Related errors


AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28). Data as JSON: /api/errors/e2d725902e4b5042. Report an issue: GitHub.