[Realtime] Emit current (non-beta) OpenAI audio/transcript event names (#7339)
Signed-off-by: Nick Cao <ncao@redhat.com> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5c69fc2a8a
commit
498c41b8d6
34 files changed
+251
-189
No files matched your search
@@ -2197,9 +2197,11 @@ def test_native_realtime_protocol_audio_delta_preserves_sample_rate_hz():
|
||||
)
|
||||
|
||||
audio_events = [
|
||||
payload for payload in payloads if payload["type"] in {"response.output_audio.delta", "response.audio.delta"}
|
||||
payload
|
||||
for payload in payloads
|
||||
if payload["type"] in {"response.output_audio.delta", "response.output_audio.delta"}
|
||||
]
|
||||
assert {payload["type"] for payload in audio_events} == {"response.audio.delta"}
|
||||
assert {payload["type"] for payload in audio_events} == {"response.output_audio.delta"}
|
||||
assert {payload["format"] for payload in audio_events} == {"pcm16"}
|
||||
assert {payload["sample_rate_hz"] for payload in audio_events} == {24000}
|
||||
|
||||
@@ -2227,14 +2229,14 @@ def test_native_realtime_protocol_ignores_removed_legacy_event_switches():
|
||||
)
|
||||
|
||||
event_types = {payload["type"] for payload in payloads}
|
||||
assert "response.audio.delta" in event_types
|
||||
assert "response.audio.done" in event_types
|
||||
assert "response.audio_transcript.delta" in event_types
|
||||
assert "response.audio_transcript.done" in event_types
|
||||
assert "response.output_audio.delta" not in event_types
|
||||
assert "response.output_audio.done" not in event_types
|
||||
assert "response.output_audio_transcript.delta" not in event_types
|
||||
assert "response.output_audio_transcript.done" not in event_types
|
||||
assert "response.output_audio.delta" in event_types
|
||||
assert "response.output_audio.done" in event_types
|
||||
assert "response.output_audio_transcript.delta" in event_types
|
||||
assert "response.output_audio_transcript.done" in event_types
|
||||
assert "response.audio.delta" not in event_types
|
||||
assert "response.audio.done" not in event_types
|
||||
assert "response.audio_transcript.delta" not in event_types
|
||||
assert "response.audio_transcript.done" not in event_types
|
||||
assert "response.output_item.created" not in event_types
|
||||
assert "response.text.delta" not in event_types
|
||||
|
||||
@@ -2256,9 +2258,9 @@ def test_native_realtime_protocol_emits_terminal_audio_transcript_events():
|
||||
)
|
||||
|
||||
by_type = {payload["type"]: payload for payload in payloads}
|
||||
assert "response.audio.done" in by_type
|
||||
assert "response.audio_transcript.delta" in by_type
|
||||
assert "response.audio_transcript.done" in by_type
|
||||
assert "response.output_audio.done" in by_type
|
||||
assert "response.output_audio_transcript.delta" in by_type
|
||||
assert "response.output_audio_transcript.done" in by_type
|
||||
assert by_type["response.content_part.done"]["part"]["transcript"] == "hello"
|
||||
assert by_type["response.output_item.done"]["item"]["object"] == "realtime.item"
|
||||
assert by_type["response.done"]["response"]["output"][0]["object"] == "realtime.item"
|
||||
@@ -2284,8 +2286,10 @@ def test_native_realtime_protocol_terminal_transcript_equals_joined_deltas():
|
||||
)
|
||||
)
|
||||
|
||||
transcript = "".join(str(event["delta"]) for event in events if event["type"] == "response.audio_transcript.delta")
|
||||
done = [str(event["transcript"]) for event in events if event["type"] == "response.audio_transcript.done"]
|
||||
transcript = "".join(
|
||||
str(event["delta"]) for event in events if event["type"] == "response.output_audio_transcript.delta"
|
||||
)
|
||||
done = [str(event["transcript"]) for event in events if event["type"] == "response.output_audio_transcript.done"]
|
||||
|
||||
assert transcript == "It's Canberra. Next question."
|
||||
assert done == [transcript]
|
||||
@@ -2374,7 +2378,7 @@ def test_native_realtime_protocol_response_done_emits_audio_done_before_terminal
|
||||
payloads = protocol._from_duplex_event({"type": "response.done", "response_id": "resp-done"})
|
||||
event_types = [payload["type"] for payload in payloads]
|
||||
|
||||
assert event_types.index("response.audio.done") < event_types.index("response.content_part.done")
|
||||
assert event_types.index("response.output_audio.done") < event_types.index("response.content_part.done")
|
||||
assert event_types.index("response.content_part.done") < event_types.index("response.output_item.done")
|
||||
assert event_types.index("conversation.item.done") < event_types.index("response.done")
|
||||
assert event_types.index("response.output_item.done") < event_types.index("response.done")
|
||||
@@ -3181,7 +3185,7 @@ async def test_auto_response_committed_overlap_does_not_precreate_empty_response
|
||||
|
||||
def commit_overlap_after_first_response(ws: TimedWebSocket, data: dict[str, Any]) -> None:
|
||||
nonlocal overlap_sent
|
||||
if data.get("type") != "response.audio.delta" or overlap_sent:
|
||||
if data.get("type") != "response.output_audio.delta" or overlap_sent:
|
||||
return
|
||||
overlap_sent = True
|
||||
chunk = {
|
||||
@@ -8679,7 +8683,7 @@ async def test_minicpmo_native_duplex_uses_segment_text_metadata_for_transcript_
|
||||
protocol = NativeRealtimeSessionProtocol(TimedWebSocket()) # type: ignore[arg-type]
|
||||
realtime_events = [event for payload in sent for event in protocol._from_duplex_event(payload)]
|
||||
transcript_deltas = [
|
||||
m for m in realtime_events if m.get("type") == "response.audio_transcript.delta" and m.get("delta")
|
||||
m for m in realtime_events if m.get("type") == "response.output_audio_transcript.delta" and m.get("delta")
|
||||
]
|
||||
assert len(created) == 2
|
||||
assert len(done) == 2
|
||||
|
||||
Reference in new issue
Block a user