sgl-project/sglang · critical · ValueError

queued MiniMax H3 jobs require pre-queue resolved temporal d

Error message

queued MiniMax H3 jobs require pre-queue resolved temporal dimensions

What it means

Companion invariant to the geometry check: the pre-queue plan for a queued MiniMax H3 job must carry a resolved frame_count. Temporal dimensions (duration, fps, frame count) are resolved before queueing so downstream validation knows exactly how many frames the output must contain; a None frame_count means temporal resolution never happened.

Source

Thrown at python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/video_adapter.py:289

        if not isinstance(canonical, dict) or not all(
            key in canonical
            for key in ("schema", "task", "prompt", "conditions", "target")
        ):
            return None
        from sglang.multimodal_gen.runtime.pipelines_core.stages.model_specific_stages.minimax_h3.resolved_plan import (
            minimax_h3_plan_from_batch,
        )

        plan = minimax_h3_plan_from_batch(batch)
        if plan is None:
            return None
        shape = plan.shape
        if str(shape.get("geometry") or "") != "resolved_v2":
            raise ValueError(
                "queued MiniMax H3 jobs require pre-queue resolved_v2 geometry"
            )
        if shape.get("frame_count") is None:
            raise ValueError(
                "queued MiniMax H3 jobs require pre-queue resolved temporal dimensions"
            )
        return shape

    def project_queued_job_fields(self, batch: Req) -> dict[str, str]:
        shape = self._resolved_shape(batch)
        if shape is None:
            return {}
        fields: dict[str, str] = {}
        if shape.get("width") is not None and shape.get("height") is not None:
            fields["size"] = f"{int(shape['width'])}x{int(shape['height'])}"
        queued_frame_count = shape.get("frame_count")
        if queued_frame_count is not None:
            fields["seconds"] = _format_video_seconds(
                int(queued_frame_count) / float(shape["fps"])
            )
        quality = getattr(batch.sampling_params, "quality", None)
        explicit_fields = getattr(batch.sampling_params, "_explicit_fields", ())

View on GitHub (pinned to 0132848349)

Solutions

  1. Run the request through the MiniMax H3 prequeue stage that resolves duration/frame_count
  2. Specify explicit duration/fps in the request so temporal resolution succeeds
  3. Log the full plan.shape to identify which temporal keys are missing
Defensive patterns

Strategy: try-catch

Validate before calling

shape = plan.shape
assert shape.get("geometry") == "resolved_v2" and shape.get("frame_count") is not None

Try / catch

try:
    adapter.project_queued_job_fields(batch)
except ValueError as e:
    if "temporal dimensions" in str(e):
        batch = rerun_temporal_resolution(batch)
    else:
        raise

Prevention

When it happens

Trigger: project_queued_job_fields or validate_final_outputs_sync reads a plan where shape['frame_count'] is None (resolution fields present but temporal fields unresolved).

Common situations: Requests that skip the prequeue temporal resolution stage (e.g. image-only or malformed video specs); partial plan objects built by older code or tests.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


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