Skip to content

Commit a251b42

Browse files
authored
fix(realtime): redact raw message payload from conversion-failure log (#3907)
1 parent 104b490 commit a251b42

2 files changed

Lines changed: 27 additions & 0 deletions

File tree

src/agents/realtime/openai_realtime.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,8 @@ async def send_event(self, event: RealtimeModelSendEvent) -> None:
720720
)
721721
else:
722722
await self._send_raw_message(converted)
723+
elif _debug.DONT_LOG_MODEL_DATA:
724+
logger.error("Failed to convert raw message type=%s", event.message.get("type"))
723725
else:
724726
logger.error("Failed to convert raw message: %s", event)
725727
elif isinstance(event, RealtimeModelSendUserInput):

tests/realtime/test_openai_realtime.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,31 @@ async def test_handle_invalid_event_schema_redacts_payload_from_logs(self, model
477477
error_event = mock_listener.on_event.call_args_list[1][0][0]
478478
assert error_event.type == "error"
479479

480+
@pytest.mark.asyncio
481+
async def test_send_raw_message_conversion_failure_redacts_payload_from_logs(
482+
self, model, monkeypatch
483+
):
484+
"""A raw client message that fails to convert must not leak its payload to the logs
485+
when model-data logging is disabled."""
486+
monkeypatch.setattr(
487+
"agents.realtime.openai_realtime._debug.DONT_LOG_MODEL_DATA",
488+
True,
489+
)
490+
raw = RealtimeModelSendRawMessage(
491+
message={
492+
"type": "invalid.event.type",
493+
"other_data": {"transcript": "secret transcript"},
494+
}
495+
)
496+
497+
with patch("agents.realtime.openai_realtime.logger") as mock_logger:
498+
await model.send_event(raw)
499+
500+
mock_logger.error.assert_called_once()
501+
logged_call = str(mock_logger.error.call_args)
502+
assert "secret transcript" not in logged_call
503+
assert "invalid.event.type" in logged_call
504+
480505
@pytest.mark.asyncio
481506
async def test_custom_voice_response_events_update_response_sequencer(self, model, monkeypatch):
482507
"""Dict-shaped custom voices should not block response.create sequencing."""

0 commit comments

Comments
 (0)