[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:
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
|
||||
|
||||
Reference in new issue
Block a user