From b82a19a195c4e89b49f2e2c303b9832c37e8d7ba Mon Sep 17 00:00:00 2001 From: cthomas Date: Mon, 14 Apr 2025 09:05:38 -0700 Subject: [PATCH] feat: add sleeptime frequency setting in ADE (#1685) --- letta/server/rest_api/routers/v1/agents.py | 14 ++++++++++++ letta/services/agent_manager.py | 9 ++++++++ tests/test_multi_agent.py | 26 ++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 34d4e99a..c0acdccf 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -17,6 +17,7 @@ from letta.log import get_logger from letta.orm.errors import NoResultFound from letta.schemas.agent import AgentState, AgentType, CreateAgent, UpdateAgent from letta.schemas.block import Block, BlockUpdate +from letta.schemas.group import Group from letta.schemas.job import JobStatus, JobUpdate, LettaRequestConfig from letta.schemas.letta_message import LettaMessageUnion, LettaMessageUpdateUnion from letta.schemas.letta_request import LettaRequest, LettaStreamingRequest @@ -804,3 +805,16 @@ def reset_messages( """Resets the messages for an agent""" actor = server.user_manager.get_user_or_default(user_id=actor_id) return server.agent_manager.reset_messages(agent_id=agent_id, actor=actor, add_default_initial_messages=add_default_initial_messages) + + +@router.get("/{agent_id}/groups", response_model=List[Group], operation_id="list_agent_groups") +async def list_agent_groups( + agent_id: str, + manager_type: Optional[str] = Query(None, description="Manager type to filter groups by"), + server: "SyncServer" = Depends(get_letta_server), + actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present +): + """Lists the groups for an agent""" + actor = server.user_manager.get_user_or_default(user_id=actor_id) + print("in list agents with manager_type", manager_type) + return server.agent_manager.list_groups(agent_id=agent_id, manager_type=manager_type, actor=actor) diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 6c639303..e158ba5c 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -34,6 +34,7 @@ from letta.schemas.agent import AgentType, CreateAgent, UpdateAgent from letta.schemas.block import Block as PydanticBlock from letta.schemas.block import BlockUpdate from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.group import Group as PydanticGroup from letta.schemas.group import ManagerType from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import Memory @@ -642,6 +643,14 @@ class AgentManager: # Return the updated agent state return agent.to_pydantic() + @enforce_types + def list_groups(self, agent_id: str, actor: PydanticUser, manager_type: Optional[str] = None) -> List[PydanticGroup]: + with self.session_maker() as session: + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + if manager_type: + return [group.to_pydantic() for group in agent.groups if group.manager_type == manager_type] + return [group.to_pydantic() for group in agent.groups] + # ====================================================================================================================== # In Context Messages Management # ====================================================================================================================== diff --git a/tests/test_multi_agent.py b/tests/test_multi_agent.py index 81dcffd8..acbee470 100644 --- a/tests/test_multi_agent.py +++ b/tests/test_multi_agent.py @@ -194,6 +194,32 @@ async def test_modify_group_pattern(server, actor, participant_agents, manager_a server.group_manager.delete_group(group_id=group.id, actor=actor) +@pytest.mark.asyncio +async def test_list_agent_groups(server, actor, participant_agents): + group_a = server.group_manager.create_group( + group=GroupCreate( + description="This is a group chat between best friends all like to hang out together. In their free time they like to solve mysteries.", + agent_ids=[agent.id for agent in participant_agents], + ), + actor=actor, + ) + group_b = server.group_manager.create_group( + group=GroupCreate( + description="This is a group chat between best friends all like to hang out together. In their free time they like to solve mysteries.", + agent_ids=[participant_agents[0].id], + ), + actor=actor, + ) + + agent_a_groups = server.agent_manager.list_groups(agent_id=participant_agents[0].id, actor=actor) + assert sorted([group.id for group in agent_a_groups]) == sorted([group_a.id, group_b.id]) + agent_b_groups = server.agent_manager.list_groups(agent_id=participant_agents[1].id, actor=actor) + assert [group.id for group in agent_b_groups] == [group_a.id] + + server.group_manager.delete_group(group_id=group_a.id, actor=actor) + server.group_manager.delete_group(group_id=group_b.id, actor=actor) + + @pytest.mark.asyncio async def test_round_robin(server, actor, participant_agents): description = (