From 79354a72ea7fd79987bf989a58cf2d3c4a7619f5 Mon Sep 17 00:00:00 2001 From: cthomas Date: Fri, 4 Apr 2025 09:16:59 -0700 Subject: [PATCH] chore: rename background to sleeptime (#1558) --- ...6e71df_rename_sleeptime_agent_frequency.py | 29 +++++++++++++++++++ letta/groups/helpers.py | 8 ++--- ...ulti_agent.py => sleeptime_multi_agent.py} | 14 ++++----- letta/orm/group.py | 2 +- letta/schemas/group.py | 12 ++++---- letta/server/server.py | 4 +-- letta/services/agent_manager.py | 2 +- letta/services/group_manager.py | 22 +++++++------- tests/test_multi_agent.py | 12 ++++---- 9 files changed, 67 insertions(+), 38 deletions(-) create mode 100644 alembic/versions/90bb156e71df_rename_sleeptime_agent_frequency.py rename letta/groups/{background_multi_agent.py => sleeptime_multi_agent.py} (95%) diff --git a/alembic/versions/90bb156e71df_rename_sleeptime_agent_frequency.py b/alembic/versions/90bb156e71df_rename_sleeptime_agent_frequency.py new file mode 100644 index 00000000..b80f183e --- /dev/null +++ b/alembic/versions/90bb156e71df_rename_sleeptime_agent_frequency.py @@ -0,0 +1,29 @@ +"""rename sleeptime_agent_frequency + +Revision ID: 90bb156e71df +Revises: 6fe79c0525f2 +Create Date: 2025-04-03 17:20:26.218596 + +""" + +from typing import Sequence, Union + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "90bb156e71df" +down_revision: Union[str, None] = "6fe79c0525f2" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column("groups", "background_agents_frequency", new_column_name="sleeptime_agent_frequency") + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column("groups", "sleeptime_agent_frequency", new_column_name="background_agents_frequency") + # ### end Alembic commands ### diff --git a/letta/groups/helpers.py b/letta/groups/helpers.py index 8755e190..a739c789 100644 --- a/letta/groups/helpers.py +++ b/letta/groups/helpers.py @@ -61,7 +61,7 @@ def load_multi_agent( agent_ids=group.agent_ids, description=group.description, ) - case ManagerType.background: + case ManagerType.sleeptime: if not agent_state.enable_sleeptime: return Agent( agent_state=agent_state, @@ -70,16 +70,16 @@ def load_multi_agent( mcp_clients=mcp_clients, ) - from letta.groups.background_multi_agent import BackgroundMultiAgent + from letta.groups.sleeptime_multi_agent import SleeptimeMultiAgent - return BackgroundMultiAgent( + return SleeptimeMultiAgent( agent_state=agent_state, interface=interface, user=actor, group_id=group.id, agent_ids=group.agent_ids, description=group.description, - background_agents_frequency=group.background_agents_frequency, + sleeptime_agent_frequency=group.sleeptime_agent_frequency, ) case _: raise ValueError(f"Type {group.manager_type} is not supported.") diff --git a/letta/groups/background_multi_agent.py b/letta/groups/sleeptime_multi_agent.py similarity index 95% rename from letta/groups/background_multi_agent.py rename to letta/groups/sleeptime_multi_agent.py index 64cba869..4dc27ab7 100644 --- a/letta/groups/background_multi_agent.py +++ b/letta/groups/sleeptime_multi_agent.py @@ -19,7 +19,7 @@ from letta.services.job_manager import JobManager from letta.services.message_manager import MessageManager -class BackgroundMultiAgent(Agent): +class SleeptimeMultiAgent(Agent): def __init__( self, @@ -30,13 +30,13 @@ class BackgroundMultiAgent(Agent): group_id: str = "", agent_ids: List[str] = [], description: str = "", - background_agents_frequency: Optional[int] = None, + sleeptime_agent_frequency: Optional[int] = None, ): super().__init__(interface, agent_state, user) self.group_id = group_id self.agent_ids = agent_ids self.description = description - self.background_agents_frequency = background_agents_frequency + self.sleeptime_agent_frequency = sleeptime_agent_frequency self.group_manager = GroupManager() self.message_manager = MessageManager() self.job_manager = JobManager() @@ -118,7 +118,7 @@ class BackgroundMultiAgent(Agent): ) prior_messages = [] - if self.background_agents_frequency: + if self.sleeptime_agent_frequency: try: prior_messages = self.message_manager.list_messages_for_agent( agent_id=self.agent_state.id, @@ -214,11 +214,11 @@ class BackgroundMultiAgent(Agent): ) turns_counter = None - if self.background_agents_frequency is not None and self.background_agents_frequency > 0: + if self.sleeptime_agent_frequency is not None and self.sleeptime_agent_frequency > 0: turns_counter = self.group_manager.bump_turns_counter(group_id=self.group_id, actor=self.user) - if self.background_agents_frequency is None or ( - turns_counter is not None and turns_counter % self.background_agents_frequency == 0 + if self.sleeptime_agent_frequency is None or ( + turns_counter is not None and turns_counter % self.sleeptime_agent_frequency == 0 ): last_response_messages = [message for sublist in usage_stats.steps_messages for message in sublist] last_processed_message_id = self.group_manager.get_last_processed_message_id_and_update( diff --git a/letta/orm/group.py b/letta/orm/group.py index c77d33cb..48c3b65b 100644 --- a/letta/orm/group.py +++ b/letta/orm/group.py @@ -20,7 +20,7 @@ class Group(SqlalchemyBase, OrganizationMixin): manager_agent_id: Mapped[Optional[str]] = mapped_column(String, ForeignKey("agents.id", ondelete="RESTRICT"), nullable=True, doc="") termination_token: Mapped[Optional[str]] = mapped_column(nullable=True, doc="") max_turns: Mapped[Optional[int]] = mapped_column(nullable=True, doc="") - background_agents_frequency: Mapped[Optional[int]] = mapped_column(nullable=True, doc="") + sleeptime_agent_frequency: Mapped[Optional[int]] = mapped_column(nullable=True, doc="") turns_counter: Mapped[Optional[int]] = mapped_column(nullable=True, doc="") last_processed_message_id: Mapped[Optional[str]] = mapped_column(nullable=True, doc="") diff --git a/letta/schemas/group.py b/letta/schemas/group.py index 669ebff4..e4dc80fb 100644 --- a/letta/schemas/group.py +++ b/letta/schemas/group.py @@ -10,7 +10,7 @@ class ManagerType(str, Enum): round_robin = "round_robin" supervisor = "supervisor" dynamic = "dynamic" - background = "background" + sleeptime = "sleeptime" swarm = "swarm" @@ -28,7 +28,7 @@ class Group(GroupBase): manager_agent_id: Optional[str] = Field(None, description="") termination_token: Optional[str] = Field(None, description="") max_turns: Optional[int] = Field(None, description="") - background_agents_frequency: Optional[int] = Field(None, description="") + sleeptime_agent_frequency: Optional[int] = Field(None, description="") turns_counter: Optional[int] = Field(None, description="") last_processed_message_id: Optional[str] = Field(None, description="") @@ -54,10 +54,10 @@ class DynamicManager(ManagerConfig): max_turns: Optional[int] = Field(None, description="") -class BackgroundManager(ManagerConfig): - manager_type: Literal[ManagerType.background] = Field(ManagerType.background, description="") +class SleeptimeManager(ManagerConfig): + manager_type: Literal[ManagerType.sleeptime] = Field(ManagerType.sleeptime, description="") manager_agent_id: str = Field(..., description="") - background_agents_frequency: Optional[int] = Field(None, description="") + sleeptime_agent_frequency: Optional[int] = Field(None, description="") # class SwarmGroup(ManagerConfig): @@ -65,7 +65,7 @@ class BackgroundManager(ManagerConfig): ManagerConfigUnion = Annotated[ - Union[RoundRobinManager, SupervisorManager, DynamicManager, BackgroundManager], + Union[RoundRobinManager, SupervisorManager, DynamicManager, SleeptimeManager], Field(discriminator="manager_type"), ] diff --git a/letta/server/server.py b/letta/server/server.py index 83e6cd10..2fc78496 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -40,7 +40,7 @@ from letta.schemas.embedding_config import EmbeddingConfig # openai schemas from letta.schemas.enums import JobStatus, MessageStreamStatus from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate -from letta.schemas.group import BackgroundManager, GroupCreate +from letta.schemas.group import GroupCreate, SleeptimeManager from letta.schemas.job import Job, JobUpdate from letta.schemas.letta_message import LegacyLettaMessage, LettaMessage, ToolReturnMessage from letta.schemas.letta_message_content import TextContent @@ -782,7 +782,7 @@ class SyncServer(Server): group=GroupCreate( description="", agent_ids=[sleeptime_agent.id], - manager_config=BackgroundManager( + manager_config=SleeptimeManager( manager_agent_id=main_agent.id, ), ), diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 9a5d32d9..7d9f87be 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -498,7 +498,7 @@ class AgentManager: # Delete sleeptime agent and group if agent.multi_agent_group: participant_agent_ids = agent.multi_agent_group.agent_ids - if agent.multi_agent_group.manager_type == ManagerType.background and len(participant_agent_ids) == 1: + if agent.multi_agent_group.manager_type == ManagerType.sleeptime and len(participant_agent_ids) == 1: sleeptime_agent = AgentModel.read(db_session=session, identifier=participant_agent_ids[0], actor=actor) if sleeptime_agent.agent_type == AgentType.sleeptime_agent: sleeptime_agent_group = GroupModel.read(db_session=session, identifier=agent.multi_agent_group.id, actor=actor) diff --git a/letta/services/group_manager.py b/letta/services/group_manager.py index 623d0fa4..17d411e0 100644 --- a/letta/services/group_manager.py +++ b/letta/services/group_manager.py @@ -71,11 +71,11 @@ class GroupManager: case ManagerType.supervisor: new_group.manager_type = ManagerType.supervisor new_group.manager_agent_id = group.manager_config.manager_agent_id - case ManagerType.background: - new_group.manager_type = ManagerType.background + case ManagerType.sleeptime: + new_group.manager_type = ManagerType.sleeptime new_group.manager_agent_id = group.manager_config.manager_agent_id - new_group.background_agents_frequency = group.manager_config.background_agents_frequency - if new_group.background_agents_frequency: + new_group.sleeptime_agent_frequency = group.manager_config.sleeptime_agent_frequency + if new_group.sleeptime_agent_frequency: new_group.turns_counter = 0 case _: raise ValueError(f"Unsupported manager type: {group.manager_config.manager_type}") @@ -93,7 +93,7 @@ class GroupManager: with self.session_maker() as session: group = GroupModel.read(db_session=session, identifier=group_id, actor=actor) - background_agents_frequency = None + sleeptime_agent_frequency = None max_turns = None termination_token = None manager_agent_id = None @@ -109,16 +109,16 @@ class GroupManager: termination_token = group_update.manager_config.termination_token case ManagerType.supervisor: manager_agent_id = group_update.manager_config.manager_agent_id - case ManagerType.background: + case ManagerType.sleeptime: manager_agent_id = group_update.manager_config.manager_agent_id - background_agents_frequency = group_update.manager_config.background_agents_frequency - if background_agents_frequency and group.turns_counter is None: + sleeptime_agent_frequency = group_update.manager_config.sleeptime_agent_frequency + if sleeptime_agent_frequency and group.turns_counter is None: group.turns_counter = 0 case _: raise ValueError(f"Unsupported manager type: {group_update.manager_config.manager_type}") - if background_agents_frequency: - group.background_agents_frequency = background_agents_frequency + if sleeptime_agent_frequency: + group.sleeptime_agent_frequency = sleeptime_agent_frequency if max_turns: group.max_turns = max_turns if termination_token: @@ -198,7 +198,7 @@ class GroupManager: group = GroupModel.read(db_session=session, identifier=group_id, actor=actor) # Update turns counter - group.turns_counter = (group.turns_counter + 1) % group.background_agents_frequency + group.turns_counter = (group.turns_counter + 1) % group.sleeptime_agent_frequency group.update(session, actor=actor) return group.turns_counter diff --git a/tests/test_multi_agent.py b/tests/test_multi_agent.py index ec9f07f5..3e8cb276 100644 --- a/tests/test_multi_agent.py +++ b/tests/test_multi_agent.py @@ -10,12 +10,12 @@ from letta.schemas.agent import CreateAgent from letta.schemas.block import CreateBlock from letta.schemas.enums import JobStatus from letta.schemas.group import ( - BackgroundManager, DynamicManager, GroupCreate, GroupUpdate, ManagerType, RoundRobinManager, + SleeptimeManager, SupervisorManager, ) from letta.schemas.message import MessageCreate @@ -441,7 +441,7 @@ async def test_dynamic_group_chat(server, actor, manager_agent, participant_agen @pytest.mark.asyncio -async def test_background_group_chat(server, actor): +async def test_sleeptime_group_chat(server, actor): # 0. Refresh base tools server.tool_manager.upsert_base_tools(actor=actor) @@ -472,16 +472,16 @@ async def test_background_group_chat(server, actor): group = server.group_manager.modify_group( group_id=main_agent.multi_agent_group.id, group_update=GroupUpdate( - manager_config=BackgroundManager( + manager_config=SleeptimeManager( manager_agent_id=main_agent.id, - background_agents_frequency=2, + sleeptime_agent_frequency=2, ), ), actor=actor, ) - assert group.manager_type == ManagerType.background - assert group.background_agents_frequency == 2 + assert group.manager_type == ManagerType.sleeptime + assert group.sleeptime_agent_frequency == 2 assert len(group.agent_ids) == 1 # 3. Verify shared blocks