{"record":{"id":"ef137409f4e115a1","repo":"sgl-project/sglang","slug":"invalid-lora-merge-mode-merge-mode-valid-modes","errorCode":null,"errorMessage":"Invalid LoRA merge mode: {merge_mode}. Valid modes: {LORA_MERGE_MODES}","messagePattern":"Invalid LoRA merge mode: (.+?)\\. Valid modes: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/pipelines_core/lora/pipeline.py","lineNumber":589,"sourceCode":"        module_name: str,\n        lora_layers: dict[str, BaseLayerWithLoRA],\n    ) -> bool:\n        return self.is_lora_merged.get(\n            module_name, False\n        ) or self._has_active_unmerged_lora(lora_layers)\n\n    def _resolve_lora_merge_mode(\n        self,\n        merge_weights: bool | None,\n        merge_mode: str | None,\n    ) -> str:\n        if merge_mode is None:\n            if merge_weights is not None:\n                merge_mode = \"merge\" if merge_weights else \"dynamic\"\n            else:\n                merge_mode = self.server_args.lora_merge_mode\n        if merge_mode not in LORA_MERGE_MODES:\n            raise ValueError(\n                f\"Invalid LoRA merge mode: {merge_mode}. Valid modes: {LORA_MERGE_MODES}\"\n            )\n        return merge_mode\n\n    def _should_merge_lora_for_layers(\n        self,\n        module_name: str,\n        lora_layers: dict[str, BaseLayerWithLoRA],\n        merge_mode: str,\n    ) -> bool:\n        if merge_mode == \"dynamic\":\n            return False\n        uses_dtensor_weights = self._uses_dtensor_weights(lora_layers)\n        if merge_mode == \"auto\":\n            if uses_dtensor_weights:\n                logger.info(\n                    \"Using dynamic LoRA for %s because FSDP-sharded weights would require a full-gather merge.\",\n                    module_name,","sourceCodeStart":571,"sourceCodeEnd":607,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/pipelines_core/lora/pipeline.py#L571-L607","documentation":"Thrown by _resolve_lora_merge_mode when the resolved LoRA merge mode string is not one of LORA_MERGE_MODES (typically 'merge' or 'dynamic'). The mode is resolved from an explicit argument, or from the legacy merge_weights boolean, or falls back to server_args.lora_merge_mode — any typo in any of these triggers it.","triggerScenarios":"Calling set_lora(merge_mode='merged') or configuring server_args.lora_merge_mode to an invalid string; also passing merge_weights plus an invalid merge_mode, since merge_mode takes precedence.","commonSituations":"Typos in pipeline config YAML/JSON for lora_merge_mode; upgrading to a version that renamed modes; passing merge_weights-style booleans where a string mode is expected.","solutions":["Set merge_mode to a valid value from LORA_MERGE_MERGE modes: check `from sglang.multimodal_gen.runtime.pipelines_core.lora.pipeline import LORA_MERGE_MODES` — currently 'merge' or 'dynamic'","Fix server_args.lora_merge_mode in your launch config","If using legacy merge_weights, drop the merge_mode argument entirely"],"exampleFix":"# before\npipeline.set_lora(lora_paths=[p], lora_nicknames=['a'], merge_mode='merged')\n# after\npipeline.set_lora(lora_paths=[p], lora_nicknames=['a'], merge_mode='merge')","handlingStrategy":"validation","validationCode":"from sglang.multimodal_gen.runtime.pipelines_core.lora.pipeline import LORA_MERGE_MODES\nassert merge_mode in LORA_MERGE_MODES, f'{merge_mode} not in {LORA_MERGE_MODES}'","typeGuard":"def is_valid_merge_mode(m: str) -> bool: return m in LORA_MERGE_MODES","tryCatchPattern":null,"preventionTips":["Import LORA_MERGE_MODES and validate config before set_lora","Validate lora_merge_mode at server-args load time with a choices= CLI arg"],"tags":["lora","config-validation","diffusion-pipeline"],"backgroundTag":"invalid-config-value","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}