feat: enhance call end coordination with state management
- Added support for tracking call end states (pending, speaking, cancelled) in CallEndCoordinator. - Introduced a callback mechanism for state changes to allow external handling of call end states. - Updated pipeline and tests to accommodate new state management features, ensuring proper handling of call end scenarios.
This commit is contained in:
@@ -19,20 +19,26 @@ from services.pipecat.processors import CallEndingUserMuteStrategy
|
||||
class CallEndCoordinatorTest(unittest.IsolatedAsyncioTestCase):
|
||||
async def asyncSetUp(self):
|
||||
self.reasons: list[str] = []
|
||||
self.states: list[tuple[str, bool]] = []
|
||||
|
||||
async def queue_end(reason: str) -> None:
|
||||
self.reasons.append(reason)
|
||||
|
||||
self.coordinator = CallEndCoordinator(queue_end)
|
||||
async def record_state(state: str, interruptible: bool) -> None:
|
||||
self.states.append((state, interruptible))
|
||||
|
||||
self.coordinator = CallEndCoordinator(queue_end, record_state)
|
||||
|
||||
async def test_generated_closing_text_waits_for_audio_stop(self):
|
||||
self.coordinator.begin_response()
|
||||
self.coordinator.begin("prompt_end_call")
|
||||
await asyncio.sleep(0)
|
||||
await self.coordinator.finish_after_current_speech(has_text=True)
|
||||
|
||||
self.assertEqual(self.reasons, [])
|
||||
await self.coordinator.observe(BotStartedSpeakingFrame())
|
||||
self.assertEqual(self.reasons, [])
|
||||
self.assertEqual(self.states[-1], ("speaking", False))
|
||||
await self.coordinator.observe(BotStoppedSpeakingFrame())
|
||||
self.assertEqual(self.reasons, ["prompt_end_call"])
|
||||
|
||||
@@ -71,12 +77,17 @@ class CallEndCoordinatorTest(unittest.IsolatedAsyncioTestCase):
|
||||
async def test_interruptible_end_keeps_input_open_and_can_be_cancelled(self):
|
||||
self.coordinator.begin_response()
|
||||
self.coordinator.begin("user_goodbye", interruptible=True)
|
||||
await asyncio.sleep(0)
|
||||
self.assertEqual(self.states[-1], ("pending", True))
|
||||
await self.coordinator.finish_after_current_speech(has_text=True)
|
||||
await self.coordinator.observe(BotStartedSpeakingFrame())
|
||||
self.assertEqual(self.states[-1], ("speaking", True))
|
||||
|
||||
self.assertTrue(self.coordinator.ending)
|
||||
self.assertTrue(self.coordinator.accepts_input)
|
||||
self.assertTrue(self.coordinator.cancel_pending_end())
|
||||
await asyncio.sleep(0)
|
||||
self.assertEqual(self.states[-1], ("cancelled", False))
|
||||
self.assertFalse(self.coordinator.ending)
|
||||
self.assertTrue(self.coordinator.accepts_input)
|
||||
self.assertTrue(self.coordinator.speaking)
|
||||
|
||||
Reference in New Issue
Block a user