From 6cd9bb6d799940a748bd160aafdceafa1173e994 Mon Sep 17 00:00:00 2001 From: Kevin Lin Date: Tue, 10 Dec 2024 12:27:35 -0700 Subject: [PATCH] fix: allow empty initial message sequence (#2214) --- letta/offline_memory_agent.py | 3 ++- letta/server/server.py | 4 +++- tests/test_offline_memory_agent.py | 22 +++++++++++++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/letta/offline_memory_agent.py b/letta/offline_memory_agent.py index cceefb43..85cbb082 100644 --- a/letta/offline_memory_agent.py +++ b/letta/offline_memory_agent.py @@ -130,8 +130,9 @@ class OfflineMemoryAgent(Agent): # extras first_message_verify_mono: bool = False, max_memory_rethinks: int = 10, + initial_message_sequence: Optional[List[Message]] = None, ): - super().__init__(interface, agent_state, user) + super().__init__(interface, agent_state, user, initial_message_sequence=initial_message_sequence) self.first_message_verify_mono = first_message_verify_mono self.max_memory_rethinks = max_memory_rethinks diff --git a/letta/server/server.py b/letta/server/server.py index e20afd17..08701587 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -379,6 +379,8 @@ class SyncServer(Server): interface = interface or self.default_interface_factory() if agent_state.agent_type == AgentType.memgpt_agent: agent = Agent(agent_state=agent_state, interface=interface, user=actor, initial_message_sequence=initial_message_sequence) + elif agent_state.agent_type == AgentType.offline_memory_agent: + agent = OfflineMemoryAgent(agent_state=agent_state, interface=interface, user=actor, initial_message_sequence=initial_message_sequence) else: assert initial_message_sequence is None, f"Initial message sequence is not supported for O1Agents" agent = O1Agent(agent_state=agent_state, interface=interface, user=actor) @@ -843,7 +845,7 @@ class SyncServer(Server): self.ms.create_agent(agent_state) # create the agent object - if request.initial_message_sequence: + if request.initial_message_sequence is not None: # init_messages = [Message(user_id=user_id, agent_id=agent_state.id, role=message.role, text=message.text) for message in request.initial_message_sequence] init_messages = [] for message in request.initial_message_sequence: diff --git a/tests/test_offline_memory_agent.py b/tests/test_offline_memory_agent.py index c3cbb71d..ff3aca5c 100644 --- a/tests/test_offline_memory_agent.py +++ b/tests/test_offline_memory_agent.py @@ -32,7 +32,6 @@ def clear_agents(client): for agent in client.list_agents(): client.delete_agent(agent.id) - def test_ripple_edit(client, mock_e2b_api_key_none): trigger_rethink_memory_tool = client.create_or_update_tool(trigger_rethink_memory) @@ -135,3 +134,24 @@ def test_chat_only_agent(client, mock_e2b_api_key_none): # Clean up agent client.delete_agent(chat_only_agent.id) + +def test_initial_message_sequence(client, mock_e2b_api_key_none): + """ + Test that when we set the initial sequence to an empty list, + we do not get the default initial message sequence. + """ + offline_memory_agent = client.create_agent( + name="offline_memory_agent", + agent_type=AgentType.offline_memory_agent, + system=gpt_system.get_system_text("memgpt_offline_memory"), + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config("text-embedding-ada-002"), + include_base_tools=False, + initial_message_sequence=[], + ) + assert offline_memory_agent is not None + assert len(offline_memory_agent.message_ids) == 1 # There should just the system message + + client.delete_agent(offline_memory_agent.id) + +