{"record":{"id":"78272663e81f9849","repo":"sgl-project/sglang","slug":"minimaxh3textencodingstage-direct-qwen3vl-encoder","errorCode":null,"errorMessage":"MiniMaxH3TextEncodingStage direct Qwen3VL encoder forward requires a canonical minimax_h3 request (resolved plan); legacy prompt-only requests are unsupported.","messagePattern":"MiniMaxH3TextEncodingStage direct Qwen3VL encoder forward requires a canonical minimax_h3 request \\(resolved plan\\); legacy prompt-only requests are unsupported\\.","errorType":"validation","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/stages/text_encoding.py","lineNumber":80,"sourceCode":"                    ),\n                )\n                self._publish_native_text_conditioning(batch)\n                if current_platform.is_mps():\n                    self._finish_active_component_use()\n            except Exception:\n                from sglang.multimodal_gen.runtime.pipelines_core.stages.model_specific_stages.minimax_h3.material_io import (\n                    minimax_h3_cleanup_temp_dirs,\n                )\n\n                batch.extra.pop(MINIMAX_H3_PREPARED_REFERENCE_VIDEO_EXTRA_KEY, None)\n                minimax_h3_cleanup_temp_dirs(batch)\n                raise\n            return batch\n        if batch.sampling_params is not None and (\n            batch.sampling_params.prompt is not None\n            or batch.sampling_params.prompt_path is not None\n        ):\n            raise NotImplementedError(\n                \"MiniMaxH3TextEncodingStage direct Qwen3VL encoder forward requires \"\n                \"a canonical minimax_h3 request (resolved plan); legacy prompt-only \"\n                \"requests are unsupported.\"\n            )\n        return batch\n\n    def build_dedup_fingerprint(self, batch: Req, server_args: ServerArgs):\n        from sglang.multimodal_gen.runtime.pipelines_core.stages.model_specific_stages.minimax_h3.resolved_plan import (\n            minimax_h3_plan_from_batch,\n        )\n\n        plan = minimax_h3_plan_from_batch(batch)\n        if plan is None:\n            return super().build_dedup_fingerprint(batch, server_args)\n        materials = tuple(\n            (\n                item.condition_index,\n                item.role,","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/stages/text_encoding.py#L62-L98","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Submit requests through the canonical MiniMax H3 request API so they arrive with a resolved plan and no raw prompt fields","Clear sampling_params.prompt / prompt_path when building batches programmatically","Update legacy callers to the plan-based request format"],"exampleFix":"// before\nbatch.sampling_params.prompt = \"a cat playing piano\"\n// after\nbatch.sampling_params.prompt = None  # use a resolved minimax_h3 plan instead\nbatch.plan = resolve_minimax_h3_request(request)","handlingStrategy":"validation","validationCode":"sp = batch.sampling_params\nif sp is not None and (sp.prompt is not None or sp.prompt_path is not None):\n    batch = resolve_minimax_h3_request(sp)  # convert to canonical plan","typeGuard":"def is_canonical_minimax_request(batch) -> bool:\n    sp = batch.sampling_params\n    return sp is None or (sp.prompt is None and sp.prompt_path is None)","tryCatchPattern":null,"preventionTips":["Migrate legacy prompt-based callers to plan-based requests","Clear prompt fields after plan resolution when building batches"],"tags":["minimax-h3","legacy-api","not-implemented","request-format"],"backgroundTag":"unsupported-legacy-request-format","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}