LLMUserAggregator: prevent consecutive user/bot turn starts
This commit is contained in:
@@ -241,6 +241,7 @@ class LLMUserAggregator(LLMContextAggregator):
|
|||||||
"""
|
"""
|
||||||
super().__init__(context=context, role="user", **kwargs)
|
super().__init__(context=context, role="user", **kwargs)
|
||||||
self._params = params or LLMUserAggregatorParams()
|
self._params = params or LLMUserAggregatorParams()
|
||||||
|
self._user_speaking = False
|
||||||
|
|
||||||
async def cleanup(self):
|
async def cleanup(self):
|
||||||
"""Clean up processor resources."""
|
"""Clean up processor resources."""
|
||||||
@@ -251,9 +252,11 @@ class LLMUserAggregator(LLMContextAggregator):
|
|||||||
"""Reset the aggregation state and interruption strategies."""
|
"""Reset the aggregation state and interruption strategies."""
|
||||||
await super().reset()
|
await super().reset()
|
||||||
|
|
||||||
if self.turn_start_strategies:
|
if self.turn_start_strategies and self.turn_start_strategies.user:
|
||||||
for s in self.turn_start_strategies.user:
|
for s in self.turn_start_strategies.user:
|
||||||
await s.reset()
|
await s.reset()
|
||||||
|
|
||||||
|
if self.turn_start_strategies and self.turn_start_strategies.bot:
|
||||||
for s in self.turn_start_strategies.bot:
|
for s in self.turn_start_strategies.bot:
|
||||||
await s.reset()
|
await s.reset()
|
||||||
|
|
||||||
@@ -313,20 +316,19 @@ class LLMUserAggregator(LLMContextAggregator):
|
|||||||
await self.push_context_frame()
|
await self.push_context_frame()
|
||||||
|
|
||||||
async def _start(self, frame: StartFrame):
|
async def _start(self, frame: StartFrame):
|
||||||
if not self.turn_start_strategies:
|
if self.turn_start_strategies and self.turn_start_strategies.user:
|
||||||
return
|
for s in self.turn_start_strategies.user:
|
||||||
|
await s.setup(self.task_manager)
|
||||||
|
s.add_event_handler("on_push_frame", self._on_push_frame)
|
||||||
|
s.add_event_handler("on_broadcast_frame", self._on_broadcast_frame)
|
||||||
|
s.add_event_handler("on_user_turn_started", self._on_user_turn_started)
|
||||||
|
|
||||||
for s in self.turn_start_strategies.user:
|
if self.turn_start_strategies and self.turn_start_strategies.bot:
|
||||||
await s.setup(self.task_manager)
|
for s in self.turn_start_strategies.bot:
|
||||||
s.add_event_handler("on_push_frame", self._on_push_frame)
|
await s.setup(self.task_manager)
|
||||||
s.add_event_handler("on_broadcast_frame", self._on_broadcast_frame)
|
s.add_event_handler("on_push_frame", self._on_push_frame)
|
||||||
s.add_event_handler("on_user_turn_started", self._on_user_turn_started)
|
s.add_event_handler("on_broadcast_frame", self._on_broadcast_frame)
|
||||||
|
s.add_event_handler("on_bot_turn_started", self._on_bot_turn_started)
|
||||||
for s in self.turn_start_strategies.bot:
|
|
||||||
await s.setup(self.task_manager)
|
|
||||||
s.add_event_handler("on_push_frame", self._on_push_frame)
|
|
||||||
s.add_event_handler("on_broadcast_frame", self._on_broadcast_frame)
|
|
||||||
s.add_event_handler("on_bot_turn_started", self._on_bot_turn_started)
|
|
||||||
|
|
||||||
async def _stop(self, frame: EndFrame):
|
async def _stop(self, frame: EndFrame):
|
||||||
await self._cleanup()
|
await self._cleanup()
|
||||||
@@ -335,17 +337,20 @@ class LLMUserAggregator(LLMContextAggregator):
|
|||||||
await self._cleanup()
|
await self._cleanup()
|
||||||
|
|
||||||
async def _cleanup(self):
|
async def _cleanup(self):
|
||||||
if self.turn_start_strategies:
|
if self.turn_start_strategies and self.turn_start_strategies.user:
|
||||||
for s in self.turn_start_strategies.user:
|
for s in self.turn_start_strategies.user:
|
||||||
await s.cleanup()
|
await s.cleanup()
|
||||||
|
|
||||||
|
if self.turn_start_strategies and self.turn_start_strategies.bot:
|
||||||
for s in self.turn_start_strategies.bot:
|
for s in self.turn_start_strategies.bot:
|
||||||
await s.cleanup()
|
await s.cleanup()
|
||||||
|
|
||||||
async def _turn_start_strategies_process_frame(self, frame: Frame):
|
async def _turn_start_strategies_process_frame(self, frame: Frame):
|
||||||
if self.turn_start_strategies:
|
if self.turn_start_strategies and self.turn_start_strategies.user:
|
||||||
for strategy in self.turn_start_strategies.user:
|
for strategy in self.turn_start_strategies.user:
|
||||||
await strategy.process_frame(frame)
|
await strategy.process_frame(frame)
|
||||||
|
|
||||||
|
if self.turn_start_strategies and self.turn_start_strategies.bot:
|
||||||
for strategy in self.turn_start_strategies.bot:
|
for strategy in self.turn_start_strategies.bot:
|
||||||
await strategy.process_frame(frame)
|
await strategy.process_frame(frame)
|
||||||
|
|
||||||
@@ -399,8 +404,14 @@ class LLMUserAggregator(LLMContextAggregator):
|
|||||||
await self.broadcast_frame(frame_cls, **kwargs)
|
await self.broadcast_frame(frame_cls, **kwargs)
|
||||||
|
|
||||||
async def _trigger_user_turn_start(self, strategy: BaseUserTurnStartStrategy):
|
async def _trigger_user_turn_start(self, strategy: BaseUserTurnStartStrategy):
|
||||||
|
# Prevent two consecutive user turn starts.
|
||||||
|
if self._user_speaking:
|
||||||
|
return
|
||||||
|
|
||||||
|
self._user_speaking = True
|
||||||
|
|
||||||
# Reset all user turn start strategies to start fresh.
|
# Reset all user turn start strategies to start fresh.
|
||||||
if self.turn_start_strategies:
|
if self.turn_start_strategies and self.turn_start_strategies.user:
|
||||||
for s in self.turn_start_strategies.user:
|
for s in self.turn_start_strategies.user:
|
||||||
await s.reset()
|
await s.reset()
|
||||||
|
|
||||||
@@ -411,8 +422,14 @@ class LLMUserAggregator(LLMContextAggregator):
|
|||||||
await self.broadcast_frame(InterruptionFrame)
|
await self.broadcast_frame(InterruptionFrame)
|
||||||
|
|
||||||
async def _trigger_bot_turn_start(self, strategy: BaseBotTurnStartStrategy):
|
async def _trigger_bot_turn_start(self, strategy: BaseBotTurnStartStrategy):
|
||||||
|
# Prevent two consecutive bot turn starts.
|
||||||
|
if not self._user_speaking:
|
||||||
|
return
|
||||||
|
|
||||||
|
self._user_speaking = False
|
||||||
|
|
||||||
# Reset all bot turn start strategies to start fresh.
|
# Reset all bot turn start strategies to start fresh.
|
||||||
if self.turn_start_strategies:
|
if self.turn_start_strategies and self.turn_start_strategies.bot:
|
||||||
for s in self.turn_start_strategies.bot:
|
for s in self.turn_start_strategies.bot:
|
||||||
await s.reset()
|
await s.reset()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user