sgl-project/sglang · error · NotImplementedError

MiniMaxH3TextEncodingStage direct Qwen3VL encoder forward re

Error message

MiniMaxH3TextEncodingStage direct Qwen3VL encoder forward requires a canonical minimax_h3 request (resolved plan); legacy prompt-only requests are unsupported.

What it means

The stage only accepts canonical MiniMax H3 requests carrying a resolved plan; if sampling_params still carries a raw prompt or prompt_path (the legacy prompt-only interface), forward() raises NotImplementedError. This is a deliberate gate: direct Qwen3VL encoder forward must be driven by the resolved plan, not free-text prompts.

Source

Thrown at python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/stages/text_encoding.py:80

                    ),
                )
                self._publish_native_text_conditioning(batch)
                if current_platform.is_mps():
                    self._finish_active_component_use()
            except Exception:
                from sglang.multimodal_gen.runtime.pipelines_core.stages.model_specific_stages.minimax_h3.material_io import (
                    minimax_h3_cleanup_temp_dirs,
                )

                batch.extra.pop(MINIMAX_H3_PREPARED_REFERENCE_VIDEO_EXTRA_KEY, None)
                minimax_h3_cleanup_temp_dirs(batch)
                raise
            return batch
        if batch.sampling_params is not None and (
            batch.sampling_params.prompt is not None
            or batch.sampling_params.prompt_path is not None
        ):
            raise NotImplementedError(
                "MiniMaxH3TextEncodingStage direct Qwen3VL encoder forward requires "
                "a canonical minimax_h3 request (resolved plan); legacy prompt-only "
                "requests are unsupported."
            )
        return batch

    def build_dedup_fingerprint(self, batch: Req, server_args: ServerArgs):
        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 super().build_dedup_fingerprint(batch, server_args)
        materials = tuple(
            (
                item.condition_index,
                item.role,

View on GitHub (pinned to 0132848349)

Solutions

  1. Submit requests through the canonical MiniMax H3 request API so they arrive with a resolved plan and no raw prompt fields
  2. Clear sampling_params.prompt / prompt_path when building batches programmatically
  3. Update legacy callers to the plan-based request format

Example fix

// before
batch.sampling_params.prompt = "a cat playing piano"
// after
batch.sampling_params.prompt = None  # use a resolved minimax_h3 plan instead
batch.plan = resolve_minimax_h3_request(request)
Defensive patterns

Strategy: validation

Validate before calling

sp = batch.sampling_params
if sp is not None and (sp.prompt is not None or sp.prompt_path is not None):
    batch = resolve_minimax_h3_request(sp)  # convert to canonical plan

Type guard

def is_canonical_minimax_request(batch) -> bool:
    sp = batch.sampling_params
    return sp is None or (sp.prompt is None and sp.prompt_path is None)

Prevention

When it happens

Trigger: forward() sees batch.sampling_params is not None and sampling_params.prompt or sampling_params.prompt_path is not None on a request that lacks a usable resolved plan path.

Common situations: Porting old code that passed text prompts directly to the diffusion pipeline; requests routed to the new stage without going through plan resolution; prompt leftover fields not cleared after resolution.

Related errors


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