{"record":{"id":"48365864db4ccae5","repo":"sgl-project/sglang","slug":"dynamic-lora-currently-supports-only-one-adapter-p","errorCode":null,"errorMessage":"Dynamic LoRA currently supports only one adapter per target. Use merge_mode='merge' for multiple adapters.","messagePattern":"Dynamic LoRA currently supports only one adapter per target\\. Use merge_mode='merge' for multiple adapters\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/pipelines_core/lora/pipeline.py","lineNumber":1043,"sourceCode":"            tgt_nicknames = [lora_nicknames[i] for i in idx_list]\n            tgt_paths = [\n                lora_paths[i] or self.loaded_adapter_paths.get(lora_nicknames[i])\n                for i in idx_list\n            ]\n            tgt_strengths = [strengths[i] for i in idx_list]\n\n            merged_name = (\n                \",\".join(tgt_nicknames) if len(tgt_nicknames) > 1 else tgt_nicknames[0]\n            )\n\n            # Skip if LoRA configuration matches exactly (including order and strength)\n            # Since all modules for the same target apply the same config, checking one is sufficient\n            first_module_name, first_lora_layers_dict = target_modules[0]\n            first_effective_merge_weights = self._should_merge_lora_for_layers(\n                first_module_name, first_lora_layers_dict, merge_mode\n            )\n            if not first_effective_merge_weights and len(tgt_nicknames) > 1:\n                raise ValueError(\n                    \"Dynamic LoRA currently supports only one adapter per target. \"\n                    \"Use merge_mode='merge' for multiple adapters.\"\n                )\n\n            merge_weights_by_module = {}\n            for module_name, lora_layers_dict in target_modules:\n                merge_weights_by_module[module_name] = (\n                    first_effective_merge_weights\n                    if module_name == first_module_name\n                    else self._should_merge_lora_for_layers(\n                        module_name, lora_layers_dict, merge_mode\n                    )\n                )\n\n            if self._check_lora_config_matches(\n                first_module_name,\n                tgt_nicknames,\n                tgt_strengths,","sourceCodeStart":1025,"sourceCodeEnd":1061,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/pipelines_core/lora/pipeline.py#L1025-L1061","documentation":"In dynamic merge mode LoRA weights stay unmerged and are applied at runtime, which the implementation only supports for a single adapter per target. If _should_merge_lora_for_layers resolves to non-merged and multiple nicknames target the same module set, this error is raised.","triggerScenarios":"set_lora with two adapters sharing a target and merge_mode='dynamic' (or server default dynamic), e.g. lora_nicknames=['a','b'], targets=['attn'] for both.","commonSituations":"Composing multiple style adapters on the same layers without specifying merge mode; server default lora_merge_mode is 'dynamic' and user adds a second adapter.","solutions":["Pass merge_mode='merge' so adapters are merged into base weights","Restrict each target to a single adapter in dynamic mode"],"exampleFix":"# before\npipeline.set_lora(lora_paths=[pa,pb], lora_nicknames=['a','b'], targets=['attn'])  # default dynamic\n# after\npipeline.set_lora(lora_paths=[pa,pb], lora_nicknames=['a','b'], targets=['attn'], merge_mode='merge')","handlingStrategy":"validation","validationCode":"from collections import Counter\ncnt = Counter(nickname for _, tgt in assignments for nickname in tgt)\nif any(v > 1 for v in cnt.values()): merge_mode = 'merge'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Default to merge_mode='merge' when composing multiple adapters","Document per-target adapter limits in your config schema"],"tags":["lora","merge-mode","multi-adapter"],"backgroundTag":"unsupported-feature-combination","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}