diff --git a/verl/workers/rollout/vllm_rollout/vllm_omni_async_server.py b/verl/workers/rollout/vllm_rollout/vllm_omni_async_server.py index 6d21f66e710..df493e42d7b 100644 --- a/verl/workers/rollout/vllm_rollout/vllm_omni_async_server.py +++ b/verl/workers/rollout/vllm_rollout/vllm_omni_async_server.py @@ -171,7 +171,20 @@ async def generate( extra_args[k] = v sampling_kwargs["extra_args"] = extra_args if lora_request is not None: - sampling_kwargs["lora_request"] = lora_request + # vllm-omni >=0.19 renames lora_request/lora_scale to the plural + # lora_requests/lora_scales (list form) for multi-LoRA composition. + # Detect which field the installed version exposes so this adapter + # works on both pre- and post-rename releases. + if "lora_requests" in OmniDiffusionSamplingParams.__dataclass_fields__: + sampling_kwargs["lora_requests"] = [lora_request] + # On the post-rename API the singular "lora_scale" key from + # sampling_params would have fallen into extra_args above (no + # such field on the dataclass); lift it back out into the + # plural lora_scales so the scale actually takes effect. + if "lora_scale" in extra_args: + sampling_kwargs["lora_scales"] = [extra_args.pop("lora_scale")] + else: + sampling_kwargs["lora_request"] = lora_request diffusion_sampling_params = OmniDiffusionSamplingParams(**sampling_kwargs) # Call AsyncOmni.generate() with the correct API