sgl-project/sglang · critical · RuntimeError

MiniMax H3 audio decode produced no output payload

Error message

MiniMax H3 audio decode produced no output payload

What it means

After the audio decode and (optional) replica broadcast of the audio payload, the payload must be a dict containing the decoded waveform and sample_rate. A non-dict payload (e.g. None or a tensor) raises this RuntimeError.

Source

Thrown at python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/stages/decoding.py:452

        audio_payload = None
        if is_audio_owner:
            try:
                audio_payload = self._decode_audio(audio_latent, server_args)
            except Exception as exc:
                owner_exception = exc
                owner_error = f"{type(exc).__name__}: {exc}"
        if replica_group is not None:
            owner_error = replica_group.broadcast_object(owner_error, src=0)
        if owner_error is not None:
            if owner_exception is not None:
                raise owner_exception
            raise RuntimeError(
                f"MiniMax H3 audio decode failed on rank 0: {owner_error}"
            )
        if replica_group is not None:
            audio_payload = replica_group.broadcast_tensor_dict(audio_payload, src=0)
        if not isinstance(audio_payload, dict):
            raise RuntimeError("MiniMax H3 audio decode produced no output payload")
        audio_waveform = _required_tensor(
            audio_payload.get("waveform"), "audio_vae.decode"
        )
        audio_sample_rate = int(audio_payload["sample_rate"])

        visual_frames = server_args.pipeline_config.post_decoding(
            visual_frames, server_args
        )
        output_audio_waveform = _canonical_output_audio_waveform(
            audio_waveform, batch_size=int(visual_frames.shape[0])
        )
        return OutputBatch(
            output=visual_frames,
            audio=output_audio_waveform,
            audio_sample_rate=audio_sample_rate,
            trajectory_timesteps=batch.trajectory_timesteps,
            trajectory_latents=batch.trajectory_latents,
            rollout_trajectory_data=batch.rollout_trajectory_data,

View on GitHub (pinned to 0132848349)

Solutions

  1. Ensure the audio decoder returns a dict with 'waveform' and 'sample_rate'
  2. Verify replica_group ranks stay in sync (same broadcast calls on all ranks)
  3. Wrap/normalize the decoder output into the expected payload shape
Defensive patterns

Strategy: validation

Validate before calling

# in custom audio decoders
return {"waveform": waveform, "sample_rate": int(sr)}

Type guard

def valid_audio_payload(p) -> bool:
    return isinstance(p, dict) and "waveform" in p and "sample_rate" in p

Prevention

When it happens

Trigger: The audio VAE decode returning None, a bare tensor, or the tensor-dict broadcast producing a non-mapping on non-rank-0 replicas.

Common situations: Custom audio VAE implementations that don't return the expected {'waveform':..., 'sample_rate':...} dict; broadcast desynchronization between replicas.

Related errors


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