Files
vllm-omni/vllm_omni/experimental/fullduplex/engine/duplex_runtime.py
T
05b794f29b [Full Duplex] Feat: Support Full-Duplex realtime runtime & add MiniCPM-o 4.5 demo (#3907)
Signed-off-by: Sy03 <1370724210@qq.com>
Signed-off-by: lishunyang12 <lishunyang03@gmail.com>
Signed-off-by: Yueqian Lin <linyueqian@outlook.com>
Co-authored-by: lishunyang12 <lishunyang03@gmail.com>
Co-authored-by: Yueqian Lin <linyueqian@outlook.com>
Co-authored-by: StormMelody <22371184@zju.edu.cn>
Co-authored-by: Gao Han <hgaoaf@connect.ust.hk>
Co-authored-by: Hongsheng Liu <liuhongsheng4@huawei.com>
2026-07-23 16:45:18 +08:00

109 lines
3.7 KiB
Python

# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
"""Experimental duplex runtime loading and compatibility exports."""
from __future__ import annotations
from importlib import import_module
from vllm_omni.experimental.fullduplex.engine.contracts import (
DuplexAppendPlan,
DuplexInputMode,
DuplexOutputAction,
DuplexOutputDecision,
DuplexRuntimeCapabilities,
DuplexRuntimeExtension,
SessionMode,
duplex_data_plane_request_info,
duplex_resource_request_belongs_to_session,
duplex_resource_request_id,
)
def load_duplex_runtime_extension(path: str | None) -> DuplexRuntimeExtension | None:
if not path:
return None
module_name, separator, attribute_name = path.rpartition(".")
if not separator:
raise ValueError(f"Invalid duplex runtime extension path: {path!r}")
extension_type = getattr(import_module(module_name), attribute_name)
return validate_duplex_runtime_extension(extension_type())
def validate_duplex_runtime_extension(
extension: object,
*,
sampling_defaults: tuple[object, ...] | None = None,
) -> DuplexRuntimeExtension:
required_methods = (
"configure_sampling_params",
"plan_append",
"decide_output",
)
missing = [name for name in required_methods if not callable(getattr(extension, name, None))]
if missing:
raise TypeError(f"Duplex runtime extension is missing callable method(s): {', '.join(missing)}")
typed_extension = extension # type: ignore[assignment]
if sampling_defaults is not None:
configured = typed_extension.configure_sampling_params(
runtime_config={},
defaults=sampling_defaults,
)
if not isinstance(configured, tuple):
raise TypeError("Duplex runtime extension must return sampling parameters as a tuple")
if len(configured) != len(sampling_defaults):
raise ValueError("Duplex runtime extension must return one sampling parameter per stage")
for stage_id, (value, default) in enumerate(zip(configured, sampling_defaults, strict=True)):
if default is not None and not isinstance(value, type(default)):
raise TypeError(
"Duplex runtime extension sampling parameter type mismatch "
f"for stage {stage_id}: expected {type(default).__name__}, got {type(value).__name__}"
)
return typed_extension
from vllm_omni.experimental.fullduplex.engine.duplex_session import ( # noqa: E402, F401
DuplexAppendReservation,
DuplexCompletedAppend,
DuplexFenceMismatchError,
DuplexInputAppend,
DuplexRequestResource,
DuplexSessionRuntimeManager,
DuplexSessionRuntimeState,
DuplexStageBinding,
)
from vllm_omni.experimental.fullduplex.engine.lease import ( # noqa: E402, F401
DuplexLeaseActivity,
DuplexLeaseConfig,
DuplexLeaseState,
DuplexSessionExpiry,
)
__all__ = [
"DuplexAppendPlan",
"DuplexAppendReservation",
"DuplexCompletedAppend",
"DuplexFenceMismatchError",
"DuplexInputAppend",
"DuplexInputMode",
"DuplexLeaseActivity",
"DuplexLeaseConfig",
"DuplexLeaseState",
"DuplexOutputAction",
"DuplexOutputDecision",
"DuplexRequestResource",
"DuplexRuntimeCapabilities",
"DuplexRuntimeExtension",
"DuplexSessionExpiry",
"DuplexSessionRuntimeManager",
"DuplexSessionRuntimeState",
"DuplexStageBinding",
"SessionMode",
"duplex_data_plane_request_info",
"duplex_resource_request_belongs_to_session",
"duplex_resource_request_id",
"load_duplex_runtime_extension",
"validate_duplex_runtime_extension",
]