letta-nightly 0.6.1.dev20241206104246__tar.gz → 0.6.1.dev20241208104134__tar.gz

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 (241) hide show
  1. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/PKG-INFO +2 -2
  2. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/agent.py +68 -76
  3. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/agent_store/db.py +1 -77
  4. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/agent_store/storage.py +0 -5
  5. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/cli/cli.py +1 -4
  6. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/client/client.py +11 -14
  7. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/constants.py +1 -0
  8. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/functions/function_sets/base.py +33 -5
  9. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/functions/helpers.py +3 -3
  10. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/llm_api/openai.py +0 -1
  11. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/llm_chat_completion_wrappers/chatml.py +13 -1
  12. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/main.py +2 -2
  13. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/memory.py +4 -82
  14. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/metadata.py +0 -35
  15. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/o1_agent.py +7 -2
  16. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/offline_memory_agent.py +6 -0
  17. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/__init__.py +2 -0
  18. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/file.py +1 -1
  19. letta_nightly-0.6.1.dev20241208104134/letta/orm/message.py +64 -0
  20. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/mixins.py +16 -0
  21. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/organization.py +1 -0
  22. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/sqlalchemy_base.py +118 -26
  23. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/letta_base.py +7 -6
  24. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/message.py +6 -12
  25. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/tool.py +18 -11
  26. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/app.py +2 -3
  27. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/v1/agents.py +7 -6
  28. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/v1/blocks.py +2 -2
  29. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/v1/tools.py +26 -4
  30. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/utils.py +3 -1
  31. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/server.py +67 -62
  32. letta_nightly-0.6.1.dev20241208104134/letta/server/static_files/assets/index-43ab4d62.css +1 -0
  33. letta_nightly-0.6.1.dev20241208104134/letta/server/static_files/assets/index-4848e3d7.js +40 -0
  34. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/static_files/index.html +2 -2
  35. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/block_manager.py +1 -1
  36. letta_nightly-0.6.1.dev20241208104134/letta/services/message_manager.py +194 -0
  37. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/organization_manager.py +6 -9
  38. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/sandbox_config_manager.py +16 -1
  39. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/source_manager.py +1 -1
  40. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/tool_manager.py +2 -4
  41. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/user_manager.py +1 -1
  42. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/pyproject.toml +2 -2
  43. letta_nightly-0.6.1.dev20241206104246/letta/agent_store/lancedb.py +0 -177
  44. letta_nightly-0.6.1.dev20241206104246/letta/persistence_manager.py +0 -149
  45. letta_nightly-0.6.1.dev20241206104246/letta/server/static_files/assets/index-1b5d1a41.js +0 -271
  46. letta_nightly-0.6.1.dev20241206104246/letta/server/static_files/assets/index-56a3f8c6.css +0 -1
  47. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/LICENSE +0 -0
  48. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/README.md +0 -0
  49. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/__init__.py +0 -0
  50. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/__main__.py +0 -0
  51. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/agent_store/chroma.py +0 -0
  52. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/agent_store/milvus.py +0 -0
  53. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/agent_store/qdrant.py +0 -0
  54. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/benchmark/benchmark.py +0 -0
  55. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/benchmark/constants.py +0 -0
  56. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/chat_only_agent.py +0 -0
  57. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/cli/cli_config.py +0 -0
  58. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/cli/cli_load.py +0 -0
  59. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/client/__init__.py +0 -0
  60. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/client/streaming.py +0 -0
  61. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/client/utils.py +0 -0
  62. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/config.py +0 -0
  63. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/credentials.py +0 -0
  64. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/data_sources/connectors.py +0 -0
  65. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/data_sources/connectors_helper.py +0 -0
  66. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/embeddings.py +0 -0
  67. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/errors.py +0 -0
  68. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/functions/__init__.py +0 -0
  69. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/functions/function_sets/extras.py +0 -0
  70. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/functions/functions.py +0 -0
  71. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/functions/schema_generator.py +0 -0
  72. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/helpers/__init__.py +0 -0
  73. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/helpers/tool_rule_solver.py +0 -0
  74. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/humans/__init__.py +0 -0
  75. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/humans/examples/basic.txt +0 -0
  76. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/humans/examples/cs_phd.txt +0 -0
  77. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/interface.py +0 -0
  78. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/llm_api/__init__.py +0 -0
  79. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/llm_api/anthropic.py +0 -0
  80. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/llm_api/azure_openai.py +0 -0
  81. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/llm_api/azure_openai_constants.py +0 -0
  82. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/llm_api/cohere.py +0 -0
  83. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/llm_api/google_ai.py +0 -0
  84. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/llm_api/helpers.py +0 -0
  85. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/llm_api/llm_api_tools.py +0 -0
  86. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/llm_api/mistral.py +0 -0
  87. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/README.md +0 -0
  88. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/__init__.py +0 -0
  89. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/chat_completion_proxy.py +0 -0
  90. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/constants.py +0 -0
  91. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/function_parser.py +0 -0
  92. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/grammars/__init__.py +0 -0
  93. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/grammars/gbnf_grammar_generator.py +0 -0
  94. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/grammars/json.gbnf +0 -0
  95. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/grammars/json_func_calls_with_inner_thoughts.gbnf +0 -0
  96. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/json_parser.py +0 -0
  97. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/koboldcpp/api.py +0 -0
  98. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/koboldcpp/settings.py +0 -0
  99. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/llamacpp/api.py +0 -0
  100. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/llamacpp/settings.py +0 -0
  101. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/llm_chat_completion_wrappers/__init__.py +0 -0
  102. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/llm_chat_completion_wrappers/airoboros.py +0 -0
  103. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py +0 -0
  104. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/llm_chat_completion_wrappers/dolphin.py +0 -0
  105. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/llm_chat_completion_wrappers/llama3.py +0 -0
  106. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/llm_chat_completion_wrappers/simple_summary_wrapper.py +0 -0
  107. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/llm_chat_completion_wrappers/wrapper_base.py +0 -0
  108. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/llm_chat_completion_wrappers/zephyr.py +0 -0
  109. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/lmstudio/api.py +0 -0
  110. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/lmstudio/settings.py +0 -0
  111. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/ollama/api.py +0 -0
  112. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/ollama/settings.py +0 -0
  113. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/settings/__init__.py +0 -0
  114. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/settings/deterministic_mirostat.py +0 -0
  115. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/settings/settings.py +0 -0
  116. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/settings/simple.py +0 -0
  117. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/utils.py +0 -0
  118. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/vllm/api.py +0 -0
  119. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/webui/api.py +0 -0
  120. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/webui/legacy_api.py +0 -0
  121. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/webui/legacy_settings.py +0 -0
  122. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/local_llm/webui/settings.py +0 -0
  123. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/log.py +0 -0
  124. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/openai_backcompat/__init__.py +0 -0
  125. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/openai_backcompat/openai_object.py +0 -0
  126. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/__all__.py +0 -0
  127. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/agents_tags.py +0 -0
  128. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/base.py +0 -0
  129. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/block.py +0 -0
  130. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/blocks_agents.py +0 -0
  131. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/enums.py +0 -0
  132. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/errors.py +0 -0
  133. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/job.py +0 -0
  134. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/sandbox_config.py +0 -0
  135. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/source.py +0 -0
  136. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/tool.py +0 -0
  137. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/tools_agents.py +0 -0
  138. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/orm/user.py +0 -0
  139. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/personas/__init__.py +0 -0
  140. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/personas/examples/anna_pa.txt +0 -0
  141. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/personas/examples/google_search_persona.txt +0 -0
  142. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/personas/examples/memgpt_doc.txt +0 -0
  143. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/personas/examples/memgpt_starter.txt +0 -0
  144. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/personas/examples/o1_persona.txt +0 -0
  145. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/personas/examples/offline_memory_persona.txt +0 -0
  146. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/personas/examples/sam.txt +0 -0
  147. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/personas/examples/sam_pov.txt +0 -0
  148. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/personas/examples/sam_simple_pov_gpt35.txt +0 -0
  149. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/personas/examples/sqldb/test.db +0 -0
  150. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/__init__.py +0 -0
  151. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/gpt_summarize.py +0 -0
  152. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/gpt_system.py +0 -0
  153. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_base.txt +0 -0
  154. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_chat.txt +0 -0
  155. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_chat_compressed.txt +0 -0
  156. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_chat_fstring.txt +0 -0
  157. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_convo_only.txt +0 -0
  158. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_doc.txt +0 -0
  159. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_gpt35_extralong.txt +0 -0
  160. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_intuitive_knowledge.txt +0 -0
  161. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_modified_chat.txt +0 -0
  162. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_modified_o1.txt +0 -0
  163. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_offline_memory.txt +0 -0
  164. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/prompts/system/memgpt_offline_memory_chat.txt +0 -0
  165. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/providers.py +0 -0
  166. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/pytest.ini +0 -0
  167. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/agent.py +0 -0
  168. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/agents_tags.py +0 -0
  169. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/api_key.py +0 -0
  170. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/block.py +0 -0
  171. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/blocks_agents.py +0 -0
  172. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/embedding_config.py +0 -0
  173. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/enums.py +0 -0
  174. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/file.py +0 -0
  175. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/health.py +0 -0
  176. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/job.py +0 -0
  177. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/letta_message.py +0 -0
  178. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/letta_request.py +0 -0
  179. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/letta_response.py +0 -0
  180. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/llm_config.py +0 -0
  181. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/memory.py +0 -0
  182. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/openai/chat_completion_request.py +0 -0
  183. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/openai/chat_completion_response.py +0 -0
  184. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/openai/chat_completions.py +0 -0
  185. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/openai/embedding_response.py +0 -0
  186. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/openai/openai.py +0 -0
  187. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/organization.py +0 -0
  188. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/passage.py +0 -0
  189. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/sandbox_config.py +0 -0
  190. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/source.py +0 -0
  191. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/tool_rule.py +0 -0
  192. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/tools_agents.py +0 -0
  193. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/usage.py +0 -0
  194. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/schemas/user.py +0 -0
  195. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/__init__.py +0 -0
  196. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/constants.py +0 -0
  197. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/generate_openapi_schema.sh +0 -0
  198. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/__init__.py +0 -0
  199. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/auth/__init__.py +0 -0
  200. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/auth/index.py +0 -0
  201. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/auth_token.py +0 -0
  202. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/interface.py +0 -0
  203. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/__init__.py +0 -0
  204. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/openai/__init__.py +0 -0
  205. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/openai/assistants/__init__.py +0 -0
  206. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/openai/assistants/assistants.py +0 -0
  207. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/openai/assistants/schemas.py +0 -0
  208. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/openai/assistants/threads.py +0 -0
  209. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/openai/chat_completions/__init__.py +0 -0
  210. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +0 -0
  211. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/v1/__init__.py +0 -0
  212. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/v1/health.py +0 -0
  213. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/v1/jobs.py +0 -0
  214. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/v1/llms.py +0 -0
  215. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/v1/organizations.py +0 -0
  216. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/v1/sandbox_configs.py +0 -0
  217. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/v1/sources.py +0 -0
  218. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/routers/v1/users.py +0 -0
  219. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/rest_api/static_files.py +0 -0
  220. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/startup.sh +0 -0
  221. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/static_files/favicon.ico +0 -0
  222. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/static_files/memgpt_logo_transparent.png +0 -0
  223. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/utils.py +0 -0
  224. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/ws_api/__init__.py +0 -0
  225. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/ws_api/example_client.py +0 -0
  226. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/ws_api/interface.py +0 -0
  227. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/ws_api/protocol.py +0 -0
  228. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/server/ws_api/server.py +0 -0
  229. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/__init__.py +0 -0
  230. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/agents_tags_manager.py +0 -0
  231. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/blocks_agents_manager.py +0 -0
  232. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/job_manager.py +0 -0
  233. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/per_agent_lock_manager.py +0 -0
  234. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/tool_execution_sandbox.py +0 -0
  235. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/tool_sandbox_env/.gitkeep +0 -0
  236. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/services/tools_agents_manager.py +0 -0
  237. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/settings.py +0 -0
  238. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/streaming_interface.py +0 -0
  239. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/streaming_utils.py +0 -0
  240. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/system.py +0 -0
  241. {letta_nightly-0.6.1.dev20241206104246 → letta_nightly-0.6.1.dev20241208104134}/letta/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-nightly
3
- Version: 0.6.1.dev20241206104246
3
+ Version: 0.6.1.dev20241208104134
4
4
  Summary: Create LLM agents with long-term memory and custom tools
5
5
  License: Apache License
6
6
  Author: Letta Team
@@ -26,7 +26,7 @@ Requires-Dist: alembic (>=1.13.3,<2.0.0)
26
26
  Requires-Dist: autoflake (>=2.3.0,<3.0.0) ; extra == "dev" or extra == "all"
27
27
  Requires-Dist: black[jupyter] (>=24.2.0,<25.0.0) ; extra == "dev" or extra == "all"
28
28
  Requires-Dist: chromadb (>=0.4.24,<0.5.0)
29
- Requires-Dist: composio-core (>=0.5.34,<0.6.0)
29
+ Requires-Dist: composio-core (>=0.5.51,<0.6.0)
30
30
  Requires-Dist: composio-langchain (>=0.5.28,<0.6.0)
31
31
  Requires-Dist: datasets (>=2.14.6,<3.0.0) ; extra == "dev" or extra == "all"
32
32
  Requires-Dist: demjson3 (>=3.0.6,<4.0.0)
@@ -19,6 +19,7 @@ from letta.constants import (
19
19
  MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST,
20
20
  MESSAGE_SUMMARY_TRUNC_TOKEN_FRAC,
21
21
  MESSAGE_SUMMARY_WARNING_FRAC,
22
+ O1_BASE_TOOLS,
22
23
  REQ_HEARTBEAT_MESSAGE,
23
24
  )
24
25
  from letta.errors import LLMError
@@ -27,16 +28,15 @@ from letta.interface import AgentInterface
27
28
  from letta.llm_api.helpers import is_context_overflow_error
28
29
  from letta.llm_api.llm_api_tools import create
29
30
  from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_messages
30
- from letta.memory import ArchivalMemory, RecallMemory, summarize_messages
31
+ from letta.memory import ArchivalMemory, EmbeddingArchivalMemory, summarize_messages
31
32
  from letta.metadata import MetadataStore
32
33
  from letta.orm import User
33
- from letta.persistence_manager import LocalStateManager
34
34
  from letta.schemas.agent import AgentState, AgentStepResponse
35
35
  from letta.schemas.block import BlockUpdate
36
36
  from letta.schemas.embedding_config import EmbeddingConfig
37
37
  from letta.schemas.enums import MessageRole
38
38
  from letta.schemas.memory import ContextWindowOverview, Memory
39
- from letta.schemas.message import Message, UpdateMessage
39
+ from letta.schemas.message import Message, MessageUpdate
40
40
  from letta.schemas.openai.chat_completion_request import (
41
41
  Tool as ChatCompletionRequestTool,
42
42
  )
@@ -49,7 +49,9 @@ from letta.schemas.passage import Passage
49
49
  from letta.schemas.tool import Tool
50
50
  from letta.schemas.tool_rule import TerminalToolRule
51
51
  from letta.schemas.usage import LettaUsageStatistics
52
+ from letta.schemas.user import User as PydanticUser
52
53
  from letta.services.block_manager import BlockManager
54
+ from letta.services.message_manager import MessageManager
53
55
  from letta.services.source_manager import SourceManager
54
56
  from letta.services.tool_execution_sandbox import ToolExecutionSandbox
55
57
  from letta.services.user_manager import UserManager
@@ -80,9 +82,11 @@ from letta.utils import (
80
82
 
81
83
 
82
84
  def compile_memory_metadata_block(
85
+ actor: PydanticUser,
86
+ agent_id: str,
83
87
  memory_edit_timestamp: datetime.datetime,
84
88
  archival_memory: Optional[ArchivalMemory] = None,
85
- recall_memory: Optional[RecallMemory] = None,
89
+ message_manager: Optional[MessageManager] = None,
86
90
  ) -> str:
87
91
  # Put the timestamp in the local timezone (mimicking get_local_time())
88
92
  timestamp_str = memory_edit_timestamp.astimezone().strftime("%Y-%m-%d %I:%M:%S %p %Z%z").strip()
@@ -91,7 +95,7 @@ def compile_memory_metadata_block(
91
95
  memory_metadata_block = "\n".join(
92
96
  [
93
97
  f"### Memory [last modified: {timestamp_str}]",
94
- f"{recall_memory.count() if recall_memory else 0} previous messages between you and the user are stored in recall memory (use functions to access them)",
98
+ f"{message_manager.size(actor=actor, agent_id=agent_id) if message_manager else 0} previous messages between you and the user are stored in recall memory (use functions to access them)",
95
99
  f"{archival_memory.count() if archival_memory else 0} total memories you created are stored in archival memory (use functions to access them)",
96
100
  "\nCore memory shown below (limited in size, additional information stored in archival / recall memory):",
97
101
  ]
@@ -101,10 +105,12 @@ def compile_memory_metadata_block(
101
105
 
102
106
  def compile_system_message(
103
107
  system_prompt: str,
108
+ agent_id: str,
104
109
  in_context_memory: Memory,
105
110
  in_context_memory_last_edit: datetime.datetime, # TODO move this inside of BaseMemory?
111
+ actor: PydanticUser,
106
112
  archival_memory: Optional[ArchivalMemory] = None,
107
- recall_memory: Optional[RecallMemory] = None,
113
+ message_manager: Optional[MessageManager] = None,
108
114
  user_defined_variables: Optional[dict] = None,
109
115
  append_icm_if_missing: bool = True,
110
116
  template_format: Literal["f-string", "mustache", "jinja2"] = "f-string",
@@ -129,9 +135,11 @@ def compile_system_message(
129
135
  else:
130
136
  # TODO should this all put into the memory.__repr__ function?
131
137
  memory_metadata_string = compile_memory_metadata_block(
138
+ actor=actor,
139
+ agent_id=agent_id,
132
140
  memory_edit_timestamp=in_context_memory_last_edit,
133
141
  archival_memory=archival_memory,
134
- recall_memory=recall_memory,
142
+ message_manager=message_manager,
135
143
  )
136
144
  full_memory_string = memory_metadata_string + "\n" + in_context_memory.compile()
137
145
 
@@ -164,9 +172,11 @@ def compile_system_message(
164
172
  def initialize_message_sequence(
165
173
  model: str,
166
174
  system: str,
175
+ agent_id: str,
167
176
  memory: Memory,
177
+ actor: PydanticUser,
168
178
  archival_memory: Optional[ArchivalMemory] = None,
169
- recall_memory: Optional[RecallMemory] = None,
179
+ message_manager: Optional[MessageManager] = None,
170
180
  memory_edit_timestamp: Optional[datetime.datetime] = None,
171
181
  include_initial_boot_message: bool = True,
172
182
  ) -> List[dict]:
@@ -177,11 +187,13 @@ def initialize_message_sequence(
177
187
  # system, memory, memory_edit_timestamp, archival_memory=archival_memory, recall_memory=recall_memory
178
188
  # )
179
189
  full_system_message = compile_system_message(
190
+ agent_id=agent_id,
180
191
  system_prompt=system,
181
192
  in_context_memory=memory,
182
193
  in_context_memory_last_edit=memory_edit_timestamp,
194
+ actor=actor,
183
195
  archival_memory=archival_memory,
184
- recall_memory=recall_memory,
196
+ message_manager=message_manager,
185
197
  user_defined_variables=None,
186
198
  append_icm_if_missing=True,
187
199
  )
@@ -282,7 +294,8 @@ class Agent(BaseAgent):
282
294
  self.interface = interface
283
295
 
284
296
  # Create the persistence manager object based on the AgentState info
285
- self.persistence_manager = LocalStateManager(agent_state=self.agent_state)
297
+ self.archival_memory = EmbeddingArchivalMemory(agent_state)
298
+ self.message_manager = MessageManager()
286
299
 
287
300
  # State needed for heartbeat pausing
288
301
  self.pause_heartbeats_start = None
@@ -309,9 +322,11 @@ class Agent(BaseAgent):
309
322
  init_messages = initialize_message_sequence(
310
323
  model=self.model,
311
324
  system=self.agent_state.system,
325
+ agent_id=self.agent_state.id,
312
326
  memory=self.agent_state.memory,
327
+ actor=self.user,
313
328
  archival_memory=None,
314
- recall_memory=None,
329
+ message_manager=None,
315
330
  memory_edit_timestamp=get_utc_time(),
316
331
  include_initial_boot_message=True,
317
332
  )
@@ -333,8 +348,10 @@ class Agent(BaseAgent):
333
348
  model=self.model,
334
349
  system=self.agent_state.system,
335
350
  memory=self.agent_state.memory,
351
+ agent_id=self.agent_state.id,
352
+ actor=self.user,
336
353
  archival_memory=None,
337
- recall_memory=None,
354
+ message_manager=None,
338
355
  memory_edit_timestamp=get_utc_time(),
339
356
  include_initial_boot_message=True,
340
357
  )
@@ -356,7 +373,6 @@ class Agent(BaseAgent):
356
373
 
357
374
  # Put the messages inside the message buffer
358
375
  self.messages_total = 0
359
- # self._append_to_messages(added_messages=[cast(Message, msg) for msg in init_messages_objs if msg is not None])
360
376
  self._append_to_messages(added_messages=init_messages_objs)
361
377
  self._validate_message_buffer_is_utc()
362
378
 
@@ -413,7 +429,10 @@ class Agent(BaseAgent):
413
429
  # TODO: need to have an AgentState object that actually has full access to the block data
414
430
  # this is because the sandbox tools need to be able to access block.value to edit this data
415
431
  try:
416
- if function_name in BASE_TOOLS:
432
+ # TODO: This is NO BUENO
433
+ # TODO: Matching purely by names is extremely problematic, users can create tools with these names and run them in the agent loop
434
+ # TODO: We will have probably have to match the function strings exactly for safety
435
+ if function_name in BASE_TOOLS or function_name in O1_BASE_TOOLS:
417
436
  # base tools are allowed to access the `Agent` object and run on the database
418
437
  function_args["self"] = self # need to attach self to arg since it's dynamically linked
419
438
  function_response = function_to_call(**function_args)
@@ -458,10 +477,10 @@ class Agent(BaseAgent):
458
477
  for tool in tools:
459
478
  try:
460
479
  # WARNING: name may not be consistent?
461
- if tool.module: # execute the whole module
462
- exec(tool.module, env)
463
- else:
464
- exec(tool.source_code, env)
480
+ # if tool.module: # execute the whole module
481
+ # exec(tool.module, env)
482
+ # else:
483
+ exec(tool.source_code, env)
465
484
  self.functions_python[tool.json_schema["name"]] = env[tool.json_schema["name"]]
466
485
  self.functions.append(tool.json_schema)
467
486
  except Exception:
@@ -474,7 +493,7 @@ class Agent(BaseAgent):
474
493
  # Pull the message objects from the database
475
494
  message_objs = []
476
495
  for msg_id in message_ids:
477
- msg_obj = self.persistence_manager.recall_memory.storage.get(msg_id)
496
+ msg_obj = self.message_manager.get_message_by_id(msg_id, actor=self.user)
478
497
  if msg_obj:
479
498
  if isinstance(msg_obj, Message):
480
499
  message_objs.append(msg_obj)
@@ -493,9 +512,10 @@ class Agent(BaseAgent):
493
512
  for m in self._messages:
494
513
  # assert is_utc_datetime(m.created_at), f"created_at on message for agent {self.agent_state.name} isn't UTC:\n{vars(m)}"
495
514
  # TODO eventually do casting via an edit_message function
496
- if not is_utc_datetime(m.created_at):
497
- printd(f"Warning - created_at on message for agent {self.agent_state.name} isn't UTC (text='{m.text}')")
498
- m.created_at = m.created_at.replace(tzinfo=datetime.timezone.utc)
515
+ if m.created_at:
516
+ if not is_utc_datetime(m.created_at):
517
+ printd(f"Warning - created_at on message for agent {self.agent_state.name} isn't UTC (text='{m.text}')")
518
+ m.created_at = m.created_at.replace(tzinfo=datetime.timezone.utc)
499
519
 
500
520
  def set_message_buffer(self, message_ids: List[str], force_utc: bool = True):
501
521
  """Set the messages in the buffer to the message IDs list"""
@@ -522,16 +542,13 @@ class Agent(BaseAgent):
522
542
 
523
543
  def _trim_messages(self, num):
524
544
  """Trim messages from the front, not including the system message"""
525
- self.persistence_manager.trim_messages(num)
526
-
527
545
  new_messages = [self._messages[0]] + self._messages[num:]
528
546
  self._messages = new_messages
529
547
 
530
548
  def _prepend_to_messages(self, added_messages: List[Message]):
531
549
  """Wrapper around self.messages.prepend to allow additional calls to a state/persistence manager"""
532
550
  assert all([isinstance(msg, Message) for msg in added_messages])
533
-
534
- self.persistence_manager.prepend_to_messages(added_messages)
551
+ self.message_manager.create_many_messages(added_messages, actor=self.user)
535
552
 
536
553
  new_messages = [self._messages[0]] + added_messages + self._messages[1:] # prepend (no system)
537
554
  self._messages = new_messages
@@ -540,8 +557,7 @@ class Agent(BaseAgent):
540
557
  def _append_to_messages(self, added_messages: List[Message]):
541
558
  """Wrapper around self.messages.append to allow additional calls to a state/persistence manager"""
542
559
  assert all([isinstance(msg, Message) for msg in added_messages])
543
-
544
- self.persistence_manager.append_to_messages(added_messages)
560
+ self.message_manager.create_many_messages(added_messages, actor=self.user)
545
561
 
546
562
  # strip extra metadata if it exists
547
563
  # for msg in added_messages:
@@ -885,7 +901,6 @@ class Agent(BaseAgent):
885
901
  messages=next_input_message,
886
902
  **kwargs,
887
903
  )
888
- step_response.messages
889
904
  heartbeat_request = step_response.heartbeat_request
890
905
  function_failed = step_response.function_failed
891
906
  token_warning = step_response.in_context_memory_warning
@@ -1247,7 +1262,7 @@ class Agent(BaseAgent):
1247
1262
  assert new_system_message_obj.role == "system", new_system_message_obj
1248
1263
  assert self._messages[0].role == "system", self._messages
1249
1264
 
1250
- self.persistence_manager.swap_system_message(new_system_message_obj)
1265
+ self.message_manager.create_message(new_system_message_obj, actor=self.user)
1251
1266
 
1252
1267
  new_messages = [new_system_message_obj] + self._messages[1:] # swap index 0 (system)
1253
1268
  self._messages = new_messages
@@ -1280,11 +1295,13 @@ class Agent(BaseAgent):
1280
1295
 
1281
1296
  # update memory (TODO: potentially update recall/archival stats seperately)
1282
1297
  new_system_message_str = compile_system_message(
1298
+ agent_id=self.agent_state.id,
1283
1299
  system_prompt=self.agent_state.system,
1284
1300
  in_context_memory=self.agent_state.memory,
1285
1301
  in_context_memory_last_edit=memory_edit_timestamp,
1286
- archival_memory=self.persistence_manager.archival_memory,
1287
- recall_memory=self.persistence_manager.recall_memory,
1302
+ actor=self.user,
1303
+ archival_memory=self.archival_memory,
1304
+ message_manager=self.message_manager,
1288
1305
  user_defined_variables=None,
1289
1306
  append_icm_if_missing=True,
1290
1307
  )
@@ -1370,55 +1387,29 @@ class Agent(BaseAgent):
1370
1387
  # passage.id = create_uuid_from_string(f"{source_id}_{str(passage.agent_id)}_{passage.text}")
1371
1388
 
1372
1389
  # insert into agent archival memory
1373
- self.persistence_manager.archival_memory.storage.insert_many(passages)
1390
+ self.archival_memory.storage.insert_many(passages)
1374
1391
  all_passages += passages
1375
1392
 
1376
1393
  assert size == len(all_passages), f"Expected {size} passages, but only got {len(all_passages)}"
1377
1394
 
1378
1395
  # save destination storage
1379
- self.persistence_manager.archival_memory.storage.save()
1396
+ self.archival_memory.storage.save()
1380
1397
 
1381
1398
  # attach to agent
1382
1399
  source = SourceManager().get_source_by_id(source_id=source_id, actor=user)
1383
1400
  assert source is not None, f"Source {source_id} not found in metadata store"
1384
1401
  ms.attach_source(agent_id=self.agent_state.id, source_id=source_id, user_id=self.agent_state.user_id)
1385
1402
 
1386
- total_agent_passages = self.persistence_manager.archival_memory.storage.size()
1403
+ total_agent_passages = self.archival_memory.storage.size()
1387
1404
 
1388
1405
  printd(
1389
1406
  f"Attached data source {source.name} to agent {self.agent_state.name}, consisting of {len(all_passages)}. Agent now has {total_agent_passages} embeddings in archival memory.",
1390
1407
  )
1391
1408
 
1392
- def update_message(self, request: UpdateMessage) -> Message:
1409
+ def update_message(self, message_id: str, request: MessageUpdate) -> Message:
1393
1410
  """Update the details of a message associated with an agent"""
1394
-
1395
- message = self.persistence_manager.recall_memory.storage.get(id=request.id)
1396
- if message is None:
1397
- raise ValueError(f"Message with id {request.id} not found")
1398
- assert isinstance(message, Message), f"Message is not a Message object: {type(message)}"
1399
-
1400
- # Override fields
1401
- # NOTE: we try to do some sanity checking here (see asserts), but it's not foolproof
1402
- if request.role:
1403
- message.role = request.role
1404
- if request.text:
1405
- message.text = request.text
1406
- if request.name:
1407
- message.name = request.name
1408
- if request.tool_calls:
1409
- assert message.role == MessageRole.assistant, "Tool calls can only be added to assistant messages"
1410
- message.tool_calls = request.tool_calls
1411
- if request.tool_call_id:
1412
- assert message.role == MessageRole.tool, "tool_call_id can only be added to tool messages"
1413
- message.tool_call_id = request.tool_call_id
1414
-
1415
1411
  # Save the updated message
1416
- self.persistence_manager.recall_memory.storage.update(record=message)
1417
-
1418
- # Return the updated message
1419
- updated_message = self.persistence_manager.recall_memory.storage.get(id=message.id)
1420
- if updated_message is None:
1421
- raise ValueError(f"Error persisting message - message with id {request.id} not found")
1412
+ updated_message = self.message_manager.update_message_by_id(message_id=message_id, message_update=request, actor=self.user)
1422
1413
  return updated_message
1423
1414
 
1424
1415
  # TODO(sarah): should we be creating a new message here, or just editing a message?
@@ -1428,10 +1419,10 @@ class Agent(BaseAgent):
1428
1419
  msg_obj = self._messages[x]
1429
1420
  if msg_obj.role == MessageRole.assistant:
1430
1421
  updated_message = self.update_message(
1431
- request=UpdateMessage(
1432
- id=msg_obj.id,
1422
+ message_id=msg_obj.id,
1423
+ request=MessageUpdate(
1433
1424
  text=new_thought,
1434
- )
1425
+ ),
1435
1426
  )
1436
1427
  self.refresh_message_buffer()
1437
1428
  return updated_message
@@ -1470,10 +1461,10 @@ class Agent(BaseAgent):
1470
1461
 
1471
1462
  # Write the update to the DB
1472
1463
  updated_message = self.update_message(
1473
- request=UpdateMessage(
1474
- id=message_obj.id,
1464
+ message_id=message_obj.id,
1465
+ request=MessageUpdate(
1475
1466
  tool_calls=message_obj.tool_calls,
1476
- )
1467
+ ),
1477
1468
  )
1478
1469
  self.refresh_message_buffer()
1479
1470
  return updated_message
@@ -1496,7 +1487,7 @@ class Agent(BaseAgent):
1496
1487
  deleted_message = self._messages.pop()
1497
1488
  # then also remove it from recall storage
1498
1489
  try:
1499
- self.persistence_manager.recall_memory.storage.delete(filters={"id": deleted_message.id})
1490
+ self.message_manager.delete_message_by_id(deleted_message.id, actor=self.user)
1500
1491
  popped_messages.append(deleted_message)
1501
1492
  except Exception as e:
1502
1493
  warnings.warn(f"Error deleting message {deleted_message.id} from recall memory: {e}")
@@ -1522,7 +1513,6 @@ class Agent(BaseAgent):
1522
1513
 
1523
1514
  def retry_message(self) -> List[Message]:
1524
1515
  """Retry / regenerate the last message"""
1525
-
1526
1516
  self.pop_until_user()
1527
1517
  user_message = self.pop_message(count=1)[0]
1528
1518
  assert user_message.text is not None, "User message text is None"
@@ -1569,12 +1559,14 @@ class Agent(BaseAgent):
1569
1559
  num_tokens_from_messages(messages=messages_openai_format[1:], model=self.model) if len(messages_openai_format) > 1 else 0
1570
1560
  )
1571
1561
 
1572
- num_archival_memory = self.persistence_manager.archival_memory.storage.size()
1573
- num_recall_memory = self.persistence_manager.recall_memory.storage.size()
1562
+ num_archival_memory = self.archival_memory.storage.size()
1563
+ message_manager_size = self.message_manager.size(actor=self.user, agent_id=self.agent_state.id)
1574
1564
  external_memory_summary = compile_memory_metadata_block(
1565
+ actor=self.user,
1566
+ agent_id=self.agent_state.id,
1575
1567
  memory_edit_timestamp=get_utc_time(), # dummy timestamp
1576
- archival_memory=self.persistence_manager.archival_memory,
1577
- recall_memory=self.persistence_manager.recall_memory,
1568
+ archival_memory=self.archival_memory,
1569
+ message_manager=self.message_manager,
1578
1570
  )
1579
1571
  num_tokens_external_memory_summary = count_tokens(external_memory_summary)
1580
1572
 
@@ -1600,7 +1592,7 @@ class Agent(BaseAgent):
1600
1592
  # context window breakdown (in messages)
1601
1593
  num_messages=len(self._messages),
1602
1594
  num_archival_memory=num_archival_memory,
1603
- num_recall_memory=num_recall_memory,
1595
+ num_recall_memory=message_manager_size,
1604
1596
  num_tokens_external_memory_summary=num_tokens_external_memory_summary,
1605
1597
  # top-level information
1606
1598
  context_window_size_max=self.agent_state.llm_config.context_window,
@@ -27,13 +27,11 @@ from tqdm import tqdm
27
27
  from letta.agent_store.storage import StorageConnector, TableType
28
28
  from letta.config import LettaConfig
29
29
  from letta.constants import MAX_EMBEDDING_DIM
30
- from letta.metadata import EmbeddingConfigColumn, ToolCallColumn
30
+ from letta.metadata import EmbeddingConfigColumn
31
31
  from letta.orm.base import Base
32
32
  from letta.orm.file import FileMetadata as FileMetadataModel
33
33
 
34
34
  # from letta.schemas.message import Message, Passage, Record, RecordType, ToolCall
35
- from letta.schemas.message import Message
36
- from letta.schemas.openai.chat_completions import ToolCall
37
35
  from letta.schemas.passage import Passage
38
36
  from letta.settings import settings
39
37
 
@@ -69,69 +67,6 @@ class CommonVector(TypeDecorator):
69
67
  return np.frombuffer(value, dtype=np.float32)
70
68
 
71
69
 
72
- class MessageModel(Base):
73
- """Defines data model for storing Message objects"""
74
-
75
- __tablename__ = "messages"
76
- __table_args__ = {"extend_existing": True}
77
-
78
- # Assuming message_id is the primary key
79
- id = Column(String, primary_key=True)
80
- user_id = Column(String, nullable=False)
81
- agent_id = Column(String, nullable=False)
82
-
83
- # openai info
84
- role = Column(String, nullable=False)
85
- text = Column(String) # optional: can be null if function call
86
- model = Column(String) # optional: can be null if LLM backend doesn't require specifying
87
- name = Column(String) # optional: multi-agent only
88
-
89
- # tool call request info
90
- # if role == "assistant", this MAY be specified
91
- # if role != "assistant", this must be null
92
- # TODO align with OpenAI spec of multiple tool calls
93
- # tool_calls = Column(ToolCallColumn)
94
- tool_calls = Column(ToolCallColumn)
95
-
96
- # tool call response info
97
- # if role == "tool", then this must be specified
98
- # if role != "tool", this must be null
99
- tool_call_id = Column(String)
100
-
101
- # Add a datetime column, with default value as the current time
102
- created_at = Column(DateTime(timezone=True))
103
- Index("message_idx_user", user_id, agent_id),
104
-
105
- def __repr__(self):
106
- return f"<Message(message_id='{self.id}', text='{self.text}')>"
107
-
108
- def to_record(self):
109
- # calls = (
110
- # [ToolCall(id=tool_call["id"], function=ToolCallFunction(**tool_call["function"])) for tool_call in self.tool_calls]
111
- # if self.tool_calls
112
- # else None
113
- # )
114
- # if calls:
115
- # assert isinstance(calls[0], ToolCall)
116
- if self.tool_calls and len(self.tool_calls) > 0:
117
- assert isinstance(self.tool_calls[0], ToolCall), type(self.tool_calls[0])
118
- for tool in self.tool_calls:
119
- assert isinstance(tool, ToolCall), type(tool)
120
- return Message(
121
- user_id=self.user_id,
122
- agent_id=self.agent_id,
123
- role=self.role,
124
- name=self.name,
125
- text=self.text,
126
- model=self.model,
127
- # tool_calls=[ToolCall(id=tool_call["id"], function=ToolCallFunction(**tool_call["function"])) for tool_call in self.tool_calls] if self.tool_calls else None,
128
- tool_calls=self.tool_calls,
129
- tool_call_id=self.tool_call_id,
130
- created_at=self.created_at,
131
- id=self.id,
132
- )
133
-
134
-
135
70
  class PassageModel(Base):
136
71
  """Defines data model for storing Passages (consisting of text, embedding)"""
137
72
 
@@ -367,11 +302,6 @@ class PostgresStorageConnector(SQLStorageConnector):
367
302
  self.db_model = PassageModel
368
303
  if self.config.archival_storage_uri is None:
369
304
  raise ValueError(f"Must specify archival_storage_uri in config {self.config.config_path}")
370
- elif table_type == TableType.RECALL_MEMORY:
371
- self.uri = self.config.recall_storage_uri
372
- self.db_model = MessageModel
373
- if self.config.recall_storage_uri is None:
374
- raise ValueError(f"Must specify recall_storage_uri in config {self.config.config_path}")
375
305
  elif table_type == TableType.FILES:
376
306
  self.uri = self.config.metadata_storage_uri
377
307
  self.db_model = FileMetadataModel
@@ -490,12 +420,6 @@ class SQLLiteStorageConnector(SQLStorageConnector):
490
420
  # get storage URI
491
421
  if table_type == TableType.ARCHIVAL_MEMORY or table_type == TableType.PASSAGES:
492
422
  raise ValueError(f"Table type {table_type} not implemented")
493
- elif table_type == TableType.RECALL_MEMORY:
494
- # TODO: eventually implement URI option
495
- self.path = self.config.recall_storage_path
496
- if self.path is None:
497
- raise ValueError(f"Must specify recall_storage_path in config.")
498
- self.db_model = MessageModel
499
423
  elif table_type == TableType.FILES:
500
424
  self.path = self.config.metadata_storage_path
501
425
  if self.path is None:
@@ -110,11 +110,6 @@ class StorageConnector:
110
110
  from letta.agent_store.qdrant import QdrantStorageConnector
111
111
 
112
112
  return QdrantStorageConnector(table_type, config, user_id, agent_id)
113
- # TODO: add back
114
- # elif storage_type == "lancedb":
115
- # from letta.agent_store.db import LanceDBConnector
116
-
117
- # return LanceDBConnector(agent_config=agent_config, table_type=table_type)
118
113
 
119
114
  elif storage_type == "sqlite":
120
115
  from letta.agent_store.db import SQLLiteStorageConnector
@@ -51,7 +51,6 @@ def server(
51
51
  port: Annotated[Optional[int], typer.Option(help="Port to run the server on")] = None,
52
52
  host: Annotated[Optional[str], typer.Option(help="Host to run the server on (default to localhost)")] = None,
53
53
  debug: Annotated[bool, typer.Option(help="Turn debugging output on")] = False,
54
- ade: Annotated[bool, typer.Option(help="Allows remote access")] = False,
55
54
  secure: Annotated[bool, typer.Option(help="Adds simple security access")] = False,
56
55
  ):
57
56
  """Launch a Letta server process"""
@@ -171,7 +170,6 @@ def run(
171
170
  # printd("State path:", agent_config.save_state_dir())
172
171
  # printd("Persistent manager path:", agent_config.save_persistence_manager_dir())
173
172
  # printd("Index path:", agent_config.save_agent_index_dir())
174
- # persistence_manager = LocalStateManager(agent_config).load() # TODO: implement load
175
173
  # TODO: load prior agent state
176
174
 
177
175
  # Allow overriding model specifics (model, model wrapper, model endpoint IP + type, context_window)
@@ -372,8 +370,7 @@ def delete_agent(
372
370
  sys.exit(1)
373
371
 
374
372
 
375
- def version():
373
+ def version() -> str:
376
374
  import letta
377
375
 
378
- print(letta.__version__)
379
376
  return letta.__version__
@@ -22,7 +22,7 @@ from letta.schemas.embedding_config import EmbeddingConfig
22
22
  from letta.schemas.enums import JobStatus, MessageRole
23
23
  from letta.schemas.file import FileMetadata
24
24
  from letta.schemas.job import Job
25
- from letta.schemas.letta_request import LettaRequest
25
+ from letta.schemas.letta_request import LettaRequest, LettaStreamingRequest
26
26
  from letta.schemas.letta_response import LettaResponse, LettaStreamingResponse
27
27
  from letta.schemas.llm_config import LLMConfig
28
28
  from letta.schemas.memory import (
@@ -32,7 +32,7 @@ from letta.schemas.memory import (
32
32
  Memory,
33
33
  RecallMemorySummary,
34
34
  )
35
- from letta.schemas.message import Message, MessageCreate, UpdateMessage
35
+ from letta.schemas.message import Message, MessageCreate, MessageUpdate
36
36
  from letta.schemas.openai.chat_completions import ToolCall
37
37
  from letta.schemas.organization import Organization
38
38
  from letta.schemas.passage import Passage
@@ -586,8 +586,7 @@ class RESTClient(AbstractClient):
586
586
  tool_calls: Optional[List[ToolCall]] = None,
587
587
  tool_call_id: Optional[str] = None,
588
588
  ) -> Message:
589
- request = UpdateMessage(
590
- id=message_id,
589
+ request = MessageUpdate(
591
590
  role=role,
592
591
  text=text,
593
592
  name=name,
@@ -965,8 +964,10 @@ class RESTClient(AbstractClient):
965
964
  if stream_tokens or stream_steps:
966
965
  from letta.client.streaming import _sse_post
967
966
 
967
+ request = LettaStreamingRequest(messages=messages, stream_tokens=stream_tokens)
968
968
  return _sse_post(f"{self.base_url}/{self.api_prefix}/agents/{agent_id}/messages/stream", request.model_dump(), self.headers)
969
969
  else:
970
+ request = LettaRequest(messages=messages)
970
971
  response = requests.post(
971
972
  f"{self.base_url}/{self.api_prefix}/agents/{agent_id}/messages", json=request.model_dump(), headers=self.headers
972
973
  )
@@ -2146,8 +2147,8 @@ class LocalClient(AbstractClient):
2146
2147
  ) -> Message:
2147
2148
  message = self.server.update_agent_message(
2148
2149
  agent_id=agent_id,
2149
- request=UpdateMessage(
2150
- id=message_id,
2150
+ message_id=message_id,
2151
+ request=MessageUpdate(
2151
2152
  role=role,
2152
2153
  text=text,
2153
2154
  name=name,
@@ -2683,7 +2684,7 @@ class LocalClient(AbstractClient):
2683
2684
  return self.server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**tool_create.model_dump()), actor=self.user)
2684
2685
 
2685
2686
  def load_composio_tool(self, action: "ActionType") -> Tool:
2686
- tool_create = ToolCreate.from_composio(action=action)
2687
+ tool_create = ToolCreate.from_composio(action_name=action.name)
2687
2688
  return self.server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**tool_create.model_dump()), actor=self.user)
2688
2689
 
2689
2690
  def create_tool(
@@ -3054,16 +3055,13 @@ class LocalClient(AbstractClient):
3054
3055
 
3055
3056
  # recall memory
3056
3057
 
3057
- def get_messages(
3058
- self, agent_id: str, before: Optional[str] = None, after: Optional[str] = None, limit: Optional[int] = 1000
3059
- ) -> List[Message]:
3058
+ def get_messages(self, agent_id: str, cursor: Optional[str] = None, limit: Optional[int] = 1000) -> List[Message]:
3060
3059
  """
3061
3060
  Get messages from an agent with pagination.
3062
3061
 
3063
3062
  Args:
3064
3063
  agent_id (str): ID of the agent
3065
- before (str): Get messages before a certain time
3066
- after (str): Get messages after a certain time
3064
+ cursor (str): Get messages after a certain time
3067
3065
  limit (int): Limit number of messages
3068
3066
 
3069
3067
  Returns:
@@ -3074,8 +3072,7 @@ class LocalClient(AbstractClient):
3074
3072
  return self.server.get_agent_recall_cursor(
3075
3073
  user_id=self.user_id,
3076
3074
  agent_id=agent_id,
3077
- before=before,
3078
- after=after,
3075
+ cursor=cursor,
3079
3076
  limit=limit,
3080
3077
  reverse=True,
3081
3078
  )
@@ -38,6 +38,7 @@ DEFAULT_PRESET = "memgpt_chat"
38
38
 
39
39
  # Base tools that cannot be edited, as they access agent state directly
40
40
  BASE_TOOLS = ["send_message", "conversation_search", "conversation_search_date", "archival_memory_insert", "archival_memory_search"]
41
+ O1_BASE_TOOLS = ["send_thinking_message", "send_final_message"]
41
42
  # Base memory tools CAN be edited, and are added by default by the server
42
43
  BASE_MEMORY_TOOLS = ["core_memory_append", "core_memory_replace"]
43
44