sgl-project/sglang · error · ValueError
MiniMax H3 latent preparation requires pre-queue resolved_v2
Error message
MiniMax H3 latent preparation requires pre-queue resolved_v2 geometry, got {geometry!r} What it means
When the denoise state is not already present, the stage builds it from the request's resolved plan and requires plan.shape['geometry'] == 'resolved_v2' — the geometry string produced by the pre-queue resolution stage. Any other value (e.g. 'raw', 'resolved', or None coerced to string) is rejected because latent dimension math assumes the v2 resolution contract.
Source
Thrown at python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/stages/latent_preparation.py:80
batch.audio_latents = audio_rows
batch.raw_latent_shape = (1, 24, latent_t, latent_h, latent_w)
batch.raw_audio_latent_shape = (2, 32, audio_t)
def _prepare_denoise_state_from_plan(self, batch: Req, plan) -> None:
"""Direct initial-noise materialization (t2va recipe):
torch.Generator().manual_seed(seed); video rows drawn first,
then audio rows, CPU fp32. Every task consumes the final latent grid
frozen by the pre-queue shape resolver."""
from sglang.multimodal_gen.runtime.pipelines_core.stages.model_specific_stages.minimax_h3.constants import (
MINIMAX_H3_DENOISE_STATE_EXTRA_KEY,
)
if MINIMAX_H3_DENOISE_STATE_EXTRA_KEY in batch.extra:
return
shape = plan.shape
geometry = str(shape["geometry"])
if geometry != "resolved_v2":
raise ValueError(
"MiniMax H3 latent preparation requires pre-queue resolved_v2 "
f"geometry, got {geometry!r}"
)
latent_h = int(shape["height"]) // 16
latent_w = int(shape["width"]) // 16
if shape.get("video_latent_t") is None or shape.get("audio_latent_t") is None:
raise ValueError(
"MiniMax H3 latent preparation requires pre-queue resolved "
"temporal dimensions"
)
latent_t = int(shape["video_latent_t"])
audio_t = int(shape["audio_latent_t"])
seed = plan.seed
if seed is None:
seed = 42 # pinned default seed
video_rows_n = latent_t * (latent_h // 2) * (latent_w // 2)
audio_rows_n = audio_t * 2View on GitHub (pinned to 0132848349)
Solutions
- Run the request through the pre-queue geometry resolution stage so plan.shape['geometry'] becomes 'resolved_v2' before latent preparation
- Discard cached plans produced by older resolver versions and re-resolve
- Verify height/width and latent_t fields are populated by the same resolver (v2 contract)
Defensive patterns
Strategy: validation
Validate before calling
if str(plan.shape.get("geometry")) != "resolved_v2":
plan = resolve_plan_through_prequeue(plan) # run geometry resolution first Type guard
def plan_is_resolved_v2(plan) -> bool:
return str(plan.shape.get("geometry", "")) == "resolved_v2" Prevention
- Always run the pre-queue resolution stage before MiniMax H3 model stages
- Invalidate cached plans after upgrading the resolver
When it happens
Trigger: _prepare_denoise_state_from_plan executes with plan.shape['geometry'] set to anything other than 'resolved_v2', or the geometry key missing (str(None) == 'None'), because the pre-queue resolution stage was skipped or an older resolver version wrote a different tag.
Common situations: Running the pipeline without the geometry-resolution pre-queue stage, using a stale/cached resolved plan from an older format, or feeding a raw un-resolved request directly into the model stages.
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
- keyframe resolved_frame_index values disagree with semantic
- cached keyframe preparation disagrees with the resolved plan
- {profile.task} ResolvedPlan requires one or two ordered imag
- MiniMax H3 denoise state must be a mapping
- MiniMax H3 latent preparation requires pre-queue resolved te
AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28).
Data as JSON: /api/errors/2fc5a9acad257f5c.
Report an issue: GitHub.