Files
vllm-omni/vllm_omni/diffusion/request.py
T
2026-08-01 15:17:33 +00:00

77 lines
3.3 KiB
Python

# adapted from sglang and fastvideo
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
import random
from dataclasses import dataclass
from typing import Any
from vllm_omni.inputs.data import OmniDiffusionSamplingParams, OmniPromptType
DUMMY_DIFFUSION_REQUEST_ID = "dummy_req_id"
@dataclass
class OmniDiffusionRequest:
"""
Input payload for a single diffusion request.
This dataclass contains the prompt and sampling parameters for the diffusion pipeline
execution. It also contains a request_id for other components to trace this request and its outputs.
The runner wraps one or more requests into a DiffusionRequestBatch before pipeline execution.
"""
# TODO(will): double check that args are separate from server_args
# properly. Also maybe think about providing an abstraction for pipeline
# specific arguments.
# data_type: DataType
prompt: OmniPromptType
sampling_params: OmniDiffusionSamplingParams
request_id: str
kv_sender_info: dict[str, Any] | None = None
def __post_init__(self):
"""Initialize dependent fields after dataclass initialization."""
if not isinstance(self.request_id, str) or not self.request_id:
raise ValueError("OmniDiffusionRequest.request_id must be a non-empty string.")
# When neither a generator nor a seed is provided, assign a random seed
# so that all ranks derive the same generator state.
if self.sampling_params.generator is None and self.sampling_params.seed is None:
self.sampling_params.seed = random.randint(0, 2**31 - 1)
# Detect whether the caller explicitly provided guidance_scale before
# resolving the omitted value. ``0.0`` is API-valid and must not be
# treated as omission because that would unexpectedly enable CFG in
# pipelines with a model-specific default above zero.
if self.sampling_params.guidance_scale is not None:
self.sampling_params.guidance_scale_provided = True
else:
self.sampling_params.guidance_scale = 1.0
# Set do_classifier_free_guidance based on guidance scale and negative prompt
if self.sampling_params.guidance_scale > 1.0 and (
not isinstance(self.prompt, str) and self.prompt.get("negative_prompt")
):
self.sampling_params.do_classifier_free_guidance = True
# Detect whether the caller explicitly provided guidance_scale_2
# BEFORE auto-filling it. Pipelines with a model-specific second
# guidance default (e.g. Boogu image_guidance_scale=1.0) must be able
# to tell an explicit value apart from the guidance_scale fallback.
if self.sampling_params.guidance_scale_2 is not None:
self.sampling_params.guidance_scale_2_provided = True
# Auto-fill guidance_scale_2 from the (now-resolved) guidance_scale
# so downstream code always has a valid value.
if self.sampling_params.guidance_scale_2 is None:
self.sampling_params.guidance_scale_2 = self.sampling_params.guidance_scale
def is_dummy_run(self) -> bool:
return self.is_dummy_run_request_id(self.request_id)
@classmethod
def is_dummy_run_request_id(cls, request_id: str | None) -> bool:
return request_id == DUMMY_DIFFUSION_REQUEST_ID