[Core][Frontend] Bound duplex output delivery and reject cancelled audio (#7644)

Signed-off-by: Nolen Liang <nliang@nvidia.com>
Signed-off-by: bcsdhjew <nliang@nvidia.com>
This commit is contained in:
bcsdhjew authored and GitHub committed 2026-10-04 14:06:04 -07:00
1 parent 3f20252151
commit f781f7bb08
26 files changed
+1170 -147

No files matched your search

@@ -9,6 +9,8 @@ import json
import pytest
from vllm_omni.engine.duplex.delivery import DuplexOutputBuffer
from vllm_omni.engine.duplex.events import AudioDelta, ResponseDone
from vllm_omni.entrypoints.duplex.session_attachment import (
DuplexEventJournal,
DuplexJournalGapError,
@@ -22,6 +24,36 @@ from vllm_omni.entrypoints.duplex.session_attachment import (
pytestmark = [pytest.mark.core_model, pytest.mark.cpu]
@pytest.mark.asyncio
@pytest.mark.parametrize("journal", [False, True])
async def test_audio_invalidated_while_waiting_for_send_is_not_sequenced_or_journaled(mocker, journal: bool):
registry = DuplexSessionAttachmentRegistry(replay_ttl_s=60.0, replay_max_bytes_per_session=4096)
output = DuplexOutputBuffer(max_bytes=4096, max_events=8)
sent: list[dict[str, object]] = []
accepted = mocker.Mock()
await registry.create("s", send=mocker.AsyncMock(side_effect=sent.append), close=mocker.AsyncMock())
audio = AudioDelta(session_id="s", response_id="r", epoch=0, delta="AAAA")
output.put(audio)
assert await output.get() is audio
state = registry._sessions["s"]
async with state.outbound_lock:
delivery = asyncio.create_task(
registry.send_event(
"s", audio.to_realtime(), journal=journal, on_accepted=accepted, event_guard=lambda: output.guard(audio)
)
)
await asyncio.sleep(0)
assert not delivery.done()
output.invalidate("r", through_epoch=0)
assert await delivery is None
accepted.assert_not_called()
done = ResponseDone(response_id="r", response={"status": "cancelled"})
await registry.send_event("s", done.to_realtime())
assert [(entry["type"], entry["server_event_seq"]) for entry in sent] == [("response.done", 1)]
assert [entry.payload["event_id"] for entry in state.journal.replay_after(0)] == [done.event_id]
class _Clock:
def __init__(self) -> None:
self.value = 0.0