sgl-project/sglang · error · ValueError

video block token counts and timestamps must align

Error message

video block token counts and timestamps must align

What it means

Video block token counts and block timestamps must have matching lengths. Align the two sequences.

Solutions

  1. Make both arguments use identical nesting and the same number of per-reference groups
  2. Generate counts and timestamps together as paired per-video records
  3. Add a pre-call check len(normalized_counts) == len(normalized_timestamps)

Example fix

// before
video_block_token_counts=[196,196],
video_block_timestamps=[[3.5],[7.0]],
// after
video_block_token_counts=[[196,196]],
video_block_timestamps=[[3.5,7.0]],
Defensive patterns

Strategy: validation

Validate before calling

if len(video_block_token_counts) != len(video_block_timestamps):
    raise ValueError("one counts group and one timestamps group per video")

Prevention

When it happens

Trigger: Passing counts for 2 videos but timestamps for 1, e.g. counts=[[196],[196]] with timestamps=[[3.5]]. This typically results from inconsistent flat/nested nesting between the two arguments.

Common situations: Building the two lists in different code paths; one argument flat for a single video while the other is nested (flat counts=[[196]] equivalent vs nested timestamps with extra/missing group).

Related errors


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

Appendix: source

Thrown at python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/presentation.py:259

    content tokens; vision delimiters remain dense.
    """
    if not prompt:
        raise ValueError("prompt must be non-empty")
    presentation = _Presentation(track_video_mask=return_video_mask)
    video_token_id = (
        tokenizer.convert_tokens_to_ids(VIDEO_PAD) if return_video_mask else None
    )
    image_token_counts = _as_int_list(image_token_count, name="image_token_count")
    video_counts_by_ref = _as_nested_int_list(
        video_block_token_counts,
        name="video_block_token_counts",
    )
    video_timestamps_by_ref = _as_nested_float_list(
        video_block_timestamps,
        name="video_block_timestamps",
    )
    if len(video_counts_by_ref) != len(video_timestamps_by_ref):
        raise ValueError("video block token counts and timestamps must align")
    image_seen = 0
    video_seen = 0
    for cond_type, ordinal in condition_labels:
        if cond_type == "image":
            image_seen += 1
            if image_seen > len(image_token_counts):
                raise ValueError("image_token_count required for an image reference")
            count = int(image_token_counts[image_seen - 1])
            if count <= 0:
                raise ValueError("image_token_count required for an image reference")
            presentation.text(_text_ids(tokenizer, f"<Picture {ordinal}>: "))
            presentation.vision(_vision_block_ids(tokenizer, IMAGE_PAD, count))
        elif cond_type == "audio":
            presentation.text(_text_ids(tokenizer, f"<Audio {ordinal}>: "))
        elif cond_type == "video":
            video_seen += 1
            if video_seen > len(video_counts_by_ref):
                raise ValueError(

View on GitHub (pinned to 0132848349)