Skip to content

Commit c478007

Browse files
committed
fix: #2097 fix the default settings for SIP realtime runner
1 parent e93d778 commit c478007

File tree

3 files changed

+40
-9
lines changed

3 files changed

+40
-9
lines changed

examples/realtime/twilio_sip/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ This example shows how to handle OpenAI Realtime SIP calls with the Agents SDK.
2525

2626
1. Install dependencies:
2727
```bash
28-
uv pip install -r examples/realtime/twilio-sip/requirements.txt
28+
uv pip install -r examples/realtime/twilio_sip/requirements.txt
2929
```
3030
2. Export required environment variables:
3131
```bash

src/agents/realtime/openai_realtime.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ def __init__(self) -> None:
198198
self._playback_tracker: RealtimePlaybackTracker | None = None
199199
self._created_session: OpenAISessionCreateRequest | None = None
200200
self._server_event_type_adapter = get_server_event_type_adapter()
201+
self._call_id: str | None = None
201202

202203
async def connect(self, options: RealtimeModelConfig) -> None:
203204
"""Establish a connection to the model and keep it alive."""
@@ -220,6 +221,7 @@ async def connect(self, options: RealtimeModelConfig) -> None:
220221
if model_name:
221222
self.model = model_name
222223

224+
self._call_id = call_id
223225
api_key = await get_api_key(options.get("api_key"))
224226

225227
if "tracing" in model_settings:
@@ -833,10 +835,13 @@ def _get_session_config(
833835
speed = model_settings.get("speed")
834836
modalities = model_settings.get("modalities", DEFAULT_MODEL_SETTINGS.get("modalities"))
835837

836-
input_audio_format = model_settings.get(
837-
"input_audio_format",
838-
DEFAULT_MODEL_SETTINGS.get("input_audio_format"),
839-
)
838+
if self._call_id:
839+
input_audio_format = model_settings.get("input_audio_format")
840+
else:
841+
input_audio_format = model_settings.get(
842+
"input_audio_format",
843+
DEFAULT_MODEL_SETTINGS.get("input_audio_format"),
844+
)
840845
input_audio_transcription = model_settings.get(
841846
"input_audio_transcription",
842847
DEFAULT_MODEL_SETTINGS.get("input_audio_transcription"),
@@ -845,10 +850,13 @@ def _get_session_config(
845850
"turn_detection",
846851
DEFAULT_MODEL_SETTINGS.get("turn_detection"),
847852
)
848-
output_audio_format = model_settings.get(
849-
"output_audio_format",
850-
DEFAULT_MODEL_SETTINGS.get("output_audio_format"),
851-
)
853+
if self._call_id:
854+
output_audio_format = model_settings.get("output_audio_format")
855+
else:
856+
output_audio_format = model_settings.get(
857+
"output_audio_format",
858+
DEFAULT_MODEL_SETTINGS.get("output_audio_format"),
859+
)
852860
input_audio_noise_reduction = model_settings.get(
853861
"input_audio_noise_reduction",
854862
DEFAULT_MODEL_SETTINGS.get("input_audio_noise_reduction"),

tests/realtime/test_openai_realtime.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,29 @@ def test_get_and_update_session_config(self, model):
606606
assert cfg.audio is not None and cfg.audio.output is not None
607607
assert cfg.audio.output.voice == "verse"
608608

609+
def test_session_config_defaults_audio_formats_when_not_call(self, model):
610+
settings: dict[str, Any] = {}
611+
cfg = model._get_session_config(settings)
612+
assert cfg.audio is not None
613+
assert cfg.audio.input is not None
614+
assert cfg.audio.input.format is not None
615+
assert cfg.audio.input.format.type == "audio/pcm"
616+
assert cfg.audio.output is not None
617+
assert cfg.audio.output.format is not None
618+
assert cfg.audio.output.format.type == "audio/pcm"
619+
620+
def test_session_config_preserves_sip_audio_formats(self, model):
621+
model._call_id = "call-123"
622+
settings = {
623+
"turn_detection": {"type": "semantic_vad", "interrupt_response": True},
624+
}
625+
cfg = model._get_session_config(settings)
626+
assert cfg.audio is not None
627+
assert cfg.audio.input is not None
628+
assert cfg.audio.input.format is None
629+
assert cfg.audio.output is not None
630+
assert cfg.audio.output.format is None
631+
609632
@pytest.mark.asyncio
610633
async def test_handle_error_event_success(self, model):
611634
"""Test successful handling of error events."""

0 commit comments

Comments
 (0)