168 lines
6.3 KiB
Python
168 lines
6.3 KiB
Python
import pytest
|
|
|
|
from letta.config import LettaConfig
|
|
from letta.schemas.agent import CreateAgent
|
|
from letta.schemas.block import CreateBlock
|
|
from letta.schemas.group import (
|
|
DynamicManagerUpdate,
|
|
GroupCreate,
|
|
GroupUpdate,
|
|
ManagerType,
|
|
)
|
|
from letta.server.server import SyncServer
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def server():
|
|
config = LettaConfig.load()
|
|
print("CONFIG PATH", config.config_path)
|
|
|
|
config.save()
|
|
|
|
server = SyncServer()
|
|
return server
|
|
|
|
|
|
@pytest.fixture
|
|
async def default_organization(server: SyncServer):
|
|
"""Fixture to create and return the default organization."""
|
|
yield await server.organization_manager.create_default_organization_async()
|
|
|
|
|
|
@pytest.fixture
|
|
async def default_user(server: SyncServer, default_organization):
|
|
"""Fixture to create and return the default user within the default organization."""
|
|
yield await server.user_manager.create_default_actor_async(org_id=default_organization.id)
|
|
|
|
|
|
@pytest.fixture
|
|
async def four_participant_agents(server, default_user):
|
|
agent_fred = await server.create_agent_async(
|
|
request=CreateAgent(
|
|
name="fred",
|
|
memory_blocks=[
|
|
CreateBlock(
|
|
label="persona",
|
|
value="Your name is fred and you like to ski and have been wanting to go on a ski trip soon. You are speaking in a group chat with other agent pals where you participate in friendly banter.",
|
|
),
|
|
],
|
|
model="openai/gpt-4o-mini",
|
|
embedding="openai/text-embedding-3-small",
|
|
),
|
|
actor=default_user,
|
|
)
|
|
agent_velma = await server.create_agent_async(
|
|
request=CreateAgent(
|
|
name="velma",
|
|
memory_blocks=[
|
|
CreateBlock(
|
|
label="persona",
|
|
value="Your name is velma and you like tropical locations. You are speaking in a group chat with other agent friends and you love to include everyone.",
|
|
),
|
|
],
|
|
model="openai/gpt-4o-mini",
|
|
embedding="openai/text-embedding-3-small",
|
|
),
|
|
actor=default_user,
|
|
)
|
|
agent_daphne = await server.create_agent_async(
|
|
request=CreateAgent(
|
|
name="daphne",
|
|
memory_blocks=[
|
|
CreateBlock(
|
|
label="persona",
|
|
value="Your name is daphne and you love traveling abroad. You are speaking in a group chat with other agent friends and you love to keep in touch with them.",
|
|
),
|
|
],
|
|
model="openai/gpt-4o-mini",
|
|
embedding="openai/text-embedding-3-small",
|
|
),
|
|
actor=default_user,
|
|
)
|
|
agent_shaggy = await server.create_agent_async(
|
|
request=CreateAgent(
|
|
name="shaggy",
|
|
memory_blocks=[
|
|
CreateBlock(
|
|
label="persona",
|
|
value="Your name is shaggy and your best friend is your dog, scooby. You are speaking in a group chat with other agent friends and you like to solve mysteries with them.",
|
|
),
|
|
],
|
|
model="openai/gpt-4o-mini",
|
|
embedding="openai/text-embedding-3-small",
|
|
),
|
|
actor=default_user,
|
|
)
|
|
yield [agent_fred, agent_velma, agent_daphne, agent_shaggy]
|
|
|
|
|
|
@pytest.fixture
|
|
async def manager_agent(server, default_user):
|
|
agent_scooby = await server.create_agent_async(
|
|
request=CreateAgent(
|
|
name="scooby",
|
|
memory_blocks=[
|
|
CreateBlock(
|
|
label="persona",
|
|
value="You are a puppy operations agent for Letta and you help run multi-agent group chats. Your job is to get to know the agents in your group and pick who is best suited to speak next in the conversation.",
|
|
),
|
|
CreateBlock(
|
|
label="human",
|
|
value="",
|
|
),
|
|
],
|
|
model="openai/gpt-4o-mini",
|
|
embedding="openai/text-embedding-3-small",
|
|
),
|
|
actor=default_user,
|
|
)
|
|
yield agent_scooby
|
|
|
|
|
|
async def test_modify_group_pattern(server, default_user, four_participant_agents, manager_agent):
|
|
group = await server.group_manager.create_group_async(
|
|
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 four_participant_agents],
|
|
),
|
|
actor=default_user,
|
|
)
|
|
with pytest.raises(ValueError, match="Cannot change group pattern"):
|
|
await server.group_manager.modify_group_async(
|
|
group_id=group.id,
|
|
group_update=GroupUpdate(
|
|
manager_config=DynamicManagerUpdate(
|
|
manager_type=ManagerType.dynamic,
|
|
manager_agent_id=manager_agent.id,
|
|
),
|
|
),
|
|
actor=default_user,
|
|
)
|
|
|
|
await server.group_manager.delete_group_async(group_id=group.id, actor=default_user)
|
|
|
|
|
|
async def test_list_agent_groups(server, default_user, four_participant_agents):
|
|
group_a = await server.group_manager.create_group_async(
|
|
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 four_participant_agents],
|
|
),
|
|
actor=default_user,
|
|
)
|
|
group_b = await server.group_manager.create_group_async(
|
|
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=[four_participant_agents[0].id],
|
|
),
|
|
actor=default_user,
|
|
)
|
|
|
|
agent_a_groups = server.agent_manager.list_groups(agent_id=four_participant_agents[0].id, actor=default_user)
|
|
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=four_participant_agents[1].id, actor=default_user)
|
|
assert [group.id for group in agent_b_groups] == [group_a.id]
|
|
|
|
await server.group_manager.delete_group_async(group_id=group_a.id, actor=default_user)
|
|
await server.group_manager.delete_group_async(group_id=group_b.id, actor=default_user)
|