letta-nightly 0.7.16.dev20250515205957__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.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/PKG-INFO +1 -1
  2. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/__init__.py +1 -1
  3. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/letta_agent.py +23 -15
  4. letta_nightly-0.7.17.dev20250516090339/letta/interfaces/openai_streaming_interface.py +303 -0
  5. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sqlalchemy_base.py +90 -21
  6. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/agents.py +18 -16
  7. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/blocks.py +1 -1
  8. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/groups.py +2 -2
  9. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/messages.py +5 -5
  10. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/runs.py +2 -2
  11. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/tools.py +1 -1
  12. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/users.py +9 -9
  13. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/voice.py +1 -1
  14. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/agent_manager.py +4 -8
  15. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/message_manager.py +15 -0
  16. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/passage_manager.py +14 -0
  17. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/user_manager.py +70 -0
  18. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/pyproject.toml +1 -1
  19. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/LICENSE +0 -0
  20. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/README.md +0 -0
  21. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/__main__.py +0 -0
  22. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/agent.py +0 -0
  23. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/__init__.py +0 -0
  24. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/base_agent.py +0 -0
  25. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/ephemeral_agent.py +0 -0
  26. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/exceptions.py +0 -0
  27. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/helpers.py +0 -0
  28. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/letta_agent_batch.py +0 -0
  29. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/voice_agent.py +0 -0
  30. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/voice_sleeptime_agent.py +0 -0
  31. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/benchmark/benchmark.py +0 -0
  32. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/benchmark/constants.py +0 -0
  33. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/cli/cli.py +0 -0
  34. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/cli/cli_config.py +0 -0
  35. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/cli/cli_load.py +0 -0
  36. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/client/__init__.py +0 -0
  37. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/client/client.py +0 -0
  38. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/client/streaming.py +0 -0
  39. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/client/utils.py +0 -0
  40. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/config.py +0 -0
  41. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/constants.py +0 -0
  42. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/data_sources/connectors.py +0 -0
  43. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/data_sources/connectors_helper.py +0 -0
  44. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/embeddings.py +0 -0
  45. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/errors.py +0 -0
  46. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/__init__.py +0 -0
  47. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/ast_parsers.py +0 -0
  48. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/async_composio_toolset.py +0 -0
  49. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/composio_helpers.py +0 -0
  50. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/base.py +0 -0
  51. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/extras.py +0 -0
  52. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/multi_agent.py +0 -0
  53. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/voice.py +0 -0
  54. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/functions.py +0 -0
  55. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/helpers.py +0 -0
  56. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/interface.py +0 -0
  57. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/__init__.py +0 -0
  58. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/base_client.py +0 -0
  59. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/exceptions.py +0 -0
  60. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/sse_client.py +0 -0
  61. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/stdio_client.py +0 -0
  62. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/types.py +0 -0
  63. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/schema_generator.py +0 -0
  64. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/dynamic_multi_agent.py +0 -0
  65. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/helpers.py +0 -0
  66. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/round_robin_multi_agent.py +0 -0
  67. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/sleeptime_multi_agent.py +0 -0
  68. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/sleeptime_multi_agent_v2.py +0 -0
  69. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/supervisor_multi_agent.py +0 -0
  70. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/__init__.py +0 -0
  71. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/composio_helpers.py +0 -0
  72. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/converters.py +0 -0
  73. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/datetime_helpers.py +0 -0
  74. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/json_helpers.py +0 -0
  75. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/message_helper.py +0 -0
  76. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/tool_execution_helper.py +0 -0
  77. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/tool_rule_solver.py +0 -0
  78. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/humans/__init__.py +0 -0
  79. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/humans/examples/basic.txt +0 -0
  80. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/humans/examples/cs_phd.txt +0 -0
  81. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/interface.py +0 -0
  82. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/__init__.py +0 -0
  83. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/anthropic_streaming_interface.py +0 -0
  84. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/openai_chat_completions_streaming_interface.py +0 -0
  85. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/utils.py +0 -0
  86. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/__init__.py +0 -0
  87. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/helpers.py +0 -0
  88. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/llm_batch_job_polling.py +0 -0
  89. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/scheduler.py +0 -0
  90. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/types.py +0 -0
  91. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/__init__.py +0 -0
  92. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/anthropic.py +0 -0
  93. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/anthropic_client.py +0 -0
  94. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/aws_bedrock.py +0 -0
  95. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/azure_openai.py +0 -0
  96. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/azure_openai_constants.py +0 -0
  97. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/cohere.py +0 -0
  98. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/deepseek.py +0 -0
  99. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/google_ai_client.py +0 -0
  100. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/google_constants.py +0 -0
  101. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/google_vertex_client.py +0 -0
  102. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/helpers.py +0 -0
  103. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/llm_api_tools.py +0 -0
  104. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/llm_client.py +0 -0
  105. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/llm_client_base.py +0 -0
  106. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/mistral.py +0 -0
  107. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/openai.py +0 -0
  108. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/openai_client.py +0 -0
  109. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/README.md +0 -0
  110. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/__init__.py +0 -0
  111. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/chat_completion_proxy.py +0 -0
  112. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/constants.py +0 -0
  113. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/function_parser.py +0 -0
  114. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/__init__.py +0 -0
  115. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/gbnf_grammar_generator.py +0 -0
  116. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/json.gbnf +0 -0
  117. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/json_func_calls_with_inner_thoughts.gbnf +0 -0
  118. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/json_parser.py +0 -0
  119. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/koboldcpp/api.py +0 -0
  120. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/koboldcpp/settings.py +0 -0
  121. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llamacpp/api.py +0 -0
  122. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llamacpp/settings.py +0 -0
  123. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/__init__.py +0 -0
  124. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/airoboros.py +0 -0
  125. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/chatml.py +0 -0
  126. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py +0 -0
  127. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/dolphin.py +0 -0
  128. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/llama3.py +0 -0
  129. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/simple_summary_wrapper.py +0 -0
  130. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/wrapper_base.py +0 -0
  131. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/zephyr.py +0 -0
  132. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/lmstudio/api.py +0 -0
  133. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/lmstudio/settings.py +0 -0
  134. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/ollama/api.py +0 -0
  135. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/ollama/settings.py +0 -0
  136. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/__init__.py +0 -0
  137. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/deterministic_mirostat.py +0 -0
  138. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/settings.py +0 -0
  139. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/simple.py +0 -0
  140. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/utils.py +0 -0
  141. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/vllm/api.py +0 -0
  142. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/api.py +0 -0
  143. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/legacy_api.py +0 -0
  144. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/legacy_settings.py +0 -0
  145. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/settings.py +0 -0
  146. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/log.py +0 -0
  147. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/main.py +0 -0
  148. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/memory.py +0 -0
  149. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/openai_backcompat/__init__.py +0 -0
  150. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/openai_backcompat/openai_object.py +0 -0
  151. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/__all__.py +0 -0
  152. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/__init__.py +0 -0
  153. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/agent.py +0 -0
  154. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/agents_tags.py +0 -0
  155. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/base.py +0 -0
  156. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/block.py +0 -0
  157. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/block_history.py +0 -0
  158. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/blocks_agents.py +0 -0
  159. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/custom_columns.py +0 -0
  160. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/enums.py +0 -0
  161. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/errors.py +0 -0
  162. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/file.py +0 -0
  163. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/group.py +0 -0
  164. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/groups_agents.py +0 -0
  165. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/groups_blocks.py +0 -0
  166. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/identities_agents.py +0 -0
  167. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/identities_blocks.py +0 -0
  168. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/identity.py +0 -0
  169. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/job.py +0 -0
  170. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/job_messages.py +0 -0
  171. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/llm_batch_items.py +0 -0
  172. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/llm_batch_job.py +0 -0
  173. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/message.py +0 -0
  174. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/mixins.py +0 -0
  175. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/organization.py +0 -0
  176. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/passage.py +0 -0
  177. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/provider.py +0 -0
  178. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sandbox_config.py +0 -0
  179. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/source.py +0 -0
  180. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sources_agents.py +0 -0
  181. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sqlite_functions.py +0 -0
  182. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/step.py +0 -0
  183. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/tool.py +0 -0
  184. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/tools_agents.py +0 -0
  185. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/user.py +0 -0
  186. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/__init__.py +0 -0
  187. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/anna_pa.txt +0 -0
  188. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/google_search_persona.txt +0 -0
  189. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/memgpt_doc.txt +0 -0
  190. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/memgpt_starter.txt +0 -0
  191. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/o1_persona.txt +0 -0
  192. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sam.txt +0 -0
  193. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sam_pov.txt +0 -0
  194. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sam_simple_pov_gpt35.txt +0 -0
  195. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sleeptime_doc_persona.txt +0 -0
  196. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sleeptime_memory_persona.txt +0 -0
  197. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sqldb/test.db +0 -0
  198. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/voice_memory_persona.txt +0 -0
  199. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/__init__.py +0 -0
  200. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/gpt_summarize.py +0 -0
  201. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/gpt_system.py +0 -0
  202. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_base.txt +0 -0
  203. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_chat.txt +0 -0
  204. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_chat_compressed.txt +0 -0
  205. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_chat_fstring.txt +0 -0
  206. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_convo_only.txt +0 -0
  207. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_doc.txt +0 -0
  208. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_gpt35_extralong.txt +0 -0
  209. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_intuitive_knowledge.txt +0 -0
  210. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_memory_only.txt +0 -0
  211. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_modified_chat.txt +0 -0
  212. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_modified_o1.txt +0 -0
  213. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_offline_memory.txt +0 -0
  214. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_offline_memory_chat.txt +0 -0
  215. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_sleeptime_chat.txt +0 -0
  216. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/sleeptime.txt +0 -0
  217. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/sleeptime_doc_ingest.txt +0 -0
  218. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/voice_chat.txt +0 -0
  219. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/voice_sleeptime.txt +0 -0
  220. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/pytest.ini +0 -0
  221. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/agent.py +0 -0
  222. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/block.py +0 -0
  223. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/embedding_config.py +0 -0
  224. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/embedding_config_overrides.py +0 -0
  225. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/enums.py +0 -0
  226. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/environment_variables.py +0 -0
  227. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/file.py +0 -0
  228. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/group.py +0 -0
  229. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/health.py +0 -0
  230. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/identity.py +0 -0
  231. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/job.py +0 -0
  232. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_base.py +0 -0
  233. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_message.py +0 -0
  234. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_message_content.py +0 -0
  235. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_request.py +0 -0
  236. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_response.py +0 -0
  237. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/llm_batch_job.py +0 -0
  238. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/llm_config.py +0 -0
  239. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/llm_config_overrides.py +0 -0
  240. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/memory.py +0 -0
  241. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/message.py +0 -0
  242. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/chat_completion_request.py +0 -0
  243. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/chat_completion_response.py +0 -0
  244. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/chat_completions.py +0 -0
  245. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/embedding_response.py +0 -0
  246. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/openai.py +0 -0
  247. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/organization.py +0 -0
  248. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/passage.py +0 -0
  249. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/providers.py +0 -0
  250. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/response_format.py +0 -0
  251. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/run.py +0 -0
  252. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/sandbox_config.py +0 -0
  253. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/source.py +0 -0
  254. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/step.py +0 -0
  255. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/tool.py +0 -0
  256. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/tool_execution_result.py +0 -0
  257. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/tool_rule.py +0 -0
  258. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/usage.py +0 -0
  259. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/user.py +0 -0
  260. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/__init__.py +0 -0
  261. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_agent.py +0 -0
  262. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_agent_environment_variable.py +0 -0
  263. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_base.py +0 -0
  264. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_block.py +0 -0
  265. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_custom_fields.py +0 -0
  266. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_message.py +0 -0
  267. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_tag.py +0 -0
  268. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_tool.py +0 -0
  269. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/pydantic_agent_schema.py +0 -0
  270. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/__init__.py +0 -0
  271. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/constants.py +0 -0
  272. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/db.py +0 -0
  273. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/generate_openapi_schema.sh +0 -0
  274. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/__init__.py +0 -0
  275. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/app.py +0 -0
  276. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/auth/__init__.py +0 -0
  277. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/auth/index.py +0 -0
  278. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/auth_token.py +0 -0
  279. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/chat_completions_interface.py +0 -0
  280. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/interface.py +0 -0
  281. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/json_parser.py +0 -0
  282. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/__init__.py +0 -0
  283. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/openai/chat_completions/__init__.py +0 -0
  284. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +0 -0
  285. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/__init__.py +0 -0
  286. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/embeddings.py +0 -0
  287. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/health.py +0 -0
  288. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/identities.py +0 -0
  289. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/jobs.py +0 -0
  290. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/llms.py +0 -0
  291. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/organizations.py +0 -0
  292. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/providers.py +0 -0
  293. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/sandbox_configs.py +0 -0
  294. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/sources.py +0 -0
  295. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/steps.py +0 -0
  296. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/tags.py +0 -0
  297. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/static_files.py +0 -0
  298. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/utils.py +0 -0
  299. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/server.py +0 -0
  300. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/startup.sh +0 -0
  301. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/assets/index-048c9598.js +0 -0
  302. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/assets/index-0e31b727.css +0 -0
  303. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/favicon.ico +0 -0
  304. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/index.html +0 -0
  305. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/memgpt_logo_transparent.png +0 -0
  306. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/utils.py +0 -0
  307. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/__init__.py +0 -0
  308. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/example_client.py +0 -0
  309. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/interface.py +0 -0
  310. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/protocol.py +0 -0
  311. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/server.py +0 -0
  312. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/__init__.py +0 -0
  313. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/block_manager.py +0 -0
  314. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/group_manager.py +0 -0
  315. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/helpers/agent_manager_helper.py +0 -0
  316. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/helpers/tool_execution_helper.py +0 -0
  317. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/identity_manager.py +0 -0
  318. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/job_manager.py +0 -0
  319. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/llm_batch_manager.py +0 -0
  320. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/__init__.py +0 -0
  321. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/base_client.py +0 -0
  322. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/sse_client.py +0 -0
  323. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/stdio_client.py +0 -0
  324. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/types.py +0 -0
  325. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/organization_manager.py +0 -0
  326. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/per_agent_lock_manager.py +0 -0
  327. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/provider_manager.py +0 -0
  328. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/sandbox_config_manager.py +0 -0
  329. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/source_manager.py +0 -0
  330. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/step_manager.py +0 -0
  331. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/summarizer/__init__.py +0 -0
  332. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/summarizer/enums.py +0 -0
  333. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/summarizer/summarizer.py +0 -0
  334. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/__init__.py +0 -0
  335. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/tool_execution_manager.py +0 -0
  336. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/tool_execution_sandbox.py +0 -0
  337. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/tool_executor.py +0 -0
  338. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_manager.py +0 -0
  339. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/__init__.py +0 -0
  340. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/base.py +0 -0
  341. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/e2b_sandbox.py +0 -0
  342. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/local_sandbox.py +0 -0
  343. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/settings.py +0 -0
  344. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/streaming_interface.py +0 -0
  345. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/streaming_utils.py +0 -0
  346. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/system.py +0 -0
  347. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/tracing.py +0 -0
  348. {letta_nightly-0.7.16.dev20250515205957 → letta_nightly-0.7.17.dev20250516090339}/letta/types/__init__.py +0 -0
  349. {letta_nightly-0.7.16.dev20250515205957 → 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.16.dev20250515205957
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
@@ -1,4 +1,4 @@
1
- __version__ = "0.7.16"
1
+ __version__ = "0.7.17"
2
2
 
3
3
  # import clients
4
4
  from letta.client.client import LocalClient, RESTClient, create_client
@@ -8,10 +8,11 @@ from openai.types import CompletionUsage
8
8
  from openai.types.chat import ChatCompletion, ChatCompletionChunk
9
9
 
10
10
  from letta.agents.base_agent import BaseAgent
11
- 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
12
12
  from letta.helpers import ToolRulesSolver
13
13
  from letta.helpers.tool_execution_helper import enable_strict_mode
14
14
  from letta.interfaces.anthropic_streaming_interface import AnthropicStreamingInterface
15
+ from letta.interfaces.openai_streaming_interface import OpenAIStreamingInterface
15
16
  from letta.llm_api.llm_client import LLMClient
16
17
  from letta.llm_api.llm_client_base import LLMClientBase
17
18
  from letta.local_llm.constants import INNER_THOUGHTS_KWARG
@@ -61,12 +62,8 @@ class LettaAgent(BaseAgent):
61
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)
66
-
67
- # Cached archival memory/message size
68
- self.num_messages = self.message_manager.size(actor=self.actor, agent_id=agent_id)
69
- 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
70
67
 
71
68
  @trace_method
72
69
  async def step(self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = True) -> LettaResponse:
@@ -81,7 +78,7 @@ class LettaAgent(BaseAgent):
81
78
  async def _step(
82
79
  self, agent_state: AgentState, input_messages: List[MessageCreate], max_steps: int = 10
83
80
  ) -> Tuple[List[Message], List[Message], CompletionUsage]:
84
- current_in_context_messages, new_in_context_messages = _prepare_in_context_messages(
81
+ current_in_context_messages, new_in_context_messages = await _prepare_in_context_messages_async(
85
82
  input_messages, agent_state, self.message_manager, self.actor
86
83
  )
87
84
  tool_rules_solver = ToolRulesSolver(agent_state.tool_rules)
@@ -129,14 +126,14 @@ class LettaAgent(BaseAgent):
129
126
 
130
127
  @trace_method
131
128
  async def step_stream(
132
- self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = True
129
+ self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = True, stream_tokens: bool = False
133
130
  ) -> AsyncGenerator[str, None]:
134
131
  """
135
132
  Main streaming loop that yields partial tokens.
136
133
  Whenever we detect a tool call, we yield from _handle_ai_response as well.
137
134
  """
138
135
  agent_state = await self.agent_manager.get_agent_by_id_async(self.agent_id, actor=self.actor)
139
- current_in_context_messages, new_in_context_messages = _prepare_in_context_messages(
136
+ current_in_context_messages, new_in_context_messages = await _prepare_in_context_messages_async(
140
137
  input_messages, agent_state, self.message_manager, self.actor
141
138
  )
142
139
  tool_rules_solver = ToolRulesSolver(agent_state.tool_rules)
@@ -157,9 +154,16 @@ class LettaAgent(BaseAgent):
157
154
  )
158
155
  # TODO: THIS IS INCREDIBLY UGLY
159
156
  # TODO: THERE ARE MULTIPLE COPIES OF THE LLM_CONFIG EVERYWHERE THAT ARE GETTING MANIPULATED
160
- interface = AnthropicStreamingInterface(
161
- use_assistant_message=use_assistant_message, put_inner_thoughts_in_kwarg=agent_state.llm_config.put_inner_thoughts_in_kwargs
162
- )
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
+ )
163
167
  async for chunk in interface.process(stream):
164
168
  yield f"data: {chunk.model_dump_json()}\n\n"
165
169
 
@@ -197,8 +201,8 @@ class LettaAgent(BaseAgent):
197
201
 
198
202
  # TODO: This may be out of sync, if in between steps users add files
199
203
  # NOTE (cliandy): temporary for now for particlar use cases.
200
- self.num_messages = self.message_manager.size(actor=self.actor, agent_id=agent_state.id)
201
- 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)
202
206
 
203
207
  # TODO: Also yield out a letta usage stats SSE
204
208
  yield f"data: {usage.model_dump_json()}\n\n"
@@ -215,6 +219,10 @@ class LettaAgent(BaseAgent):
215
219
  stream: bool,
216
220
  ) -> ChatCompletion | AsyncStream[ChatCompletionChunk]:
217
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
+ )
218
226
  in_context_messages = await self._rebuild_memory_async(
219
227
  in_context_messages, agent_state, num_messages=self.num_messages, num_archival_memories=self.num_archival_memories
220
228
  )
@@ -0,0 +1,303 @@
1
+ from datetime import datetime, timezone
2
+ from typing import AsyncGenerator, List, Optional
3
+
4
+ from openai import AsyncStream
5
+ from openai.types.chat.chat_completion_chunk import ChatCompletionChunk
6
+
7
+ from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG
8
+ from letta.schemas.letta_message import AssistantMessage, LettaMessage, ReasoningMessage, ToolCallDelta, ToolCallMessage
9
+ from letta.schemas.letta_message_content import TextContent
10
+ from letta.schemas.message import Message
11
+ from letta.schemas.openai.chat_completion_response import FunctionCall, ToolCall
12
+ from letta.server.rest_api.json_parser import OptimisticJSONParser
13
+ from letta.streaming_utils import JSONInnerThoughtsExtractor
14
+
15
+
16
+ class OpenAIStreamingInterface:
17
+ """
18
+ Encapsulates the logic for streaming responses from OpenAI.
19
+ This class handles parsing of partial tokens, pre-execution messages,
20
+ and detection of tool call events.
21
+ """
22
+
23
+ def __init__(self, use_assistant_message: bool = False, put_inner_thoughts_in_kwarg: bool = False):
24
+ self.use_assistant_message = use_assistant_message
25
+ self.assistant_message_tool_name = DEFAULT_MESSAGE_TOOL
26
+ self.assistant_message_tool_kwarg = DEFAULT_MESSAGE_TOOL_KWARG
27
+
28
+ self.optimistic_json_parser: OptimisticJSONParser = OptimisticJSONParser()
29
+ self.function_args_reader = JSONInnerThoughtsExtractor(wait_for_first_key=True) # TODO: pass in kward
30
+ self.function_name_buffer = None
31
+ self.function_args_buffer = None
32
+ self.function_id_buffer = None
33
+ self.last_flushed_function_name = None
34
+
35
+ # Buffer to hold function arguments until inner thoughts are complete
36
+ self.current_function_arguments = ""
37
+ self.current_json_parse_result = {}
38
+
39
+ # Premake IDs for database writes
40
+ self.letta_assistant_message_id = Message.generate_id()
41
+ self.letta_tool_message_id = Message.generate_id()
42
+
43
+ # token counters
44
+ self.input_tokens = 0
45
+ self.output_tokens = 0
46
+
47
+ self.content_buffer: List[str] = []
48
+ self.tool_call_name: Optional[str] = None
49
+ self.tool_call_id: Optional[str] = None
50
+ self.reasoning_messages = []
51
+
52
+ def get_reasoning_content(self) -> List[TextContent]:
53
+ content = "".join(self.reasoning_messages)
54
+ return [TextContent(text=content)]
55
+
56
+ def get_tool_call_object(self) -> ToolCall:
57
+ """Useful for agent loop"""
58
+ return ToolCall(
59
+ id=self.letta_tool_message_id,
60
+ function=FunctionCall(arguments=self.current_function_arguments, name=self.last_flushed_function_name),
61
+ )
62
+
63
+ async def process(self, stream: AsyncStream[ChatCompletionChunk]) -> AsyncGenerator[LettaMessage, None]:
64
+ """
65
+ Iterates over the OpenAI stream, yielding SSE events.
66
+ It also collects tokens and detects if a tool call is triggered.
67
+ """
68
+ async with stream:
69
+ prev_message_type = None
70
+ message_index = 0
71
+ async for chunk in stream:
72
+ # track usage
73
+ if chunk.usage:
74
+ self.input_tokens += len(chunk.usage.prompt_tokens)
75
+ self.output_tokens += len(chunk.usage.completion_tokens)
76
+
77
+ if chunk.choices:
78
+ choice = chunk.choices[0]
79
+ message_delta = choice.delta
80
+
81
+ if message_delta.tool_calls is not None and len(message_delta.tool_calls) > 0:
82
+ tool_call = message_delta.tool_calls[0]
83
+
84
+ if tool_call.function.name:
85
+ # If we're waiting for the first key, then we should hold back the name
86
+ # ie add it to a buffer instead of returning it as a chunk
87
+ if self.function_name_buffer is None:
88
+ self.function_name_buffer = tool_call.function.name
89
+ else:
90
+ self.function_name_buffer += tool_call.function.name
91
+
92
+ if tool_call.id:
93
+ # Buffer until next time
94
+ if self.function_id_buffer is None:
95
+ self.function_id_buffer = tool_call.id
96
+ else:
97
+ self.function_id_buffer += tool_call.id
98
+
99
+ if tool_call.function.arguments:
100
+ # updates_main_json, updates_inner_thoughts = self.function_args_reader.process_fragment(tool_call.function.arguments)
101
+ self.current_function_arguments += tool_call.function.arguments
102
+ updates_main_json, updates_inner_thoughts = self.function_args_reader.process_fragment(
103
+ tool_call.function.arguments
104
+ )
105
+
106
+ # If we have inner thoughts, we should output them as a chunk
107
+ if updates_inner_thoughts:
108
+ if prev_message_type and prev_message_type != "reasoning_message":
109
+ message_index += 1
110
+ self.reasoning_messages.append(updates_inner_thoughts)
111
+ reasoning_message = ReasoningMessage(
112
+ id=self.letta_tool_message_id,
113
+ date=datetime.now(timezone.utc),
114
+ reasoning=updates_inner_thoughts,
115
+ # name=name,
116
+ otid=Message.generate_otid_from_id(self.letta_tool_message_id, message_index),
117
+ )
118
+ prev_message_type = reasoning_message.message_type
119
+ yield reasoning_message
120
+
121
+ # Additionally inner thoughts may stream back with a chunk of main JSON
122
+ # In that case, since we can only return a chunk at a time, we should buffer it
123
+ if updates_main_json:
124
+ if self.function_args_buffer is None:
125
+ self.function_args_buffer = updates_main_json
126
+ else:
127
+ self.function_args_buffer += updates_main_json
128
+
129
+ # If we have main_json, we should output a ToolCallMessage
130
+ elif updates_main_json:
131
+
132
+ # If there's something in the function_name buffer, we should release it first
133
+ # NOTE: we could output it as part of a chunk that has both name and args,
134
+ # however the frontend may expect name first, then args, so to be
135
+ # safe we'll output name first in a separate chunk
136
+ if self.function_name_buffer:
137
+
138
+ # use_assisitant_message means that we should also not release main_json raw, and instead should only release the contents of "message": "..."
139
+ if self.use_assistant_message and self.function_name_buffer == self.assistant_message_tool_name:
140
+
141
+ # Store the ID of the tool call so allow skipping the corresponding response
142
+ if self.function_id_buffer:
143
+ self.prev_assistant_message_id = self.function_id_buffer
144
+
145
+ else:
146
+ if prev_message_type and prev_message_type != "tool_call_message":
147
+ message_index += 1
148
+ self.tool_call_name = str(self.function_name_buffer)
149
+ tool_call_msg = ToolCallMessage(
150
+ id=self.letta_tool_message_id,
151
+ date=datetime.now(timezone.utc),
152
+ tool_call=ToolCallDelta(
153
+ name=self.function_name_buffer,
154
+ arguments=None,
155
+ tool_call_id=self.function_id_buffer,
156
+ ),
157
+ otid=Message.generate_otid_from_id(self.letta_tool_message_id, message_index),
158
+ )
159
+ prev_message_type = tool_call_msg.message_type
160
+ yield tool_call_msg
161
+
162
+ # Record what the last function name we flushed was
163
+ self.last_flushed_function_name = self.function_name_buffer
164
+ # Clear the buffer
165
+ self.function_name_buffer = None
166
+ self.function_id_buffer = None
167
+ # Since we're clearing the name buffer, we should store
168
+ # any updates to the arguments inside a separate buffer
169
+
170
+ # Add any main_json updates to the arguments buffer
171
+ if self.function_args_buffer is None:
172
+ self.function_args_buffer = updates_main_json
173
+ else:
174
+ self.function_args_buffer += updates_main_json
175
+
176
+ # If there was nothing in the name buffer, we can proceed to
177
+ # output the arguments chunk as a ToolCallMessage
178
+ else:
179
+
180
+ # use_assisitant_message means that we should also not release main_json raw, and instead should only release the contents of "message": "..."
181
+ if self.use_assistant_message and (
182
+ self.last_flushed_function_name is not None
183
+ and self.last_flushed_function_name == self.assistant_message_tool_name
184
+ ):
185
+ # do an additional parse on the updates_main_json
186
+ if self.function_args_buffer:
187
+ updates_main_json = self.function_args_buffer + updates_main_json
188
+ self.function_args_buffer = None
189
+
190
+ # Pretty gross hardcoding that assumes that if we're toggling into the keywords, we have the full prefix
191
+ match_str = '{"' + self.assistant_message_tool_kwarg + '":"'
192
+ if updates_main_json == match_str:
193
+ updates_main_json = None
194
+
195
+ else:
196
+ # Some hardcoding to strip off the trailing "}"
197
+ if updates_main_json in ["}", '"}']:
198
+ updates_main_json = None
199
+ if updates_main_json and len(updates_main_json) > 0 and updates_main_json[-1:] == '"':
200
+ updates_main_json = updates_main_json[:-1]
201
+
202
+ if not updates_main_json:
203
+ # early exit to turn into content mode
204
+ continue
205
+
206
+ # There may be a buffer from a previous chunk, for example
207
+ # if the previous chunk had arguments but we needed to flush name
208
+ if self.function_args_buffer:
209
+ # In this case, we should release the buffer + new data at once
210
+ combined_chunk = self.function_args_buffer + updates_main_json
211
+
212
+ if prev_message_type and prev_message_type != "assistant_message":
213
+ message_index += 1
214
+ assistant_message = AssistantMessage(
215
+ id=self.letta_assistant_message_id,
216
+ date=datetime.now(timezone.utc),
217
+ content=combined_chunk,
218
+ otid=Message.generate_otid_from_id(self.letta_assistant_message_id, message_index),
219
+ )
220
+ prev_message_type = assistant_message.message_type
221
+ yield assistant_message
222
+ # Store the ID of the tool call so allow skipping the corresponding response
223
+ if self.function_id_buffer:
224
+ self.prev_assistant_message_id = self.function_id_buffer
225
+ # clear buffer
226
+ self.function_args_buffer = None
227
+ self.function_id_buffer = None
228
+
229
+ else:
230
+ # If there's no buffer to clear, just output a new chunk with new data
231
+ # TODO: THIS IS HORRIBLE
232
+ # TODO: WE USE THE OLD JSON PARSER EARLIER (WHICH DOES NOTHING) AND NOW THE NEW JSON PARSER
233
+ # TODO: THIS IS TOTALLY WRONG AND BAD, BUT SAVING FOR A LARGER REWRITE IN THE NEAR FUTURE
234
+ parsed_args = self.optimistic_json_parser.parse(self.current_function_arguments)
235
+
236
+ if parsed_args.get(self.assistant_message_tool_kwarg) and parsed_args.get(
237
+ self.assistant_message_tool_kwarg
238
+ ) != self.current_json_parse_result.get(self.assistant_message_tool_kwarg):
239
+ new_content = parsed_args.get(self.assistant_message_tool_kwarg)
240
+ prev_content = self.current_json_parse_result.get(self.assistant_message_tool_kwarg, "")
241
+ # TODO: Assumes consistent state and that prev_content is subset of new_content
242
+ diff = new_content.replace(prev_content, "", 1)
243
+ self.current_json_parse_result = parsed_args
244
+ if prev_message_type and prev_message_type != "assistant_message":
245
+ message_index += 1
246
+ assistant_message = AssistantMessage(
247
+ id=self.letta_assistant_message_id,
248
+ date=datetime.now(timezone.utc),
249
+ content=diff,
250
+ # name=name,
251
+ otid=Message.generate_otid_from_id(self.letta_assistant_message_id, message_index),
252
+ )
253
+ prev_message_type = assistant_message.message_type
254
+ yield assistant_message
255
+
256
+ # Store the ID of the tool call so allow skipping the corresponding response
257
+ if self.function_id_buffer:
258
+ self.prev_assistant_message_id = self.function_id_buffer
259
+ # clear buffers
260
+ self.function_id_buffer = None
261
+ else:
262
+
263
+ # There may be a buffer from a previous chunk, for example
264
+ # if the previous chunk had arguments but we needed to flush name
265
+ if self.function_args_buffer:
266
+ # In this case, we should release the buffer + new data at once
267
+ combined_chunk = self.function_args_buffer + updates_main_json
268
+ if prev_message_type and prev_message_type != "tool_call_message":
269
+ message_index += 1
270
+ tool_call_msg = ToolCallMessage(
271
+ id=self.letta_tool_message_id,
272
+ date=datetime.now(timezone.utc),
273
+ tool_call=ToolCallDelta(
274
+ name=None,
275
+ arguments=combined_chunk,
276
+ tool_call_id=self.function_id_buffer,
277
+ ),
278
+ # name=name,
279
+ otid=Message.generate_otid_from_id(self.letta_tool_message_id, message_index),
280
+ )
281
+ prev_message_type = tool_call_msg.message_type
282
+ yield tool_call_msg
283
+ # clear buffer
284
+ self.function_args_buffer = None
285
+ self.function_id_buffer = None
286
+ else:
287
+ # If there's no buffer to clear, just output a new chunk with new data
288
+ if prev_message_type and prev_message_type != "tool_call_message":
289
+ message_index += 1
290
+ tool_call_msg = ToolCallMessage(
291
+ id=self.letta_tool_message_id,
292
+ date=datetime.now(timezone.utc),
293
+ tool_call=ToolCallDelta(
294
+ name=None,
295
+ arguments=updates_main_json,
296
+ tool_call_id=self.function_id_buffer,
297
+ ),
298
+ # name=name,
299
+ otid=Message.generate_otid_from_id(self.letta_tool_message_id, message_index),
300
+ )
301
+ prev_message_type = tool_call_msg.message_type
302
+ yield tool_call_msg
303
+ self.function_id_buffer = None
@@ -745,6 +745,17 @@ class SqlalchemyBase(CommonSqlalchemyMetaMixins, Base):
745
745
  self.is_deleted = True
746
746
  return self.update(db_session)
747
747
 
748
+ @handle_db_timeout
749
+ async def delete_async(self, db_session: "AsyncSession", actor: Optional["User"] = None) -> "SqlalchemyBase":
750
+ """Soft delete a record asynchronously (mark as deleted)."""
751
+ logger.debug(f"Soft deleting {self.__class__.__name__} with ID: {self.id} with actor={actor} (async)")
752
+
753
+ if actor:
754
+ self._set_created_and_updated_by_fields(actor.id)
755
+
756
+ self.is_deleted = True
757
+ return await self.update_async(db_session)
758
+
748
759
  @handle_db_timeout
749
760
  def hard_delete(self, db_session: "Session", actor: Optional["User"] = None) -> None:
750
761
  """Permanently removes the record from the database."""
@@ -761,6 +772,20 @@ class SqlalchemyBase(CommonSqlalchemyMetaMixins, Base):
761
772
  else:
762
773
  logger.debug(f"{self.__class__.__name__} with ID {self.id} successfully hard deleted")
763
774
 
775
+ @handle_db_timeout
776
+ async def hard_delete_async(self, db_session: "AsyncSession", actor: Optional["User"] = None) -> None:
777
+ """Permanently removes the record from the database asynchronously."""
778
+ logger.debug(f"Hard deleting {self.__class__.__name__} with ID: {self.id} with actor={actor} (async)")
779
+
780
+ async with db_session as session:
781
+ try:
782
+ await session.delete(self)
783
+ await session.commit()
784
+ except Exception as e:
785
+ await session.rollback()
786
+ logger.exception(f"Failed to hard delete {self.__class__.__name__} with ID {self.id}")
787
+ raise ValueError(f"Failed to hard delete {self.__class__.__name__} with ID {self.id}: {e}")
788
+
764
789
  @handle_db_timeout
765
790
  def update(self, db_session: Session, actor: Optional["User"] = None, no_commit: bool = False) -> "SqlalchemyBase":
766
791
  logger.debug(...)
@@ -793,6 +818,39 @@ class SqlalchemyBase(CommonSqlalchemyMetaMixins, Base):
793
818
  await db_session.refresh(self)
794
819
  return self
795
820
 
821
+ @classmethod
822
+ def _size_preprocess(
823
+ cls,
824
+ *,
825
+ db_session: "Session",
826
+ actor: Optional["User"] = None,
827
+ access: Optional[List[Literal["read", "write", "admin"]]] = ["read"],
828
+ access_type: AccessType = AccessType.ORGANIZATION,
829
+ **kwargs,
830
+ ):
831
+ logger.debug(f"Calculating size for {cls.__name__} with filters {kwargs}")
832
+ query = select(func.count()).select_from(cls)
833
+
834
+ if actor:
835
+ query = cls.apply_access_predicate(query, actor, access, access_type)
836
+
837
+ # Apply filtering logic based on kwargs
838
+ for key, value in kwargs.items():
839
+ if value:
840
+ column = getattr(cls, key, None)
841
+ if not column:
842
+ raise AttributeError(f"{cls.__name__} has no attribute '{key}'")
843
+ if isinstance(value, (list, tuple, set)): # Check for iterables
844
+ query = query.where(column.in_(value))
845
+ else: # Single value for equality filtering
846
+ query = query.where(column == value)
847
+
848
+ # Handle soft deletes if the class has the 'is_deleted' attribute
849
+ if hasattr(cls, "is_deleted"):
850
+ query = query.where(cls.is_deleted == False)
851
+
852
+ return query
853
+
796
854
  @classmethod
797
855
  @handle_db_timeout
798
856
  def size(
@@ -817,28 +875,8 @@ class SqlalchemyBase(CommonSqlalchemyMetaMixins, Base):
817
875
  Raises:
818
876
  DBAPIError: If a database error occurs
819
877
  """
820
- logger.debug(f"Calculating size for {cls.__name__} with filters {kwargs}")
821
-
822
878
  with db_session as session:
823
- query = select(func.count()).select_from(cls)
824
-
825
- if actor:
826
- query = cls.apply_access_predicate(query, actor, access, access_type)
827
-
828
- # Apply filtering logic based on kwargs
829
- for key, value in kwargs.items():
830
- if value:
831
- column = getattr(cls, key, None)
832
- if not column:
833
- raise AttributeError(f"{cls.__name__} has no attribute '{key}'")
834
- if isinstance(value, (list, tuple, set)): # Check for iterables
835
- query = query.where(column.in_(value))
836
- else: # Single value for equality filtering
837
- query = query.where(column == value)
838
-
839
- # Handle soft deletes if the class has the 'is_deleted' attribute
840
- if hasattr(cls, "is_deleted"):
841
- query = query.where(cls.is_deleted == False)
879
+ query = cls._size_preprocess(db_session=session, actor=actor, access=access, access_type=access_type, **kwargs)
842
880
 
843
881
  try:
844
882
  count = session.execute(query).scalar()
@@ -847,6 +885,37 @@ class SqlalchemyBase(CommonSqlalchemyMetaMixins, Base):
847
885
  logger.exception(f"Failed to calculate size for {cls.__name__}")
848
886
  raise e
849
887
 
888
+ @classmethod
889
+ @handle_db_timeout
890
+ async def size_async(
891
+ cls,
892
+ *,
893
+ db_session: "AsyncSession",
894
+ actor: Optional["User"] = None,
895
+ access: Optional[List[Literal["read", "write", "admin"]]] = ["read"],
896
+ access_type: AccessType = AccessType.ORGANIZATION,
897
+ **kwargs,
898
+ ) -> int:
899
+ """
900
+ Get the count of rows that match the provided filters.
901
+ Args:
902
+ db_session: SQLAlchemy session
903
+ **kwargs: Filters to apply to the query (e.g., column_name=value)
904
+ Returns:
905
+ int: The count of rows that match the filters
906
+ Raises:
907
+ DBAPIError: If a database error occurs
908
+ """
909
+ async with db_session as session:
910
+ query = cls._size_preprocess(db_session=session, actor=actor, access=access, access_type=access_type, **kwargs)
911
+
912
+ try:
913
+ count = await session.execute(query).scalar()
914
+ return count if count else 0
915
+ except DBAPIError as e:
916
+ logger.exception(f"Failed to calculate size for {cls.__name__}")
917
+ raise e
918
+
850
919
  @classmethod
851
920
  def apply_access_predicate(
852
921
  cls,