Skip to content

Commit d4b2906

Browse files
Add functionality to update agent during realtime session
1 parent 818344c commit d4b2906

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/agents/realtime/session.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,29 @@ async def interrupt(self) -> None:
180180
"""Interrupt the model."""
181181
await self._model.send_event(RealtimeModelSendInterrupt())
182182

183+
async def update_agent(self, agent: RealtimeAgent) -> None:
184+
"""Update the active agent for this session and apply its settings to the model."""
185+
186+
previous_agent = self._current_agent
187+
self._current_agent = agent
188+
189+
updated_settings = await self._get_updated_model_settings_from_agent(
190+
starting_settings=None,
191+
agent=self._current_agent,
192+
)
193+
194+
await self._put_event(
195+
RealtimeHandoffEvent(
196+
from_agent=previous_agent,
197+
to_agent=self._current_agent,
198+
info=self._event_info,
199+
)
200+
)
201+
202+
await self._model.send_event(
203+
RealtimeModelSendSessionUpdate(session_settings=updated_settings)
204+
)
205+
183206
async def on_event(self, event: RealtimeModelEvent) -> None:
184207
await self._put_event(RealtimeRawModelEvent(data=event, info=self._event_info))
185208

tests/realtime/test_session.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
RealtimeAudioInterrupted,
1616
RealtimeError,
1717
RealtimeGuardrailTripped,
18+
RealtimeHandoffEvent,
1819
RealtimeHistoryAdded,
1920
RealtimeHistoryUpdated,
2021
RealtimeRawModelEvent,
@@ -45,6 +46,7 @@
4546
RealtimeModelTurnEndedEvent,
4647
RealtimeModelTurnStartedEvent,
4748
)
49+
from agents.realtime.model_inputs import RealtimeModelSendSessionUpdate
4850
from agents.realtime.session import RealtimeSession
4951
from agents.tool import FunctionTool
5052
from agents.tool_context import ToolContext
@@ -1488,3 +1490,30 @@ async def mock_get_handoffs(cls, agent, context_wrapper):
14881490
assert model_settings["voice"] == "model_config_only_voice"
14891491
assert model_settings["tool_choice"] == "required"
14901492
assert model_settings["output_audio_format"] == "g711_ulaw"
1493+
1494+
1495+
class TestUpdateAgentFunctionality:
1496+
"""Tests for update agent functionality in RealtimeSession"""
1497+
1498+
@pytest.mark.asyncio
1499+
async def test_update_agent_creates_handoff_and_session_update_event(self, mock_model):
1500+
first_agent = RealtimeAgent(name="first", instructions="first", tools=[], handoffs=[])
1501+
second_agent = RealtimeAgent(name="second", instructions="second", tools=[], handoffs=[])
1502+
1503+
session = RealtimeSession(mock_model, first_agent, None)
1504+
1505+
await session.update_agent(second_agent)
1506+
1507+
# Should have sent handoff event
1508+
handoff_event = await session._event_queue.get()
1509+
assert isinstance(handoff_event, RealtimeHandoffEvent)
1510+
assert handoff_event.from_agent == first_agent
1511+
assert handoff_event.to_agent == second_agent
1512+
1513+
# Should have sent session update
1514+
session_update_event = mock_model.sent_events[0]
1515+
assert isinstance(session_update_event, RealtimeModelSendSessionUpdate)
1516+
assert session_update_event.session_settings["instructions"] == "second"
1517+
1518+
# Check that the current agent and session settings are updated
1519+
assert session._current_agent == second_agent

0 commit comments

Comments
 (0)