sgl-project/sglang · error · ValueError

MiniMax H3 SGLang backend only supports output_mode='decoded

Error message

MiniMax H3 SGLang backend only supports output_mode='decoded_files', got {output_mode!r}

What it means

The MiniMax H3 video adapter for SGLang validates the transport/delivery options of a video request before lowering it. Only output_mode='decoded_files' (or leaving it unset) is accepted because the backend always decodes generation results into files on disk. Any other output_mode (e.g. 'url', 'base64', 'tensor') is rejected with this ValueError.

Source

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

    def validate_transport_options(
        self,
        request: VideoGenerationsRequest,
        *,
        model_path: str | None,
    ) -> None:
        extras = request.model_extra or {}
        self.validate_task_gate(extras.get("task"), provided="task" in extras)
        del model_path
        self._positive_finite_extra(request, "audio_flow_shift")
        if _extra_value(request, "audio_guidance_scale") is not None:
            raise ValueError(
                "audio_guidance_scale is not supported: MiniMax H3 serves only "
                "the CFG-distilled single-positive-branch checkpoint"
            )
        output_mode = _extra_value(request, "output_mode")
        if output_mode not in (None, "decoded_files"):
            raise ValueError(
                "MiniMax H3 SGLang backend only supports "
                f"output_mode='decoded_files', got {output_mode!r}"
            )
        if request.enable_frame_interpolation:
            raise ValueError(
                "MiniMax H3 does not support enable_frame_interpolation: the "
                "accepted delivery contract is the canonical 24 fps output"
            )
        if request.enable_upscaling:
            raise ValueError(
                "MiniMax H3 does not support enable_upscaling: the accepted "
                "delivery contract is the resolved target canvas"
            )

    def validate_sampling_params(self, sampling_params: SamplingParams) -> None:
        """Apply the HTTP task/delivery gate to offline requests as well."""

        task = getattr(sampling_params, "task", None)

View on GitHub (pinned to 0132848349)

Solutions

  1. Set output_mode='decoded_files' (or omit it) on the request
  2. Configure save_output=True and a valid output_path since decoded files must be persisted
  3. If you need URLs, generate them yourself from the decoded output files after the call returns

Example fix

// before
request.extra = {"output_mode": "url"}
adapter.lower_video_request_kwargs(request)
// after
request.extra = {"output_mode": "decoded_files"}
sampling_params.save_output = True
sampling_params.output_path = "/tmp/out.mp4"
Defensive patterns

Strategy: validation

Validate before calling

mode = request.extra.get("output_mode") if request.extra else None
if mode not in (None, "decoded_files"):
    raise ValueError(f"unsupported output_mode {mode!r}; use 'decoded_files'")

Prevention

When it happens

Trigger: Calling lower_video_request_kwargs (directly or via the HTTP/offline video generation entry point) with request extra fields containing output_mode set to anything other than None or 'decoded_files'.

Common situations: Porting a client from another video backend that returned URLs or in-memory bytes; copy-pasting generic video request kwargs where output_mode defaults to something like 'url'.

Related errors


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