Skip to content

vllm_omni.model_executor.models.nemotron_voicechat.duplex

Native Full-Duplex integration for NVIDIA NemotronLabs VoiceChat.

The single duplex_plugin seam (RFC vllm-omni#7181): NemotronVoiceChatDuplexPlugin carries the engine and session policies, data_plane.py projects stage outputs and input.py packetizes 80 ms PCM frames into the framework's per-session model state.

Modules:

Name Description
capabilities
data_plane

Output projection for Nemotron VoiceChat's independent channels.

input

80 ms PCM packetization for Nemotron VoiceChat native duplex.

plugin

Nemotron VoiceChat full-duplex model plugin: engine policy and session policy in one class.

NemotronVoiceChatDuplexPlugin

Bases: DuplexModelPlugin

Nemotron-owned sampling policy, append planning, session state and output projection.

data_plane instance-attribute

data_plane = NemotronVoiceChatDataPlaneSession(encode_audio)

plugin_id class-attribute instance-attribute

plugin_id = 'nemotron_voicechat'

private_runtime_config_keys class-attribute instance-attribute

private_runtime_config_keys = PRIVATE_RUNTIME_CONFIG_KEYS

silence_continuation_samples class-attribute instance-attribute

silence_continuation_samples = (
    NEMOTRON_VOICECHAT_FRAME_SAMPLES
)

capabilities

capabilities(*, max_sessions: int) -> DuplexCapabilities

configure_sampling_params

configure_sampling_params(
    *,
    runtime_config: dict[str, object],
    defaults: tuple[object, ...],
) -> tuple[object, ...]

create_session_state

create_session_state() -> DefaultDuplexModelSessionState

data_plane_context

data_plane_context(
    *,
    epoch: int,
    turn_id: int,
    active_response_turn_id: int | None,
    active_response_id: str | None,
    auto_responds: bool,
    response_format: str,
    speed: float | None,
    modalities: tuple[str, ...],
) -> NemotronVoiceChatDataPlaneContext

decide_output

decide_output(
    *,
    stage_id: int,
    final_stage_id: int,
    segment_finished: bool,
    segment_token_ids: tuple[int, ...],
    segment_output_metadata: dict[str, object],
    output: object,
) -> DuplexOutputDecision | None

plan_append

plan_append(
    *,
    request_id: str,
    fence: DuplexFence,
    session_config: dict[str, object],
    runtime_config: dict[str, object],
    seq: int,
    turn_seq: int,
    payload: object,
    final: bool,
    sampling_params: object,
) -> DuplexAppendPlan

prepare_runtime_config async

prepare_runtime_config(
    config: DuplexSessionConfig,
    *,
    model_config: ModelConfig | None,
) -> dict[str, object]

runtime_config_after_model_output

runtime_config_after_model_output(
    current: Mapping[str, object],
    output_metadata: Mapping[str, object],
) -> dict[str, object] | None

Retire batches after the thinker takes ownership of their tokens.

runtime_config_for_function_output

runtime_config_for_function_output(
    config: DuplexSessionConfig,
    current: Mapping[str, object],
    item: Mapping[str, object],
) -> dict[str, object]

Queue a client tool result for frame-locked function-channel injection.

runtime_config_for_update

runtime_config_for_update(
    config: DuplexSessionConfig,
    current: Mapping[str, object],
) -> dict[str, object]

validate_client_extra_body

validate_client_extra_body(extra_body: object) -> None