From 162661457a8ec1a9e15e8f6f32bb994e0538da36 Mon Sep 17 00:00:00 2001 From: Ari Webb Date: Tue, 4 Nov 2025 17:31:31 -0800 Subject: [PATCH] fix: sleeptime agents are broken [LET-6042] (#5953) minimal solution --- letta/groups/sleeptime_multi_agent_v3.py | 27 +++++++++++++----------- letta/groups/sleeptime_multi_agent_v4.py | 27 +++++++++++++----------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/letta/groups/sleeptime_multi_agent_v3.py b/letta/groups/sleeptime_multi_agent_v3.py index 53653ffa..df00fabd 100644 --- a/letta/groups/sleeptime_multi_agent_v3.py +++ b/letta/groups/sleeptime_multi_agent_v3.py @@ -81,18 +81,21 @@ class SleeptimeMultiAgentV3(LettaAgentV2): input_messages[i].group_id = self.group.id # Perform foreground agent step - async for chunk in super().stream( - input_messages=input_messages, - max_steps=max_steps, - stream_tokens=stream_tokens, - run_id=run_id, - use_assistant_message=use_assistant_message, - include_return_message_types=include_return_message_types, - request_start_timestamp_ns=request_start_timestamp_ns, - ): - yield chunk - - await self.run_sleeptime_agents() + try: + async for chunk in super().stream( + input_messages=input_messages, + max_steps=max_steps, + stream_tokens=stream_tokens, + run_id=run_id, + use_assistant_message=use_assistant_message, + include_return_message_types=include_return_message_types, + request_start_timestamp_ns=request_start_timestamp_ns, + ): + yield chunk + finally: + # For some reason, stream is throwing a GeneratorExit even though it appears the that client + # is getting the whole stream. This pattern should work to ensure sleeptime agents run despite this. + await self.run_sleeptime_agents() @trace_method async def run_sleeptime_agents(self): diff --git a/letta/groups/sleeptime_multi_agent_v4.py b/letta/groups/sleeptime_multi_agent_v4.py index 6580b432..535d42b4 100644 --- a/letta/groups/sleeptime_multi_agent_v4.py +++ b/letta/groups/sleeptime_multi_agent_v4.py @@ -80,18 +80,21 @@ class SleeptimeMultiAgentV4(LettaAgentV3): input_messages[i].group_id = self.group.id # Perform foreground agent step - async for chunk in super().stream( - input_messages=input_messages, - max_steps=max_steps, - stream_tokens=stream_tokens, - run_id=run_id, - use_assistant_message=use_assistant_message, - include_return_message_types=include_return_message_types, - request_start_timestamp_ns=request_start_timestamp_ns, - ): - yield chunk - - await self.run_sleeptime_agents() + try: + async for chunk in super().stream( + input_messages=input_messages, + max_steps=max_steps, + stream_tokens=stream_tokens, + run_id=run_id, + use_assistant_message=use_assistant_message, + include_return_message_types=include_return_message_types, + request_start_timestamp_ns=request_start_timestamp_ns, + ): + yield chunk + finally: + # For some reason, stream is throwing a GeneratorExit even though it appears the that client + # is getting the whole stream. This pattern should work to ensure sleeptime agents run despite this. + await self.run_sleeptime_agents() @trace_method async def run_sleeptime_agents(self) -> list[str]: