letta-nightly 0.6.0.dev20241205104308__py3-none-any.whl → 0.6.1.dev20241206104246__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of letta-nightly might be problematic. Click here for more details.

Files changed (27) hide show
  1. letta/__init__.py +1 -1
  2. letta/agent.py +15 -1
  3. letta/chat_only_agent.py +103 -0
  4. letta/functions/function_sets/base.py +4 -4
  5. letta/offline_memory_agent.py +174 -0
  6. letta/orm/__init__.py +1 -0
  7. letta/orm/tool.py +22 -1
  8. letta/orm/tools_agents.py +32 -0
  9. letta/personas/examples/offline_memory_persona.txt +4 -0
  10. letta/prompts/system/memgpt_convo_only.txt +14 -0
  11. letta/prompts/system/memgpt_offline_memory.txt +23 -0
  12. letta/prompts/system/memgpt_offline_memory_chat.txt +35 -0
  13. letta/schemas/agent.py +3 -2
  14. letta/schemas/tools_agents.py +32 -0
  15. letta/server/rest_api/app.py +11 -0
  16. letta/server/server.py +24 -4
  17. letta/server/static_files/assets/{index-9fa459a2.js → index-1b5d1a41.js} +50 -50
  18. letta/server/static_files/assets/index-56a3f8c6.css +1 -0
  19. letta/server/static_files/index.html +2 -2
  20. letta/services/tool_manager.py +1 -1
  21. letta/services/tools_agents_manager.py +94 -0
  22. {letta_nightly-0.6.0.dev20241205104308.dist-info → letta_nightly-0.6.1.dev20241206104246.dist-info}/METADATA +2 -1
  23. {letta_nightly-0.6.0.dev20241205104308.dist-info → letta_nightly-0.6.1.dev20241206104246.dist-info}/RECORD +26 -17
  24. letta/server/static_files/assets/index-3ab03d5b.css +0 -1
  25. {letta_nightly-0.6.0.dev20241205104308.dist-info → letta_nightly-0.6.1.dev20241206104246.dist-info}/LICENSE +0 -0
  26. {letta_nightly-0.6.0.dev20241205104308.dist-info → letta_nightly-0.6.1.dev20241206104246.dist-info}/WHEEL +0 -0
  27. {letta_nightly-0.6.0.dev20241205104308.dist-info → letta_nightly-0.6.1.dev20241206104246.dist-info}/entry_points.txt +0 -0
letta/server/server.py CHANGED
@@ -18,6 +18,7 @@ import letta.system as system
18
18
  from letta.agent import Agent, save_agent
19
19
  from letta.agent_store.db import attach_base
20
20
  from letta.agent_store.storage import StorageConnector, TableType
21
+ from letta.chat_only_agent import ChatOnlyAgent
21
22
  from letta.credentials import LettaCredentials
22
23
  from letta.data_sources.connectors import DataConnector, load_data
23
24
 
@@ -27,6 +28,7 @@ from letta.interface import CLIInterface # for printing to terminal
27
28
  from letta.log import get_logger
28
29
  from letta.metadata import MetadataStore
29
30
  from letta.o1_agent import O1Agent
31
+ from letta.offline_memory_agent import OfflineMemoryAgent
30
32
  from letta.orm import Base
31
33
  from letta.orm.errors import NoResultFound
32
34
  from letta.prompts import gpt_system
@@ -75,6 +77,7 @@ from letta.schemas.user import User
75
77
  from letta.services.agents_tags_manager import AgentsTagsManager
76
78
  from letta.services.block_manager import BlockManager
77
79
  from letta.services.blocks_agents_manager import BlocksAgentsManager
80
+ from letta.services.tools_agents_manager import ToolsAgentsManager
78
81
  from letta.services.job_manager import JobManager
79
82
  from letta.services.organization_manager import OrganizationManager
80
83
  from letta.services.per_agent_lock_manager import PerAgentLockManager
@@ -257,6 +260,7 @@ class SyncServer(Server):
257
260
  self.agents_tags_manager = AgentsTagsManager()
258
261
  self.sandbox_config_manager = SandboxConfigManager(tool_settings)
259
262
  self.blocks_agents_manager = BlocksAgentsManager()
263
+ self.tools_agents_manager = ToolsAgentsManager()
260
264
  self.job_manager = JobManager()
261
265
 
262
266
  # Managers that interface with parallelism
@@ -395,20 +399,30 @@ class SyncServer(Server):
395
399
  agent_lock = self.per_agent_lock_manager.get_lock(agent_id)
396
400
  with agent_lock:
397
401
  agent_state = self.get_agent(agent_id=agent_id)
402
+ if agent_state is None:
403
+ raise ValueError(f"Agent (agent_id={agent_id}) does not exist")
404
+ elif agent_state.user_id is None:
405
+ raise ValueError(f"Agent (agent_id={agent_id}) does not have a user_id")
398
406
  actor = self.user_manager.get_user_by_id(user_id=agent_state.user_id)
399
407
 
400
408
  interface = interface or self.default_interface_factory()
401
409
  if agent_state.agent_type == AgentType.memgpt_agent:
402
410
  agent = Agent(agent_state=agent_state, interface=interface, user=actor)
403
- else:
411
+ elif agent_state.agent_type == AgentType.o1_agent:
404
412
  agent = O1Agent(agent_state=agent_state, interface=interface, user=actor)
413
+ elif agent_state.agent_type == AgentType.offline_memory_agent:
414
+ agent = OfflineMemoryAgent(agent_state=agent_state, interface=interface, user=actor)
415
+ elif agent_state.agent_type == AgentType.chat_only_agent:
416
+ agent = ChatOnlyAgent(agent_state=agent_state, interface=interface, user=actor)
417
+ else:
418
+ raise ValueError(f"Invalid agent type {agent_state.agent_type}")
405
419
 
406
420
  # Rebuild the system prompt - may be linked to new blocks now
407
421
  agent.rebuild_system_prompt()
408
422
 
409
423
  # Persist to agent
410
424
  save_agent(agent, self.ms)
411
- return agent
425
+ return agent
412
426
 
413
427
  def _step(
414
428
  self,
@@ -796,6 +810,10 @@ class SyncServer(Server):
796
810
  request.system = gpt_system.get_system_text("memgpt_chat")
797
811
  elif request.agent_type == AgentType.o1_agent:
798
812
  request.system = gpt_system.get_system_text("memgpt_modified_o1")
813
+ elif request.agent_type == AgentType.offline_memory_agent:
814
+ request.system = gpt_system.get_system_text("memgpt_offline_memory")
815
+ elif request.agent_type == AgentType.chat_only_agent:
816
+ request.system = gpt_system.get_system_text("memgpt_convo_only")
799
817
  else:
800
818
  raise ValueError(f"Invalid agent type: {request.agent_type}")
801
819
 
@@ -882,7 +900,7 @@ class SyncServer(Server):
882
900
  in_memory_agent_state = self.get_agent(agent_state.id)
883
901
  return in_memory_agent_state
884
902
 
885
- def get_agent(self, agent_id: str) -> AgentState:
903
+ def get_agent(self, agent_id: str) -> Optional[AgentState]:
886
904
  """
887
905
  Retrieve the full agent state from the DB.
888
906
  This gathers data accross multiple tables to provide the full state of an agent, which is passed into the `Agent` object for creation.
@@ -893,6 +911,8 @@ class SyncServer(Server):
893
911
  if agent_state is None:
894
912
  # agent does not exist
895
913
  return None
914
+ if agent_state.user_id is None:
915
+ raise ValueError(f"Agent {agent_id} does not have a user_id")
896
916
  user = self.user_manager.get_user_by_id(user_id=agent_state.user_id)
897
917
 
898
918
  # construct the in-memory, full agent state - this gather data stored in different tables but that needs to be passed to `Agent`
@@ -1333,7 +1353,7 @@ class SyncServer(Server):
1333
1353
  records = records[::-1]
1334
1354
 
1335
1355
  return records
1336
-
1356
+
1337
1357
  def get_server_config(self, include_defaults: bool = False) -> dict:
1338
1358
  """Return the base config"""
1339
1359