letta-nightly 0.7.15.dev20250515104317__tar.gz → 0.7.17.dev20250516090339__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.
Files changed (349) hide show
  1. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/PKG-INFO +3 -3
  2. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/__init__.py +1 -1
  3. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agent.py +12 -0
  4. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/helpers.py +48 -5
  5. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/letta_agent.py +64 -28
  6. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/letta_agent_batch.py +44 -26
  7. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/voice_sleeptime_agent.py +6 -4
  8. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/client/client.py +16 -1
  9. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/constants.py +3 -0
  10. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/async_composio_toolset.py +1 -1
  11. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/anthropic_streaming_interface.py +40 -6
  12. letta_nightly-0.7.17.dev20250516090339/letta/interfaces/openai_streaming_interface.py +303 -0
  13. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/llm_batch_job_polling.py +6 -2
  14. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/agent.py +102 -1
  15. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/block.py +3 -0
  16. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sqlalchemy_base.py +459 -158
  17. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/agent.py +10 -2
  18. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/block.py +3 -0
  19. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/memory.py +7 -2
  20. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/agents.py +29 -27
  21. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/blocks.py +1 -1
  22. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/groups.py +2 -2
  23. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/messages.py +11 -11
  24. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/runs.py +2 -2
  25. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/tools.py +4 -4
  26. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/users.py +9 -9
  27. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/voice.py +1 -1
  28. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/server.py +74 -0
  29. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/agent_manager.py +417 -7
  30. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/block_manager.py +12 -8
  31. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/helpers/agent_manager_helper.py +19 -0
  32. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/job_manager.py +99 -0
  33. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/llm_batch_manager.py +28 -27
  34. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/message_manager.py +66 -19
  35. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/passage_manager.py +14 -0
  36. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/tool_executor.py +19 -1
  37. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_manager.py +13 -3
  38. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/user_manager.py +70 -0
  39. letta_nightly-0.7.17.dev20250516090339/letta/types/__init__.py +0 -0
  40. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/pyproject.toml +3 -3
  41. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/LICENSE +0 -0
  42. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/README.md +0 -0
  43. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/__main__.py +0 -0
  44. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/__init__.py +0 -0
  45. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/base_agent.py +0 -0
  46. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/ephemeral_agent.py +0 -0
  47. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/exceptions.py +0 -0
  48. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/voice_agent.py +0 -0
  49. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/benchmark/benchmark.py +0 -0
  50. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/benchmark/constants.py +0 -0
  51. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/cli/cli.py +0 -0
  52. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/cli/cli_config.py +0 -0
  53. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/cli/cli_load.py +0 -0
  54. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/client/__init__.py +0 -0
  55. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/client/streaming.py +0 -0
  56. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/client/utils.py +0 -0
  57. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/config.py +0 -0
  58. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/data_sources/connectors.py +0 -0
  59. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/data_sources/connectors_helper.py +0 -0
  60. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/embeddings.py +0 -0
  61. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/errors.py +0 -0
  62. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/__init__.py +0 -0
  63. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/ast_parsers.py +0 -0
  64. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/composio_helpers.py +0 -0
  65. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/base.py +0 -0
  66. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/extras.py +0 -0
  67. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/multi_agent.py +0 -0
  68. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/voice.py +0 -0
  69. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/functions.py +0 -0
  70. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/helpers.py +0 -0
  71. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/interface.py +0 -0
  72. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/__init__.py +0 -0
  73. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/base_client.py +0 -0
  74. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/exceptions.py +0 -0
  75. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/sse_client.py +0 -0
  76. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/stdio_client.py +0 -0
  77. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/types.py +0 -0
  78. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/schema_generator.py +0 -0
  79. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/dynamic_multi_agent.py +0 -0
  80. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/helpers.py +0 -0
  81. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/round_robin_multi_agent.py +0 -0
  82. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/sleeptime_multi_agent.py +0 -0
  83. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/sleeptime_multi_agent_v2.py +0 -0
  84. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/supervisor_multi_agent.py +0 -0
  85. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/__init__.py +0 -0
  86. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/composio_helpers.py +0 -0
  87. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/converters.py +0 -0
  88. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/datetime_helpers.py +0 -0
  89. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/json_helpers.py +0 -0
  90. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/message_helper.py +0 -0
  91. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/tool_execution_helper.py +0 -0
  92. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/tool_rule_solver.py +0 -0
  93. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/humans/__init__.py +0 -0
  94. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/humans/examples/basic.txt +0 -0
  95. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/humans/examples/cs_phd.txt +0 -0
  96. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/interface.py +0 -0
  97. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/__init__.py +0 -0
  98. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/openai_chat_completions_streaming_interface.py +0 -0
  99. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/utils.py +0 -0
  100. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/__init__.py +0 -0
  101. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/helpers.py +0 -0
  102. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/scheduler.py +0 -0
  103. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/types.py +0 -0
  104. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/__init__.py +0 -0
  105. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/anthropic.py +0 -0
  106. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/anthropic_client.py +0 -0
  107. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/aws_bedrock.py +0 -0
  108. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/azure_openai.py +0 -0
  109. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/azure_openai_constants.py +0 -0
  110. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/cohere.py +0 -0
  111. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/deepseek.py +0 -0
  112. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/google_ai_client.py +0 -0
  113. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/google_constants.py +0 -0
  114. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/google_vertex_client.py +0 -0
  115. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/helpers.py +0 -0
  116. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/llm_api_tools.py +0 -0
  117. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/llm_client.py +0 -0
  118. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/llm_client_base.py +0 -0
  119. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/mistral.py +0 -0
  120. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/openai.py +0 -0
  121. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/openai_client.py +0 -0
  122. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/README.md +0 -0
  123. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/__init__.py +0 -0
  124. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/chat_completion_proxy.py +0 -0
  125. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/constants.py +0 -0
  126. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/function_parser.py +0 -0
  127. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/__init__.py +0 -0
  128. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/gbnf_grammar_generator.py +0 -0
  129. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/json.gbnf +0 -0
  130. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/json_func_calls_with_inner_thoughts.gbnf +0 -0
  131. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/json_parser.py +0 -0
  132. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/koboldcpp/api.py +0 -0
  133. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/koboldcpp/settings.py +0 -0
  134. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llamacpp/api.py +0 -0
  135. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llamacpp/settings.py +0 -0
  136. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/__init__.py +0 -0
  137. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/airoboros.py +0 -0
  138. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/chatml.py +0 -0
  139. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py +0 -0
  140. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/dolphin.py +0 -0
  141. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/llama3.py +0 -0
  142. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/simple_summary_wrapper.py +0 -0
  143. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/wrapper_base.py +0 -0
  144. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/zephyr.py +0 -0
  145. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/lmstudio/api.py +0 -0
  146. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/lmstudio/settings.py +0 -0
  147. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/ollama/api.py +0 -0
  148. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/ollama/settings.py +0 -0
  149. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/__init__.py +0 -0
  150. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/deterministic_mirostat.py +0 -0
  151. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/settings.py +0 -0
  152. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/simple.py +0 -0
  153. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/utils.py +0 -0
  154. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/vllm/api.py +0 -0
  155. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/api.py +0 -0
  156. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/legacy_api.py +0 -0
  157. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/legacy_settings.py +0 -0
  158. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/settings.py +0 -0
  159. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/log.py +0 -0
  160. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/main.py +0 -0
  161. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/memory.py +0 -0
  162. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/openai_backcompat/__init__.py +0 -0
  163. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/openai_backcompat/openai_object.py +0 -0
  164. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/__all__.py +0 -0
  165. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/__init__.py +0 -0
  166. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/agents_tags.py +0 -0
  167. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/base.py +0 -0
  168. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/block_history.py +0 -0
  169. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/blocks_agents.py +0 -0
  170. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/custom_columns.py +0 -0
  171. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/enums.py +0 -0
  172. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/errors.py +0 -0
  173. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/file.py +0 -0
  174. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/group.py +0 -0
  175. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/groups_agents.py +0 -0
  176. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/groups_blocks.py +0 -0
  177. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/identities_agents.py +0 -0
  178. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/identities_blocks.py +0 -0
  179. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/identity.py +0 -0
  180. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/job.py +0 -0
  181. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/job_messages.py +0 -0
  182. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/llm_batch_items.py +0 -0
  183. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/llm_batch_job.py +0 -0
  184. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/message.py +0 -0
  185. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/mixins.py +0 -0
  186. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/organization.py +0 -0
  187. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/passage.py +0 -0
  188. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/provider.py +0 -0
  189. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sandbox_config.py +0 -0
  190. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/source.py +0 -0
  191. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sources_agents.py +0 -0
  192. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sqlite_functions.py +0 -0
  193. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/step.py +0 -0
  194. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/tool.py +0 -0
  195. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/tools_agents.py +0 -0
  196. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/user.py +0 -0
  197. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/__init__.py +0 -0
  198. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/anna_pa.txt +0 -0
  199. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/google_search_persona.txt +0 -0
  200. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/memgpt_doc.txt +0 -0
  201. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/memgpt_starter.txt +0 -0
  202. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/o1_persona.txt +0 -0
  203. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sam.txt +0 -0
  204. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sam_pov.txt +0 -0
  205. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sam_simple_pov_gpt35.txt +0 -0
  206. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sleeptime_doc_persona.txt +0 -0
  207. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sleeptime_memory_persona.txt +0 -0
  208. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sqldb/test.db +0 -0
  209. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/voice_memory_persona.txt +0 -0
  210. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/__init__.py +0 -0
  211. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/gpt_summarize.py +0 -0
  212. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/gpt_system.py +0 -0
  213. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_base.txt +0 -0
  214. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_chat.txt +0 -0
  215. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_chat_compressed.txt +0 -0
  216. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_chat_fstring.txt +0 -0
  217. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_convo_only.txt +0 -0
  218. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_doc.txt +0 -0
  219. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_gpt35_extralong.txt +0 -0
  220. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_intuitive_knowledge.txt +0 -0
  221. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_memory_only.txt +0 -0
  222. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_modified_chat.txt +0 -0
  223. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_modified_o1.txt +0 -0
  224. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_offline_memory.txt +0 -0
  225. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_offline_memory_chat.txt +0 -0
  226. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_sleeptime_chat.txt +0 -0
  227. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/sleeptime.txt +0 -0
  228. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/sleeptime_doc_ingest.txt +0 -0
  229. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/voice_chat.txt +0 -0
  230. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/voice_sleeptime.txt +0 -0
  231. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/pytest.ini +0 -0
  232. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/embedding_config.py +0 -0
  233. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/embedding_config_overrides.py +0 -0
  234. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/enums.py +0 -0
  235. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/environment_variables.py +0 -0
  236. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/file.py +0 -0
  237. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/group.py +0 -0
  238. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/health.py +0 -0
  239. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/identity.py +0 -0
  240. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/job.py +0 -0
  241. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_base.py +0 -0
  242. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_message.py +0 -0
  243. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_message_content.py +0 -0
  244. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_request.py +0 -0
  245. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_response.py +0 -0
  246. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/llm_batch_job.py +0 -0
  247. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/llm_config.py +0 -0
  248. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/llm_config_overrides.py +0 -0
  249. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/message.py +0 -0
  250. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/chat_completion_request.py +0 -0
  251. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/chat_completion_response.py +0 -0
  252. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/chat_completions.py +0 -0
  253. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/embedding_response.py +0 -0
  254. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/openai.py +0 -0
  255. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/organization.py +0 -0
  256. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/passage.py +0 -0
  257. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/providers.py +0 -0
  258. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/response_format.py +0 -0
  259. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/run.py +0 -0
  260. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/sandbox_config.py +0 -0
  261. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/source.py +0 -0
  262. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/step.py +0 -0
  263. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/tool.py +0 -0
  264. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/tool_execution_result.py +0 -0
  265. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/tool_rule.py +0 -0
  266. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/usage.py +0 -0
  267. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/user.py +0 -0
  268. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/__init__.py +0 -0
  269. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_agent.py +0 -0
  270. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_agent_environment_variable.py +0 -0
  271. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_base.py +0 -0
  272. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_block.py +0 -0
  273. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_custom_fields.py +0 -0
  274. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_message.py +0 -0
  275. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_tag.py +0 -0
  276. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_tool.py +0 -0
  277. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/pydantic_agent_schema.py +0 -0
  278. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/__init__.py +0 -0
  279. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/constants.py +0 -0
  280. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/db.py +0 -0
  281. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/generate_openapi_schema.sh +0 -0
  282. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/__init__.py +0 -0
  283. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/app.py +0 -0
  284. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/auth/__init__.py +0 -0
  285. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/auth/index.py +0 -0
  286. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/auth_token.py +0 -0
  287. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/chat_completions_interface.py +0 -0
  288. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/interface.py +0 -0
  289. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/json_parser.py +0 -0
  290. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/__init__.py +0 -0
  291. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/openai/chat_completions/__init__.py +0 -0
  292. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +0 -0
  293. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/__init__.py +0 -0
  294. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/embeddings.py +0 -0
  295. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/health.py +0 -0
  296. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/identities.py +0 -0
  297. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/jobs.py +0 -0
  298. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/llms.py +0 -0
  299. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/organizations.py +0 -0
  300. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/providers.py +0 -0
  301. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/sandbox_configs.py +0 -0
  302. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/sources.py +0 -0
  303. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/steps.py +0 -0
  304. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/tags.py +0 -0
  305. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/static_files.py +0 -0
  306. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/utils.py +0 -0
  307. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/startup.sh +0 -0
  308. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/assets/index-048c9598.js +0 -0
  309. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/assets/index-0e31b727.css +0 -0
  310. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/favicon.ico +0 -0
  311. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/index.html +0 -0
  312. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/memgpt_logo_transparent.png +0 -0
  313. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/utils.py +0 -0
  314. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/__init__.py +0 -0
  315. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/example_client.py +0 -0
  316. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/interface.py +0 -0
  317. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/protocol.py +0 -0
  318. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/server.py +0 -0
  319. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/__init__.py +0 -0
  320. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/group_manager.py +0 -0
  321. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/helpers/tool_execution_helper.py +0 -0
  322. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/identity_manager.py +0 -0
  323. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/__init__.py +0 -0
  324. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/base_client.py +0 -0
  325. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/sse_client.py +0 -0
  326. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/stdio_client.py +0 -0
  327. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/types.py +0 -0
  328. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/organization_manager.py +0 -0
  329. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/per_agent_lock_manager.py +0 -0
  330. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/provider_manager.py +0 -0
  331. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/sandbox_config_manager.py +0 -0
  332. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/source_manager.py +0 -0
  333. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/step_manager.py +0 -0
  334. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/summarizer/__init__.py +0 -0
  335. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/summarizer/enums.py +0 -0
  336. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/summarizer/summarizer.py +0 -0
  337. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/__init__.py +0 -0
  338. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/tool_execution_manager.py +0 -0
  339. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/tool_execution_sandbox.py +0 -0
  340. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/__init__.py +0 -0
  341. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/base.py +0 -0
  342. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/e2b_sandbox.py +0 -0
  343. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/local_sandbox.py +0 -0
  344. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/settings.py +0 -0
  345. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/streaming_interface.py +0 -0
  346. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/streaming_utils.py +0 -0
  347. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/system.py +0 -0
  348. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/tracing.py +0 -0
  349. {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-nightly
3
- Version: 0.7.15.dev20250515104317
3
+ Version: 0.7.17.dev20250516090339
4
4
  Summary: Create LLM agents with long-term memory and custom tools
5
5
  License: Apache License
6
6
  Author: Letta Team
@@ -51,7 +51,7 @@ Requires-Dist: isort (>=5.13.2,<6.0.0) ; extra == "dev" or extra == "all"
51
51
  Requires-Dist: jinja2 (>=3.1.5,<4.0.0)
52
52
  Requires-Dist: langchain (>=0.3.7,<0.4.0) ; extra == "external-tools" or extra == "desktop" or extra == "all"
53
53
  Requires-Dist: langchain-community (>=0.3.7,<0.4.0) ; extra == "external-tools" or extra == "desktop" or extra == "all"
54
- Requires-Dist: letta_client (>=0.1.141,<0.2.0)
54
+ Requires-Dist: letta_client (>=0.1.143,<0.2.0)
55
55
  Requires-Dist: llama-index (>=0.12.2,<0.13.0)
56
56
  Requires-Dist: llama-index-embeddings-openai (>=0.3.1,<0.4.0)
57
57
  Requires-Dist: locust (>=2.31.5,<3.0.0) ; extra == "dev" or extra == "desktop" or extra == "all"
@@ -77,7 +77,7 @@ Requires-Dist: pydantic (>=2.10.6,<3.0.0)
77
77
  Requires-Dist: pydantic-settings (>=2.2.1,<3.0.0)
78
78
  Requires-Dist: pyhumps (>=3.8.0,<4.0.0)
79
79
  Requires-Dist: pyright (>=1.1.347,<2.0.0) ; extra == "dev" or extra == "desktop" or extra == "all"
80
- Requires-Dist: pytest-asyncio (>=0.23.2,<0.24.0) ; extra == "dev" or extra == "all"
80
+ Requires-Dist: pytest-asyncio (>=0.24.0,<0.25.0) ; extra == "dev" or extra == "all"
81
81
  Requires-Dist: pytest-order (>=1.2.0,<2.0.0) ; extra == "dev" or extra == "all"
82
82
  Requires-Dist: python-box (>=7.1.1,<8.0.0)
83
83
  Requires-Dist: python-multipart (>=0.0.19,<0.0.20)
@@ -1,4 +1,4 @@
1
- __version__ = "0.7.15"
1
+ __version__ = "0.7.17"
2
2
 
3
3
  # import clients
4
4
  from letta.client.client import LocalClient, RESTClient, create_client
@@ -179,6 +179,15 @@ class Agent(BaseAgent):
179
179
  raise ValueError(f"Invalid JSON format in message: {text_content}")
180
180
  return None
181
181
 
182
+ def ensure_read_only_block_not_modified(self, new_memory: Memory) -> None:
183
+ """
184
+ Throw an error if a read-only block has been modified
185
+ """
186
+ for label in self.agent_state.memory.list_block_labels():
187
+ if self.agent_state.memory.get_block(label).read_only:
188
+ if new_memory.get_block(label).value != self.agent_state.memory.get_block(label).value:
189
+ raise ValueError(READ_ONLY_BLOCK_EDIT_ERROR)
190
+
182
191
  def update_memory_if_changed(self, new_memory: Memory) -> bool:
183
192
  """
184
193
  Update internal memory object and system prompt if there have been modifications.
@@ -1277,6 +1286,9 @@ class Agent(BaseAgent):
1277
1286
  agent_state_copy = self.agent_state.__deepcopy__()
1278
1287
  function_args["agent_state"] = agent_state_copy # need to attach self to arg since it's dynamically linked
1279
1288
  function_response = callable_func(**function_args)
1289
+ self.ensure_read_only_block_not_modified(
1290
+ new_memory=agent_state_copy.memory
1291
+ ) # memory editing tools cannot edit read-only blocks
1280
1292
  self.update_memory_if_changed(agent_state_copy.memory)
1281
1293
  elif target_letta_tool.tool_type == ToolType.EXTERNAL_COMPOSIO:
1282
1294
  action_name = generate_composio_action_from_func_name(target_letta_tool.name)
@@ -10,14 +10,18 @@ from letta.server.rest_api.utils import create_input_messages
10
10
  from letta.services.message_manager import MessageManager
11
11
 
12
12
 
13
- def _create_letta_response(new_in_context_messages: list[Message], use_assistant_message: bool) -> LettaResponse:
13
+ def _create_letta_response(
14
+ new_in_context_messages: list[Message], use_assistant_message: bool, usage: LettaUsageStatistics
15
+ ) -> LettaResponse:
14
16
  """
15
17
  Converts the newly created/persisted messages into a LettaResponse.
16
18
  """
17
- response_messages = []
18
- for msg in new_in_context_messages:
19
- response_messages.extend(msg.to_letta_messages(use_assistant_message=use_assistant_message))
20
- return LettaResponse(messages=response_messages, usage=LettaUsageStatistics())
19
+ # NOTE: hacky solution to avoid returning heartbeat messages and the original user message
20
+ filter_user_messages = [m for m in new_in_context_messages if m.role != "user"]
21
+ response_messages = Message.to_letta_messages_from_list(
22
+ messages=filter_user_messages, use_assistant_message=use_assistant_message, reverse=False
23
+ )
24
+ return LettaResponse(messages=response_messages, usage=usage)
21
25
 
22
26
 
23
27
  def _prepare_in_context_messages(
@@ -56,6 +60,45 @@ def _prepare_in_context_messages(
56
60
  return current_in_context_messages, new_in_context_messages
57
61
 
58
62
 
63
+ async def _prepare_in_context_messages_async(
64
+ input_messages: List[MessageCreate],
65
+ agent_state: AgentState,
66
+ message_manager: MessageManager,
67
+ actor: User,
68
+ ) -> Tuple[List[Message], List[Message]]:
69
+ """
70
+ Prepares in-context messages for an agent, based on the current state and a new user input.
71
+ Async version of _prepare_in_context_messages.
72
+
73
+ Args:
74
+ input_messages (List[MessageCreate]): The new user input messages to process.
75
+ agent_state (AgentState): The current state of the agent, including message buffer config.
76
+ message_manager (MessageManager): The manager used to retrieve and create messages.
77
+ actor (User): The user performing the action, used for access control and attribution.
78
+
79
+ Returns:
80
+ Tuple[List[Message], List[Message]]: A tuple containing:
81
+ - The current in-context messages (existing context for the agent).
82
+ - The new in-context messages (messages created from the new input).
83
+ """
84
+
85
+ if agent_state.message_buffer_autoclear:
86
+ # If autoclear is enabled, only include the most recent system message (usually at index 0)
87
+ current_in_context_messages = [
88
+ (await message_manager.get_messages_by_ids_async(message_ids=agent_state.message_ids, actor=actor))[0]
89
+ ]
90
+ else:
91
+ # Otherwise, include the full list of messages by ID for context
92
+ current_in_context_messages = await message_manager.get_messages_by_ids_async(message_ids=agent_state.message_ids, actor=actor)
93
+
94
+ # Create a new user message from the input and store it
95
+ new_in_context_messages = await message_manager.create_many_messages_async(
96
+ create_input_messages(input_messages=input_messages, agent_id=agent_state.id, actor=actor), actor=actor
97
+ )
98
+
99
+ return current_in_context_messages, new_in_context_messages
100
+
101
+
59
102
  def serialize_message_history(messages: List[str], context: str) -> str:
60
103
  """
61
104
  Produce an XML document like:
@@ -4,13 +4,15 @@ import uuid
4
4
  from typing import Any, AsyncGenerator, Dict, List, Optional, Tuple, Union
5
5
 
6
6
  from openai import AsyncStream
7
+ from openai.types import CompletionUsage
7
8
  from openai.types.chat import ChatCompletion, ChatCompletionChunk
8
9
 
9
10
  from letta.agents.base_agent import BaseAgent
10
- from letta.agents.helpers import _create_letta_response, _prepare_in_context_messages
11
+ from letta.agents.helpers import _create_letta_response, _prepare_in_context_messages_async
11
12
  from letta.helpers import ToolRulesSolver
12
13
  from letta.helpers.tool_execution_helper import enable_strict_mode
13
14
  from letta.interfaces.anthropic_streaming_interface import AnthropicStreamingInterface
15
+ from letta.interfaces.openai_streaming_interface import OpenAIStreamingInterface
14
16
  from letta.llm_api.llm_client import LLMClient
15
17
  from letta.llm_api.llm_client_base import LLMClientBase
16
18
  from letta.local_llm.constants import INNER_THOUGHTS_KWARG
@@ -23,6 +25,7 @@ from letta.schemas.letta_message_content import OmittedReasoningContent, Reasoni
23
25
  from letta.schemas.letta_response import LettaResponse
24
26
  from letta.schemas.message import Message, MessageCreate
25
27
  from letta.schemas.openai.chat_completion_response import ToolCall
28
+ from letta.schemas.usage import LettaUsageStatistics
26
29
  from letta.schemas.user import User
27
30
  from letta.server.rest_api.utils import create_letta_messages_from_llm_response
28
31
  from letta.services.agent_manager import AgentManager
@@ -47,7 +50,6 @@ class LettaAgent(BaseAgent):
47
50
  block_manager: BlockManager,
48
51
  passage_manager: PassageManager,
49
52
  actor: User,
50
- use_assistant_message: bool = True,
51
53
  ):
52
54
  super().__init__(agent_id=agent_id, openai_client=None, message_manager=message_manager, agent_manager=agent_manager, actor=actor)
53
55
 
@@ -55,27 +57,28 @@ class LettaAgent(BaseAgent):
55
57
  # Summarizer settings
56
58
  self.block_manager = block_manager
57
59
  self.passage_manager = passage_manager
58
- self.use_assistant_message = use_assistant_message
59
60
  self.response_messages: List[Message] = []
60
61
 
61
- self.last_function_response = self._load_last_function_response()
62
+ self.last_function_response = None
62
63
 
63
64
  # Cached archival memory/message size
64
- self.num_messages = self.message_manager.size(actor=self.actor, agent_id=agent_id)
65
- self.num_archival_memories = self.passage_manager.size(actor=self.actor, agent_id=agent_id)
65
+ self.num_messages = 0
66
+ self.num_archival_memories = 0
66
67
 
67
68
  @trace_method
68
- async def step(self, input_messages: List[MessageCreate], max_steps: int = 10) -> LettaResponse:
69
- agent_state = self.agent_manager.get_agent_by_id(self.agent_id, actor=self.actor)
70
- current_in_context_messages, new_in_context_messages = await self._step(
69
+ async def step(self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = True) -> LettaResponse:
70
+ agent_state = await self.agent_manager.get_agent_by_id_async(self.agent_id, actor=self.actor)
71
+ current_in_context_messages, new_in_context_messages, usage = await self._step(
71
72
  agent_state=agent_state, input_messages=input_messages, max_steps=max_steps
72
73
  )
73
- return _create_letta_response(new_in_context_messages=new_in_context_messages, use_assistant_message=self.use_assistant_message)
74
+ return _create_letta_response(
75
+ new_in_context_messages=new_in_context_messages, use_assistant_message=use_assistant_message, usage=usage
76
+ )
74
77
 
75
78
  async def _step(
76
79
  self, agent_state: AgentState, input_messages: List[MessageCreate], max_steps: int = 10
77
- ) -> Tuple[List[Message], List[Message]]:
78
- current_in_context_messages, new_in_context_messages = _prepare_in_context_messages(
80
+ ) -> Tuple[List[Message], List[Message], CompletionUsage]:
81
+ current_in_context_messages, new_in_context_messages = await _prepare_in_context_messages_async(
79
82
  input_messages, agent_state, self.message_manager, self.actor
80
83
  )
81
84
  tool_rules_solver = ToolRulesSolver(agent_state.tool_rules)
@@ -84,6 +87,7 @@ class LettaAgent(BaseAgent):
84
87
  put_inner_thoughts_first=True,
85
88
  actor=self.actor,
86
89
  )
90
+ usage = LettaUsageStatistics()
87
91
  for _ in range(max_steps):
88
92
  response = await self._get_ai_reply(
89
93
  llm_client=llm_client,
@@ -95,11 +99,21 @@ class LettaAgent(BaseAgent):
95
99
  )
96
100
 
97
101
  tool_call = response.choices[0].message.tool_calls[0]
102
+ reasoning = [TextContent(text=response.choices[0].message.content)] # reasoning placed into content for legacy reasons
98
103
 
99
- persisted_messages, should_continue = await self._handle_ai_response(tool_call, agent_state, tool_rules_solver)
104
+ persisted_messages, should_continue = await self._handle_ai_response(
105
+ tool_call, agent_state, tool_rules_solver, reasoning_content=reasoning
106
+ )
100
107
  self.response_messages.extend(persisted_messages)
101
108
  new_in_context_messages.extend(persisted_messages)
102
109
 
110
+ # update usage
111
+ # TODO: add run_id
112
+ usage.step_count += 1
113
+ usage.completion_tokens += response.usage.completion_tokens
114
+ usage.prompt_tokens += response.usage.prompt_tokens
115
+ usage.total_tokens += response.usage.total_tokens
116
+
103
117
  if not should_continue:
104
118
  break
105
119
 
@@ -108,18 +122,18 @@ class LettaAgent(BaseAgent):
108
122
  message_ids = [m.id for m in (current_in_context_messages + new_in_context_messages)]
109
123
  self.agent_manager.set_in_context_messages(agent_id=self.agent_id, message_ids=message_ids, actor=self.actor)
110
124
 
111
- return current_in_context_messages, new_in_context_messages
125
+ return current_in_context_messages, new_in_context_messages, usage
112
126
 
113
127
  @trace_method
114
128
  async def step_stream(
115
- self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = False
129
+ self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = True, stream_tokens: bool = False
116
130
  ) -> AsyncGenerator[str, None]:
117
131
  """
118
132
  Main streaming loop that yields partial tokens.
119
133
  Whenever we detect a tool call, we yield from _handle_ai_response as well.
120
134
  """
121
- agent_state = self.agent_manager.get_agent_by_id(self.agent_id, actor=self.actor)
122
- current_in_context_messages, new_in_context_messages = _prepare_in_context_messages(
135
+ agent_state = await self.agent_manager.get_agent_by_id_async(self.agent_id, actor=self.actor)
136
+ current_in_context_messages, new_in_context_messages = await _prepare_in_context_messages_async(
123
137
  input_messages, agent_state, self.message_manager, self.actor
124
138
  )
125
139
  tool_rules_solver = ToolRulesSolver(agent_state.tool_rules)
@@ -128,6 +142,7 @@ class LettaAgent(BaseAgent):
128
142
  put_inner_thoughts_first=True,
129
143
  actor=self.actor,
130
144
  )
145
+ usage = LettaUsageStatistics()
131
146
 
132
147
  for _ in range(max_steps):
133
148
  stream = await self._get_ai_reply(
@@ -137,15 +152,27 @@ class LettaAgent(BaseAgent):
137
152
  tool_rules_solver=tool_rules_solver,
138
153
  stream=True,
139
154
  )
140
-
141
155
  # TODO: THIS IS INCREDIBLY UGLY
142
156
  # TODO: THERE ARE MULTIPLE COPIES OF THE LLM_CONFIG EVERYWHERE THAT ARE GETTING MANIPULATED
143
- interface = AnthropicStreamingInterface(
144
- use_assistant_message=use_assistant_message, put_inner_thoughts_in_kwarg=agent_state.llm_config.put_inner_thoughts_in_kwargs
145
- )
157
+ if agent_state.llm_config.model_endpoint_type == "anthropic":
158
+ interface = AnthropicStreamingInterface(
159
+ use_assistant_message=use_assistant_message,
160
+ put_inner_thoughts_in_kwarg=agent_state.llm_config.put_inner_thoughts_in_kwargs,
161
+ )
162
+ elif agent_state.llm_config.model_endpoint_type == "openai":
163
+ interface = OpenAIStreamingInterface(
164
+ use_assistant_message=use_assistant_message,
165
+ put_inner_thoughts_in_kwarg=agent_state.llm_config.put_inner_thoughts_in_kwargs,
166
+ )
146
167
  async for chunk in interface.process(stream):
147
168
  yield f"data: {chunk.model_dump_json()}\n\n"
148
169
 
170
+ # update usage
171
+ usage.step_count += 1
172
+ usage.completion_tokens += interface.output_tokens
173
+ usage.prompt_tokens += interface.input_tokens
174
+ usage.total_tokens += interface.input_tokens + interface.output_tokens
175
+
149
176
  # Process resulting stream content
150
177
  tool_call = interface.get_tool_call_object()
151
178
  reasoning_content = interface.get_reasoning_content()
@@ -160,6 +187,10 @@ class LettaAgent(BaseAgent):
160
187
  self.response_messages.extend(persisted_messages)
161
188
  new_in_context_messages.extend(persisted_messages)
162
189
 
190
+ if not use_assistant_message or should_continue:
191
+ tool_return = [msg for msg in persisted_messages if msg.role == "tool"][-1].to_letta_messages()[0]
192
+ yield f"data: {tool_return.model_dump_json()}\n\n"
193
+
163
194
  if not should_continue:
164
195
  break
165
196
 
@@ -170,11 +201,11 @@ class LettaAgent(BaseAgent):
170
201
 
171
202
  # TODO: This may be out of sync, if in between steps users add files
172
203
  # NOTE (cliandy): temporary for now for particlar use cases.
173
- self.num_messages = self.message_manager.size(actor=self.actor, agent_id=agent_state.id)
174
- self.num_archival_memories = self.passage_manager.size(actor=self.actor, agent_id=agent_state.id)
204
+ self.num_messages = await self.message_manager.size_async(actor=self.actor, agent_id=agent_state.id)
205
+ self.num_archival_memories = await self.passage_manager.size_async(actor=self.actor, agent_id=agent_state.id)
175
206
 
176
207
  # TODO: Also yield out a letta usage stats SSE
177
-
208
+ yield f"data: {usage.model_dump_json()}\n\n"
178
209
  yield f"data: {MessageStreamStatus.done.model_dump_json()}\n\n"
179
210
 
180
211
  @trace_method
@@ -188,6 +219,10 @@ class LettaAgent(BaseAgent):
188
219
  stream: bool,
189
220
  ) -> ChatCompletion | AsyncStream[ChatCompletionChunk]:
190
221
  if settings.experimental_enable_async_db_engine:
222
+ self.num_messages = self.num_messages or (await self.message_manager.size_async(actor=self.actor, agent_id=agent_state.id))
223
+ self.num_archival_memories = self.num_archival_memories or (
224
+ await self.passage_manager.size_async(actor=self.actor, agent_id=agent_state.id)
225
+ )
191
226
  in_context_messages = await self._rebuild_memory_async(
192
227
  in_context_messages, agent_state, num_messages=self.num_messages, num_archival_memories=self.num_archival_memories
193
228
  )
@@ -214,6 +249,8 @@ class LettaAgent(BaseAgent):
214
249
  ]
215
250
 
216
251
  # Mirror the sync agent loop: get allowed tools or allow all if none are allowed
252
+ if self.last_function_response is None:
253
+ self.last_function_response = await self._load_last_function_response_async()
217
254
  valid_tool_names = tool_rules_solver.get_allowed_tool_names(
218
255
  available_tools=set([t.name for t in tools]),
219
256
  last_function_response=self.last_function_response,
@@ -307,7 +344,7 @@ class LettaAgent(BaseAgent):
307
344
  pre_computed_assistant_message_id=pre_computed_assistant_message_id,
308
345
  pre_computed_tool_message_id=pre_computed_tool_message_id,
309
346
  )
310
- persisted_messages = self.message_manager.create_many_messages(tool_call_messages, actor=self.actor)
347
+ persisted_messages = await self.message_manager.create_many_messages_async(tool_call_messages, actor=self.actor)
311
348
  self.last_function_response = function_response
312
349
 
313
350
  return persisted_messages, continue_stepping
@@ -359,7 +396,6 @@ class LettaAgent(BaseAgent):
359
396
  block_manager=self.block_manager,
360
397
  passage_manager=self.passage_manager,
361
398
  actor=self.actor,
362
- use_assistant_message=True,
363
399
  )
364
400
 
365
401
  augmented_message = (
@@ -394,9 +430,9 @@ class LettaAgent(BaseAgent):
394
430
  results = await asyncio.gather(*tasks)
395
431
  return results
396
432
 
397
- def _load_last_function_response(self):
433
+ async def _load_last_function_response_async(self):
398
434
  """Load the last function response from message history"""
399
- in_context_messages = self.agent_manager.get_in_context_messages(agent_id=self.agent_id, actor=self.actor)
435
+ in_context_messages = await self.agent_manager.get_in_context_messages_async(agent_id=self.agent_id, actor=self.actor)
400
436
  for msg in reversed(in_context_messages):
401
437
  if msg.role == MessageRole.tool and msg.content and len(msg.content) == 1 and isinstance(msg.content[0], TextContent):
402
438
  text_content = msg.content[0].text
@@ -7,7 +7,7 @@ from aiomultiprocess import Pool
7
7
  from anthropic.types.beta.messages import BetaMessageBatchCanceledResult, BetaMessageBatchErroredResult, BetaMessageBatchSucceededResult
8
8
 
9
9
  from letta.agents.base_agent import BaseAgent
10
- from letta.agents.helpers import _prepare_in_context_messages
10
+ from letta.agents.helpers import _prepare_in_context_messages_async
11
11
  from letta.helpers import ToolRulesSolver
12
12
  from letta.helpers.datetime_helpers import get_utc_time
13
13
  from letta.helpers.tool_execution_helper import enable_strict_mode
@@ -107,7 +107,6 @@ class LettaAgentBatch(BaseAgent):
107
107
  sandbox_config_manager: SandboxConfigManager,
108
108
  job_manager: JobManager,
109
109
  actor: User,
110
- use_assistant_message: bool = True,
111
110
  max_steps: int = 10,
112
111
  ):
113
112
  self.message_manager = message_manager
@@ -117,7 +116,6 @@ class LettaAgentBatch(BaseAgent):
117
116
  self.batch_manager = batch_manager
118
117
  self.sandbox_config_manager = sandbox_config_manager
119
118
  self.job_manager = job_manager
120
- self.use_assistant_message = use_assistant_message
121
119
  self.actor = actor
122
120
  self.max_steps = max_steps
123
121
 
@@ -128,6 +126,7 @@ class LettaAgentBatch(BaseAgent):
128
126
  letta_batch_job_id: str,
129
127
  agent_step_state_mapping: Optional[Dict[str, AgentStepState]] = None,
130
128
  ) -> LettaBatchResponse:
129
+ """Carry out agent steps until the LLM request is sent."""
131
130
  log_event(name="validate_inputs")
132
131
  if not batch_requests:
133
132
  raise ValueError("Empty list of batch_requests passed in!")
@@ -135,15 +134,26 @@ class LettaAgentBatch(BaseAgent):
135
134
  agent_step_state_mapping = {}
136
135
 
137
136
  log_event(name="load_and_prepare_agents")
138
- agent_messages_mapping: Dict[str, List[Message]] = {}
139
- agent_tools_mapping: Dict[str, List[dict]] = {}
137
+ # prepares (1) agent states, (2) step states, (3) LLMBatchItems (4) message batch_item_ids (5) messages per agent (6) tools per agent
138
+
139
+ agent_messages_mapping: dict[str, list[Message]] = {}
140
+ agent_tools_mapping: dict[str, list[dict]] = {}
140
141
  # TODO: This isn't optimal, moving fast - prone to bugs because we pass around this half formed pydantic object
141
- agent_batch_item_mapping: Dict[str, LLMBatchItem] = {}
142
+ agent_batch_item_mapping: dict[str, LLMBatchItem] = {}
143
+
144
+ # fetch agent states in batch
145
+ agent_mapping = {
146
+ agent_state.id: agent_state
147
+ for agent_state in await self.agent_manager.get_agents_by_ids_async(
148
+ agent_ids=[request.agent_id for request in batch_requests], actor=self.actor
149
+ )
150
+ }
151
+
142
152
  agent_states = []
143
153
  for batch_request in batch_requests:
144
154
  agent_id = batch_request.agent_id
145
- agent_state = self.agent_manager.get_agent_by_id(agent_id, actor=self.actor)
146
- agent_states.append(agent_state)
155
+ agent_state = agent_mapping[agent_id]
156
+ agent_states.append(agent_state) # keeping this to maintain ordering, but may not be necessary
147
157
 
148
158
  if agent_id not in agent_step_state_mapping:
149
159
  agent_step_state_mapping[agent_id] = AgentStepState(
@@ -164,7 +174,7 @@ class LettaAgentBatch(BaseAgent):
164
174
  for msg in batch_request.messages:
165
175
  msg.batch_item_id = llm_batch_item.id
166
176
 
167
- agent_messages_mapping[agent_id] = self._prepare_in_context_messages_per_agent(
177
+ agent_messages_mapping[agent_id] = await self._prepare_in_context_messages_per_agent_async(
168
178
  agent_state=agent_state, input_messages=batch_request.messages
169
179
  )
170
180
 
@@ -186,7 +196,7 @@ class LettaAgentBatch(BaseAgent):
186
196
  )
187
197
 
188
198
  log_event(name="persist_llm_batch_job")
189
- llm_batch_job = self.batch_manager.create_llm_batch_job(
199
+ llm_batch_job = await self.batch_manager.create_llm_batch_job_async(
190
200
  llm_provider=ProviderType.anthropic, # TODO: Expand to more providers
191
201
  create_batch_response=batch_response,
192
202
  actor=self.actor,
@@ -204,7 +214,7 @@ class LettaAgentBatch(BaseAgent):
204
214
 
205
215
  if batch_items:
206
216
  log_event(name="bulk_create_batch_items")
207
- batch_items_persisted = self.batch_manager.create_llm_batch_items_bulk(batch_items, actor=self.actor)
217
+ batch_items_persisted = await self.batch_manager.create_llm_batch_items_bulk_async(batch_items, actor=self.actor)
208
218
 
209
219
  log_event(name="return_batch_response")
210
220
  return LettaBatchResponse(
@@ -219,7 +229,7 @@ class LettaAgentBatch(BaseAgent):
219
229
  @trace_method
220
230
  async def resume_step_after_request(self, letta_batch_id: str, llm_batch_id: str) -> LettaBatchResponse:
221
231
  log_event(name="load_context")
222
- llm_batch_job = self.batch_manager.get_llm_batch_job_by_id(llm_batch_id=llm_batch_id, actor=self.actor)
232
+ llm_batch_job = await self.batch_manager.get_llm_batch_job_by_id_async(llm_batch_id=llm_batch_id, actor=self.actor)
223
233
  ctx = await self._collect_resume_context(llm_batch_id)
224
234
 
225
235
  log_event(name="update_statuses")
@@ -229,7 +239,7 @@ class LettaAgentBatch(BaseAgent):
229
239
  exec_results = await self._execute_tools(ctx)
230
240
 
231
241
  log_event(name="persist_messages")
232
- msg_map = self._persist_tool_messages(exec_results, ctx)
242
+ msg_map = await self._persist_tool_messages(exec_results, ctx)
233
243
 
234
244
  log_event(name="mark_steps_done")
235
245
  self._mark_steps_complete(llm_batch_id, ctx.agent_ids)
@@ -237,7 +247,9 @@ class LettaAgentBatch(BaseAgent):
237
247
  log_event(name="prepare_next")
238
248
  next_reqs, next_step_state = self._prepare_next_iteration(exec_results, ctx, msg_map)
239
249
  if len(next_reqs) == 0:
240
- self.job_manager.update_job_by_id(job_id=letta_batch_id, job_update=JobUpdate(status=JobStatus.completed), actor=self.actor)
250
+ await self.job_manager.update_job_by_id_async(
251
+ job_id=letta_batch_id, job_update=JobUpdate(status=JobStatus.completed), actor=self.actor
252
+ )
241
253
  return LettaBatchResponse(
242
254
  letta_batch_id=llm_batch_job.letta_batch_job_id,
243
255
  last_llm_batch_id=llm_batch_job.id,
@@ -256,18 +268,22 @@ class LettaAgentBatch(BaseAgent):
256
268
  @trace_method
257
269
  async def _collect_resume_context(self, llm_batch_id: str) -> _ResumeContext:
258
270
  # NOTE: We only continue for items with successful results
259
- batch_items = self.batch_manager.list_llm_batch_items(llm_batch_id=llm_batch_id, request_status=JobStatus.completed)
271
+ batch_items = await self.batch_manager.list_llm_batch_items_async(llm_batch_id=llm_batch_id, request_status=JobStatus.completed)
260
272
 
261
- agent_ids, agent_state_map = [], {}
262
- provider_results, name_map, args_map, cont_map = {}, {}, {}, {}
273
+ agent_ids = []
274
+ provider_results = {}
263
275
  request_status_updates: List[RequestStatusUpdateInfo] = []
264
276
 
265
277
  for item in batch_items:
266
278
  aid = item.agent_id
267
279
  agent_ids.append(aid)
268
- agent_state_map[aid] = self.agent_manager.get_agent_by_id(aid, actor=self.actor)
269
280
  provider_results[aid] = item.batch_request_result.result
270
281
 
282
+ agent_states = await self.agent_manager.get_agents_by_ids_async(agent_ids, actor=self.actor)
283
+ agent_state_map = {agent.id: agent for agent in agent_states}
284
+
285
+ name_map, args_map, cont_map = {}, {}, {}
286
+ for aid in agent_ids:
271
287
  # status bookkeeping
272
288
  pr = provider_results[aid]
273
289
  status = (
@@ -344,14 +360,14 @@ class LettaAgentBatch(BaseAgent):
344
360
  tool_params.append(param)
345
361
 
346
362
  if rethink_memory_params:
347
- return self._bulk_rethink_memory(rethink_memory_params)
363
+ return await self._bulk_rethink_memory_async(rethink_memory_params)
348
364
 
349
365
  if tool_params:
350
366
  async with Pool() as pool:
351
367
  return await pool.map(execute_tool_wrapper, tool_params)
352
368
 
353
369
  @trace_method
354
- def _bulk_rethink_memory(self, params: List[ToolExecutionParams]) -> Sequence[Tuple[str, Tuple[str, bool]]]:
370
+ async def _bulk_rethink_memory_async(self, params: List[ToolExecutionParams]) -> Sequence[Tuple[str, Tuple[str, bool]]]:
355
371
  updates = {}
356
372
  result = []
357
373
  for param in params:
@@ -372,11 +388,11 @@ class LettaAgentBatch(BaseAgent):
372
388
  # TODO: This is quite ugly and confusing - this is mostly to align with the returns of other tools
373
389
  result.append((param.agent_id, ("", True)))
374
390
 
375
- self.block_manager.bulk_update_block_values(updates=updates, actor=self.actor)
391
+ await self.block_manager.bulk_update_block_values_async(updates=updates, actor=self.actor)
376
392
 
377
393
  return result
378
394
 
379
- def _persist_tool_messages(
395
+ async def _persist_tool_messages(
380
396
  self,
381
397
  exec_results: Sequence[Tuple[str, Tuple[str, bool]]],
382
398
  ctx: _ResumeContext,
@@ -398,7 +414,7 @@ class LettaAgentBatch(BaseAgent):
398
414
  )
399
415
  msg_map[aid] = msgs
400
416
  # flatten & persist
401
- self.message_manager.create_many_messages([m for msgs in msg_map.values() for m in msgs], actor=self.actor)
417
+ await self.message_manager.create_many_messages_async([m for msgs in msg_map.values() for m in msgs], actor=self.actor)
402
418
  return msg_map
403
419
 
404
420
  def _mark_steps_complete(self, llm_batch_id: str, agent_ids: List[str]) -> None:
@@ -530,12 +546,14 @@ class LettaAgentBatch(BaseAgent):
530
546
  valid_tool_names = tool_rules_solver.get_allowed_tool_names(available_tools=set([t.name for t in tools]))
531
547
  return [enable_strict_mode(t.json_schema) for t in tools if t.name in set(valid_tool_names)]
532
548
 
533
- def _prepare_in_context_messages_per_agent(self, agent_state: AgentState, input_messages: List[MessageCreate]) -> List[Message]:
534
- current_in_context_messages, new_in_context_messages = _prepare_in_context_messages(
549
+ async def _prepare_in_context_messages_per_agent_async(
550
+ self, agent_state: AgentState, input_messages: List[MessageCreate]
551
+ ) -> List[Message]:
552
+ current_in_context_messages, new_in_context_messages = await _prepare_in_context_messages_async(
535
553
  input_messages, agent_state, self.message_manager, self.actor
536
554
  )
537
555
 
538
- in_context_messages = self._rebuild_memory(current_in_context_messages + new_in_context_messages, agent_state)
556
+ in_context_messages = await self._rebuild_memory_async(current_in_context_messages + new_in_context_messages, agent_state)
539
557
  return in_context_messages
540
558
 
541
559
  # TODO: Make this a bullk function
@@ -58,7 +58,7 @@ class VoiceSleeptimeAgent(LettaAgent):
58
58
  def update_message_transcript(self, message_transcripts: List[str]):
59
59
  self.message_transcripts = message_transcripts
60
60
 
61
- async def step(self, input_messages: List[MessageCreate], max_steps: int = 20) -> LettaResponse:
61
+ async def step(self, input_messages: List[MessageCreate], max_steps: int = 20, use_assistant_message: bool = True) -> LettaResponse:
62
62
  """
63
63
  Process the user's input message, allowing the model to call memory-related tools
64
64
  until it decides to stop and provide a final response.
@@ -74,7 +74,7 @@ class VoiceSleeptimeAgent(LettaAgent):
74
74
  ]
75
75
 
76
76
  # Summarize
77
- current_in_context_messages, new_in_context_messages = await super()._step(
77
+ current_in_context_messages, new_in_context_messages, usage = await super()._step(
78
78
  agent_state=agent_state, input_messages=input_messages, max_steps=max_steps
79
79
  )
80
80
  new_in_context_messages, updated = self.summarizer.summarize(
@@ -84,7 +84,9 @@ class VoiceSleeptimeAgent(LettaAgent):
84
84
  agent_id=self.agent_id, message_ids=[m.id for m in new_in_context_messages], actor=self.actor
85
85
  )
86
86
 
87
- return _create_letta_response(new_in_context_messages=new_in_context_messages, use_assistant_message=self.use_assistant_message)
87
+ return _create_letta_response(
88
+ new_in_context_messages=new_in_context_messages, use_assistant_message=use_assistant_message, usage=usage
89
+ )
88
90
 
89
91
  @trace_method
90
92
  async def _execute_tool(self, tool_name: str, tool_args: dict, agent_state: AgentState) -> Tuple[str, bool]:
@@ -146,7 +148,7 @@ class VoiceSleeptimeAgent(LettaAgent):
146
148
  return f"Failed to store memory given start_index {start_index} and end_index {end_index}: {e}", False
147
149
 
148
150
  async def step_stream(
149
- self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = False
151
+ self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = True
150
152
  ) -> AsyncGenerator[Union[LettaMessage, LegacyLettaMessage, MessageStreamStatus], None]:
151
153
  """
152
154
  This agent is synchronous-only. If called in an async context, raise an error.
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import logging
2
3
  import sys
3
4
  import time
@@ -3055,7 +3056,21 @@ class LocalClient(AbstractClient):
3055
3056
  Returns:
3056
3057
  tools (List[Tool]): List of tools
3057
3058
  """
3058
- return self.server.tool_manager.list_tools(after=after, limit=limit, actor=self.user)
3059
+ # Get the current event loop or create a new one if there isn't one
3060
+ try:
3061
+ loop = asyncio.get_event_loop()
3062
+ if loop.is_running():
3063
+ # We're in an async context but can't await - use a new loop via run_coroutine_threadsafe
3064
+ concurrent_future = asyncio.run_coroutine_threadsafe(
3065
+ self.server.tool_manager.list_tools_async(actor=self.user, after=after, limit=limit), loop
3066
+ )
3067
+ return concurrent_future.result()
3068
+ else:
3069
+ # We have a loop but it's not running - we can just run the coroutine
3070
+ return loop.run_until_complete(self.server.tool_manager.list_tools_async(actor=self.user, after=after, limit=limit))
3071
+ except RuntimeError:
3072
+ # No running event loop - create a new one with asyncio.run
3073
+ return asyncio.run(self.server.tool_manager.list_tools_async(actor=self.user, after=after, limit=limit))
3059
3074
 
3060
3075
  def get_tool(self, id: str) -> Optional[Tool]:
3061
3076
  """
@@ -195,6 +195,9 @@ DATA_SOURCE_ATTACH_ALERT = (
195
195
  "[ALERT] New data was just uploaded to archival memory. You can view this data by calling the archival_memory_search tool."
196
196
  )
197
197
 
198
+ # Throw an error message when a read-only block is edited
199
+ READ_ONLY_BLOCK_EDIT_ERROR = f"{ERROR_MESSAGE_PREFIX} This block is read-only and cannot be edited."
200
+
198
201
  # The ackknowledgement message used in the summarize sequence
199
202
  MESSAGE_SUMMARY_REQUEST_ACK = "Understood, I will respond with a summary of the message (and only the summary, nothing else) once I receive the conversation history. I'm ready."
200
203
 
@@ -12,7 +12,7 @@ from composio.exceptions import (
12
12
  )
13
13
 
14
14
 
15
- class AsyncComposioToolSet(BaseComposioToolSet, runtime="letta"):
15
+ class AsyncComposioToolSet(BaseComposioToolSet, runtime="letta", description_char_limit=1024):
16
16
  """
17
17
  Async version of ComposioToolSet client for interacting with Composio API
18
18
  Used to asynchronously hit the execute action endpoint